Skip to content

Commit cb47c7b

Browse files
committed
Add the select and the selectTo methods to the Entityql and NativeSql DSLs
1 parent c54627f commit cb47c7b

File tree

19 files changed

+437
-91
lines changed

19 files changed

+437
-91
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.seasar.doma.jdbc.criteria.statement.EntityqlBatchUpdateStatement;
1919
import org.seasar.doma.jdbc.criteria.statement.EntityqlDeleteStatement;
2020
import org.seasar.doma.jdbc.criteria.statement.EntityqlInsertStatement;
21-
import org.seasar.doma.jdbc.criteria.statement.EntityqlSelectStatement;
21+
import org.seasar.doma.jdbc.criteria.statement.EntityqlSelectStarting;
2222
import org.seasar.doma.jdbc.criteria.statement.EntityqlUpdateStatement;
2323
import org.seasar.doma.jdbc.criteria.statement.Statement;
2424

@@ -30,19 +30,19 @@ public Entityql(Config config) {
3030
this.config = Objects.requireNonNull(config);
3131
}
3232

33-
public <ENTITY> EntityqlSelectStatement<ENTITY> from(EntityMetamodel<ENTITY> entityMetamodel) {
33+
public <ENTITY> EntityqlSelectStarting<ENTITY> from(EntityMetamodel<ENTITY> entityMetamodel) {
3434
Objects.requireNonNull(entityMetamodel);
3535
return from(entityMetamodel, settings -> {});
3636
}
3737

38-
public <ENTITY> EntityqlSelectStatement<ENTITY> from(
38+
public <ENTITY> EntityqlSelectStarting<ENTITY> from(
3939
EntityMetamodel<ENTITY> entityMetamodel, Consumer<SelectSettings> settingsConsumer) {
4040
Objects.requireNonNull(entityMetamodel);
4141
Objects.requireNonNull(settingsConsumer);
4242
SelectContext context = new SelectContext(entityMetamodel);
4343
settingsConsumer.accept(context.getSettings());
4444
SelectFromDeclaration declaration = new SelectFromDeclaration(context);
45-
return new EntityqlSelectStatement<>(config, declaration);
45+
return new EntityqlSelectStarting<>(config, declaration, entityMetamodel);
4646
}
4747

4848
public <ENTITY> Statement<Result<ENTITY>> update(

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/AssociateCommand.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,22 @@
1919
public class AssociateCommand<ENTITY> implements Command<List<ENTITY>> {
2020
private final SelectContext context;
2121
private final SelectQuery query;
22+
private final EntityMetamodel<ENTITY> entityMetamodel;
2223

23-
public AssociateCommand(SelectContext context, SelectQuery query) {
24+
public AssociateCommand(
25+
SelectContext context, SelectQuery query, EntityMetamodel<ENTITY> entityMetamodel) {
2426
this.context = Objects.requireNonNull(context);
2527
this.query = Objects.requireNonNull(query);
28+
this.entityMetamodel = Objects.requireNonNull(entityMetamodel);
2629
}
2730

2831
@Override
2932
@SuppressWarnings("unchecked")
3033
public List<ENTITY> execute() {
3134
Map<EntityKey, Object> cache = new LinkedHashMap<>();
32-
List<EntityMetamodel<?>> entityMetamodels = context.allEntityDefs();
3335
SelectCommand<List<EntityPool>> command =
34-
new SelectCommand<>(query, new EntityPoolIterationHandler(entityMetamodels));
36+
new SelectCommand<>(
37+
query, new EntityPoolIterationHandler(context.getProjectionEntityMetamodels()));
3538
List<EntityPool> entityPools = command.execute();
3639
for (EntityPool entityPool : entityPools) {
3740
Map<EntityMetamodel<?>, Object> associationCandidate = new LinkedHashMap<>();
@@ -56,7 +59,7 @@ public List<ENTITY> execute() {
5659
}
5760
return (List<ENTITY>)
5861
cache.entrySet().stream()
59-
.filter(e -> e.getKey().getEntityMetamodel() == context.entityMetamodel)
62+
.filter(e -> e.getKey().getEntityMetamodel() == entityMetamodel)
6063
.map(Map.Entry::getValue)
6164
.collect(toList());
6265
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package org.seasar.doma.jdbc.criteria.command;
22

3+
import java.util.List;
34
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
45
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
56

67
public interface DataRow {
78

89
<ENTITY> ENTITY get(EntityMetamodel<ENTITY> entityEntityMetamodel);
910

11+
<ENTITY> ENTITY get(
12+
EntityMetamodel<ENTITY> entityEntityMetamodel, List<PropertyMetamodel<?>> propertyMetamodels);
13+
1014
<PROPERTY> PROPERTY get(PropertyMetamodel<PROPERTY> propertyMetamodel);
1115
}
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
package org.seasar.doma.jdbc.criteria.command;
22

33
import java.util.List;
4+
import java.util.Map;
45
import java.util.Objects;
56
import org.seasar.doma.internal.jdbc.command.AbstractIterationHandler;
67
import org.seasar.doma.internal.jdbc.command.ResultListCallback;
78
import org.seasar.doma.jdbc.ObjectProvider;
89
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
10+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
911
import org.seasar.doma.jdbc.query.SelectQuery;
1012

1113
public class EntityPoolIterationHandler
1214
extends AbstractIterationHandler<EntityPool, List<EntityPool>> {
13-
private final List<EntityMetamodel<?>> entityMetamodels;
15+
private final Map<EntityMetamodel<?>, List<PropertyMetamodel<?>>> projectionEntityMetamodels;
1416

15-
public EntityPoolIterationHandler(List<EntityMetamodel<?>> entityMetamodels) {
17+
public EntityPoolIterationHandler(
18+
Map<EntityMetamodel<?>, List<PropertyMetamodel<?>>> projectionEntityMetamodels) {
1619
super(new ResultListCallback<>());
17-
this.entityMetamodels = Objects.requireNonNull(entityMetamodels);
20+
this.projectionEntityMetamodels = Objects.requireNonNull(projectionEntityMetamodels);
1821
}
1922

2023
@Override
2124
protected ObjectProvider<EntityPool> createObjectProvider(SelectQuery query) {
22-
return new EntityPoolProvider(entityMetamodels, query);
25+
return new EntityPoolProvider(projectionEntityMetamodels, query);
2326
}
2427
}

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityPoolProvider.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@
1212
import java.util.stream.Collectors;
1313
import org.seasar.doma.jdbc.ObjectProvider;
1414
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
15+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
1516
import org.seasar.doma.jdbc.entity.EntityPropertyType;
1617
import org.seasar.doma.jdbc.entity.EntityType;
1718
import org.seasar.doma.jdbc.entity.Property;
1819
import org.seasar.doma.jdbc.query.Query;
1920

2021
public class EntityPoolProvider implements ObjectProvider<EntityPool> {
21-
private final List<EntityMetamodel<?>> entityMetamodels;
22+
private final Map<EntityMetamodel<?>, List<PropertyMetamodel<?>>> projectionEntityMetamodels;
2223
private final FetchSupport fetchSupport;
2324

24-
public EntityPoolProvider(List<EntityMetamodel<?>> entityMetamodels, Query query) {
25-
this.entityMetamodels = Objects.requireNonNull(entityMetamodels);
25+
public EntityPoolProvider(
26+
Map<EntityMetamodel<?>, List<PropertyMetamodel<?>>> projectionEntityMetamodels, Query query) {
27+
this.projectionEntityMetamodels = Objects.requireNonNull(projectionEntityMetamodels);
2628
Objects.requireNonNull(query);
2729
this.fetchSupport = new FetchSupport(query);
2830
}
@@ -33,9 +35,13 @@ public EntityPool get(ResultSet resultSet) throws SQLException {
3335
Objects.requireNonNull(resultSet);
3436
EntityPool entityPool = new EntityPool();
3537
int index = 1;
36-
for (EntityMetamodel<?> entityMetamodel : entityMetamodels) {
38+
for (Map.Entry<EntityMetamodel<?>, List<PropertyMetamodel<?>>> entry :
39+
projectionEntityMetamodels.entrySet()) {
40+
EntityMetamodel<?> entityMetamodel = entry.getKey();
41+
List<PropertyMetamodel<?>> projectionTargets = entry.getValue();
3742
EntityType<?> entityType = entityMetamodel.asType();
38-
List<? extends EntityPropertyType<?, ?>> propertyTypes = entityType.getEntityPropertyTypes();
43+
List<? extends EntityPropertyType<?, ?>> propertyTypes =
44+
projectionTargets.stream().map(PropertyMetamodel::asType).collect(toList());
3945
List<Prop> props = new ArrayList<>(propertyTypes.size());
4046
for (EntityPropertyType<?, ?> propertyType : propertyTypes) {
4147
Property<Object, ?> property = (Property<Object, ?>) propertyType.createProperty();

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/MappedResultProvider.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,13 @@ public RESULT get(ResultSet resultSet) throws SQLException {
3535

3636
@Override
3737
public <ENTITY> ENTITY get(EntityMetamodel<ENTITY> entityMetamodel) {
38-
List<PropertyMetamodel<?>> propertyMetamodels = entityMetamodel.allPropertyMetamodels();
38+
return get(entityMetamodel, entityMetamodel.allPropertyMetamodels());
39+
}
40+
41+
@Override
42+
public <ENTITY> ENTITY get(
43+
EntityMetamodel<ENTITY> entityMetamodel,
44+
List<PropertyMetamodel<?>> propertyMetamodels) {
3945
Map<String, Property<ENTITY, ?>> states = new HashMap<>(propertyMetamodels.size());
4046
List<Object> rawValues = new ArrayList<>(propertyMetamodels.size());
4147
for (PropertyMetamodel<?> propertyMetamodel : propertyMetamodels) {

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

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,47 @@
22

33
import java.util.Arrays;
44
import java.util.Collections;
5+
import java.util.LinkedHashMap;
6+
import java.util.Map;
57
import java.util.Objects;
8+
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
69
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
710

811
public interface Projection {
9-
All All = new All() {};
1012

1113
<R> R accept(Visitor<R> visitor);
1214

13-
class All implements Projection {
14-
private All() {}
15+
class EntityMetamodels implements Projection {
16+
public final Map<EntityMetamodel<?>, java.util.List<PropertyMetamodel<?>>> map =
17+
new LinkedHashMap<>();
18+
19+
public EntityMetamodels(EntityMetamodel<?> entityMetamodel) {
20+
Objects.requireNonNull(entityMetamodel);
21+
map.put(entityMetamodel, entityMetamodel.allPropertyMetamodels());
22+
}
23+
24+
public EntityMetamodels(
25+
EntityMetamodel<?> entityMetamodel,
26+
java.util.List<PropertyMetamodel<?>> propertyMetamodels) {
27+
Objects.requireNonNull(entityMetamodel);
28+
Objects.requireNonNull(propertyMetamodels);
29+
map.put(entityMetamodel, Collections.unmodifiableList(propertyMetamodels));
30+
}
1531

1632
@Override
1733
public <R> R accept(Visitor<R> visitor) {
1834
return visitor.visit(this);
1935
}
2036
}
2137

22-
class List implements Projection {
38+
class PropertyMetamodels implements Projection {
2339
public final java.util.List<PropertyMetamodel<?>> propertyMetamodels;
2440

25-
public List(PropertyMetamodel<?>... propertyMetamodels) {
41+
public PropertyMetamodels(PropertyMetamodel<?>... propertyMetamodels) {
2642
this(Arrays.asList(propertyMetamodels));
2743
}
2844

29-
public List(java.util.List<PropertyMetamodel<?>> propertyMetamodels) {
45+
public PropertyMetamodels(java.util.List<PropertyMetamodel<?>> propertyMetamodels) {
3046
Objects.requireNonNull(propertyMetamodels);
3147
this.propertyMetamodels = Collections.unmodifiableList(propertyMetamodels);
3248
}
@@ -38,8 +54,8 @@ public <R> R accept(Visitor<R> visitor) {
3854
}
3955

4056
interface Visitor<R> {
41-
R visit(All all);
57+
R visit(EntityMetamodels entityMetamodels);
4258

43-
R visit(List list);
59+
R visit(PropertyMetamodels propertyMetamodels);
4460
}
4561
}

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

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static java.util.stream.Collectors.toList;
44

55
import java.util.ArrayList;
6+
import java.util.Collection;
67
import java.util.LinkedHashMap;
78
import java.util.List;
89
import java.util.Map;
@@ -17,7 +18,7 @@
1718

1819
public class SelectContext implements Context {
1920
public final EntityMetamodel<?> entityMetamodel;
20-
public Projection projection = Projection.All;
21+
public Projection projection;
2122
public DistinctOption distinct = DistinctOption.none();
2223
public final List<Join> joins = new ArrayList<>();
2324
public List<Criterion> where = new ArrayList<>();
@@ -33,6 +34,7 @@ public class SelectContext implements Context {
3334

3435
public SelectContext(EntityMetamodel<?> entityMetamodel) {
3536
this.entityMetamodel = Objects.requireNonNull(entityMetamodel);
37+
this.projection = new Projection.EntityMetamodels(entityMetamodel);
3638
}
3739

3840
@Override
@@ -50,29 +52,48 @@ public SelectSettings getSettings() {
5052
return settings;
5153
}
5254

53-
public List<EntityMetamodel<?>> allEntityDefs() {
54-
Stream<EntityMetamodel<?>> a = Stream.of(entityMetamodel);
55-
Stream<EntityMetamodel<?>> b =
56-
associations.keySet().stream().flatMap(pair -> Stream.of(pair.fst, pair.snd));
57-
return Stream.concat(a, b).distinct().collect(toList());
55+
public Map<EntityMetamodel<?>, List<PropertyMetamodel<?>>> getProjectionEntityMetamodels() {
56+
return projection.accept(
57+
new Projection.Visitor<Map<EntityMetamodel<?>, List<PropertyMetamodel<?>>>>() {
58+
@Override
59+
public Map<EntityMetamodel<?>, List<PropertyMetamodel<?>>> visit(
60+
Projection.EntityMetamodels entityMetamodels) {
61+
Map<EntityMetamodel<?>, List<PropertyMetamodel<?>>> map =
62+
new LinkedHashMap<>(entityMetamodels.map);
63+
associations.keySet().stream()
64+
.flatMap(pair -> Stream.of(pair.fst, pair.snd))
65+
.forEach(
66+
it -> {
67+
if (!map.containsKey(it)) {
68+
map.put(it, it.allPropertyMetamodels());
69+
}
70+
});
71+
return map;
72+
}
73+
74+
@Override
75+
public Map<EntityMetamodel<?>, List<PropertyMetamodel<?>>> visit(
76+
Projection.PropertyMetamodels propertyMetamodels) {
77+
throw new IllegalStateException();
78+
}
79+
});
5880
}
5981

60-
public List<PropertyMetamodel<?>> allPropertyMetamodels() {
82+
public List<PropertyMetamodel<?>> getProjectionPropertyMetamodels() {
6183
return projection.accept(
6284
new Projection.Visitor<List<PropertyMetamodel<?>>>() {
85+
6386
@Override
64-
public List<PropertyMetamodel<?>> visit(Projection.All all) {
65-
return allEntityDefs().stream()
66-
.flatMap(it -> it.allPropertyMetamodels().stream())
87+
public List<PropertyMetamodel<?>> visit(Projection.EntityMetamodels entityMetamodels) {
88+
return getProjectionEntityMetamodels().values().stream()
89+
.flatMap(Collection::stream)
6790
.collect(toList());
6891
}
6992

7093
@Override
71-
public List<PropertyMetamodel<?>> visit(Projection.List list) {
72-
if (list.propertyMetamodels.isEmpty()) {
73-
return visit(Projection.All);
74-
}
75-
return list.propertyMetamodels;
94+
public List<PropertyMetamodel<?>> visit(
95+
Projection.PropertyMetamodels propertyMetamodels) {
96+
return propertyMetamodels.propertyMetamodels;
7697
}
7798
});
7899
}

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

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package org.seasar.doma.jdbc.criteria.declaration;
22

3+
import java.util.ArrayList;
34
import java.util.Arrays;
5+
import java.util.LinkedHashSet;
46
import java.util.List;
57
import java.util.Objects;
8+
import java.util.Set;
69
import java.util.function.BiConsumer;
710
import java.util.function.Consumer;
811
import org.seasar.doma.DomaException;
@@ -17,6 +20,8 @@
1720
import org.seasar.doma.jdbc.criteria.option.AssociationOption;
1821
import org.seasar.doma.jdbc.criteria.option.DistinctOption;
1922
import org.seasar.doma.jdbc.criteria.option.ForUpdateOption;
23+
import org.seasar.doma.jdbc.entity.EntityPropertyType;
24+
import org.seasar.doma.jdbc.entity.EntityType;
2025
import org.seasar.doma.message.Message;
2126

2227
public class SelectFromDeclaration {
@@ -99,9 +104,41 @@ public void select(List<PropertyMetamodel<?>> propertyMetamodels) {
99104
Objects.requireNonNull(propertyMetamodels);
100105
int i = 0;
101106
for (PropertyMetamodel<?> propertyMetamodel : propertyMetamodels) {
102-
Objects.requireNonNull(propertyMetamodels, "propertyMetamodels: " + i);
107+
Objects.requireNonNull(propertyMetamodel, "propertyMetamodels: " + i);
103108
}
104-
context.projection = new Projection.List(propertyMetamodels);
109+
context.projection = new Projection.PropertyMetamodels(propertyMetamodels);
110+
}
111+
112+
public void select(EntityMetamodel<?> entityMetamodel) {
113+
Objects.requireNonNull(entityMetamodel);
114+
if (!context.getEntityMetamodels().contains(entityMetamodel)) {
115+
throw new DomaException(Message.DOMA6009, "entityMetamodel");
116+
}
117+
context.projection = new Projection.EntityMetamodels(entityMetamodel);
118+
}
119+
120+
public void selectTo(
121+
EntityMetamodel<?> entityMetamodel, List<PropertyMetamodel<?>> propertyMetamodels) {
122+
Objects.requireNonNull(propertyMetamodels);
123+
if (!context.getEntityMetamodels().contains(entityMetamodel)) {
124+
throw new DomaException(Message.DOMA6007, "entityMetamodel");
125+
}
126+
int i = 0;
127+
for (PropertyMetamodel<?> propertyMetamodel : propertyMetamodels) {
128+
Objects.requireNonNull(propertyMetamodel, "propertyMetamodels: " + i);
129+
if (!entityMetamodel.allPropertyMetamodels().contains(propertyMetamodel)) {
130+
throw new DomaException(Message.DOMA6008, i);
131+
}
132+
}
133+
Set<PropertyMetamodel<?>> projectionTargets = new LinkedHashSet<>();
134+
EntityType<?> entityType = entityMetamodel.asType();
135+
List<? extends EntityPropertyType<?, ?>> idPropertyTypes = entityType.getIdPropertyTypes();
136+
entityMetamodel.allPropertyMetamodels().stream()
137+
.filter(it -> idPropertyTypes.contains(it.asType()))
138+
.forEach(projectionTargets::add);
139+
projectionTargets.addAll(propertyMetamodels);
140+
context.projection =
141+
new Projection.EntityMetamodels(entityMetamodel, new ArrayList<>(projectionTargets));
105142
}
106143

107144
@SuppressWarnings("unchecked")

0 commit comments

Comments
 (0)