Skip to content

Commit bf11ecf

Browse files
committed
Refactor returning methods for concise API and improved usability.
Replaced `Result` and `MultiResult` with `Singular` and `Listable` abstractions for more intuitive APIs.
1 parent 67d34ea commit bf11ecf

30 files changed

+771
-444
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
* Copyright Doma Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.seasar.doma.jdbc.criteria.statement;
17+
18+
import java.util.Objects;
19+
import org.seasar.doma.internal.jdbc.command.EntitySingleResultHandler;
20+
import org.seasar.doma.jdbc.Config;
21+
import org.seasar.doma.jdbc.OptimisticLockException;
22+
import org.seasar.doma.jdbc.command.Command;
23+
import org.seasar.doma.jdbc.criteria.context.DeleteSettings;
24+
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
25+
import org.seasar.doma.jdbc.query.Query;
26+
import org.seasar.doma.jdbc.query.ReturningProperties;
27+
28+
public class EntityqlDeleteReturningStatement<ENTITY>
29+
extends AbstractStatement<EntityqlDeleteReturningStatement<ENTITY>, ENTITY>
30+
implements Singular<ENTITY> {
31+
32+
private final EntityMetamodel<ENTITY> entityMetamodel;
33+
private final ENTITY entity;
34+
private final DeleteSettings settings;
35+
private final ReturningProperties returning;
36+
37+
public EntityqlDeleteReturningStatement(
38+
Config config,
39+
EntityMetamodel<ENTITY> entityMetamodel,
40+
ENTITY entity,
41+
DeleteSettings settings,
42+
ReturningProperties returning) {
43+
super(Objects.requireNonNull(config));
44+
this.entityMetamodel = Objects.requireNonNull(entityMetamodel);
45+
this.entity = Objects.requireNonNull(entity);
46+
this.settings = Objects.requireNonNull(settings);
47+
this.returning = Objects.requireNonNull(returning);
48+
}
49+
50+
/**
51+
* {@inheritDoc}
52+
*
53+
* @throws EmptyWhereClauseException if {@link DeleteSettings#getAllowEmptyWhere()} returns
54+
* {@literal false} and the WHERE clause is empty
55+
* @throws OptimisticLockException if the entity has a version property and an update count is
56+
* {@literal 0}
57+
* @throws org.seasar.doma.jdbc.JdbcException if a JDBC related error occurs
58+
*/
59+
@SuppressWarnings("EmptyMethod")
60+
@Override
61+
public ENTITY execute() {
62+
return super.execute();
63+
}
64+
65+
@Override
66+
protected Command<ENTITY> createCommand() {
67+
var entityType = entityMetamodel.asType();
68+
var query = config.getQueryImplementors().createAutoDeleteQuery(EXECUTE_METHOD, entityType);
69+
query.setConfig(config);
70+
query.setMethod(EXECUTE_METHOD);
71+
query.setEntity(entity);
72+
query.setCallerClassName(getClass().getName());
73+
query.setCallerMethodName(EXECUTE_METHOD_NAME);
74+
query.setQueryTimeout(settings.getQueryTimeout());
75+
query.setSqlLogType(settings.getSqlLogType());
76+
query.setVersionIgnored(settings.getIgnoreVersion());
77+
query.setOptimisticLockExceptionSuppressed(settings.getSuppressOptimisticLockException());
78+
query.setMessage(settings.getComment());
79+
query.setReturning(returning);
80+
query.prepare();
81+
var command =
82+
config
83+
.getCommandImplementors()
84+
.createDeleteReturningCommand(
85+
EXECUTE_METHOD, query, new EntitySingleResultHandler<>(entityType), () -> null);
86+
return new Command<>() {
87+
@Override
88+
public Query getQuery() {
89+
return query;
90+
}
91+
92+
@Override
93+
public ENTITY execute() {
94+
ENTITY entity = command.execute();
95+
query.complete();
96+
return entity;
97+
}
98+
};
99+
}
100+
}

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

Lines changed: 6 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -16,53 +16,37 @@
1616
package org.seasar.doma.jdbc.criteria.statement;
1717

1818
import java.util.Objects;
19-
import org.seasar.doma.internal.jdbc.command.EntitySingleResultHandler;
2019
import org.seasar.doma.jdbc.Config;
2120
import org.seasar.doma.jdbc.OptimisticLockException;
2221
import org.seasar.doma.jdbc.Result;
2322
import org.seasar.doma.jdbc.command.Command;
24-
import org.seasar.doma.jdbc.command.DeleteCommand;
25-
import org.seasar.doma.jdbc.command.DeleteReturningCommand;
2623
import org.seasar.doma.jdbc.criteria.context.DeleteSettings;
2724
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
2825
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
29-
import org.seasar.doma.jdbc.entity.EntityType;
30-
import org.seasar.doma.jdbc.query.AutoDeleteQuery;
3126
import org.seasar.doma.jdbc.query.Query;
32-
import org.seasar.doma.jdbc.query.ReturningProperties;
3327

3428
public class EntityqlDeleteStatement<ENTITY>
3529
extends AbstractStatement<EntityqlDeleteStatement<ENTITY>, Result<ENTITY>> {
3630

3731
private final EntityMetamodel<ENTITY> entityMetamodel;
3832
private final ENTITY entity;
3933
private final DeleteSettings settings;
40-
private final ReturningProperties returning;
4134

4235
public EntityqlDeleteStatement(
4336
Config config,
4437
EntityMetamodel<ENTITY> entityMetamodel,
4538
ENTITY entity,
4639
DeleteSettings settings) {
47-
this(config, entityMetamodel, entity, settings, ReturningProperties.NONE);
48-
}
49-
50-
private EntityqlDeleteStatement(
51-
Config config,
52-
EntityMetamodel<ENTITY> entityMetamodel,
53-
ENTITY entity,
54-
DeleteSettings settings,
55-
ReturningProperties returning) {
5640
super(Objects.requireNonNull(config));
5741
this.entityMetamodel = Objects.requireNonNull(entityMetamodel);
5842
this.entity = Objects.requireNonNull(entity);
5943
this.settings = Objects.requireNonNull(settings);
60-
this.returning = returning;
6144
}
6245

63-
public Statement<Result<ENTITY>> returning(PropertyMetamodel<?>... properties) {
46+
public Singular<ENTITY> returning(PropertyMetamodel<?>... properties) {
6447
var returning = ReturningPropertyMetamodels.of(entityMetamodel, properties);
65-
return new EntityqlDeleteStatement<>(config, entityMetamodel, entity, settings, returning);
48+
return new EntityqlDeleteReturningStatement<>(
49+
config, entityMetamodel, entity, settings, returning);
6650
}
6751

6852
/**
@@ -82,9 +66,8 @@ public Result<ENTITY> execute() {
8266

8367
@Override
8468
protected Command<Result<ENTITY>> createCommand() {
85-
EntityType<ENTITY> entityType = entityMetamodel.asType();
86-
AutoDeleteQuery<ENTITY> query =
87-
config.getQueryImplementors().createAutoDeleteQuery(EXECUTE_METHOD, entityType);
69+
var entityType = entityMetamodel.asType();
70+
var query = config.getQueryImplementors().createAutoDeleteQuery(EXECUTE_METHOD, entityType);
8871
query.setConfig(config);
8972
query.setMethod(EXECUTE_METHOD);
9073
query.setEntity(entity);
@@ -95,18 +78,8 @@ protected Command<Result<ENTITY>> createCommand() {
9578
query.setVersionIgnored(settings.getIgnoreVersion());
9679
query.setOptimisticLockExceptionSuppressed(settings.getSuppressOptimisticLockException());
9780
query.setMessage(settings.getComment());
98-
query.setReturning(returning);
9981
query.prepare();
100-
if (returning.isNone()) {
101-
return createCommand(query);
102-
} else {
103-
return createReturningCommand(entityType, query);
104-
}
105-
}
106-
107-
private Command<Result<ENTITY>> createCommand(AutoDeleteQuery<ENTITY> query) {
108-
DeleteCommand command =
109-
config.getCommandImplementors().createDeleteCommand(EXECUTE_METHOD, query);
82+
var command = config.getCommandImplementors().createDeleteCommand(EXECUTE_METHOD, query);
11083
return new Command<>() {
11184
@Override
11285
public Query getQuery() {
@@ -121,27 +94,4 @@ public Result<ENTITY> execute() {
12194
}
12295
};
12396
}
124-
125-
private Command<Result<ENTITY>> createReturningCommand(
126-
EntityType<ENTITY> entityType, AutoDeleteQuery<ENTITY> query) {
127-
DeleteReturningCommand<ENTITY> command =
128-
config
129-
.getCommandImplementors()
130-
.createDeleteReturningCommand(
131-
EXECUTE_METHOD, query, new EntitySingleResultHandler<>(entityType), () -> null);
132-
return new Command<>() {
133-
@Override
134-
public Query getQuery() {
135-
return query;
136-
}
137-
138-
@Override
139-
public Result<ENTITY> execute() {
140-
ENTITY entity = command.execute();
141-
int count = entity == null ? 0 : 1;
142-
query.complete();
143-
return new Result<>(count, entity);
144-
}
145-
};
146-
}
14797
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ public EntityqlInsertTerminal<ENTITY> keys(PropertyMetamodel<?>... keys) {
6060
config, entityMetamodel, entity, settings, duplicateKeyType, Arrays.stream(keys).toList());
6161
}
6262

63-
public Statement<Result<ENTITY>> returning(PropertyMetamodel<?>... properties) {
64-
var returning = ReturningPropertyMetamodels.of(entityMetamodel, properties);
63+
public Singular<ENTITY> returning(PropertyMetamodel<?>... properties) {
6564
return new EntityqlInsertTerminal<>(
66-
config, entityMetamodel, entity, settings, duplicateKeyType, List.of(), returning);
65+
config, entityMetamodel, entity, settings, duplicateKeyType, List.of())
66+
.returning(properties);
6767
}
6868

6969
/**
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
* Copyright Doma Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.seasar.doma.jdbc.criteria.statement;
17+
18+
import java.util.List;
19+
import java.util.Objects;
20+
import org.seasar.doma.internal.jdbc.command.EntitySingleResultHandler;
21+
import org.seasar.doma.jdbc.Config;
22+
import org.seasar.doma.jdbc.command.Command;
23+
import org.seasar.doma.jdbc.command.InsertReturningCommand;
24+
import org.seasar.doma.jdbc.criteria.context.InsertSettings;
25+
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
26+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
27+
import org.seasar.doma.jdbc.entity.EntityType;
28+
import org.seasar.doma.jdbc.query.AutoInsertQuery;
29+
import org.seasar.doma.jdbc.query.DuplicateKeyType;
30+
import org.seasar.doma.jdbc.query.Query;
31+
import org.seasar.doma.jdbc.query.ReturningProperties;
32+
33+
class EntityqlInsertReturningStatement<ENTITY>
34+
extends AbstractStatement<EntityqlInsertReturningStatement<ENTITY>, ENTITY>
35+
implements Singular<ENTITY> {
36+
37+
private final EntityMetamodel<ENTITY> entityMetamodel;
38+
private final ENTITY entity;
39+
private final InsertSettings settings;
40+
private final DuplicateKeyType duplicateKeyType;
41+
private final List<PropertyMetamodel<?>> keys;
42+
private final ReturningProperties returning;
43+
44+
public EntityqlInsertReturningStatement(
45+
Config config,
46+
EntityMetamodel<ENTITY> entityMetamodel,
47+
ENTITY entity,
48+
InsertSettings settings,
49+
DuplicateKeyType duplicateKeyType,
50+
List<PropertyMetamodel<?>> keys,
51+
ReturningProperties returning) {
52+
super(Objects.requireNonNull(config));
53+
this.entityMetamodel = Objects.requireNonNull(entityMetamodel);
54+
this.entity = Objects.requireNonNull(entity);
55+
this.settings = Objects.requireNonNull(settings);
56+
this.duplicateKeyType = Objects.requireNonNull(duplicateKeyType);
57+
this.keys = Objects.requireNonNull(keys);
58+
this.returning = Objects.requireNonNull(returning);
59+
}
60+
61+
/**
62+
* {@inheritDoc}
63+
*
64+
* @throws org.seasar.doma.jdbc.UniqueConstraintException if an unique constraint is violated
65+
* @throws org.seasar.doma.jdbc.JdbcException if a JDBC related error occurs
66+
*/
67+
@SuppressWarnings("EmptyMethod")
68+
@Override
69+
public ENTITY execute() {
70+
return super.execute();
71+
}
72+
73+
@Override
74+
protected Command<ENTITY> createCommand() {
75+
EntityType<ENTITY> entityType = entityMetamodel.asType();
76+
AutoInsertQuery<ENTITY> query =
77+
config.getQueryImplementors().createAutoInsertQuery(EXECUTE_METHOD, entityType);
78+
query.setMethod(EXECUTE_METHOD);
79+
query.setConfig(config);
80+
query.setEntity(entity);
81+
query.setCallerClassName(getClass().getName());
82+
query.setCallerMethodName(EXECUTE_METHOD_NAME);
83+
query.setQueryTimeout(settings.getQueryTimeout());
84+
query.setSqlLogType(settings.getSqlLogType());
85+
query.setNullExcluded(settings.getExcludeNull());
86+
query.setIncludedPropertyNames(
87+
settings.include().stream().map(PropertyMetamodel::getName).toArray(String[]::new));
88+
query.setExcludedPropertyNames(
89+
settings.exclude().stream().map(PropertyMetamodel::getName).toArray(String[]::new));
90+
query.setMessage(settings.getComment());
91+
query.setDuplicateKeyType(duplicateKeyType);
92+
query.setDuplicateKeyNames(
93+
keys.stream().map(PropertyMetamodel::getName).toArray(String[]::new));
94+
query.setReturning(returning);
95+
query.prepare();
96+
97+
InsertReturningCommand<ENTITY> command =
98+
config
99+
.getCommandImplementors()
100+
.createInsertReturningCommand(
101+
EXECUTE_METHOD, query, new EntitySingleResultHandler<>(entityType), () -> null);
102+
return new Command<>() {
103+
@Override
104+
public Query getQuery() {
105+
return query;
106+
}
107+
108+
@Override
109+
public ENTITY execute() {
110+
ENTITY entity = command.execute();
111+
query.complete();
112+
return entity;
113+
}
114+
};
115+
}
116+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public EntityqlInsertIntermediate<ENTITY> onDuplicateKeyIgnore() {
6666
config, entityMetamodel, entity, settings, duplicateKeyType);
6767
}
6868

69-
public Statement<Result<ENTITY>> returning(PropertyMetamodel<?>... properties) {
69+
public Singular<ENTITY> returning(PropertyMetamodel<?>... properties) {
7070
return new EntityqlInsertIntermediate<>(
7171
config, entityMetamodel, entity, settings, duplicateKeyType)
7272
.returning(properties);

0 commit comments

Comments
 (0)