Skip to content

Commit 8b9d230

Browse files
authored
Make it possible to bind values in the CASE expression (#1007)
1 parent bc28534 commit 8b9d230

File tree

3 files changed

+167
-0
lines changed

3 files changed

+167
-0
lines changed

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/CaseExpression.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ public <PROPERTY> void eq(
5555
add(Criterion.Eq::new, left, right, then);
5656
}
5757

58+
public <PROPERTY> void eq(
59+
PropertyMetamodel<PROPERTY> left, PROPERTY right, PropertyMetamodel<RESULT> then) {
60+
Objects.requireNonNull(left, "left");
61+
Objects.requireNonNull(then, "then");
62+
if (right != null) {
63+
add(Criterion.Eq::new, left, right, then);
64+
}
65+
}
66+
5867
public <PROPERTY> void ne(
5968
PropertyMetamodel<PROPERTY> left,
6069
PropertyMetamodel<PROPERTY> right,
@@ -65,6 +74,15 @@ public <PROPERTY> void ne(
6574
add(Criterion.Ne::new, left, right, then);
6675
}
6776

77+
public <PROPERTY> void ne(
78+
PropertyMetamodel<PROPERTY> left, PROPERTY right, PropertyMetamodel<RESULT> then) {
79+
Objects.requireNonNull(left, "left");
80+
Objects.requireNonNull(then, "then");
81+
if (right != null) {
82+
add(Criterion.Ne::new, left, right, then);
83+
}
84+
}
85+
6886
public <PROPERTY> void ge(
6987
PropertyMetamodel<PROPERTY> left,
7088
PropertyMetamodel<PROPERTY> right,
@@ -75,6 +93,15 @@ public <PROPERTY> void ge(
7593
add(Criterion.Ge::new, left, right, then);
7694
}
7795

96+
public <PROPERTY> void ge(
97+
PropertyMetamodel<PROPERTY> left, PROPERTY right, PropertyMetamodel<RESULT> then) {
98+
Objects.requireNonNull(left, "left");
99+
Objects.requireNonNull(then, "then");
100+
if (right != null) {
101+
add(Criterion.Ge::new, left, right, then);
102+
}
103+
}
104+
78105
public <PROPERTY> void gt(
79106
PropertyMetamodel<PROPERTY> left,
80107
PropertyMetamodel<PROPERTY> right,
@@ -85,6 +112,15 @@ public <PROPERTY> void gt(
85112
add(Criterion.Gt::new, left, right, then);
86113
}
87114

115+
public <PROPERTY> void gt(
116+
PropertyMetamodel<PROPERTY> left, PROPERTY right, PropertyMetamodel<RESULT> then) {
117+
Objects.requireNonNull(left, "left");
118+
Objects.requireNonNull(then, "then");
119+
if (right != null) {
120+
add(Criterion.Gt::new, left, right, then);
121+
}
122+
}
123+
88124
public <PROPERTY> void le(
89125
PropertyMetamodel<PROPERTY> left,
90126
PropertyMetamodel<PROPERTY> right,
@@ -95,6 +131,15 @@ public <PROPERTY> void le(
95131
add(Criterion.Le::new, left, right, then);
96132
}
97133

134+
public <PROPERTY> void le(
135+
PropertyMetamodel<PROPERTY> left, PROPERTY right, PropertyMetamodel<RESULT> then) {
136+
Objects.requireNonNull(left, "left");
137+
Objects.requireNonNull(then, "then");
138+
if (right != null) {
139+
add(Criterion.Le::new, left, right, then);
140+
}
141+
}
142+
98143
public <PROPERTY> void lt(
99144
PropertyMetamodel<PROPERTY> left,
100145
PropertyMetamodel<PROPERTY> right,
@@ -105,6 +150,15 @@ public <PROPERTY> void lt(
105150
add(Criterion.Lt::new, left, right, then);
106151
}
107152

153+
public <PROPERTY> void lt(
154+
PropertyMetamodel<PROPERTY> left, PROPERTY right, PropertyMetamodel<RESULT> then) {
155+
Objects.requireNonNull(left, "left");
156+
Objects.requireNonNull(then, "then");
157+
if (right != null) {
158+
add(Criterion.Lt::new, left, right, then);
159+
}
160+
}
161+
108162
public <PROPERTY> void isNull(
109163
PropertyMetamodel<PROPERTY> propertyMetamodel, PropertyMetamodel<RESULT> then) {
110164
Objects.requireNonNull(propertyMetamodel, "propertyMetamodel");
@@ -128,6 +182,15 @@ private <PROPERTY> void add(
128182
criterionList.add(new Pair<>(criterion, new Operand.Prop(then)));
129183
}
130184

185+
private <PROPERTY> void add(
186+
BiFunction<Operand.Prop, Operand.Param, Criterion> operator,
187+
PropertyMetamodel<PROPERTY> left,
188+
PROPERTY right,
189+
PropertyMetamodel<RESULT> then) {
190+
Criterion criterion = operator.apply(new Operand.Prop(left), new Operand.Param(left, right));
191+
criterionList.add(new Pair<>(criterion, new Operand.Prop(then)));
192+
}
193+
131194
private <PROPERTY> void add(
132195
Function<Operand.Prop, Criterion> operator,
133196
PropertyMetamodel<PROPERTY> propertyMetamodel,

doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlSelectTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,6 +1486,57 @@ void expression_when_operators() {
14861486
sql.getRawSql());
14871487
}
14881488

1489+
@Test
1490+
void expression_when_operators_binding() {
1491+
Emp_ e = new Emp_();
1492+
Buildable<?> stmt =
1493+
nativeSql
1494+
.from(e)
1495+
.select(
1496+
when(
1497+
c -> {
1498+
c.eq(e.name, "a", literal("b"));
1499+
c.ne(e.name, "c", literal("d"));
1500+
c.ge(e.name, "e", literal("f"));
1501+
c.gt(e.name, "g", literal("h"));
1502+
c.le(e.name, "i", literal("j"));
1503+
c.lt(e.name, "k", literal("l"));
1504+
},
1505+
literal("z")));
1506+
Sql<?> sql = stmt.asSql();
1507+
assertEquals(
1508+
"select case "
1509+
+ "when t0_.NAME = ? then 'b' "
1510+
+ "when t0_.NAME <> ? then 'd' "
1511+
+ "when t0_.NAME >= ? then 'f' "
1512+
+ "when t0_.NAME > ? then 'h' "
1513+
+ "when t0_.NAME <= ? then 'j' "
1514+
+ "when t0_.NAME < ? then 'l' "
1515+
+ "else 'z' end from EMP t0_",
1516+
sql.getRawSql());
1517+
}
1518+
1519+
@Test
1520+
void expression_when_operators_binding_null() {
1521+
Emp_ e = new Emp_();
1522+
Buildable<?> stmt =
1523+
nativeSql
1524+
.from(e)
1525+
.select(
1526+
when(
1527+
c -> {
1528+
c.eq(e.name, (String) null, literal("b"));
1529+
c.ne(e.name, (String) null, literal("d"));
1530+
c.ge(e.name, (String) null, literal("f"));
1531+
c.gt(e.name, (String) null, literal("h"));
1532+
c.le(e.name, (String) null, literal("j"));
1533+
c.lt(e.name, (String) null, literal("l"));
1534+
},
1535+
literal("z")));
1536+
Sql<?> sql = stmt.asSql();
1537+
assertEquals("select 'z' from EMP t0_", sql.getRawSql());
1538+
}
1539+
14891540
@Test
14901541
void expression_when_empty() {
14911542
Emp_ e = new Emp_();

integration-test-java/src/test/java/org/seasar/doma/it/criteria/NativeSqlSelectTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,59 @@ void expressions_when_empty() {
641641
assertEquals(14, list.stream().filter(it -> it.equals("_")).count());
642642
}
643643

644+
@Test
645+
void expressions_when_binding_string() {
646+
Employee_ e = new Employee_();
647+
648+
List<String> list =
649+
nativeSql
650+
.from(e)
651+
.select(
652+
when(
653+
c -> {
654+
c.eq(e.employeeName, "SMITH", lower(e.employeeName));
655+
c.eq(e.employeeName, "KING", lower(e.employeeName));
656+
},
657+
literal("_")))
658+
.fetch();
659+
660+
assertEquals(14, list.size());
661+
assertEquals(1, list.stream().filter(it -> it.equals("smith")).count());
662+
assertEquals(1, list.stream().filter(it -> it.equals("king")).count());
663+
}
664+
665+
@Test
666+
void expressions_when_binding_domainType() {
667+
Employee_ e = new Employee_();
668+
669+
List<String> list =
670+
nativeSql
671+
.from(e)
672+
.select(
673+
when(c -> c.eq(e.salary, new Salary("3000"), lower(e.employeeName)), literal("*")))
674+
.fetch();
675+
676+
assertEquals(14, list.size());
677+
assertEquals(1, list.stream().filter(it -> it.equals("scott")).count());
678+
assertEquals(1, list.stream().filter(it -> it.equals("ford")).count());
679+
assertEquals(12, list.stream().filter(it -> it.equals("*")).count());
680+
}
681+
682+
@Test
683+
void expressions_when_eq_null() {
684+
Employee_ e = new Employee_();
685+
686+
List<String> list =
687+
nativeSql
688+
.from(e)
689+
.select(
690+
when(c -> c.eq(e.employeeName, (String) null, lower(e.employeeName)), literal("*")))
691+
.fetch();
692+
693+
assertEquals(14, list.size());
694+
assertEquals(14, list.stream().filter(it -> it.equals("*")).count());
695+
}
696+
644697
@Test
645698
void expressions_literal_localDate() {
646699
Employee_ e = new Employee_();

0 commit comments

Comments
 (0)