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 */
016
017package com.mybatisflex.core.query;
018
019import java.util.Collection;
020import java.util.function.BiPredicate;
021import java.util.function.BooleanSupplier;
022import java.util.function.Predicate;
023
024/**
025 * 动态条件查询接口。
026 *
027 * @param <R> 链式调用返回值类型
028 * @author 王帅
029 * @since 2023-08-12
030 */
031@SuppressWarnings("unused")
032public interface Conditional<R> {
033
034    /**
035     * 等于 {@code =}
036     *
037     * @param value 条件的值
038     */
039    R eq(Object value);
040
041    /**
042     * 等于 {@code =}
043     *
044     * @param value       条件的值
045     * @param isEffective 是否有效
046     */
047    R eq(Object value, boolean isEffective);
048
049    /**
050     * 等于 {@code =}
051     *
052     * @param value       条件的值
053     * @param isEffective 是否有效
054     */
055    R eq(Object value, BooleanSupplier isEffective);
056
057    /**
058     * 等于 {@code =}
059     *
060     * @param value       条件的值
061     * @param isEffective 是否生效
062     */
063    <T> R eq(T value, Predicate<T> isEffective);
064
065    /**
066     * 不等于 {@code !=}
067     *
068     * @param value 条件的值
069     */
070    R ne(Object value);
071
072    /**
073     * 不等于 {@code !=}
074     *
075     * @param value       条件的值
076     * @param isEffective 是否有效
077     */
078    R ne(Object value, boolean isEffective);
079
080    /**
081     * 不等于 {@code !=}
082     *
083     * @param value       条件的值
084     * @param isEffective 是否有效
085     */
086    R ne(Object value, BooleanSupplier isEffective);
087
088    /**
089     * 不等于 {@code !=}
090     *
091     * @param value       条件的值
092     * @param isEffective 是否有效
093     */
094    <T> R ne(T value, Predicate<T> isEffective);
095
096    /**
097     * 大于 {@code >}
098     *
099     * @param value 条件的值
100     */
101    R gt(Object value);
102
103    /**
104     * 大于 {@code >}
105     *
106     * @param value       条件的值
107     * @param isEffective 是否有效
108     */
109    R gt(Object value, boolean isEffective);
110
111    /**
112     * 大于 {@code >}
113     *
114     * @param value       条件的值
115     * @param isEffective 是否有效
116     */
117    R gt(Object value, BooleanSupplier isEffective);
118
119    /**
120     * 大于 {@code >}
121     *
122     * @param value       条件的值
123     * @param isEffective 是否有效
124     */
125    <T> R gt(T value, Predicate<T> isEffective);
126
127    /**
128     * 大于等于 {@code >=}
129     *
130     * @param value 条件的值
131     */
132    R ge(Object value);
133
134    /**
135     * 大于等于 {@code >=}
136     *
137     * @param value       条件的值
138     * @param isEffective 是否有效
139     */
140    R ge(Object value, boolean isEffective);
141
142    /**
143     * 大于等于 {@code >=}
144     *
145     * @param value       条件的值
146     * @param isEffective 是否有效
147     */
148    R ge(Object value, BooleanSupplier isEffective);
149
150    /**
151     * 大于等于 {@code >=}
152     *
153     * @param value       条件的值
154     * @param isEffective 是否有效
155     */
156    <T> R ge(T value, Predicate<T> isEffective);
157
158    /**
159     * 小于 {@code <}
160     *
161     * @param value 条件的值
162     */
163    R lt(Object value);
164
165    /**
166     * 小于 {@code <}
167     *
168     * @param value       条件的值
169     * @param isEffective 是否有效
170     */
171    R lt(Object value, boolean isEffective);
172
173    /**
174     * 小于 {@code <}
175     *
176     * @param value       条件的值
177     * @param isEffective 是否有效
178     */
179    R lt(Object value, BooleanSupplier isEffective);
180
181    /**
182     * 小于 {@code <}
183     *
184     * @param value       条件的值
185     * @param isEffective 是否有效
186     */
187    <T> R lt(T value, Predicate<T> isEffective);
188
189    /**
190     * 小于等于 {@code <=}
191     *
192     * @param value 条件的值
193     */
194    R le(Object value);
195
196    /**
197     * 小于等于 {@code <=}
198     *
199     * @param value       条件的值
200     * @param isEffective 是否有效
201     */
202    R le(Object value, boolean isEffective);
203
204    /**
205     * 小于等于 {@code <=}
206     *
207     * @param value       条件的值
208     * @param isEffective 是否有效
209     */
210    R le(Object value, BooleanSupplier isEffective);
211
212    /**
213     * 小于等于 {@code <=}
214     *
215     * @param value       条件的值
216     * @param isEffective 是否有效
217     */
218    <T> R le(T value, Predicate<T> isEffective);
219
220    /**
221     * {@code IN(value)}
222     *
223     * @param value 条件的值
224     */
225    R in(Object... value);
226
227    /**
228     * {@code IN(value)}
229     *
230     * @param value       条件的值
231     * @param isEffective 是否有效
232     */
233    R in(Object[] value, boolean isEffective);
234
235    /**
236     * {@code IN(value)}
237     *
238     * @param value       条件的值
239     * @param isEffective 是否有效
240     */
241    R in(Object[] value, BooleanSupplier isEffective);
242
243    /**
244     * {@code IN(value)}
245     *
246     * @param value       条件的值
247     * @param isEffective 是否有效
248     */
249    <T> R in(T[] value, Predicate<T[]> isEffective);
250
251    /**
252     * {@code IN(value)}
253     *
254     * @param value 条件的值
255     */
256    R in(Collection<?> value);
257
258    /**
259     * {@code IN(value)}
260     *
261     * @param value       条件的值
262     * @param isEffective 是否有效
263     */
264    R in(Collection<?> value, boolean isEffective);
265
266    /**
267     * {@code IN(value)}
268     *
269     * @param value       条件的值
270     * @param isEffective 是否有效
271     */
272    R in(Collection<?> value, BooleanSupplier isEffective);
273
274    /**
275     * {@code IN(value)}
276     *
277     * @param value       条件的值
278     * @param isEffective 是否有效
279     */
280    <T extends Collection<?>> R in(T value, Predicate<T> isEffective);
281
282    /**
283     * {@code IN(value)}
284     *
285     * @param queryWrapper 子查询值
286     */
287    R in(QueryWrapper queryWrapper);
288
289    /**
290     * {@code IN(value)}
291     *
292     * @param queryWrapper 子查询值
293     * @param isEffective  是否有效
294     */
295    R in(QueryWrapper queryWrapper, boolean isEffective);
296
297    /**
298     * {@code IN(value)}
299     *
300     * @param queryWrapper 子查询值
301     * @param isEffective  是否有效
302     */
303    R in(QueryWrapper queryWrapper, BooleanSupplier isEffective);
304
305    /**
306     * {@code NOT IN(value)}
307     *
308     * @param value 条件的值
309     */
310    R notIn(Object... value);
311
312    /**
313     * {@code NOT IN(value)}
314     *
315     * @param value       条件的值
316     * @param isEffective 是否有效
317     */
318    R notIn(Object[] value, boolean isEffective);
319
320    /**
321     * {@code NOT IN(value)}
322     *
323     * @param value       条件的值
324     * @param isEffective 是否有效
325     */
326    R notIn(Object[] value, BooleanSupplier isEffective);
327
328    /**
329     * {@code NOT IN(value)}
330     *
331     * @param value       条件的值
332     * @param isEffective 是否有效
333     */
334    <T> R notIn(T[] value, Predicate<T[]> isEffective);
335
336    /**
337     * {@code NOT IN(value)}
338     *
339     * @param value 条件的值
340     */
341    R notIn(Collection<?> value);
342
343    /**
344     * {@code NOT IN(value)}
345     *
346     * @param value       条件的值
347     * @param isEffective 是否有效
348     */
349    R notIn(Collection<?> value, boolean isEffective);
350
351    /**
352     * {@code NOT IN(value)}
353     *
354     * @param value       条件的值
355     * @param isEffective 是否有效
356     */
357    R notIn(Collection<?> value, BooleanSupplier isEffective);
358
359    /**
360     * {@code NOT IN(value)}
361     *
362     * @param value       条件的值
363     * @param isEffective 是否有效
364     */
365    <T extends Collection<?>> R notIn(T value, Predicate<T> isEffective);
366
367    /**
368     * {@code NOT IN(value)}
369     *
370     * @param queryWrapper 子查询值
371     */
372    R notIn(QueryWrapper queryWrapper);
373
374    /**
375     * {@code NOT IN(value)}
376     *
377     * @param queryWrapper 子查询值
378     * @param isEffective  是否有效
379     */
380    R notIn(QueryWrapper queryWrapper, boolean isEffective);
381
382    /**
383     * {@code NOT IN(value)}
384     *
385     * @param queryWrapper 子查询值
386     * @param isEffective  是否有效
387     */
388    R notIn(QueryWrapper queryWrapper, BooleanSupplier isEffective);
389
390    /**
391     * {@code BETWEEN values[0] AND values[1]}
392     *
393     * @param values 范围值
394     */
395    R between(Object[] values);
396
397    /**
398     * {@code BETWEEN values[0] AND values[1]}
399     *
400     * @param values 值
401     * @param isEffective 是否有效
402     */
403    R between(Object[] values, boolean isEffective);
404
405    /**
406     * {@code BETWEEN start AND end}
407     *
408     * @param start 开始的值
409     * @param end   结束的值
410     */
411    R between(Object start, Object end);
412
413    /**
414     * {@code BETWEEN start AND end}
415     *
416     * @param start       开始的值
417     * @param end         结束的值
418     * @param isEffective 是否有效
419     */
420    R between(Object start, Object end, boolean isEffective);
421
422    /**
423     * {@code BETWEEN start AND end}
424     *
425     * @param start       开始的值
426     * @param end         结束的值
427     * @param isEffective 是否有效
428     */
429    R between(Object start, Object end, BooleanSupplier isEffective);
430
431    /**
432     * {@code BETWEEN start AND end}
433     *
434     * @param start       开始的值
435     * @param end         结束的值
436     * @param isEffective 是否有效
437     */
438    <S, E> R between(S start, E end, BiPredicate<S, E> isEffective);
439
440    /**
441     * {@code NOT BETWEEN values[0] AND values[1]}
442     *
443     * @param values 范围值
444     */
445    R notBetween(Object[] values);
446
447    /**
448     * {@code NOT BETWEEN values[0] AND values[1]}
449     *
450     * @param values 值
451     * @param isEffective 是否有效
452     */
453    R notBetween(Object[] values, boolean isEffective);
454
455    /**
456     * {@code NOT BETWEEN start AND end}
457     *
458     * @param start 开始的值
459     * @param end   结束的值
460     */
461    R notBetween(Object start, Object end);
462
463    /**
464     * {@code NOT BETWEEN start AND end}
465     *
466     * @param start       开始的值
467     * @param end         结束的值
468     * @param isEffective 是否有效
469     */
470    R notBetween(Object start, Object end, boolean isEffective);
471
472    /**
473     * {@code NOT BETWEEN start AND end}
474     *
475     * @param start       开始的值
476     * @param end         结束的值
477     * @param isEffective 是否有效
478     */
479    R notBetween(Object start, Object end, BooleanSupplier isEffective);
480
481    /**
482     * {@code NOT BETWEEN start AND end}
483     *
484     * @param start       开始的值
485     * @param end         结束的值
486     * @param isEffective 是否有效
487     */
488    <S, E> R notBetween(S start, E end, BiPredicate<S, E> isEffective);
489
490    /**
491     * {@code LIKE %value%}
492     *
493     * @param value 条件的值
494     */
495    R like(Object value);
496
497    /**
498     * {@code LIKE %value%}
499     *
500     * @param value       条件的值
501     * @param isEffective 是否有效
502     */
503    R like(Object value, boolean isEffective);
504
505    /**
506     * {@code LIKE %value%}
507     *
508     * @param value       条件的值
509     * @param isEffective 是否有效
510     */
511    R like(Object value, BooleanSupplier isEffective);
512
513    /**
514     * {@code LIKE %value%}
515     *
516     * @param value       条件的值
517     * @param isEffective 是否有效
518     */
519    <T> R like(T value, Predicate<T> isEffective);
520
521    /**
522     * {@code LIKE value%}
523     *
524     * @param value 条件的值
525     */
526    R likeLeft(Object value);
527
528    /**
529     * {@code LIKE value%}
530     *
531     * @param value       条件的值
532     * @param isEffective 是否有效
533     */
534    R likeLeft(Object value, boolean isEffective);
535
536    /**
537     * {@code LIKE value%}
538     *
539     * @param value       条件的值
540     * @param isEffective 是否有效
541     */
542    R likeLeft(Object value, BooleanSupplier isEffective);
543
544    /**
545     * {@code LIKE value%}
546     *
547     * @param value       条件的值
548     * @param isEffective 是否有效
549     */
550    <T> R likeLeft(T value, Predicate<T> isEffective);
551
552    /**
553     * {@code LIKE %value}
554     *
555     * @param value 条件的值
556     */
557    R likeRight(Object value);
558
559    /**
560     * {@code LIKE %value}
561     *
562     * @param value       条件的值
563     * @param isEffective 是否有效
564     */
565    R likeRight(Object value, boolean isEffective);
566
567    /**
568     * {@code LIKE %value}
569     *
570     * @param value       条件的值
571     * @param isEffective 是否有效
572     */
573    R likeRight(Object value, BooleanSupplier isEffective);
574
575    /**
576     * {@code LIKE %value}
577     *
578     * @param value       条件的值
579     * @param isEffective 是否有效
580     */
581    <T> R likeRight(T value, Predicate<T> isEffective);
582
583    /**
584     * {@code NOT LIKE %value%}
585     *
586     * @param value 条件的值
587     */
588    R notLike(Object value);
589
590    /**
591     * {@code NOT LIKE %value%}
592     *
593     * @param value       条件的值
594     * @param isEffective 是否有效
595     */
596    R notLike(Object value, boolean isEffective);
597
598    /**
599     * {@code NOT LIKE %value%}
600     *
601     * @param value       条件的值
602     * @param isEffective 是否有效
603     */
604    R notLike(Object value, BooleanSupplier isEffective);
605
606    /**
607     * {@code NOT LIKE %value%}
608     *
609     * @param value       条件的值
610     * @param isEffective 是否有效
611     */
612    <T> R notLike(T value, Predicate<T> isEffective);
613
614    /**
615     * {@code NOT LIKE value%}
616     *
617     * @param value 条件的值
618     */
619    R notLikeLeft(Object value);
620
621    /**
622     * {@code NOT LIKE value%}
623     *
624     * @param value       条件的值
625     * @param isEffective 是否有效
626     */
627    R notLikeLeft(Object value, boolean isEffective);
628
629    /**
630     * {@code NOT LIKE value%}
631     *
632     * @param value       条件的值
633     * @param isEffective 是否有效
634     */
635    R notLikeLeft(Object value, BooleanSupplier isEffective);
636
637    /**
638     * {@code NOT LIKE value%}
639     *
640     * @param value       条件的值
641     * @param isEffective 是否有效
642     */
643    <T> R notLikeLeft(T value, Predicate<T> isEffective);
644
645    /**
646     * {@code NOT LIKE %value}
647     *
648     * @param value 条件的值
649     */
650    R notLikeRight(Object value);
651
652    /**
653     * {@code NOT LIKE %value}
654     *
655     * @param value       条件的值
656     * @param isEffective 是否有效
657     */
658    R notLikeRight(Object value, boolean isEffective);
659
660    /**
661     * {@code NOT LIKE %value}
662     *
663     * @param value       条件的值
664     * @param isEffective 是否有效
665     */
666    R notLikeRight(Object value, BooleanSupplier isEffective);
667
668    /**
669     * {@code NOT LIKE %value}
670     *
671     * @param value       条件的值
672     * @param isEffective 是否有效
673     */
674    <T> R notLikeRight(T value, Predicate<T> isEffective);
675
676    /**
677     * {@code IS NULL}
678     */
679    default R isNull() {
680        return isNull(true);
681    }
682
683    /**
684     * {@code IS NULL}
685     *
686     * @param isEffective 是否有效
687     */
688    R isNull(boolean isEffective);
689
690    /**
691     * {@code IS NULL}
692     *
693     * @param isEffective 是否有效
694     */
695    default R isNull(BooleanSupplier isEffective) {
696        return isNull(isEffective.getAsBoolean());
697    }
698
699    /**
700     * {@code IS NOT NULL}
701     */
702    default R isNotNull() {
703        return isNotNull(true);
704    }
705
706    /**
707     * {@code IS NOT NULL}
708     *
709     * @param isEffective 是否有效
710     */
711    R isNotNull(boolean isEffective);
712
713    /**
714     * {@code IS NOT NULL}
715     *
716     * @param isEffective 是否有效
717     */
718    default R isNotNull(BooleanSupplier isEffective) {
719        return isNotNull(isEffective.getAsBoolean());
720    }
721
722}