Skip to content

Commit 1abec92

Browse files
authored
Merge pull request #435 from domaframework/optional-select-call
Make a select method call optional in a sub-select
2 parents 1bbb22b + 99f74e6 commit 1abec92

File tree

7 files changed

+67
-30
lines changed

7 files changed

+67
-30
lines changed
Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
package org.seasar.doma.jdbc.criteria.context;
22

3-
import java.util.Objects;
3+
public interface SubSelectContext<RESULT> {
44

5-
public class SubSelectContext<RESULT> {
6-
public final SelectContext context;
7-
8-
public SubSelectContext(SelectContext context) {
9-
this.context = Objects.requireNonNull(context);
10-
}
5+
SelectContext get();
116
}

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/InsertDeclaration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ public void values(Consumer<ValuesDeclaration> block) {
2727
public void select(Function<InsertSelectDeclaration, SubSelectContext<?>> block) {
2828
InsertSelectDeclaration declaration = new InsertSelectDeclaration();
2929
SubSelectContext<?> subSelectContext = block.apply(declaration);
30-
context.selectContext = subSelectContext.context;
30+
context.selectContext = subSelectContext.get();
3131
}
3232
}

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/InsertSelectDeclaration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
public class InsertSelectDeclaration {
66

7-
public SubSelectFromDeclaration from(EntityMetamodel<?> entityMetamodel) {
8-
return new SubSelectFromDeclaration(entityMetamodel);
7+
public <ENTITY> SubSelectFromDeclaration<ENTITY> from(EntityMetamodel<ENTITY> entityMetamodel) {
8+
return new SubSelectFromDeclaration<>(entityMetamodel);
99
}
1010
}

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SubSelectFromDeclaration.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
1313
import org.seasar.doma.jdbc.criteria.tuple.Tuple2;
1414

15-
public class SubSelectFromDeclaration {
15+
public class SubSelectFromDeclaration<ENTITY> implements SubSelectContext<ENTITY> {
1616

1717
private final SelectFromDeclaration declaration;
1818

@@ -22,51 +22,56 @@ public SubSelectFromDeclaration(EntityMetamodel<?> entityMetamodel) {
2222
this.declaration = new SelectFromDeclaration(context);
2323
}
2424

25-
public SubSelectFromDeclaration innerJoin(
25+
@Override
26+
public SelectContext get() {
27+
return declaration.getContext();
28+
}
29+
30+
public SubSelectFromDeclaration<ENTITY> innerJoin(
2631
EntityMetamodel<?> entityMetamodel, Consumer<JoinDeclaration> block) {
2732
declaration.innerJoin(entityMetamodel, block);
2833
return this;
2934
}
3035

31-
public SubSelectFromDeclaration leftJoin(
36+
public SubSelectFromDeclaration<ENTITY> leftJoin(
3237
EntityMetamodel<?> entityMetamodel, Consumer<JoinDeclaration> block) {
3338
declaration.leftJoin(entityMetamodel, block);
3439
return this;
3540
}
3641

37-
public SubSelectFromDeclaration where(Consumer<WhereDeclaration> block) {
42+
public SubSelectFromDeclaration<ENTITY> where(Consumer<WhereDeclaration> block) {
3843
declaration.where(block);
3944
return this;
4045
}
4146

42-
public SubSelectFromDeclaration orderBy(Consumer<OrderByNameDeclaration> block) {
47+
public SubSelectFromDeclaration<ENTITY> orderBy(Consumer<OrderByNameDeclaration> block) {
4348
declaration.orderBy(block);
4449
return this;
4550
}
4651

47-
public <PROPERTY> SubSelectContext<PROPERTY> select() {
52+
public SubSelectContext<ENTITY> select() {
4853
SelectContext context = declaration.getContext();
49-
return new SubSelectContext<>(context);
54+
return () -> context;
5055
}
5156

52-
public <PROPERTY> SubSelectContext<PROPERTY> select(EntityMetamodel<?> entityMetamodel) {
57+
public SubSelectContext<ENTITY> select(EntityMetamodel<?> entityMetamodel) {
5358
SelectContext context = declaration.getContext();
5459
context.projection = new Projection.PropertyMetamodels(entityMetamodel.allPropertyMetamodels());
55-
return new SubSelectContext<>(context);
60+
return () -> context;
5661
}
5762

5863
public <PROPERTY> SubSelectContext<PROPERTY> select(
5964
PropertyMetamodel<PROPERTY> propertyMetamodel) {
6065
SelectContext context = declaration.getContext();
6166
context.projection = new Projection.PropertyMetamodels(propertyMetamodel);
62-
return new SubSelectContext<>(context);
67+
return () -> context;
6368
}
6469

6570
public <PROPERTY1, PROPERTY2> SubSelectContext<Tuple2<PROPERTY1, PROPERTY2>> select(
6671
PropertyMetamodel<PROPERTY1> first, PropertyMetamodel<PROPERTY2> second) {
6772
SelectContext context = declaration.getContext();
6873
context.projection = new Projection.PropertyMetamodels(first, second);
69-
return new SubSelectContext<>(context);
74+
return () -> context;
7075
}
7176

7277
public SubSelectContext<List<?>> select(
@@ -79,6 +84,6 @@ public SubSelectContext<List<?>> select(
7984
list.add(propertyMetamodel2);
8085
list.addAll(Arrays.asList(propertyMetamodels));
8186
context.projection = new Projection.PropertyMetamodels(list);
82-
return new SubSelectContext<>(context);
87+
return () -> context;
8388
}
8489
}

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/WhereDeclaration.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,13 @@ public <PROPERTY> void notIn(PropertyMetamodel<PROPERTY> left, List<PROPERTY> ri
9898
public <PROPERTY> void in(PropertyMetamodel<PROPERTY> left, SubSelectContext<PROPERTY> right) {
9999
Objects.requireNonNull(left);
100100
Objects.requireNonNull(right);
101-
add(new Criterion.InSubQuery(new Operand.Prop(left), right.context));
101+
add(new Criterion.InSubQuery(new Operand.Prop(left), right.get()));
102102
}
103103

104104
public <PROPERTY> void notIn(PropertyMetamodel<PROPERTY> left, SubSelectContext<PROPERTY> right) {
105105
Objects.requireNonNull(left);
106106
Objects.requireNonNull(right);
107-
add(new Criterion.NotInSubQuery(new Operand.Prop(left), right.context));
107+
add(new Criterion.NotInSubQuery(new Operand.Prop(left), right.get()));
108108
}
109109

110110
public <PROPERTY1, PROPERTY2> void in(
@@ -148,7 +148,7 @@ public <PROPERTY1, PROPERTY2> void in(
148148
Objects.requireNonNull(right);
149149
Operand.Prop prop1 = new Operand.Prop(left.getItem1());
150150
Operand.Prop prop2 = new Operand.Prop(left.getItem2());
151-
add(new Criterion.InTuple2SubQuery(new Tuple2<>(prop1, prop2), right.context));
151+
add(new Criterion.InTuple2SubQuery(new Tuple2<>(prop1, prop2), right.get()));
152152
}
153153

154154
public <PROPERTY1, PROPERTY2> void notIn(
@@ -158,20 +158,20 @@ public <PROPERTY1, PROPERTY2> void notIn(
158158
Objects.requireNonNull(right);
159159
Operand.Prop prop1 = new Operand.Prop(left.getItem1());
160160
Operand.Prop prop2 = new Operand.Prop(left.getItem2());
161-
add(new Criterion.NotInTuple2SubQuery(new Tuple2<>(prop1, prop2), right.context));
161+
add(new Criterion.NotInTuple2SubQuery(new Tuple2<>(prop1, prop2), right.get()));
162162
}
163163

164164
public void exists(SubSelectContext<?> subSelectContext) {
165165
Objects.requireNonNull(subSelectContext);
166-
add(new Criterion.Exists(subSelectContext.context));
166+
add(new Criterion.Exists(subSelectContext.get()));
167167
}
168168

169169
public void notExists(SubSelectContext<?> subSelectContext) {
170170
Objects.requireNonNull(subSelectContext);
171-
add(new Criterion.NotExists(subSelectContext.context));
171+
add(new Criterion.NotExists(subSelectContext.get()));
172172
}
173173

174-
public SubSelectFromDeclaration from(EntityMetamodel<?> entityMetamodel) {
175-
return new SubSelectFromDeclaration(entityMetamodel);
174+
public <ENTITY> SubSelectFromDeclaration<ENTITY> from(EntityMetamodel<ENTITY> entityMetamodel) {
175+
return new SubSelectFromDeclaration<>(entityMetamodel);
176176
}
177177
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.junit.jupiter.api.Test;
66
import org.seasar.doma.internal.jdbc.mock.MockConfig;
77
import org.seasar.doma.jdbc.Sql;
8+
import org.seasar.doma.jdbc.criteria.entity.Dept_;
89
import org.seasar.doma.jdbc.criteria.entity.Emp_;
910
import org.seasar.doma.jdbc.criteria.statement.Statement;
1011

@@ -43,6 +44,30 @@ void insert_select_entity() {
4344
sql.getFormattedSql());
4445
}
4546

47+
@Test
48+
void insert_select_entity_without_select() {
49+
Emp_ e = new Emp_();
50+
Statement<Integer> stmt = nativeSql.insert(e).select(c -> c.from(e));
51+
52+
Sql<?> sql = stmt.asSql();
53+
assertEquals(
54+
"insert into EMP (ID, NAME, SALARY, VERSION) select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_",
55+
sql.getFormattedSql());
56+
}
57+
58+
@Test
59+
void insert_select_entity_join_select() {
60+
Emp_ e = new Emp_();
61+
Dept_ d = new Dept_();
62+
Statement<Integer> stmt =
63+
nativeSql.insert(e).select(c -> c.from(d).innerJoin(e, on -> on.eq(d.id, e.id)).select(e));
64+
65+
Sql<?> sql = stmt.asSql();
66+
assertEquals(
67+
"insert into EMP (ID, NAME, SALARY, VERSION) select t1_.ID, t1_.NAME, t1_.SALARY, t1_.VERSION from CATA.DEPT t0_ inner join EMP t1_ on (t0_.ID = t1_.ID)",
68+
sql.getFormattedSql());
69+
}
70+
4671
@Test
4772
void insert_select_properties() {
4873
Emp_ e = new Emp_();

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,18 @@ void where_exist() {
406406
sql.getFormattedSql());
407407
}
408408

409+
@Test
410+
void where_exist_without_select() {
411+
Emp_ e = new Emp_();
412+
Dept_ d = new Dept_();
413+
Buildable<?> stmt = nativeSql.from(e).where(c -> c.exists(c.from(d))).select(e.id);
414+
415+
Sql<?> sql = stmt.asSql();
416+
assertEquals(
417+
"select t0_.ID from EMP t0_ where exists (select t1_.ID, t1_.NAME from CATA.DEPT t1_)",
418+
sql.getFormattedSql());
419+
}
420+
409421
@Test
410422
void where_notExist() {
411423
Emp_ e = new Emp_();

0 commit comments

Comments
 (0)