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
018import com.mybatisflex.core.util.LambdaGetter;
019import com.mybatisflex.core.util.LambdaUtil;
020
021import java.util.Collection;
022import java.util.function.Predicate;
023
024public class QueryConditionBuilder {
025
026    private QueryWrapper queryWrapper;
027    private QueryColumn queryColumn;
028    private SqlConnector connector;
029
030    public QueryConditionBuilder(QueryWrapper queryWrapper, QueryColumn queryColumn, SqlConnector connector) {
031        this.queryWrapper = queryWrapper;
032        this.queryColumn = queryColumn;
033        this.connector = connector;
034    }
035
036    /**
037     * equals
038     *
039     * @param value
040     */
041    public QueryWrapper eq(Object value) {
042        if (value != null) {
043            queryWrapper.addWhereQueryCondition(queryColumn.eq(value), connector);
044        }
045        return queryWrapper;
046    }
047
048
049    public <T> QueryWrapper eq(Object value, Predicate<T> when) {
050        if (value != null) {
051            queryWrapper.addWhereQueryCondition(queryColumn.eq(value, when), connector);
052        }
053        return queryWrapper;
054    }
055
056
057    public <T> QueryWrapper eq(LambdaGetter<T> value) {
058        return eq(LambdaUtil.getQueryColumn(value));
059    }
060
061
062    public <T> QueryWrapper eq(LambdaGetter<T> value, Predicate<T> when) {
063        return eq(LambdaUtil.getQueryColumn(value), when);
064    }
065
066
067    /**
068     * not equals !=
069     *
070     * @param value
071     */
072    public QueryWrapper ne(Object value) {
073        if (value != null) {
074            queryWrapper.addWhereQueryCondition(queryColumn.ne(value), connector);
075        }
076        return queryWrapper;
077    }
078
079    public <T> QueryWrapper ne(Object value, Predicate<T> when) {
080        if (value != null) {
081            queryWrapper.addWhereQueryCondition(queryColumn.ne(value, when), connector);
082        }
083        return queryWrapper;
084    }
085
086    public <T> QueryWrapper ne(LambdaGetter<T> value) {
087        return ne(LambdaUtil.getQueryColumn(value));
088    }
089
090
091    public <T> QueryWrapper ne(LambdaGetter<T> value, Predicate<T> when) {
092        return ne(LambdaUtil.getQueryColumn(value), when);
093    }
094
095
096    /**
097     * like %%
098     *
099     * @param value
100     */
101    public QueryWrapper like(Object value) {
102        if (value != null) {
103            queryWrapper.addWhereQueryCondition(queryColumn.like(value), connector);
104        }
105        return queryWrapper;
106    }
107
108    public <T> QueryWrapper like(Object value, Predicate<T> when) {
109        if (value != null) {
110            queryWrapper.addWhereQueryCondition(queryColumn.like(value, when), connector);
111        }
112        return queryWrapper;
113    }
114
115
116    public QueryWrapper likeLeft(Object value) {
117        if (value != null) {
118            queryWrapper.addWhereQueryCondition(queryColumn.likeLeft(value), connector);
119        }
120        return queryWrapper;
121    }
122
123    public <T> QueryWrapper likeLeft(Object value, Predicate<T> when) {
124        if (value != null) {
125            queryWrapper.addWhereQueryCondition(queryColumn.likeLeft(value, when), connector);
126        }
127        return queryWrapper;
128    }
129
130
131    public QueryWrapper likeRight(Object value) {
132        if (value != null) {
133            queryWrapper.addWhereQueryCondition(queryColumn.likeRight(value), connector);
134        }
135        return queryWrapper;
136    }
137
138    public <T> QueryWrapper likeRight(Object value, Predicate<T> when) {
139        if (value != null) {
140            queryWrapper.addWhereQueryCondition(queryColumn.likeRight(value, when), connector);
141        }
142        return queryWrapper;
143    }
144
145    /**
146     * 大于 greater than
147     *
148     * @param value
149     */
150    public QueryWrapper gt(Object value) {
151        if (value != null) {
152            queryWrapper.addWhereQueryCondition(queryColumn.gt(value), connector);
153        }
154        return queryWrapper;
155    }
156
157    public <T> QueryWrapper gt(Object value, Predicate<T> when) {
158        if (value != null) {
159            queryWrapper.addWhereQueryCondition(queryColumn.gt(value, when), connector);
160        }
161        return queryWrapper;
162    }
163
164    public <T> QueryWrapper gt(LambdaGetter<T> value) {
165        return gt(LambdaUtil.getQueryColumn(value));
166    }
167
168
169    public <T> QueryWrapper gt(LambdaGetter<T> value, Predicate<T> when) {
170        return gt(LambdaUtil.getQueryColumn(value), when);
171    }
172
173
174    /**
175     * 大于等于 greater or equal
176     *
177     * @param value
178     */
179    public QueryWrapper ge(Object value) {
180        if (value != null) {
181            queryWrapper.addWhereQueryCondition(queryColumn.ge(value), connector);
182        }
183        return queryWrapper;
184    }
185
186    public <T> QueryWrapper ge(Object value, Predicate<T> when) {
187        if (value != null) {
188            queryWrapper.addWhereQueryCondition(queryColumn.ge(value, when), connector);
189        }
190        return queryWrapper;
191    }
192
193    public <T> QueryWrapper ge(LambdaGetter<T> value) {
194        return ge(LambdaUtil.getQueryColumn(value));
195    }
196
197
198    public <T> QueryWrapper ge(LambdaGetter<T> value, Predicate<T> when) {
199        return ge(LambdaUtil.getQueryColumn(value), when);
200    }
201
202    /**
203     * 小于 less than
204     *
205     * @param value
206     */
207    public QueryWrapper lt(Object value) {
208        if (value != null) {
209            queryWrapper.addWhereQueryCondition(queryColumn.lt(value), connector);
210        }
211        return queryWrapper;
212    }
213
214    public <T> QueryWrapper lt(Object value, Predicate<T> when) {
215        if (value != null) {
216            queryWrapper.addWhereQueryCondition(queryColumn.lt(value, when), connector);
217        }
218        return queryWrapper;
219    }
220
221    public <T> QueryWrapper lt(LambdaGetter<T> value) {
222        return lt(LambdaUtil.getQueryColumn(value));
223    }
224
225
226    public <T> QueryWrapper lt(LambdaGetter<T> value, Predicate<T> when) {
227        return lt(LambdaUtil.getQueryColumn(value), when);
228    }
229
230    /**
231     * 小于等于 less or equal
232     *
233     * @param value
234     */
235    public QueryWrapper le(Object value) {
236        if (value != null) {
237            queryWrapper.addWhereQueryCondition(queryColumn.le(value), connector);
238        }
239        return queryWrapper;
240    }
241
242
243    public <T> QueryWrapper le(Object value, Predicate<T> when) {
244        if (value != null) {
245            queryWrapper.addWhereQueryCondition(queryColumn.le(value, when), connector);
246        }
247        return queryWrapper;
248    }
249
250    public <T> QueryWrapper le(LambdaGetter<T> value) {
251        return le(LambdaUtil.getQueryColumn(value));
252    }
253
254
255    public <T> QueryWrapper le(LambdaGetter<T> value, Predicate<T> when) {
256        return le(LambdaUtil.getQueryColumn(value), when);
257    }
258
259
260    /**
261     * IS NULL
262     *
263     * @return
264     */
265    public QueryWrapper isNull() {
266        queryWrapper.addWhereQueryCondition(queryColumn.isNull(), connector);
267        return queryWrapper;
268    }
269
270    public <T> QueryWrapper isNull(Predicate<T> when) {
271        queryWrapper.addWhereQueryCondition(queryColumn.isNull(when), connector);
272        return queryWrapper;
273    }
274
275
276    /**
277     * IS NOT NULL
278     *
279     * @return
280     */
281    public QueryWrapper isNotNull() {
282        queryWrapper.addWhereQueryCondition(queryColumn.isNotNull(), connector);
283        return queryWrapper;
284    }
285
286    public <T> QueryWrapper isNotNull(Predicate<T> when) {
287        queryWrapper.addWhereQueryCondition(queryColumn.isNotNull(when), connector);
288        return queryWrapper;
289    }
290
291
292    /**
293     * in arrays
294     *
295     * @param arrays
296     * @return
297     */
298    public QueryWrapper in(Object... arrays) {
299        if (arrays != null) {
300            queryWrapper.addWhereQueryCondition(queryColumn.in(arrays), connector);
301        }
302        return queryWrapper;
303    }
304
305    public <T> QueryWrapper in(Object[] arrays, Predicate<T> when) {
306        //忽略 QueryWrapper.in("name", null) 的情况
307        if (arrays != null) {
308            queryWrapper.addWhereQueryCondition(queryColumn.in(arrays, when), connector);
309        }
310        return queryWrapper;
311    }
312
313    /**
314     * in child select
315     *
316     * @param queryWrapper
317     * @return
318     */
319    public QueryWrapper in(QueryWrapper queryWrapper) {
320        if (queryWrapper != null) {
321            this.queryWrapper.addWhereQueryCondition(queryColumn.in(queryWrapper), connector);
322        }
323        return this.queryWrapper;
324    }
325
326    public <T> QueryWrapper in(QueryWrapper queryWrapper, Predicate<T> when) {
327        if (queryWrapper != null) {
328            this.queryWrapper.addWhereQueryCondition(queryColumn.in(queryWrapper, when), connector);
329        }
330        return this.queryWrapper;
331    }
332
333
334    /**
335     * in Collection
336     *
337     * @param collection
338     * @return
339     */
340    public QueryWrapper in(Collection<?> collection) {
341        if (queryWrapper != null) {
342            queryWrapper.addWhereQueryCondition(queryColumn.in(collection), connector);
343        }
344        return queryWrapper;
345    }
346
347    public <T> QueryWrapper in(Collection<?> collection, Predicate<T> when) {
348        if (queryWrapper != null) {
349            queryWrapper.addWhereQueryCondition(queryColumn.in(collection, when), connector);
350        }
351        return queryWrapper;
352    }
353
354    /**
355     * not int arrays
356     *
357     * @param arrays
358     * @return
359     */
360    public QueryWrapper notIn(Object... arrays) {
361        if (queryWrapper != null) {
362            queryWrapper.addWhereQueryCondition(queryColumn.notIn(arrays), connector);
363        }
364        return queryWrapper;
365    }
366
367    public <T> QueryWrapper notIn(Object[] arrays, Predicate<T> when) {
368        if (queryWrapper != null) {
369            queryWrapper.addWhereQueryCondition(queryColumn.notIn(arrays, when), connector);
370        }
371        return queryWrapper;
372    }
373
374
375    /**
376     * not in Collection
377     *
378     * @param collection
379     * @return
380     */
381    public QueryWrapper notIn(Collection<?> collection) {
382        if (queryWrapper != null) {
383            queryWrapper.addWhereQueryCondition(queryColumn.notIn(collection), connector);
384        }
385        return queryWrapper;
386    }
387
388    public <T> QueryWrapper notIn(Collection<?> collection, Predicate<T> when) {
389        if (queryWrapper != null) {
390            queryWrapper.addWhereQueryCondition(queryColumn.notIn(collection, when), connector);
391        }
392        return queryWrapper;
393    }
394
395    /**
396     * not in child select
397     *
398     * @param queryWrapper
399     */
400    public QueryWrapper notIn(QueryWrapper queryWrapper) {
401        if (queryWrapper != null) {
402            this.queryWrapper.addWhereQueryCondition(queryColumn.notIn(queryWrapper), connector);
403        }
404        return this.queryWrapper;
405    }
406
407    public <T> QueryWrapper notIn(QueryWrapper queryWrapper, Predicate<T> when) {
408        if (queryWrapper != null) {
409            this.queryWrapper.addWhereQueryCondition(queryColumn.notIn(queryWrapper, when), connector);
410        }
411        return this.queryWrapper;
412    }
413
414
415    /**
416     * between
417     *
418     * @param start
419     * @param end
420     */
421    public QueryWrapper between(Object start, Object end) {
422        if (queryWrapper != null) {
423            queryWrapper.addWhereQueryCondition(queryColumn.between(start, end), connector);
424        }
425        return queryWrapper;
426    }
427
428
429    public <T> QueryWrapper between(Object start, Object end, Predicate<T> when) {
430        if (queryWrapper != null) {
431            queryWrapper.addWhereQueryCondition(queryColumn.between(start, end, when), connector);
432        }
433        return queryWrapper;
434    }
435
436
437    /**
438     * not between
439     *
440     * @param start
441     * @param end
442     */
443    public QueryWrapper notBetween(Object start, Object end) {
444        if (queryWrapper != null) {
445            queryWrapper.addWhereQueryCondition(queryColumn.notBetween(start, end), connector);
446        }
447        return queryWrapper;
448    }
449
450    public <T> QueryWrapper notBetween(Object start, Object end, Predicate<T> when) {
451        if (queryWrapper != null) {
452            queryWrapper.addWhereQueryCondition(queryColumn.notBetween(start, end, when), connector);
453        }
454        return queryWrapper;
455    }
456
457
458}