Skip to content

Commit c813ad8

Browse files
committed
Add property expressions
1 parent 90e5563 commit c813ad8

26 files changed

+1191
-416
lines changed

docs/criteria-api.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ We support the following aggregate functions:
592592
* min(property)
593593
* sum(property)
594594

595-
These are defined in the ``org.seasar.doma.jdbc.criteria.AggregateFunctions`` class.
595+
These are defined in the ``org.seasar.doma.jdbc.criteria.expression.Expressions`` class.
596596
Use them with static import.
597597

598598
For example, you can pass the ``sum`` function to the select method:

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

Lines changed: 0 additions & 41 deletions
This file was deleted.

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public interface Operand {
1313

1414
<R> R accept(Visitor<R> visitor);
1515

16-
class Param implements Operand {
16+
final class Param implements Operand {
1717
private final PropertyMetamodel<?> propertyMetamodel;
1818
private final Object value;
1919

@@ -32,9 +32,23 @@ public InParameter<?> createInParameter(Config config) {
3232
public <R> R accept(Visitor<R> visitor) {
3333
return visitor.visit(this);
3434
}
35+
36+
@Override
37+
public boolean equals(Object o) {
38+
if (this == o) return true;
39+
if (!(o instanceof Param)) return false;
40+
Param param = (Param) o;
41+
return propertyMetamodel.equals(param.propertyMetamodel)
42+
&& Objects.equals(value, param.value);
43+
}
44+
45+
@Override
46+
public int hashCode() {
47+
return Objects.hash(propertyMetamodel, value);
48+
}
3549
}
3650

37-
class Prop implements Operand {
51+
final class Prop implements Operand {
3852
public final PropertyMetamodel<?> value;
3953

4054
public Prop(PropertyMetamodel<?> value) {
@@ -45,6 +59,19 @@ public Prop(PropertyMetamodel<?> value) {
4559
public <R> R accept(Visitor<R> visitor) {
4660
return visitor.visit(this);
4761
}
62+
63+
@Override
64+
public boolean equals(Object o) {
65+
if (this == o) return true;
66+
if (!(o instanceof Prop)) return false;
67+
Prop prop = (Prop) o;
68+
return value.equals(prop.value);
69+
}
70+
71+
@Override
72+
public int hashCode() {
73+
return Objects.hash(value);
74+
}
4875
}
4976

5077
interface Visitor<R> {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
public class UpdateContext implements Context {
1212
public final EntityMetamodel<?> entityMetamodel;
1313
public final List<EntityMetamodel<?>> entityMetamodels;
14-
public final Map<Operand.Prop, Operand.Param> set = new LinkedHashMap<>();
14+
public final Map<Operand.Prop, Operand> set = new LinkedHashMap<>();
1515
public List<Criterion> where = new ArrayList<>();
1616
public final UpdateSettings settings = new UpdateSettings();
1717

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,11 @@ public <PROPERTY> void value(PropertyMetamodel<PROPERTY> left, PROPERTY right) {
1717
Objects.requireNonNull(left);
1818
context.set.put(new Operand.Prop(left), new Operand.Param(left, right));
1919
}
20+
21+
public <PROPERTY> void value(
22+
PropertyMetamodel<PROPERTY> left, PropertyMetamodel<PROPERTY> right) {
23+
Objects.requireNonNull(left);
24+
Objects.requireNonNull(right);
25+
context.set.put(new Operand.Prop(left), new Operand.Prop(right));
26+
}
2027
}
Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.seasar.doma.jdbc.criteria.declaration;
1+
package org.seasar.doma.jdbc.criteria.expression;
22

33
import java.util.Objects;
44
import java.util.Optional;
@@ -70,6 +70,14 @@ class Avg<PROPERTY> extends AbstractFunction<PROPERTY> {
7070
public Avg(PropertyMetamodel<PROPERTY> argument) {
7171
super("avg", argument);
7272
}
73+
74+
@Override
75+
public void accept(PropertyMetamodel.Visitor visitor) {
76+
if (visitor instanceof AggregateFunction.Visitor) {
77+
AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor;
78+
v.visit(this);
79+
}
80+
}
7381
}
7482

7583
class Count extends AbstractFunction<Long> {
@@ -88,26 +96,58 @@ public Class<?> asClass() {
8896
public EntityPropertyType<?, Long> asType() {
8997
return propertyType;
9098
}
99+
100+
@Override
101+
public void accept(PropertyMetamodel.Visitor visitor) {
102+
if (visitor instanceof AggregateFunction.Visitor) {
103+
AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor;
104+
v.visit(this);
105+
}
106+
}
91107
}
92108

93109
class Max<PROPERTY> extends AbstractFunction<PROPERTY> {
94110

95111
public Max(PropertyMetamodel<PROPERTY> argument) {
96112
super("max", argument);
97113
}
114+
115+
@Override
116+
public void accept(PropertyMetamodel.Visitor visitor) {
117+
if (visitor instanceof AggregateFunction.Visitor) {
118+
AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor;
119+
v.visit(this);
120+
}
121+
}
98122
}
99123

100124
class Min<PROPERTY> extends AbstractFunction<PROPERTY> {
101125

102126
public Min(PropertyMetamodel<PROPERTY> argument) {
103127
super("min", argument);
104128
}
129+
130+
@Override
131+
public void accept(PropertyMetamodel.Visitor visitor) {
132+
if (visitor instanceof AggregateFunction.Visitor) {
133+
AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor;
134+
v.visit(this);
135+
}
136+
}
105137
}
106138

107139
class Sum<PROPERTY> extends AbstractFunction<PROPERTY> {
108140
public Sum(PropertyMetamodel<PROPERTY> argument) {
109141
super("sum", argument);
110142
}
143+
144+
@Override
145+
public void accept(PropertyMetamodel.Visitor visitor) {
146+
if (visitor instanceof AggregateFunction.Visitor) {
147+
AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor;
148+
v.visit(this);
149+
}
150+
}
111151
}
112152

113153
class Asterisk implements PropertyMetamodel<Long> {
@@ -129,6 +169,28 @@ public Class<?> asClass() {
129169
public EntityPropertyType<?, ?> asType() {
130170
return propertyType;
131171
}
172+
173+
@Override
174+
public void accept(Visitor visitor) {
175+
if (visitor instanceof AggregateFunction.Visitor) {
176+
AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor;
177+
v.visit(this);
178+
}
179+
}
180+
}
181+
182+
interface Visitor {
183+
void visit(AggregateFunction.Avg<?> avg);
184+
185+
void visit(AggregateFunction.Count count);
186+
187+
void visit(AggregateFunction.Max<?> max);
188+
189+
void visit(AggregateFunction.Min<?> min);
190+
191+
void visit(AggregateFunction.Sum<?> sum);
192+
193+
void visit(AggregateFunction.Asterisk asterisk);
132194
}
133195
}
134196

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
package org.seasar.doma.jdbc.criteria.expression;
2+
3+
import java.util.Objects;
4+
import org.seasar.doma.jdbc.criteria.context.Operand;
5+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
6+
import org.seasar.doma.jdbc.entity.EntityPropertyType;
7+
8+
public interface ArithmeticExpression<PROPERTY> extends PropertyMetamodel<PROPERTY> {
9+
10+
abstract class AbstractArithmeticExpression<PROPERTY> implements ArithmeticExpression<PROPERTY> {
11+
private final PropertyMetamodel<?> propertyMetamodel;
12+
public final Operand left;
13+
public final Operand right;
14+
15+
protected AbstractArithmeticExpression(
16+
PropertyMetamodel<?> propertyMetamodel, Operand left, Operand right) {
17+
this.propertyMetamodel = Objects.requireNonNull(propertyMetamodel);
18+
this.left = Objects.requireNonNull(left);
19+
this.right = Objects.requireNonNull(right);
20+
}
21+
22+
@Override
23+
public Class<?> asClass() {
24+
return propertyMetamodel.asClass();
25+
}
26+
27+
@Override
28+
public EntityPropertyType<?, ?> asType() {
29+
return propertyMetamodel.asType();
30+
}
31+
32+
@Override
33+
public boolean equals(Object o) {
34+
if (this == o) return true;
35+
if (!(o instanceof AbstractArithmeticExpression)) return false;
36+
AbstractArithmeticExpression<?> that = (AbstractArithmeticExpression<?>) o;
37+
return propertyMetamodel.equals(that.propertyMetamodel)
38+
&& left.equals(that.left)
39+
&& right.equals(that.right);
40+
}
41+
42+
@Override
43+
public int hashCode() {
44+
return Objects.hash(propertyMetamodel, left, right);
45+
}
46+
}
47+
48+
class Add<PROPERTY> extends AbstractArithmeticExpression<PROPERTY> {
49+
50+
public Add(PropertyMetamodel<?> propertyDef, Operand left, Operand right) {
51+
super(propertyDef, left, right);
52+
}
53+
54+
@Override
55+
public String getName() {
56+
return "+";
57+
}
58+
59+
@Override
60+
public void accept(PropertyMetamodel.Visitor visitor) {
61+
if (visitor instanceof ArithmeticExpression.Visitor) {
62+
ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor;
63+
v.visit(this);
64+
}
65+
}
66+
}
67+
68+
class Sub<PROPERTY> extends AbstractArithmeticExpression<PROPERTY> {
69+
70+
public Sub(PropertyMetamodel<?> propertyDef, Operand left, Operand right) {
71+
super(propertyDef, left, right);
72+
}
73+
74+
@Override
75+
public String getName() {
76+
return "-";
77+
}
78+
79+
@Override
80+
public void accept(PropertyMetamodel.Visitor visitor) {
81+
if (visitor instanceof ArithmeticExpression.Visitor) {
82+
ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor;
83+
v.visit(this);
84+
}
85+
}
86+
}
87+
88+
class Mul<PROPERTY> extends AbstractArithmeticExpression<PROPERTY> {
89+
90+
public Mul(PropertyMetamodel<?> propertyDef, Operand left, Operand right) {
91+
super(propertyDef, left, right);
92+
}
93+
94+
@Override
95+
public String getName() {
96+
return "*";
97+
}
98+
99+
@Override
100+
public void accept(PropertyMetamodel.Visitor visitor) {
101+
if (visitor instanceof ArithmeticExpression.Visitor) {
102+
ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor;
103+
v.visit(this);
104+
}
105+
}
106+
}
107+
108+
class Div<PROPERTY> extends AbstractArithmeticExpression<PROPERTY> {
109+
110+
public Div(PropertyMetamodel<?> propertyDef, Operand left, Operand right) {
111+
super(propertyDef, left, right);
112+
}
113+
114+
@Override
115+
public String getName() {
116+
return "/";
117+
}
118+
119+
@Override
120+
public void accept(PropertyMetamodel.Visitor visitor) {
121+
if (visitor instanceof ArithmeticExpression.Visitor) {
122+
ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor;
123+
v.visit(this);
124+
}
125+
}
126+
}
127+
128+
class Mod<PROPERTY> extends AbstractArithmeticExpression<PROPERTY> {
129+
130+
public Mod(PropertyMetamodel<?> propertyDef, Operand left, Operand right) {
131+
super(propertyDef, left, right);
132+
}
133+
134+
@Override
135+
public String getName() {
136+
return "%";
137+
}
138+
139+
@Override
140+
public void accept(PropertyMetamodel.Visitor visitor) {
141+
if (visitor instanceof ArithmeticExpression.Visitor) {
142+
ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor;
143+
v.visit(this);
144+
}
145+
}
146+
}
147+
148+
interface Visitor {
149+
void visit(Add<?> add);
150+
151+
void visit(Sub<?> sub);
152+
153+
void visit(Mul<?> mul);
154+
155+
void visit(Div<?> div);
156+
157+
void visit(Mod<?> div);
158+
}
159+
}

0 commit comments

Comments
 (0)