44import org .javawebstack .orm .Repo ;
55import org .javawebstack .orm .SQLMapper ;
66import org .javawebstack .orm .exception .ORMQueryException ;
7+ import org .javawebstack .orm .wrapper .builder .SQLQueryString ;
78
89import java .sql .ResultSet ;
910import java .sql .SQLException ;
@@ -26,7 +27,6 @@ public class Query<T extends Model> {
2627 private QueryColumn order ;
2728 private boolean desc = false ;
2829 private boolean withDeleted = false ;
29- private final Map <Class <? extends Model >, QueryCondition > leftJoins = new HashMap <>();
3030
3131 public Query (Class <T > model ) {
3232 this (Repo .get (model ), model );
@@ -38,13 +38,36 @@ public Query(Repo<T> repo, Class<T> model) {
3838 this .where = new QueryGroup <>();
3939 }
4040
41- public Class < T > getModel () {
42- return model ;
41+ public boolean isWithDeleted () {
42+ return withDeleted ;
4343 }
4444
45- public Query <T > leftJoin (Class <? extends Model > model , String self , String other ) {
46- leftJoins .put (model , new QueryCondition (new QueryColumn (repo .getInfo ().getTableName () + "." + self ), "=" , new QueryColumn (Repo .get (model ).getInfo ().getTableName () + "." + other )));
47- return this ;
45+ public QueryGroup <T > getWhereGroup () {
46+ return where ;
47+ }
48+
49+ public Integer getLimit () {
50+ return limit ;
51+ }
52+
53+ public Integer getOffset () {
54+ return offset ;
55+ }
56+
57+ public QueryColumn getOrder () {
58+ return order ;
59+ }
60+
61+ public boolean isDescOrder () {
62+ return desc ;
63+ }
64+
65+ public Repo <T > getRepo () {
66+ return repo ;
67+ }
68+
69+ public Class <T > getModel () {
70+ return model ;
4871 }
4972
5073 public Query <T > and (Function <QueryGroup <T >, QueryGroup <T >> group ) {
@@ -286,59 +309,10 @@ public Query<T> withDeleted() {
286309 return this ;
287310 }
288311
289- public QueryString getQueryString () {
290- return getQueryString (false );
291- }
292-
293- public QueryString getQueryString (boolean count ) {
294- List <Object > parameters = new ArrayList <>();
295- StringBuilder sb = new StringBuilder ("SELECT " )
296- .append (count ? "COUNT(*)" : "*" )
297- .append (" FROM `" )
298- .append (repo .getInfo ().getTableName ())
299- .append ('`' );
300- for (Class <? extends Model > type : leftJoins .keySet ()) {
301- sb .append (" LEFT JOIN `" )
302- .append (Repo .get (type ).getInfo ().getTableName ())
303- .append ("` ON " )
304- .append (leftJoins .get (type ).getQueryString (repo .getInfo ()).getQuery ());
305- }
306- considerSoftDelete ();
307- if (where .getQueryElements ().size () > 0 ) {
308- QueryString qs = where .getQueryString (repo .getInfo ());
309- sb .append (" WHERE " ).append (qs .getQuery ());
310- parameters .addAll (qs .getParameters ());
311- }
312- if (order != null ) {
313- sb .append (" ORDER BY " ).append (order .toString (repo .getInfo ()));
314- if (desc )
315- sb .append (" DESC" );
316- }
317- if (offset != null && limit == null )
318- limit = Integer .MAX_VALUE ;
319- if (limit != null ) {
320- sb .append (" LIMIT ?" );
321- if (offset != null ) {
322- sb .append (",?" );
323- parameters .add (offset );
324- }
325- parameters .add (limit );
326- }
327- return new QueryString (sb .toString (), SQLMapper .mapParams (repo , parameters ));
328- }
329-
330312 public void finalDelete () {
331- List <Object > parameters = new ArrayList <>();
332- StringBuilder sb = new StringBuilder ("DELETE FROM `" )
333- .append (repo .getInfo ().getTableName ())
334- .append ('`' );
335- if (where .getQueryElements ().size () > 0 ) {
336- QueryString qs = where .getQueryString (repo .getInfo ());
337- sb .append (" WHERE " ).append (qs .getQuery ());
338- parameters = qs .getParameters ();
339- }
313+ SQLQueryString qs = repo .getConnection ().builder ().buildDelete (this );
340314 try {
341- repo .getConnection ().write (sb . toString (), SQLMapper . mapParams ( repo , parameters ).toArray ());
315+ repo .getConnection ().write (qs . getQuery (), qs . getParameters ( ).toArray ());
342316 } catch (SQLException throwables ) {
343317 throw new ORMQueryException (throwables );
344318 }
@@ -364,18 +338,10 @@ public void restore() {
364338 withDeleted ().update (values );
365339 }
366340
367- private void considerSoftDelete () {
368- if (repo .getInfo ().isSoftDelete () && !withDeleted ) {
369- if (where .getQueryElements ().size () > 0 )
370- where .getQueryElements ().add (0 , QueryConjunction .AND );
371- where .getQueryElements ().add (0 , new QueryCondition (new QueryColumn (repo .getInfo ().getColumnName (repo .getInfo ().getSoftDeleteField ())), "IS NULL" , null ));
372- }
373- }
374-
375341 public T refresh (T entity ) {
376- QueryString qs = getQueryString ( false );
342+ SQLQueryString qs = repo . getConnection (). builder (). buildQuery ( this , false );
377343 try {
378- ResultSet rs = repo .getConnection ().read (qs .getQuery (), SQLMapper . mapParams ( repo , SQLMapper . mapParams ( repo , qs .getParameters ()) ).toArray ());
344+ ResultSet rs = repo .getConnection ().read (qs .getQuery (), qs .getParameters ().toArray ());
379345 SQLMapper .mapBack (repo , rs , entity );
380346 repo .getConnection ().close (rs );
381347 return entity ;
@@ -389,39 +355,19 @@ public void update(T entity) {
389355 }
390356
391357 public void update (Map <String , Object > values ) {
392- if (repo .getInfo ().hasUpdated ())
393- values .put (repo .getInfo ().getColumnName (repo .getInfo ().getUpdatedField ()), Timestamp .from (Instant .now ()));
394- List <Object > parameters = new ArrayList <>();
395- List <String > sets = new ArrayList <>();
396- values .forEach ((key , value ) -> {
397- sets .add ("`" + key + "`=?" );
398- parameters .add (value );
399- });
400- StringBuilder sb = new StringBuilder ("UPDATE `" )
401- .append (repo .getInfo ().getTableName ())
402- .append ("` SET " )
403- .append (String .join ("," , sets ));
404- considerSoftDelete ();
405- if (where .getQueryElements ().size () > 0 ) {
406- QueryString qs = where .getQueryString (repo .getInfo ());
407- sb .append (" WHERE " ).append (qs .getQuery ());
408- parameters .addAll (qs .getParameters ());
409- }
410- sb .append (';' );
358+ SQLQueryString queryString = repo .getConnection ().builder ().buildUpdate (this , values );
411359 try {
412- repo .getConnection ().write (sb . toString (), SQLMapper . mapParams ( repo , parameters ).toArray ());
360+ repo .getConnection ().write (queryString . getQuery (), queryString . getParameters ( ).toArray ());
413361 } catch (SQLException throwables ) {
414362 throw new ORMQueryException (throwables );
415363 }
416364 }
417365
418366 public List <T > all () {
419- QueryString qs = getQueryString ( false );
367+ SQLQueryString qs = repo . getConnection (). builder (). buildQuery ( this , false );
420368 try {
421- ResultSet rs = repo .getConnection ().read (qs .getQuery (), SQLMapper .mapParams (repo , qs .getParameters ()).toArray ());
422- List <Class <? extends Model >> joinedModels = new ArrayList <>();
423- joinedModels .addAll (leftJoins .keySet ());
424- List <T > list = SQLMapper .map (repo , rs , joinedModels );
369+ ResultSet rs = repo .getConnection ().read (qs .getQuery (), qs .getParameters ().toArray ());
370+ List <T > list = SQLMapper .map (repo , rs , new ArrayList <>());
425371 repo .getConnection ().close (rs );
426372 return list ;
427373 } catch (SQLException throwables ) {
@@ -445,9 +391,9 @@ public Stream<T> stream() {
445391 }
446392
447393 public int count () {
448- QueryString qs = getQueryString ( true );
394+ SQLQueryString qs = repo . getConnection (). builder (). buildQuery ( this , true );
449395 try {
450- ResultSet rs = repo .getConnection ().read (qs .getQuery (), SQLMapper . mapParams ( repo , qs .getParameters () ).toArray ());
396+ ResultSet rs = repo .getConnection ().read (qs .getQuery (), qs .getParameters ().toArray ());
451397 int c = 0 ;
452398 if (rs .next ())
453399 c = rs .getInt (1 );
0 commit comments