Skip to content

Commit 9536900

Browse files
committed
Support the distinct keyword
1 parent bf07310 commit 9536900

File tree

8 files changed

+101
-2
lines changed

8 files changed

+101
-2
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package org.seasar.doma.jdbc.criteria;
2+
3+
public enum DistinctOption {
4+
ENABLED,
5+
DISABLED
6+
}

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/SelectContext.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
import java.util.function.BiConsumer;
1111
import java.util.stream.Stream;
1212
import org.seasar.doma.internal.util.Pair;
13+
import org.seasar.doma.jdbc.criteria.DistinctOption;
1314
import org.seasar.doma.jdbc.criteria.def.EntityDef;
1415
import org.seasar.doma.jdbc.criteria.def.PropertyDef;
1516

1617
public class SelectContext implements Context {
1718
public final EntityDef<?> entityDef;
1819
public Projection projection;
19-
public boolean distinct;
20+
public DistinctOption distinct = DistinctOption.DISABLED;
2021
public final List<Join> joins = new ArrayList<>();
2122
public List<Criterion> where = new ArrayList<>();
2223
public final List<PropertyDef<?>> groupBy = new ArrayList<>();

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.seasar.doma.DomaException;
88
import org.seasar.doma.internal.util.Pair;
99
import org.seasar.doma.jdbc.criteria.AssociationKind;
10+
import org.seasar.doma.jdbc.criteria.DistinctOption;
1011
import org.seasar.doma.jdbc.criteria.ForUpdateOption;
1112
import org.seasar.doma.jdbc.criteria.context.ForUpdate;
1213
import org.seasar.doma.jdbc.criteria.context.Join;
@@ -30,6 +31,10 @@ public SelectContext getContext() {
3031
return context;
3132
}
3233

34+
public void distinct(DistinctOption distinctOption) {
35+
context.distinct = distinctOption;
36+
}
37+
3338
public void innerJoin(EntityDef<?> entityDef, Consumer<JoinDeclaration> block) {
3439
Objects.requireNonNull(entityDef);
3540
Objects.requireNonNull(block);

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/SelectBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.seasar.doma.jdbc.PreparedSql;
1212
import org.seasar.doma.jdbc.SqlKind;
1313
import org.seasar.doma.jdbc.SqlLogType;
14+
import org.seasar.doma.jdbc.criteria.DistinctOption;
1415
import org.seasar.doma.jdbc.criteria.ForUpdateOption;
1516
import org.seasar.doma.jdbc.criteria.context.Criterion;
1617
import org.seasar.doma.jdbc.criteria.context.Join;
@@ -77,7 +78,7 @@ void interpret() {
7778
private void select() {
7879
buf.appendSql("select ");
7980

80-
if (context.distinct) {
81+
if (context.distinct == DistinctOption.ENABLED) {
8182
buf.appendSql("distinct ");
8283
}
8384

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlSelectStatement.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.seasar.doma.jdbc.PreparedSql;
99
import org.seasar.doma.jdbc.command.Command;
1010
import org.seasar.doma.jdbc.criteria.AssociationKind;
11+
import org.seasar.doma.jdbc.criteria.DistinctOption;
1112
import org.seasar.doma.jdbc.criteria.ForUpdateOption;
1213
import org.seasar.doma.jdbc.criteria.command.AssociateCommand;
1314
import org.seasar.doma.jdbc.criteria.context.SelectContext;
@@ -31,6 +32,16 @@ public EntityqlSelectStatement(Config config, SelectFromDeclaration declaration)
3132
this.declaration = Objects.requireNonNull(declaration);
3233
}
3334

35+
public EntityqlSelectStatement<ENTITY> distinct() {
36+
declaration.distinct(DistinctOption.ENABLED);
37+
return this;
38+
}
39+
40+
public EntityqlSelectStatement<ENTITY> distinct(DistinctOption distinctOption) {
41+
declaration.distinct(distinctOption);
42+
return this;
43+
}
44+
3445
public EntityqlSelectStatement<ENTITY> innerJoin(
3546
EntityDef<?> entityDef, Consumer<JoinDeclaration> block) {
3647
declaration.innerJoin(entityDef, block);

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectStarting.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.seasar.doma.jdbc.Config;
1313
import org.seasar.doma.jdbc.ObjectProvider;
1414
import org.seasar.doma.jdbc.command.Command;
15+
import org.seasar.doma.jdbc.criteria.DistinctOption;
1516
import org.seasar.doma.jdbc.criteria.ForUpdateOption;
1617
import org.seasar.doma.jdbc.criteria.command.MappedResultProvider;
1718
import org.seasar.doma.jdbc.criteria.context.SelectContext;
@@ -49,6 +50,16 @@ public NativeSqlSelectStarting(
4950
this.entityDef = Objects.requireNonNull(entityDef);
5051
}
5152

53+
public NativeSqlSelectStarting<ENTITY> distinct() {
54+
declaration.distinct(DistinctOption.ENABLED);
55+
return this;
56+
}
57+
58+
public NativeSqlSelectStarting<ENTITY> distinct(DistinctOption distinctOption) {
59+
declaration.distinct(distinctOption);
60+
return this;
61+
}
62+
5263
public NativeSqlSelectStarting<ENTITY> innerJoin(
5364
EntityDef<?> entityDef, Consumer<JoinDeclaration> block) {
5465
Objects.requireNonNull(entityDef);

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,4 +193,36 @@ void offset_null() {
193193
assertEquals(
194194
"select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_", sql.getFormattedSql());
195195
}
196+
197+
@Test
198+
void distinct() {
199+
Emp_ e = new Emp_();
200+
Statement<List<Emp>> stmt = entityql.from(e).distinct();
201+
202+
Sql<?> sql = stmt.asSql();
203+
assertEquals(
204+
"select distinct t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_",
205+
sql.getFormattedSql());
206+
}
207+
208+
@Test
209+
void distinct_enabled() {
210+
Emp_ e = new Emp_();
211+
Statement<List<Emp>> stmt = entityql.from(e).distinct(DistinctOption.ENABLED);
212+
213+
Sql<?> sql = stmt.asSql();
214+
assertEquals(
215+
"select distinct t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_",
216+
sql.getFormattedSql());
217+
}
218+
219+
@Test
220+
void distinct_disabled() {
221+
Emp_ e = new Emp_();
222+
Statement<List<Emp>> stmt = entityql.from(e).distinct(DistinctOption.DISABLED);
223+
224+
Sql<?> sql = stmt.asSql();
225+
assertEquals(
226+
"select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_", sql.getFormattedSql());
227+
}
196228
}

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,4 +892,36 @@ void peek() {
892892
.union(nativeSql.from(d).select(d.name).peek(System.out::println))
893893
.peek(System.out::println);
894894
}
895+
896+
@Test
897+
void distinct() {
898+
Emp_ e = new Emp_();
899+
Buildable<?> stmt = nativeSql.from(e).distinct().where(c -> c.eq(e.name, "a"));
900+
Sql<?> sql = stmt.asSql();
901+
assertEquals(
902+
"select distinct t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_ where t0_.NAME = 'a'",
903+
sql.getFormattedSql());
904+
}
905+
906+
@Test
907+
void distinct_enabled() {
908+
Emp_ e = new Emp_();
909+
Buildable<?> stmt =
910+
nativeSql.from(e).distinct(DistinctOption.ENABLED).where(c -> c.eq(e.name, "a"));
911+
Sql<?> sql = stmt.asSql();
912+
assertEquals(
913+
"select distinct t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_ where t0_.NAME = 'a'",
914+
sql.getFormattedSql());
915+
}
916+
917+
@Test
918+
void distinct_disabled() {
919+
Emp_ e = new Emp_();
920+
Buildable<?> stmt =
921+
nativeSql.from(e).distinct(DistinctOption.DISABLED).where(c -> c.eq(e.name, "a"));
922+
Sql<?> sql = stmt.asSql();
923+
assertEquals(
924+
"select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_ where t0_.NAME = 'a'",
925+
sql.getFormattedSql());
926+
}
895927
}

0 commit comments

Comments
 (0)