Skip to content

Commit 5d5cc2f

Browse files
authored
Add the "avgAsDouble" aggregate function (#605)
1 parent 33b5edf commit 5d5cc2f

File tree

7 files changed

+75
-1
lines changed

7 files changed

+75
-1
lines changed

docs/criteria-api.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,7 @@ Aggregate Functions (NativeSql)
824824
We support the following aggregate functions:
825825

826826
* avg(property)
827+
* avgAsDouble(property)
827828
* count()
828829
* count(property)
829830
* countDistinct(property)

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,31 @@ public void accept(PropertyMetamodel.Visitor visitor) {
6969
}
7070
}
7171

72+
class AvgAsDouble extends AbstractFunction<Double> {
73+
74+
public AvgAsDouble(PropertyMetamodel<?> argument) {
75+
super("avg", argument);
76+
}
77+
78+
@Override
79+
public Class<?> asClass() {
80+
return Double.class;
81+
}
82+
83+
@Override
84+
public EntityPropertyType<?, Double> asType() {
85+
return new DoublePropertyType(null);
86+
}
87+
88+
@Override
89+
public void accept(PropertyMetamodel.Visitor visitor) {
90+
if (visitor instanceof AggregateFunction.Visitor) {
91+
AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor;
92+
v.visit(this);
93+
}
94+
}
95+
}
96+
7297
class Count extends AbstractFunction<Long> {
7398

7499
public final boolean distinct;
@@ -176,6 +201,8 @@ public void accept(Visitor visitor) {
176201
interface Visitor {
177202
void visit(AggregateFunction.Avg<?> avg);
178203

204+
void visit(AggregateFunction.AvgAsDouble avg);
205+
179206
void visit(AggregateFunction.Count count);
180207

181208
void visit(AggregateFunction.Max<?> max);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,11 @@ public static <PROPERTY> AggregateFunction.Avg<PROPERTY> avg(
239239
return new AggregateFunction.Avg<>(propertyMetamodel);
240240
}
241241

242+
public static AggregateFunction.AvgAsDouble avgAsDouble(PropertyMetamodel<?> propertyMetamodel) {
243+
Objects.requireNonNull(propertyMetamodel);
244+
return new AggregateFunction.AvgAsDouble(propertyMetamodel);
245+
}
246+
242247
public static AggregateFunction.Count count() {
243248
return new AggregateFunction.Count(AggregateFunction.Asterisk);
244249
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,11 @@ public void visit(AggregateFunction.Avg<?> avg) {
562562
oneArgumentFunction(avg.getName(), avg.argument());
563563
}
564564

565+
@Override
566+
public void visit(AggregateFunction.AvgAsDouble avg) {
567+
oneArgumentFunction(avg.getName(), avg.argument());
568+
}
569+
565570
@Override
566571
public void visit(AggregateFunction.Count count) {
567572
buf.appendSql(count.getName());

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertThrows;
55
import static org.seasar.doma.jdbc.criteria.expression.Expressions.avg;
6+
import static org.seasar.doma.jdbc.criteria.expression.Expressions.avgAsDouble;
67
import static org.seasar.doma.jdbc.criteria.expression.Expressions.concat;
78
import static org.seasar.doma.jdbc.criteria.expression.Expressions.count;
89
import static org.seasar.doma.jdbc.criteria.expression.Expressions.countDistinct;
@@ -1384,4 +1385,20 @@ void expression_select() {
13841385
Sql<?> sql = stmt.asSql();
13851386
assertEquals("select (select t1_.ID from EMP t1_) from EMP t0_", sql.getRawSql());
13861387
}
1388+
1389+
@Test
1390+
void expression_avg() {
1391+
Emp_ e = new Emp_();
1392+
Buildable<?> stmt = nativeSql.from(e).select(avg(e.salary));
1393+
Sql<?> sql = stmt.asSql();
1394+
assertEquals("select avg(t0_.SALARY) from EMP t0_", sql.getFormattedSql());
1395+
}
1396+
1397+
@Test
1398+
void expression_avgAsDouble() {
1399+
Emp_ e = new Emp_();
1400+
Buildable<?> stmt = nativeSql.from(e).select(avgAsDouble(e.salary));
1401+
Sql<?> sql = stmt.asSql();
1402+
assertEquals("select avg(t0_.SALARY) from EMP t0_", sql.getFormattedSql());
1403+
}
13871404
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static org.junit.jupiter.api.Assertions.assertThrows;
66
import static org.seasar.doma.jdbc.criteria.expression.Expressions.add;
77
import static org.seasar.doma.jdbc.criteria.expression.Expressions.avg;
8+
import static org.seasar.doma.jdbc.criteria.expression.Expressions.avgAsDouble;
89
import static org.seasar.doma.jdbc.criteria.expression.Expressions.concat;
910
import static org.seasar.doma.jdbc.criteria.expression.Expressions.count;
1011
import static org.seasar.doma.jdbc.criteria.expression.Expressions.div;
@@ -161,7 +162,18 @@ void testAvg() {
161162
assertNotEquals(avg(e.id), max(e.id));
162163

163164
assertEquals("avg", avg(e.id).getName());
164-
assertEquals(e.id, count(e.id).argument());
165+
assertEquals(e.id, avg(e.id).argument());
166+
}
167+
168+
@SuppressWarnings("AssertBetweenInconvertibleTypes")
169+
@Test
170+
void testAvgAsDouble() {
171+
assertEquals(avgAsDouble(e.id), avgAsDouble(e.id));
172+
assertNotEquals(avgAsDouble(e.id), avgAsDouble(e.name));
173+
assertNotEquals(avgAsDouble(e.id), max(e.id));
174+
175+
assertEquals("avg", avgAsDouble(e.id).getName());
176+
assertEquals(e.id, avgAsDouble(e.id).argument());
165177
}
166178

167179
@SuppressWarnings("AssertBetweenInconvertibleTypes")

doma-kotlin/src/main/kotlin/org/seasar/doma/jdbc/criteria/expression/KExpressions.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.seasar.doma.jdbc.criteria.expression
22

33
import org.seasar.doma.jdbc.criteria.context.SubSelectContext
44
import org.seasar.doma.jdbc.criteria.expression.AggregateFunction.Avg
5+
import org.seasar.doma.jdbc.criteria.expression.AggregateFunction.AvgAsDouble
56
import org.seasar.doma.jdbc.criteria.expression.AggregateFunction.Max
67
import org.seasar.doma.jdbc.criteria.expression.AggregateFunction.Min
78
import org.seasar.doma.jdbc.criteria.expression.AggregateFunction.Sum
@@ -235,6 +236,12 @@ object KExpressions {
235236
return Expressions.avg(propertyMetamodel)
236237
}
237238

239+
fun avgAsDouble(
240+
propertyMetamodel: PropertyMetamodel<*>
241+
): AvgAsDouble {
242+
return Expressions.avgAsDouble(propertyMetamodel)
243+
}
244+
238245
fun count(): AggregateFunction.Count {
239246
return Expressions.count()
240247
}

0 commit comments

Comments
 (0)