Skip to content

Commit a2fec6a

Browse files
committed
Properly handle nullability in the when present conditions
1 parent 5fb069d commit a2fec6a

27 files changed

+1532
-147
lines changed

src/main/java/org/mybatis/dynamic/sql/SqlBuilder.java

Lines changed: 61 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Objects;
2222
import java.util.function.Supplier;
2323

24+
import org.jspecify.annotations.NonNull;
2425
import org.jspecify.annotations.Nullable;
2526
import org.mybatis.dynamic.sql.delete.DeleteDSL;
2627
import org.mybatis.dynamic.sql.delete.DeleteModel;
@@ -62,14 +63,18 @@
6263
import org.mybatis.dynamic.sql.util.Buildable;
6364
import org.mybatis.dynamic.sql.where.WhereDSL;
6465
import org.mybatis.dynamic.sql.where.condition.IsBetween;
66+
import org.mybatis.dynamic.sql.where.condition.IsBetweenWhenPresent;
6567
import org.mybatis.dynamic.sql.where.condition.IsEqualTo;
6668
import org.mybatis.dynamic.sql.where.condition.IsEqualToColumn;
69+
import org.mybatis.dynamic.sql.where.condition.IsEqualToWhenPresent;
6770
import org.mybatis.dynamic.sql.where.condition.IsEqualToWithSubselect;
6871
import org.mybatis.dynamic.sql.where.condition.IsGreaterThan;
6972
import org.mybatis.dynamic.sql.where.condition.IsGreaterThanColumn;
7073
import org.mybatis.dynamic.sql.where.condition.IsGreaterThanOrEqualTo;
7174
import org.mybatis.dynamic.sql.where.condition.IsGreaterThanOrEqualToColumn;
75+
import org.mybatis.dynamic.sql.where.condition.IsGreaterThanOrEqualToWhenPresent;
7276
import org.mybatis.dynamic.sql.where.condition.IsGreaterThanOrEqualToWithSubselect;
77+
import org.mybatis.dynamic.sql.where.condition.IsGreaterThanWhenPresent;
7378
import org.mybatis.dynamic.sql.where.condition.IsGreaterThanWithSubselect;
7479
import org.mybatis.dynamic.sql.where.condition.IsIn;
7580
import org.mybatis.dynamic.sql.where.condition.IsInCaseInsensitive;
@@ -80,13 +85,19 @@
8085
import org.mybatis.dynamic.sql.where.condition.IsLessThanColumn;
8186
import org.mybatis.dynamic.sql.where.condition.IsLessThanOrEqualTo;
8287
import org.mybatis.dynamic.sql.where.condition.IsLessThanOrEqualToColumn;
88+
import org.mybatis.dynamic.sql.where.condition.IsLessThanOrEqualToWhenPresent;
8389
import org.mybatis.dynamic.sql.where.condition.IsLessThanOrEqualToWithSubselect;
90+
import org.mybatis.dynamic.sql.where.condition.IsLessThanWhenPresent;
8491
import org.mybatis.dynamic.sql.where.condition.IsLessThanWithSubselect;
8592
import org.mybatis.dynamic.sql.where.condition.IsLike;
8693
import org.mybatis.dynamic.sql.where.condition.IsLikeCaseInsensitive;
94+
import org.mybatis.dynamic.sql.where.condition.IsLikeCaseInsensitiveWhenPresent;
95+
import org.mybatis.dynamic.sql.where.condition.IsLikeWhenPresent;
8796
import org.mybatis.dynamic.sql.where.condition.IsNotBetween;
97+
import org.mybatis.dynamic.sql.where.condition.IsNotBetweenWhenPresent;
8898
import org.mybatis.dynamic.sql.where.condition.IsNotEqualTo;
8999
import org.mybatis.dynamic.sql.where.condition.IsNotEqualToColumn;
100+
import org.mybatis.dynamic.sql.where.condition.IsNotEqualToWhenPresent;
90101
import org.mybatis.dynamic.sql.where.condition.IsNotEqualToWithSubselect;
91102
import org.mybatis.dynamic.sql.where.condition.IsNotIn;
92103
import org.mybatis.dynamic.sql.where.condition.IsNotInCaseInsensitive;
@@ -95,6 +106,8 @@
95106
import org.mybatis.dynamic.sql.where.condition.IsNotInWithSubselect;
96107
import org.mybatis.dynamic.sql.where.condition.IsNotLike;
97108
import org.mybatis.dynamic.sql.where.condition.IsNotLikeCaseInsensitive;
109+
import org.mybatis.dynamic.sql.where.condition.IsNotLikeCaseInsensitiveWhenPresent;
110+
import org.mybatis.dynamic.sql.where.condition.IsNotLikeWhenPresent;
98111
import org.mybatis.dynamic.sql.where.condition.IsNotNull;
99112
import org.mybatis.dynamic.sql.where.condition.IsNull;
100113

@@ -634,11 +647,11 @@ static <T> IsEqualToColumn<T> isEqualTo(BasicColumn column) {
634647
return IsEqualToColumn.of(column);
635648
}
636649

637-
static <T> IsEqualTo<T> isEqualToWhenPresent(@Nullable T value) {
638-
return value == null ? IsEqualTo.empty() : IsEqualTo.of(value);
650+
static <T> IsEqualToWhenPresent<T> isEqualToWhenPresent(@Nullable T value) {
651+
return IsEqualToWhenPresent.of(value);
639652
}
640653

641-
static <T> IsEqualTo<T> isEqualToWhenPresent(Supplier<@Nullable T> valueSupplier) {
654+
static <T> IsEqualToWhenPresent<T> isEqualToWhenPresent(Supplier<@Nullable T> valueSupplier) {
642655
return isEqualToWhenPresent(valueSupplier.get());
643656
}
644657

@@ -658,11 +671,11 @@ static <T> IsNotEqualToColumn<T> isNotEqualTo(BasicColumn column) {
658671
return IsNotEqualToColumn.of(column);
659672
}
660673

661-
static <T> IsNotEqualTo<T> isNotEqualToWhenPresent(@Nullable T value) {
662-
return value == null ? IsNotEqualTo.empty() : IsNotEqualTo.of(value);
674+
static <T> IsNotEqualToWhenPresent<T> isNotEqualToWhenPresent(@Nullable T value) {
675+
return IsNotEqualToWhenPresent.of(value);
663676
}
664677

665-
static <T> IsNotEqualTo<T> isNotEqualToWhenPresent(Supplier<@Nullable T> valueSupplier) {
678+
static <T> IsNotEqualToWhenPresent<T> isNotEqualToWhenPresent(Supplier<@Nullable T> valueSupplier) {
666679
return isNotEqualToWhenPresent(valueSupplier.get());
667680
}
668681

@@ -682,11 +695,11 @@ static <T> IsGreaterThanColumn<T> isGreaterThan(BasicColumn column) {
682695
return IsGreaterThanColumn.of(column);
683696
}
684697

685-
static <T> IsGreaterThan<T> isGreaterThanWhenPresent(@Nullable T value) {
686-
return value == null ? IsGreaterThan.empty() : IsGreaterThan.of(value);
698+
static <T> IsGreaterThanWhenPresent<T> isGreaterThanWhenPresent(@Nullable T value) {
699+
return IsGreaterThanWhenPresent.of(value);
687700
}
688701

689-
static <T> IsGreaterThan<T> isGreaterThanWhenPresent(Supplier<@Nullable T> valueSupplier) {
702+
static <T> IsGreaterThanWhenPresent<T> isGreaterThanWhenPresent(Supplier<@Nullable T> valueSupplier) {
690703
return isGreaterThanWhenPresent(valueSupplier.get());
691704
}
692705

@@ -707,11 +720,12 @@ static <T> IsGreaterThanOrEqualToColumn<T> isGreaterThanOrEqualTo(BasicColumn co
707720
return IsGreaterThanOrEqualToColumn.of(column);
708721
}
709722

710-
static <T> IsGreaterThanOrEqualTo<T> isGreaterThanOrEqualToWhenPresent(@Nullable T value) {
711-
return value == null ? IsGreaterThanOrEqualTo.empty() : IsGreaterThanOrEqualTo.of(value);
723+
static <T> IsGreaterThanOrEqualToWhenPresent<T> isGreaterThanOrEqualToWhenPresent(@Nullable T value) {
724+
return IsGreaterThanOrEqualToWhenPresent.of(value);
712725
}
713726

714-
static <T> IsGreaterThanOrEqualTo<T> isGreaterThanOrEqualToWhenPresent(Supplier<@Nullable T> valueSupplier) {
727+
static <T> IsGreaterThanOrEqualToWhenPresent<T> isGreaterThanOrEqualToWhenPresent(
728+
Supplier<@Nullable T> valueSupplier) {
715729
return isGreaterThanOrEqualToWhenPresent(valueSupplier.get());
716730
}
717731

@@ -731,11 +745,11 @@ static <T> IsLessThanColumn<T> isLessThan(BasicColumn column) {
731745
return IsLessThanColumn.of(column);
732746
}
733747

734-
static <T> IsLessThan<T> isLessThanWhenPresent(@Nullable T value) {
735-
return value == null ? IsLessThan.empty() : IsLessThan.of(value);
748+
static <T> IsLessThanWhenPresent<T> isLessThanWhenPresent(@Nullable T value) {
749+
return IsLessThanWhenPresent.of(value);
736750
}
737751

738-
static <T> IsLessThan<T> isLessThanWhenPresent(Supplier<@Nullable T> valueSupplier) {
752+
static <T> IsLessThanWhenPresent<T> isLessThanWhenPresent(Supplier<@Nullable T> valueSupplier) {
739753
return isLessThanWhenPresent(valueSupplier.get());
740754
}
741755

@@ -755,20 +769,20 @@ static <T> IsLessThanOrEqualToColumn<T> isLessThanOrEqualTo(BasicColumn column)
755769
return IsLessThanOrEqualToColumn.of(column);
756770
}
757771

758-
static <T> IsLessThanOrEqualTo<T> isLessThanOrEqualToWhenPresent(@Nullable T value) {
759-
return value == null ? IsLessThanOrEqualTo.empty() : IsLessThanOrEqualTo.of(value);
772+
static <T> IsLessThanOrEqualToWhenPresent<T> isLessThanOrEqualToWhenPresent(@Nullable T value) {
773+
return IsLessThanOrEqualToWhenPresent.of(value);
760774
}
761775

762-
static <T> IsLessThanOrEqualTo<T> isLessThanOrEqualToWhenPresent(Supplier<@Nullable T> valueSupplier) {
776+
static <T> IsLessThanOrEqualToWhenPresent<T> isLessThanOrEqualToWhenPresent(Supplier<@Nullable T> valueSupplier) {
763777
return isLessThanOrEqualToWhenPresent(valueSupplier.get());
764778
}
765779

766780
@SafeVarargs
767-
static <T> IsIn<T> isIn(T... values) {
781+
static <T> IsIn<T> isIn(@NonNull T... values) {
768782
return IsIn.of(values);
769783
}
770784

771-
static <T> IsIn<T> isIn(Collection<T> values) {
785+
static <T> IsIn<T> isIn(Collection<@NonNull T> values) {
772786
return IsIn.of(values);
773787
}
774788

@@ -782,15 +796,15 @@ static <T> IsInWhenPresent<T> isInWhenPresent(@Nullable T... values) {
782796
}
783797

784798
static <T> IsInWhenPresent<T> isInWhenPresent(@Nullable Collection<@Nullable T> values) {
785-
return values == null ? IsInWhenPresent.empty() : IsInWhenPresent.of(values);
799+
return IsInWhenPresent.of(values);
786800
}
787801

788802
@SafeVarargs
789-
static <T> IsNotIn<T> isNotIn(T... values) {
803+
static <T> IsNotIn<T> isNotIn(@NonNull T... values) {
790804
return IsNotIn.of(values);
791805
}
792806

793-
static <T> IsNotIn<T> isNotIn(Collection<T> values) {
807+
static <T> IsNotIn<T> isNotIn(Collection<@NonNull T> values) {
794808
return IsNotIn.of(values);
795809
}
796810

@@ -804,38 +818,38 @@ static <T> IsNotInWhenPresent<T> isNotInWhenPresent(@Nullable T... values) {
804818
}
805819

806820
static <T> IsNotInWhenPresent<T> isNotInWhenPresent(@Nullable Collection<@Nullable T> values) {
807-
return values == null ? IsNotInWhenPresent.empty() : IsNotInWhenPresent.of(values);
821+
return IsNotInWhenPresent.of(values);
808822
}
809823

810824
static <T> IsBetween.Builder<T> isBetween(T value1) {
811825
return IsBetween.isBetween(value1);
812826
}
813827

814-
static <T> IsBetween.Builder<T> isBetween(Supplier<T> valueSupplier1) {
828+
static <T> IsBetween.Builder<T> isBetween(Supplier<@NonNull T> valueSupplier1) {
815829
return isBetween(valueSupplier1.get());
816830
}
817831

818-
static <T> IsBetween.WhenPresentBuilder<T> isBetweenWhenPresent(@Nullable T value1) {
819-
return IsBetween.isBetweenWhenPresent(value1);
832+
static <T> IsBetweenWhenPresent.Builder<T> isBetweenWhenPresent(@Nullable T value1) {
833+
return IsBetweenWhenPresent.isBetweenWhenPresent(value1);
820834
}
821835

822-
static <T> IsBetween.WhenPresentBuilder<T> isBetweenWhenPresent(Supplier<@Nullable T> valueSupplier1) {
836+
static <T> IsBetweenWhenPresent.Builder<T> isBetweenWhenPresent(Supplier<@Nullable T> valueSupplier1) {
823837
return isBetweenWhenPresent(valueSupplier1.get());
824838
}
825839

826840
static <T> IsNotBetween.Builder<T> isNotBetween(T value1) {
827841
return IsNotBetween.isNotBetween(value1);
828842
}
829843

830-
static <T> IsNotBetween.Builder<T> isNotBetween(Supplier<T> valueSupplier1) {
844+
static <T> IsNotBetween.Builder<T> isNotBetween(Supplier<@NonNull T> valueSupplier1) {
831845
return isNotBetween(valueSupplier1.get());
832846
}
833847

834-
static <T> IsNotBetween.WhenPresentBuilder<T> isNotBetweenWhenPresent(@Nullable T value1) {
835-
return IsNotBetween.isNotBetweenWhenPresent(value1);
848+
static <T> IsNotBetweenWhenPresent.Builder<T> isNotBetweenWhenPresent(@Nullable T value1) {
849+
return IsNotBetweenWhenPresent.isNotBetweenWhenPresent(value1);
836850
}
837851

838-
static <T> IsNotBetween.WhenPresentBuilder<T> isNotBetweenWhenPresent(Supplier<@Nullable T> valueSupplier1) {
852+
static <T> IsNotBetweenWhenPresent.Builder<T> isNotBetweenWhenPresent(Supplier<@Nullable T> valueSupplier1) {
839853
return isNotBetweenWhenPresent(valueSupplier1.get());
840854
}
841855

@@ -848,11 +862,11 @@ static <T> IsLike<T> isLike(Supplier<T> valueSupplier) {
848862
return isLike(valueSupplier.get());
849863
}
850864

851-
static <T> IsLike<T> isLikeWhenPresent(@Nullable T value) {
852-
return value == null ? IsLike.empty() : IsLike.of(value);
865+
static <T> IsLikeWhenPresent<T> isLikeWhenPresent(@Nullable T value) {
866+
return IsLikeWhenPresent.of(value);
853867
}
854868

855-
static <T> IsLike<T> isLikeWhenPresent(Supplier<@Nullable T> valueSupplier) {
869+
static <T> IsLikeWhenPresent<T> isLikeWhenPresent(Supplier<@Nullable T> valueSupplier) {
856870
return isLikeWhenPresent(valueSupplier.get());
857871
}
858872

@@ -864,11 +878,11 @@ static <T> IsNotLike<T> isNotLike(Supplier<T> valueSupplier) {
864878
return isNotLike(valueSupplier.get());
865879
}
866880

867-
static <T> IsNotLike<T> isNotLikeWhenPresent(@Nullable T value) {
868-
return value == null ? IsNotLike.empty() : IsNotLike.of(value);
881+
static <T> IsNotLikeWhenPresent<T> isNotLikeWhenPresent(@Nullable T value) {
882+
return IsNotLikeWhenPresent.of(value);
869883
}
870884

871-
static <T> IsNotLike<T> isNotLikeWhenPresent(Supplier<@Nullable T> valueSupplier) {
885+
static <T> IsNotLikeWhenPresent<T> isNotLikeWhenPresent(Supplier<@Nullable T> valueSupplier) {
872886
return isNotLikeWhenPresent(valueSupplier.get());
873887
}
874888

@@ -890,11 +904,12 @@ static IsLikeCaseInsensitive<String> isLikeCaseInsensitive(Supplier<String> valu
890904
return isLikeCaseInsensitive(valueSupplier.get());
891905
}
892906

893-
static IsLikeCaseInsensitive<String> isLikeCaseInsensitiveWhenPresent(@Nullable String value) {
894-
return value == null ? IsLikeCaseInsensitive.empty() : IsLikeCaseInsensitive.of(value);
907+
static IsLikeCaseInsensitiveWhenPresent<String> isLikeCaseInsensitiveWhenPresent(@Nullable String value) {
908+
return IsLikeCaseInsensitiveWhenPresent.of(value);
895909
}
896910

897-
static IsLikeCaseInsensitive<String> isLikeCaseInsensitiveWhenPresent(Supplier<@Nullable String> valueSupplier) {
911+
static IsLikeCaseInsensitiveWhenPresent<String> isLikeCaseInsensitiveWhenPresent(
912+
Supplier<@Nullable String> valueSupplier) {
898913
return isLikeCaseInsensitiveWhenPresent(valueSupplier.get());
899914
}
900915

@@ -906,11 +921,11 @@ static IsNotLikeCaseInsensitive<String> isNotLikeCaseInsensitive(Supplier<String
906921
return isNotLikeCaseInsensitive(valueSupplier.get());
907922
}
908923

909-
static IsNotLikeCaseInsensitive<String> isNotLikeCaseInsensitiveWhenPresent(@Nullable String value) {
910-
return value == null ? IsNotLikeCaseInsensitive.empty() : IsNotLikeCaseInsensitive.of(value);
924+
static IsNotLikeCaseInsensitiveWhenPresent<String> isNotLikeCaseInsensitiveWhenPresent(@Nullable String value) {
925+
return IsNotLikeCaseInsensitiveWhenPresent.of(value);
911926
}
912927

913-
static IsNotLikeCaseInsensitive<String> isNotLikeCaseInsensitiveWhenPresent(
928+
static IsNotLikeCaseInsensitiveWhenPresent<String> isNotLikeCaseInsensitiveWhenPresent(
914929
Supplier<@Nullable String> valueSupplier) {
915930
return isNotLikeCaseInsensitiveWhenPresent(valueSupplier.get());
916931
}
@@ -929,7 +944,7 @@ static IsInCaseInsensitiveWhenPresent<String> isInCaseInsensitiveWhenPresent(@Nu
929944

930945
static IsInCaseInsensitiveWhenPresent<String> isInCaseInsensitiveWhenPresent(
931946
@Nullable Collection<@Nullable String> values) {
932-
return values == null ? IsInCaseInsensitiveWhenPresent.empty() : IsInCaseInsensitiveWhenPresent.of(values);
947+
return IsInCaseInsensitiveWhenPresent.of(values);
933948
}
934949

935950
static IsNotInCaseInsensitive<String> isNotInCaseInsensitive(String... values) {
@@ -946,8 +961,7 @@ static IsNotInCaseInsensitiveWhenPresent<String> isNotInCaseInsensitiveWhenPrese
946961

947962
static IsNotInCaseInsensitiveWhenPresent<String> isNotInCaseInsensitiveWhenPresent(
948963
@Nullable Collection<@Nullable String> values) {
949-
return values == null ? IsNotInCaseInsensitiveWhenPresent.empty() :
950-
IsNotInCaseInsensitiveWhenPresent.of(values);
964+
return IsNotInCaseInsensitiveWhenPresent.of(values);
951965
}
952966

953967
// order by support

src/main/java/org/mybatis/dynamic/sql/where/condition/AndGatherer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import java.util.function.Supplier;
1919

20+
import org.jspecify.annotations.NonNull;
21+
2022
/**
2123
* Utility class supporting the "and" part of a between condition. This class supports builders, so it is mutable.
2224
*
@@ -38,7 +40,7 @@ public R and(T value2) {
3840
return build(value2);
3941
}
4042

41-
public R and(Supplier<T> valueSupplier2) {
43+
public R and(Supplier<@NonNull T> valueSupplier2) {
4244
return and(valueSupplier2.get());
4345
}
4446

src/main/java/org/mybatis/dynamic/sql/where/condition/IsBetween.java

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.util.function.Function;
2121
import java.util.function.Predicate;
2222

23-
import org.jspecify.annotations.Nullable;
2423
import org.mybatis.dynamic.sql.AbstractTwoValueCondition;
2524

2625
public class IsBetween<T> extends AbstractTwoValueCondition<T>
@@ -86,10 +85,6 @@ public static <T> Builder<T> isBetween(T value1) {
8685
return new Builder<>(value1);
8786
}
8887

89-
public static <T> WhenPresentBuilder<T> isBetweenWhenPresent(@Nullable T value1) {
90-
return new WhenPresentBuilder<>(value1);
91-
}
92-
9388
public static class Builder<T> extends AndGatherer<T, IsBetween<T>> {
9489
private Builder(T value1) {
9590
super(value1);
@@ -100,19 +95,4 @@ protected IsBetween<T> build(T value2) {
10095
return new IsBetween<>(value1, value2);
10196
}
10297
}
103-
104-
public static class WhenPresentBuilder<T> extends AndWhenPresentGatherer<T, IsBetween<T>> {
105-
private WhenPresentBuilder(@Nullable T value1) {
106-
super(value1);
107-
}
108-
109-
@Override
110-
protected IsBetween<T> build(@Nullable T value2) {
111-
if (value1 == null || value2 == null) {
112-
return empty();
113-
} else {
114-
return new IsBetween<>(value1, value2);
115-
}
116-
}
117-
}
11898
}

0 commit comments

Comments
 (0)