001/*
002 *  Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
003 *  <p>
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *  <p>
008 *  http://www.apache.org/licenses/LICENSE-2.0
009 *  <p>
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package com.mybatisflex.core.query;
017
018
019import com.mybatisflex.core.constant.SqlConsts;
020import com.mybatisflex.core.constant.SqlOperator;
021import com.mybatisflex.core.dialect.IDialect;
022import com.mybatisflex.core.exception.FlexExceptions;
023import com.mybatisflex.core.table.TableDef;
024import com.mybatisflex.core.util.*;
025
026import java.util.Collection;
027import java.util.List;
028import java.util.function.BiPredicate;
029import java.util.function.BooleanSupplier;
030import java.util.function.Predicate;
031
032/**
033 * 查询列,描述的是一张表的字段
034 */
035public class QueryColumn implements CloneSupport<QueryColumn>, Conditional<QueryCondition> {
036
037    protected QueryTable table;
038    protected String name;
039    protected String alias;
040
041    private boolean returnCopyByAsMethod = false;
042
043
044    public QueryColumn() {
045    }
046
047    public QueryColumn(String name) {
048        SqlUtil.keepColumnSafely(name);
049        this.name = StringUtil.tryTrim(name);
050    }
051
052    public QueryColumn(String tableName, String name) {
053        SqlUtil.keepColumnSafely(name);
054        this.table = new QueryTable(tableName);
055        this.name = StringUtil.tryTrim(name);
056    }
057
058    public QueryColumn(String schema, String tableName, String name) {
059        SqlUtil.keepColumnSafely(name);
060        this.table = new QueryTable(schema, tableName);
061        this.name = StringUtil.tryTrim(name);
062    }
063
064    public QueryColumn(String schema, String tableName, String name, String alias) {
065        SqlUtil.keepColumnSafely(name);
066        this.returnCopyByAsMethod = true;
067        this.table = new QueryTable(schema, tableName);
068        this.name = StringUtil.tryTrim(name);
069        this.alias = StringUtil.tryTrim(alias);
070    }
071
072    public QueryColumn(QueryTable queryTable, String name) {
073        SqlUtil.keepColumnSafely(name);
074        this.table = queryTable;
075        this.name = StringUtil.tryTrim(name);
076    }
077
078    public QueryColumn(TableDef tableDef, String name) {
079        this(tableDef, name, null);
080    }
081
082    public QueryColumn(TableDef tableDef, String name, String alias) {
083        SqlUtil.keepColumnSafely(name);
084        this.returnCopyByAsMethod = true;
085        this.table = new QueryTable(tableDef);
086        this.name = name;
087        this.alias = alias;
088    }
089
090
091    public QueryTable getTable() {
092        return table;
093    }
094
095    public void setTable(QueryTable table) {
096        this.table = table;
097    }
098
099    public String getName() {
100        return name;
101    }
102
103    public void setName(String name) {
104        this.name = name;
105    }
106
107    public String getAlias() {
108        return alias;
109    }
110
111    public void setAlias(String alias) {
112        this.alias = alias;
113    }
114
115    public <T> QueryColumn as(LambdaGetter<T> fn) {
116        return as(fn, false);
117    }
118
119    public <T> QueryColumn as(LambdaGetter<T> fn, boolean withPrefix) {
120        return as(LambdaUtil.getAliasName(fn, withPrefix));
121    }
122
123    public QueryColumn as(String alias) {
124        SqlUtil.keepColumnSafely(alias);
125        if (returnCopyByAsMethod) {
126            QueryColumn newColumn = new QueryColumn();
127            newColumn.table = this.table;
128            newColumn.name = this.name;
129            newColumn.alias = alias;
130            return newColumn;
131        } else {
132            this.alias = alias;
133            return this;
134        }
135    }
136
137
138    // query methods ///////
139
140    @Override
141    public QueryCondition eq(Object value) {
142        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
143            return QueryCondition.createEmpty();
144        }
145        return QueryCondition.create(this, SqlOperator.EQUALS, value);
146    }
147
148    @Override
149    public QueryCondition eq(Object value, boolean isEffective) {
150        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
151            return QueryCondition.createEmpty();
152        }
153        return QueryCondition.create(this, SqlOperator.EQUALS, value).when(isEffective);
154    }
155
156    @Override
157    public QueryCondition eq(Object value, BooleanSupplier isEffective) {
158        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
159            return QueryCondition.createEmpty();
160        }
161        return QueryCondition.create(this, SqlOperator.EQUALS, value).when(isEffective);
162    }
163
164    @Override
165    public <T> QueryCondition eq(T value, Predicate<T> isEffective) {
166        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
167            return QueryCondition.createEmpty();
168        }
169        return QueryCondition.create(this, SqlOperator.EQUALS, value).when(isEffective.test(value));
170    }
171
172    @Override
173    public QueryCondition ne(Object value) {
174        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
175            return QueryCondition.createEmpty();
176        }
177        return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value);
178    }
179
180    @Override
181    public QueryCondition ne(Object value, boolean isEffective) {
182        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
183            return QueryCondition.createEmpty();
184        }
185        return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value).when(isEffective);
186    }
187
188    @Override
189    public QueryCondition ne(Object value, BooleanSupplier isEffective) {
190        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
191            return QueryCondition.createEmpty();
192        }
193        return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value).when(isEffective);
194    }
195
196    @Override
197    public <T> QueryCondition ne(T value, Predicate<T> isEffective) {
198        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
199            return QueryCondition.createEmpty();
200        }
201        return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value).when(isEffective.test(value));
202    }
203
204    @Override
205    public QueryCondition gt(Object value) {
206        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
207            return QueryCondition.createEmpty();
208        }
209        return QueryCondition.create(this, SqlOperator.GT, value);
210    }
211
212    @Override
213    public QueryCondition gt(Object value, boolean isEffective) {
214        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
215            return QueryCondition.createEmpty();
216        }
217        return QueryCondition.create(this, SqlOperator.GT, value).when(isEffective);
218    }
219
220    @Override
221    public QueryCondition gt(Object value, BooleanSupplier isEffective) {
222        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
223            return QueryCondition.createEmpty();
224        }
225        return QueryCondition.create(this, SqlOperator.GT, value).when(isEffective);
226    }
227
228    @Override
229    public <T> QueryCondition gt(T value, Predicate<T> isEffective) {
230        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
231            return QueryCondition.createEmpty();
232        }
233        return QueryCondition.create(this, SqlOperator.GT, value).when(isEffective.test(value));
234    }
235
236    @Override
237    public QueryCondition ge(Object value) {
238        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
239            return QueryCondition.createEmpty();
240        }
241        return QueryCondition.create(this, SqlOperator.GE, value);
242    }
243
244    @Override
245    public QueryCondition ge(Object value, boolean isEffective) {
246        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
247            return QueryCondition.createEmpty();
248        }
249        return QueryCondition.create(this, SqlOperator.GE, value).when(isEffective);
250    }
251
252    @Override
253    public QueryCondition ge(Object value, BooleanSupplier isEffective) {
254        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
255            return QueryCondition.createEmpty();
256        }
257        return QueryCondition.create(this, SqlOperator.GE, value).when(isEffective);
258    }
259
260    @Override
261    public <T> QueryCondition ge(T value, Predicate<T> isEffective) {
262        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
263            return QueryCondition.createEmpty();
264        }
265        return QueryCondition.create(this, SqlOperator.GE, value).when(isEffective.test(value));
266    }
267
268    @Override
269    public QueryCondition lt(Object value) {
270        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
271            return QueryCondition.createEmpty();
272        }
273        return QueryCondition.create(this, SqlOperator.LT, value);
274    }
275
276    @Override
277    public QueryCondition lt(Object value, boolean isEffective) {
278        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
279            return QueryCondition.createEmpty();
280        }
281        return QueryCondition.create(this, SqlOperator.LT, value).when(isEffective);
282    }
283
284    @Override
285    public QueryCondition lt(Object value, BooleanSupplier isEffective) {
286        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
287            return QueryCondition.createEmpty();
288        }
289        return QueryCondition.create(this, SqlOperator.LT, value).when(isEffective);
290    }
291
292    @Override
293    public <T> QueryCondition lt(T value, Predicate<T> isEffective) {
294        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
295            return QueryCondition.createEmpty();
296        }
297        return QueryCondition.create(this, SqlOperator.LT, value).when(isEffective.test(value));
298    }
299
300    @Override
301    public QueryCondition le(Object value) {
302        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
303            return QueryCondition.createEmpty();
304        }
305        return QueryCondition.create(this, SqlOperator.LE, value);
306    }
307
308    @Override
309    public QueryCondition le(Object value, boolean isEffective) {
310        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
311            return QueryCondition.createEmpty();
312        }
313        return QueryCondition.create(this, SqlOperator.LE, value).when(isEffective);
314    }
315
316    @Override
317    public QueryCondition le(Object value, BooleanSupplier isEffective) {
318        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
319            return QueryCondition.createEmpty();
320        }
321        return QueryCondition.create(this, SqlOperator.LE, value).when(isEffective);
322    }
323
324    @Override
325    public <T> QueryCondition le(T value, Predicate<T> isEffective) {
326        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
327            return QueryCondition.createEmpty();
328        }
329        return QueryCondition.create(this, SqlOperator.LE, value).when(isEffective.test(value));
330    }
331
332    @Override
333    public QueryCondition in(Object... value) {
334        if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) {
335            return QueryCondition.createEmpty();
336        }
337        // IN 里面只有一个值的情况
338        if (value.length == 1) {
339            if (QueryColumnBehavior.shouldIgnoreValue(value[0])) {
340                return QueryCondition.createEmpty();
341            }
342            if (QueryColumnBehavior.isSmartConvertInToEquals()) {
343                return QueryCondition.create(this, SqlOperator.EQUALS, value[0]);
344            }
345        }
346        return QueryCondition.create(this, SqlConsts.IN, value);
347    }
348
349    @Override
350    public QueryCondition in(Object[] value, boolean isEffective) {
351        if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) {
352            return QueryCondition.createEmpty();
353        }
354        // IN 里面只有一个值的情况
355        if (value.length == 1) {
356            if (QueryColumnBehavior.shouldIgnoreValue(value[0])) {
357                return QueryCondition.createEmpty();
358            }
359            if (QueryColumnBehavior.isSmartConvertInToEquals()) {
360                return QueryCondition.create(this, SqlOperator.EQUALS, value[0]).when(isEffective);
361            }
362        }
363        return QueryCondition.create(this, SqlConsts.IN, value).when(isEffective);
364    }
365
366    @Override
367    public QueryCondition in(Object[] value, BooleanSupplier isEffective) {
368        if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) {
369            return QueryCondition.createEmpty();
370        }
371        // IN 里面只有一个值的情况
372        if (value.length == 1) {
373            if (QueryColumnBehavior.shouldIgnoreValue(value[0])) {
374                return QueryCondition.createEmpty();
375            }
376            if (QueryColumnBehavior.isSmartConvertInToEquals()) {
377                return QueryCondition.create(this, SqlOperator.EQUALS, value[0]).when(isEffective);
378            }
379        }
380        return QueryCondition.create(this, SqlConsts.IN, value).when(isEffective);
381    }
382
383    @Override
384    public <T> QueryCondition in(T[] value, Predicate<T[]> isEffective) {
385        if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) {
386            return QueryCondition.createEmpty();
387        }
388        // IN 里面只有一个值的情况
389        if (value.length == 1) {
390            if (QueryColumnBehavior.shouldIgnoreValue(value[0])) {
391                return QueryCondition.createEmpty();
392            }
393            if (QueryColumnBehavior.isSmartConvertInToEquals()) {
394                return QueryCondition.create(this, SqlOperator.EQUALS, value[0]).when(isEffective.test(value));
395            }
396        }
397        return QueryCondition.create(this, SqlConsts.IN, value).when(isEffective.test(value));
398    }
399
400    @Override
401    public QueryCondition in(Collection<?> value) {
402        if (value == null) {
403            return QueryCondition.createEmpty();
404        }
405        return in(value.toArray());
406    }
407
408    @Override
409    public QueryCondition in(Collection<?> value, boolean isEffective) {
410        if (value == null) {
411            return QueryCondition.createEmpty();
412        }
413        return in(value.toArray()).when(isEffective);
414    }
415
416    @Override
417    public QueryCondition in(Collection<?> value, BooleanSupplier isEffective) {
418        if (value == null) {
419            return QueryCondition.createEmpty();
420        }
421        return in(value.toArray()).when(isEffective);
422    }
423
424    @Override
425    public <T extends Collection<?>> QueryCondition in(T value, Predicate<T> isEffective) {
426        if (value == null) {
427            return QueryCondition.createEmpty();
428        }
429        return in(value.toArray()).when(isEffective.test(value));
430    }
431
432    @Override
433    public QueryCondition in(QueryWrapper queryWrapper) {
434        if (queryWrapper == null) {
435            return QueryCondition.createEmpty();
436        }
437        return QueryCondition.create(this, SqlOperator.IN, queryWrapper);
438    }
439
440    @Override
441    public QueryCondition in(QueryWrapper queryWrapper, boolean isEffective) {
442        if (queryWrapper == null) {
443            return QueryCondition.createEmpty();
444        }
445        return QueryCondition.create(this, SqlOperator.IN, queryWrapper).when(isEffective);
446    }
447
448    @Override
449    public QueryCondition in(QueryWrapper queryWrapper, BooleanSupplier isEffective) {
450        if (queryWrapper == null) {
451            return QueryCondition.createEmpty();
452        }
453        return QueryCondition.create(this, SqlOperator.IN, queryWrapper).when(isEffective);
454    }
455
456    @Override
457    public QueryCondition notIn(Object... value) {
458        if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) {
459            return QueryCondition.createEmpty();
460        }
461        // NOT IN 里面只有一个值的情况
462        if (value.length == 1) {
463            if (QueryColumnBehavior.shouldIgnoreValue(value[0])) {
464                return QueryCondition.createEmpty();
465            }
466            if (QueryColumnBehavior.isSmartConvertInToEquals()) {
467                return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value[0]);
468            }
469        }
470        return QueryCondition.create(this, SqlConsts.NOT_IN, value);
471    }
472
473    @Override
474    public QueryCondition notIn(Object[] value, boolean isEffective) {
475        if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) {
476            return QueryCondition.createEmpty();
477        }
478        // NOT IN 里面只有一个值的情况
479        if (value.length == 1) {
480            if (QueryColumnBehavior.shouldIgnoreValue(value[0])) {
481                return QueryCondition.createEmpty();
482            }
483            if (QueryColumnBehavior.isSmartConvertInToEquals()) {
484                return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value[0]).when(isEffective);
485            }
486        }
487        return QueryCondition.create(this, SqlConsts.NOT_IN, value).when(isEffective);
488    }
489
490    @Override
491    public QueryCondition notIn(Object[] value, BooleanSupplier isEffective) {
492        if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) {
493            return QueryCondition.createEmpty();
494        }
495        // NOT IN 里面只有一个值的情况
496        if (value.length == 1) {
497            if (QueryColumnBehavior.shouldIgnoreValue(value[0])) {
498                return QueryCondition.createEmpty();
499            }
500            if (QueryColumnBehavior.isSmartConvertInToEquals()) {
501                return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value[0]).when(isEffective);
502            }
503        }
504        return QueryCondition.create(this, SqlConsts.NOT_IN, value).when(isEffective);
505    }
506
507    @Override
508    public <T> QueryCondition notIn(T[] value, Predicate<T[]> isEffective) {
509        if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) {
510            return QueryCondition.createEmpty();
511        }
512        // NOT IN 里面只有一个值的情况
513        if (value.length == 1) {
514            if (QueryColumnBehavior.shouldIgnoreValue(value[0])) {
515                return QueryCondition.createEmpty();
516            }
517            if (QueryColumnBehavior.isSmartConvertInToEquals()) {
518                return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value[0]).when(isEffective.test(value));
519            }
520        }
521        return QueryCondition.create(this, SqlConsts.NOT_IN, value).when(isEffective.test(value));
522    }
523
524    @Override
525    public QueryCondition notIn(Collection<?> value) {
526        if (value == null) {
527            return QueryCondition.createEmpty();
528        }
529        return notIn(value.toArray());
530    }
531
532    @Override
533    public QueryCondition notIn(Collection<?> value, boolean isEffective) {
534        if (value == null) {
535            return QueryCondition.createEmpty();
536        }
537        return notIn(value.toArray()).when(isEffective);
538    }
539
540    @Override
541    public QueryCondition notIn(Collection<?> value, BooleanSupplier isEffective) {
542        if (value == null) {
543            return QueryCondition.createEmpty();
544        }
545        return notIn(value.toArray()).when(isEffective);
546    }
547
548    @Override
549    public <T extends Collection<?>> QueryCondition notIn(T value, Predicate<T> isEffective) {
550        if (value == null) {
551            return QueryCondition.createEmpty();
552        }
553        return notIn(value.toArray()).when(isEffective.test(value));
554    }
555
556    @Override
557    public QueryCondition notIn(QueryWrapper queryWrapper) {
558        if (queryWrapper == null) {
559            return QueryCondition.createEmpty();
560        }
561        return QueryCondition.create(this, SqlOperator.NOT_IN, queryWrapper);
562    }
563
564    @Override
565    public QueryCondition notIn(QueryWrapper queryWrapper, boolean isEffective) {
566        if (queryWrapper == null) {
567            return QueryCondition.createEmpty();
568        }
569        return QueryCondition.create(this, SqlOperator.NOT_IN, queryWrapper).when(isEffective);
570    }
571
572    @Override
573    public QueryCondition notIn(QueryWrapper queryWrapper, BooleanSupplier isEffective) {
574        if (queryWrapper == null) {
575            return QueryCondition.createEmpty();
576        }
577        return QueryCondition.create(this, SqlOperator.NOT_IN, queryWrapper).when(isEffective);
578    }
579
580    @Override
581    public QueryCondition between(Object start, Object end) {
582        return QueryCondition.create(this, SqlOperator.BETWEEN, new Object[]{start, end});
583    }
584
585    @Override
586    public QueryCondition between(Object start, Object end, boolean isEffective) {
587        return QueryCondition.create(this, SqlOperator.BETWEEN, new Object[]{start, end}).when(isEffective);
588    }
589
590    @Override
591    public QueryCondition between(Object start, Object end, BooleanSupplier isEffective) {
592        return QueryCondition.create(this, SqlOperator.BETWEEN, new Object[]{start, end}).when(isEffective);
593    }
594
595    @Override
596    public <S, E> QueryCondition between(S start, E end, BiPredicate<S, E> isEffective) {
597        return QueryCondition.create(this, SqlOperator.BETWEEN, new Object[]{start, end}).when(isEffective.test(start, end));
598    }
599
600    @Override
601    public QueryCondition notBetween(Object start, Object end) {
602        return QueryCondition.create(this, SqlOperator.NOT_BETWEEN, new Object[]{start, end});
603    }
604
605    @Override
606    public QueryCondition notBetween(Object start, Object end, boolean isEffective) {
607        return QueryCondition.create(this, SqlOperator.NOT_BETWEEN, new Object[]{start, end}).when(isEffective);
608    }
609
610    @Override
611    public QueryCondition notBetween(Object start, Object end, BooleanSupplier isEffective) {
612        return QueryCondition.create(this, SqlOperator.NOT_BETWEEN, new Object[]{start, end}).when(isEffective);
613    }
614
615    @Override
616    public <S, E> QueryCondition notBetween(S start, E end, BiPredicate<S, E> isEffective) {
617        return QueryCondition.create(this, SqlOperator.NOT_BETWEEN, new Object[]{start, end}).when(isEffective.test(start, end));
618    }
619
620    @Override
621    public QueryCondition like(Object value) {
622        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
623            return QueryCondition.createEmpty();
624        }
625        return QueryCondition.create(this, SqlOperator.LIKE, "%" + value + "%");
626    }
627
628    @Override
629    public QueryCondition like(Object value, boolean isEffective) {
630        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
631            return QueryCondition.createEmpty();
632        }
633        return QueryCondition.create(this, SqlOperator.LIKE, "%" + value + "%").when(isEffective);
634    }
635
636    @Override
637    public QueryCondition like(Object value, BooleanSupplier isEffective) {
638        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
639            return QueryCondition.createEmpty();
640        }
641        return QueryCondition.create(this, SqlOperator.LIKE, "%" + value + "%").when(isEffective);
642    }
643
644    @Override
645    public <T> QueryCondition like(T value, Predicate<T> isEffective) {
646        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
647            return QueryCondition.createEmpty();
648        }
649        return QueryCondition.create(this, SqlOperator.LIKE, "%" + value + "%").when(isEffective.test(value));
650    }
651
652    @Override
653    public QueryCondition likeLeft(Object value) {
654        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
655            return QueryCondition.createEmpty();
656        }
657        return QueryCondition.create(this, SqlOperator.LIKE, value + "%");
658    }
659
660    @Override
661    public QueryCondition likeLeft(Object value, boolean isEffective) {
662        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
663            return QueryCondition.createEmpty();
664        }
665        return QueryCondition.create(this, SqlOperator.LIKE, value + "%").when(isEffective);
666    }
667
668    @Override
669    public QueryCondition likeLeft(Object value, BooleanSupplier isEffective) {
670        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
671            return QueryCondition.createEmpty();
672        }
673        return QueryCondition.create(this, SqlOperator.LIKE, value + "%").when(isEffective);
674    }
675
676    @Override
677    public <T> QueryCondition likeLeft(T value, Predicate<T> isEffective) {
678        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
679            return QueryCondition.createEmpty();
680        }
681        return QueryCondition.create(this, SqlOperator.LIKE, value + "%").when(isEffective.test(value));
682    }
683
684    @Override
685    public QueryCondition likeRight(Object value) {
686        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
687            return QueryCondition.createEmpty();
688        }
689        return QueryCondition.create(this, SqlOperator.LIKE, "%" + value);
690    }
691
692    @Override
693    public QueryCondition likeRight(Object value, boolean isEffective) {
694        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
695            return QueryCondition.createEmpty();
696        }
697        return QueryCondition.create(this, SqlOperator.LIKE, "%" + value).when(isEffective);
698    }
699
700    @Override
701    public QueryCondition likeRight(Object value, BooleanSupplier isEffective) {
702        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
703            return QueryCondition.createEmpty();
704        }
705        return QueryCondition.create(this, SqlOperator.LIKE, "%" + value).when(isEffective);
706    }
707
708    @Override
709    public <T> QueryCondition likeRight(T value, Predicate<T> isEffective) {
710        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
711            return QueryCondition.createEmpty();
712        }
713        return QueryCondition.create(this, SqlOperator.LIKE, "%" + value).when(isEffective.test(value));
714    }
715
716    /**
717     * {@code LIKE value}
718     */
719    public QueryCondition likeRaw(Object value) {
720        return likeRaw(value, true);
721    }
722
723    /**
724     * {@code LIKE value}
725     */
726    public QueryCondition likeRaw(Object value, boolean isEffective) {
727        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
728            return QueryCondition.createEmpty();
729        }
730        return QueryCondition.create(this, SqlOperator.LIKE, value).when(isEffective);
731    }
732
733    /**
734     * {@code LIKE value}
735     */
736    public QueryCondition likeRaw(Object value, BooleanSupplier isEffective) {
737        return likeRaw(value, isEffective.getAsBoolean());
738    }
739
740    /**
741     * {@code LIKE value}
742     */
743    public <T> QueryCondition likeRaw(T value, Predicate<T> isEffective) {
744        return likeRaw(value, isEffective.test(value));
745    }
746
747    @Override
748    public QueryCondition notLike(Object value) {
749        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
750            return QueryCondition.createEmpty();
751        }
752        return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value + "%");
753    }
754
755    @Override
756    public QueryCondition notLike(Object value, boolean isEffective) {
757        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
758            return QueryCondition.createEmpty();
759        }
760        return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value + "%").when(isEffective);
761    }
762
763    @Override
764    public QueryCondition notLike(Object value, BooleanSupplier isEffective) {
765        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
766            return QueryCondition.createEmpty();
767        }
768        return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value + "%").when(isEffective);
769    }
770
771    @Override
772    public <T> QueryCondition notLike(T value, Predicate<T> isEffective) {
773        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
774            return QueryCondition.createEmpty();
775        }
776        return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value + "%").when(isEffective.test(value));
777    }
778
779    @Override
780    public QueryCondition notLikeLeft(Object value) {
781        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
782            return QueryCondition.createEmpty();
783        }
784        return QueryCondition.create(this, SqlOperator.NOT_LIKE, value + "%");
785    }
786
787    @Override
788    public QueryCondition notLikeLeft(Object value, boolean isEffective) {
789        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
790            return QueryCondition.createEmpty();
791        }
792        return QueryCondition.create(this, SqlOperator.NOT_LIKE, value + "%").when(isEffective);
793    }
794
795    @Override
796    public QueryCondition notLikeLeft(Object value, BooleanSupplier isEffective) {
797        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
798            return QueryCondition.createEmpty();
799        }
800        return QueryCondition.create(this, SqlOperator.NOT_LIKE, value + "%").when(isEffective);
801    }
802
803    @Override
804    public <T> QueryCondition notLikeLeft(T value, Predicate<T> isEffective) {
805        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
806            return QueryCondition.createEmpty();
807        }
808        return QueryCondition.create(this, SqlOperator.NOT_LIKE, value + "%").when(isEffective.test(value));
809    }
810
811    @Override
812    public QueryCondition notLikeRight(Object value) {
813        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
814            return QueryCondition.createEmpty();
815        }
816        return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value);
817    }
818
819    @Override
820    public QueryCondition notLikeRight(Object value, boolean isEffective) {
821        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
822            return QueryCondition.createEmpty();
823        }
824        return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value).when(isEffective);
825    }
826
827    @Override
828    public QueryCondition notLikeRight(Object value, BooleanSupplier isEffective) {
829        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
830            return QueryCondition.createEmpty();
831        }
832        return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value).when(isEffective);
833    }
834
835    @Override
836    public <T> QueryCondition notLikeRight(T value, Predicate<T> isEffective) {
837        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
838            return QueryCondition.createEmpty();
839        }
840        return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value).when(isEffective.test(value));
841    }
842
843    /**
844     * {@code NOT LIKE value}
845     */
846    public QueryCondition notLikeRaw(Object value) {
847        return likeRaw(value, true);
848    }
849
850    /**
851     * {@code NOT LIKE value}
852     */
853    public QueryCondition notLikeRaw(Object value, boolean isEffective) {
854        if (QueryColumnBehavior.shouldIgnoreValue(value)) {
855            return QueryCondition.createEmpty();
856        }
857        return QueryCondition.create(this, SqlOperator.NOT_LIKE, value).when(isEffective);
858    }
859
860    /**
861     * {@code NOT LIKE value}
862     */
863    public QueryCondition notLikeRaw(Object value, BooleanSupplier isEffective) {
864        return likeRaw(value, isEffective.getAsBoolean());
865    }
866
867    /**
868     * {@code NOT LIKE value}
869     */
870    public <T> QueryCondition notLikeRaw(T value, Predicate<T> isEffective) {
871        return likeRaw(value, isEffective.test(value));
872    }
873
874    @Override
875    public QueryCondition isNull(boolean isEffective) {
876        return QueryCondition.create(this, SqlOperator.IS_NULL, null).when(isEffective);
877    }
878
879    @Override
880    public QueryCondition isNotNull(boolean isEffective) {
881        return QueryCondition.create(this, SqlOperator.IS_NOT_NULL, null).when(isEffective);
882    }
883
884
885    ////order by ////
886    public QueryOrderBy asc() {
887        return new QueryOrderBy(this, SqlConsts.ASC);
888    }
889
890
891    public QueryOrderBy desc() {
892        return new QueryOrderBy(this, SqlConsts.DESC);
893    }
894
895
896    // 运算 加减乘除 + - * /
897    public QueryColumn add(QueryColumn queryColumn) {
898        return new ArithmeticQueryColumn(this).add(queryColumn);
899    }
900
901    public QueryColumn add(Number number) {
902        return new ArithmeticQueryColumn(this).add(number);
903    }
904
905    public QueryColumn subtract(QueryColumn queryColumn) {
906        return new ArithmeticQueryColumn(this).subtract(queryColumn);
907    }
908
909    public QueryColumn subtract(Number number) {
910        return new ArithmeticQueryColumn(this).subtract(number);
911    }
912
913    public QueryColumn multiply(QueryColumn queryColumn) {
914        return new ArithmeticQueryColumn(this).multiply(queryColumn);
915    }
916
917    public QueryColumn multiply(Number number) {
918        return new ArithmeticQueryColumn(this).multiply(number);
919    }
920
921    public QueryColumn divide(QueryColumn queryColumn) {
922        return new ArithmeticQueryColumn(this).divide(queryColumn);
923    }
924
925    public QueryColumn divide(Number number) {
926        return new ArithmeticQueryColumn(this).divide(number);
927    }
928
929
930    String toConditionSql(List<QueryTable> queryTables, IDialect dialect) {
931        QueryTable selectTable = getSelectTable(queryTables, table);
932        if (selectTable == null) {
933            return dialect.wrap(name);
934        } else {
935            if (StringUtil.isNotBlank(selectTable.alias)) {
936                return dialect.wrap(selectTable.alias) + SqlConsts.REFERENCE + dialect.wrap(name);
937            } else if (StringUtil.isNotBlank(selectTable.getSchema()) && StringUtil.isNotBlank(selectTable.getName())) {
938                return dialect.wrap(dialect.getRealSchema(selectTable.schema)) + SqlConsts.REFERENCE + dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name);
939            } else if (StringUtil.isNotBlank(selectTable.getName())) {
940                return dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name);
941            } else {
942                return dialect.wrap(name);
943            }
944        }
945    }
946
947
948    String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
949        return toConditionSql(queryTables, dialect) + WrapperUtil.buildAlias(alias, dialect);
950    }
951
952
953    QueryTable getSelectTable(List<QueryTable> queryTables, QueryTable selfTable) {
954        //未查询任何表
955        if (queryTables == null || queryTables.isEmpty()) {
956            return null;
957        }
958
959        if (selfTable != null && StringUtil.isNotBlank(selfTable.alias)) {
960            return selfTable;
961        }
962
963        if (queryTables.size() == 1 && queryTables.get(0).isSameTable(selfTable)) {
964            //ignore table
965            return null;
966        }
967
968        if (CollectionUtil.isEmpty(queryTables)) {
969            return selfTable;
970        }
971
972        if (selfTable == null && queryTables.size() == 1) {
973            return queryTables.get(0);
974        }
975
976        for (QueryTable table : queryTables) {
977            if (table.isSameTable(selfTable)) {
978                return table;
979            }
980        }
981        return selfTable;
982    }
983
984
985    @Override
986    public String toString() {
987        return "QueryColumn{" +
988            "table=" + table +
989            ", name='" + name + '\'' +
990            ", alias='" + alias + '\'' +
991            '}';
992    }
993
994
995    @Override
996    public QueryColumn clone() {
997        try {
998            QueryColumn clone = (QueryColumn) super.clone();
999            // deep clone ...
1000            clone.table = ObjectUtil.clone(this.table);
1001            return clone;
1002        } catch (CloneNotSupportedException e) {
1003            throw FlexExceptions.wrap(e);
1004        }
1005    }
1006
1007}