Skip to content

Commit 8ed40ea

Browse files
authored
Improving AliasExpression (#1071)
* Improving AliasExpression * Add AliasExpression to Expressions * Can specify alias on orderBy * Fix NativeSqlSelectTest.java for sqlserver * Fix NativeSqlSelectTest.java for BigDecimal * Revert redundant Salary fix
1 parent 79e2760 commit 8ed40ea

File tree

6 files changed

+99
-27
lines changed

6 files changed

+99
-27
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,16 @@
22

33
import java.util.Objects;
44
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
5+
import org.seasar.doma.jdbc.criteria.statement.NativeSqlSelectStarting;
56
import org.seasar.doma.jdbc.entity.EntityPropertyType;
67

8+
/**
9+
* Used to add an alias to a column in the select clause. For in adherence to standard SQL, It is
10+
* recommended to specify only in the {@link NativeSqlSelectStarting#select} and {@link
11+
* NativeSqlSelectStarting#orderBy} method.
12+
*
13+
* @param <PROPERTY> the property type
14+
*/
715
public class AliasExpression<PROPERTY> implements PropertyMetamodel<PROPERTY> {
816

917
private final PropertyMetamodel<PROPERTY> originalPropertyMetamodel;
@@ -21,7 +29,7 @@ public AliasExpression(PropertyMetamodel<PROPERTY> originalPropertyMetamodel, St
2129

2230
@Override
2331
public Class<?> asClass() {
24-
return originalPropertyMetamodel.getClass();
32+
return originalPropertyMetamodel.asClass();
2533
}
2634

2735
@Override

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,4 +292,11 @@ public static <PROPERTY> SelectExpression<PROPERTY> select(
292292
block.apply(new SelectExpression.Declaration());
293293
return new SelectExpression<>(subSelectContext);
294294
}
295+
296+
public static <PROPERTY> AliasExpression<PROPERTY> alias(
297+
PropertyMetamodel<PROPERTY> propertyMetamodel, String alias) {
298+
Objects.requireNonNull(propertyMetamodel);
299+
Objects.requireNonNull(alias);
300+
return new AliasExpression<>(propertyMetamodel, alias);
301+
}
295302
}

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,17 @@ protected Optional<String> getAlias(PropertyMetamodel<?> propertyMetamodel) {
175175
});
176176
}
177177

178+
public void selectColumn(PropertyMetamodel<?> propertyMetamodel) {
179+
propertyMetamodel.accept(
180+
new PropertyMetamodelVisitor() {
181+
@Override
182+
public void visit(AliasExpression<?> aliasExpression) {
183+
aliasExpression.getOriginalPropertyMetamodel().accept(this);
184+
buf.appendSql(" AS " + aliasExpression.getAlias());
185+
}
186+
});
187+
}
188+
178189
public void param(Operand.Param param) {
179190
InParameter<?> parameter = param.createInParameter(config);
180191
param(parameter);
@@ -627,8 +638,7 @@ public void visit(PropertyMetamodel<?> propertyMetamodel) {
627638

628639
@Override
629640
public void visit(AliasExpression<?> aliasExpression) {
630-
aliasExpression.getOriginalPropertyMetamodel().accept(this);
631-
buf.appendSql(" AS " + aliasExpression.getAlias());
641+
buf.appendSql(aliasExpression.getAlias());
632642
}
633643

634644
protected Optional<String> getAlias(PropertyMetamodel<?> propertyMetamodel) {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ private void select() {
8989
buf.appendSql("*");
9090
} else {
9191
for (PropertyMetamodel<?> propertyMetamodel : propertyMetamodels) {
92-
column(propertyMetamodel);
92+
selectColumn(propertyMetamodel);
9393
buf.appendSql(", ");
9494
}
9595
buf.cutBackSql(2);
@@ -234,6 +234,10 @@ private void column(PropertyMetamodel<?> propertyMetamodel) {
234234
support.column(propertyMetamodel);
235235
}
236236

237+
private void selectColumn(PropertyMetamodel<?> propertyMetamodel) {
238+
support.selectColumn(propertyMetamodel);
239+
}
240+
237241
private void visitCriterion(int index, Criterion criterion) {
238242
support.visitCriterion(index, criterion);
239243
}

integration-test-java/src/test/java/org/seasar/doma/it/criteria/EntityqlSelectTest.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.seasar.doma.jdbc.SqlLogType;
3030
import org.seasar.doma.jdbc.criteria.Entityql;
3131
import org.seasar.doma.jdbc.criteria.NativeSql;
32-
import org.seasar.doma.jdbc.criteria.expression.AliasExpression;
3332
import org.seasar.doma.jdbc.criteria.expression.Expressions;
3433
import org.seasar.doma.jdbc.criteria.option.AssociationOption;
3534
import org.seasar.doma.jdbc.criteria.statement.EmptyWhereClauseException;
@@ -159,8 +158,8 @@ void from_subquery_alias() {
159158
.innerJoin(d, c -> c.eq(e.departmentId, d.departmentId))
160159
.groupBy(d.departmentName)
161160
.select(
162-
new AliasExpression<>(Expressions.sum(e.salary), t.amount.getName()),
163-
new AliasExpression<>(d.departmentName, t.name.getName()));
161+
Expressions.alias(Expressions.sum(e.salary), t.amount.getName()),
162+
Expressions.alias(d.departmentName, t.name.getName()));
164163

165164
EntityqlSelectStarting<NameAndAmount> query =
166165
entityql.from(t, subquery).orderBy(c -> c.asc(t.name));
@@ -184,7 +183,7 @@ void from_subquery_doesnot_match_alias() {
184183
.from(e)
185184
.innerJoin(d, c -> c.eq(e.departmentId, d.departmentId))
186185
.groupBy(d.departmentName)
187-
.select(new AliasExpression<>(d.departmentName, t.name.getName()));
186+
.select(Expressions.alias(d.departmentName, t.name.getName()));
188187
EntityqlSelectStarting<NameAndAmount> query =
189188
entityql.from(t, subquery).orderBy(c -> c.asc(t.name));
190189
DomaException ex = assertThrows(DomaException.class, () -> query.fetch());
@@ -202,15 +201,15 @@ void from_subquery_union() {
202201
.from(d)
203202
.where(c -> c.eq(d.departmentName, "ACCOUNTING"))
204203
.select(
205-
new AliasExpression<>(Expressions.literal(1200), t.amount.getName()),
206-
new AliasExpression<>(d.departmentName, t.name.getName()))
204+
Expressions.alias(Expressions.literal(1200), t.amount.getName()),
205+
Expressions.alias(d.departmentName, t.name.getName()))
207206
.union(
208207
nativeSql
209208
.from(d)
210209
.where(c -> c.eq(d.departmentName, "OPERATIONS"))
211210
.select(
212-
new AliasExpression<>(Expressions.literal(900), t.amount.getName()),
213-
new AliasExpression<>(d.departmentName, t.name.getName())));
211+
Expressions.alias(Expressions.literal(900), t.amount.getName()),
212+
Expressions.alias(d.departmentName, t.name.getName())));
214213

215214
EntityqlSelectStarting<NameAndAmount> query =
216215
entityql.from(t, subquery).orderBy(c -> c.asc(t.name));
@@ -232,15 +231,15 @@ void from_subquery_union_all() {
232231
.from(d)
233232
.where(c -> c.eq(d.departmentName, "ACCOUNTING"))
234233
.select(
235-
new AliasExpression<>(Expressions.literal(1200), t.amount.getName()),
236-
new AliasExpression<>(d.departmentName, t.name.getName()))
234+
Expressions.alias(Expressions.literal(1200), t.amount.getName()),
235+
Expressions.alias(d.departmentName, t.name.getName()))
237236
.unionAll(
238237
nativeSql
239238
.from(d)
240239
.where(c -> c.eq(d.departmentName, "OPERATIONS"))
241240
.select(
242-
new AliasExpression<>(Expressions.literal(900), t.amount.getName()),
243-
new AliasExpression<>(d.departmentName, t.name.getName())));
241+
Expressions.alias(Expressions.literal(900), t.amount.getName()),
242+
Expressions.alias(d.departmentName, t.name.getName())));
244243

245244
EntityqlSelectStarting<NameAndAmount> query =
246245
entityql.from(t, subquery).orderBy(c -> c.asc(t.name));

integration-test-java/src/test/java/org/seasar/doma/it/criteria/NativeSqlSelectTest.java

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ void from_subquery_alias() {
151151
.innerJoin(d, c -> c.eq(e.departmentId, d.departmentId))
152152
.groupBy(d.departmentName)
153153
.select(
154-
new AliasExpression<>(Expressions.sum(e.salary), t.amount.getName()),
155-
new AliasExpression<>(d.departmentName, t.name.getName()));
154+
Expressions.alias(Expressions.sum(e.salary), t.amount.getName()),
155+
Expressions.alias(d.departmentName, t.name.getName()));
156156

157157
NativeSqlSelectStarting<NameAndAmount> query =
158158
nativeSql.from(t, subquery).orderBy(c -> c.asc(t.name));
@@ -176,7 +176,7 @@ void from_subquery_doesnot_match_alias() {
176176
.from(e)
177177
.innerJoin(d, c -> c.eq(e.departmentId, d.departmentId))
178178
.groupBy(d.departmentName)
179-
.select(new AliasExpression<>(d.departmentName, t.name.getName()));
179+
.select(Expressions.alias(d.departmentName, t.name.getName()));
180180

181181
NativeSqlSelectStarting<NameAndAmount> query =
182182
nativeSql.from(t, subquery).orderBy(c -> c.asc(t.name));
@@ -195,15 +195,15 @@ void from_subquery_union() {
195195
.from(d)
196196
.where(c -> c.eq(d.departmentName, "ACCOUNTING"))
197197
.select(
198-
new AliasExpression<>(Expressions.literal(1200), t.amount.getName()),
199-
new AliasExpression<>(d.departmentName, t.name.getName()))
198+
Expressions.alias(Expressions.literal(1200), t.amount.getName()),
199+
Expressions.alias(d.departmentName, t.name.getName()))
200200
.union(
201201
nativeSql
202202
.from(d)
203203
.where(c -> c.eq(d.departmentName, "OPERATIONS"))
204204
.select(
205-
new AliasExpression<>(Expressions.literal(900), t.amount.getName()),
206-
new AliasExpression<>(d.departmentName, t.name.getName())));
205+
Expressions.alias(Expressions.literal(900), t.amount.getName()),
206+
Expressions.alias(d.departmentName, t.name.getName())));
207207

208208
NativeSqlSelectStarting<NameAndAmount> query =
209209
nativeSql.from(t, subquery).orderBy(c -> c.asc(t.name));
@@ -225,15 +225,15 @@ void from_subquery_union_all() {
225225
.from(d)
226226
.where(c -> c.eq(d.departmentName, "ACCOUNTING"))
227227
.select(
228-
new AliasExpression<>(Expressions.literal(1200), t.amount.getName()),
229-
new AliasExpression<>(d.departmentName, t.name.getName()))
228+
Expressions.alias(Expressions.literal(1200), t.amount.getName()),
229+
Expressions.alias(d.departmentName, t.name.getName()))
230230
.unionAll(
231231
nativeSql
232232
.from(d)
233233
.where(c -> c.eq(d.departmentName, "OPERATIONS"))
234234
.select(
235-
new AliasExpression<>(Expressions.literal(900), t.amount.getName()),
236-
new AliasExpression<>(d.departmentName, t.name.getName())));
235+
Expressions.alias(Expressions.literal(900), t.amount.getName()),
236+
Expressions.alias(d.departmentName, t.name.getName())));
237237

238238
NativeSqlSelectStarting<NameAndAmount> query =
239239
nativeSql.from(t, subquery).orderBy(c -> c.asc(t.name));
@@ -689,6 +689,50 @@ void distinct() {
689689
assertEquals(4, list.size());
690690
}
691691

692+
@Test
693+
void alias_orderBy_asc() {
694+
Department_ d = new Department_();
695+
Employee_ e = new Employee_();
696+
697+
AliasExpression<Salary> salarySum = Expressions.alias(sum(e.salary), "SALARY_SUM");
698+
699+
SetOperand<Tuple2<Integer, Salary>> query =
700+
nativeSql
701+
.from(e)
702+
.innerJoin(d, c -> c.eq(e.departmentId, d.departmentId))
703+
.groupBy(d.departmentId)
704+
.orderBy(c -> c.asc(salarySum))
705+
.select(d.departmentId, salarySum);
706+
707+
List<Tuple2<Integer, Salary>> list = query.fetch();
708+
// asc order
709+
assertEquals(0, list.get(0).component2().getValue().compareTo(new BigDecimal(8750)));
710+
assertEquals(0, list.get(1).component2().getValue().compareTo(new BigDecimal(9400)));
711+
assertEquals(0, list.get(2).component2().getValue().compareTo(new BigDecimal(10875)));
712+
}
713+
714+
@Test
715+
void alias_orderBy_desc() {
716+
Department_ d = new Department_();
717+
Employee_ e = new Employee_();
718+
719+
AliasExpression<Salary> salarySum = Expressions.alias(sum(e.salary), "SALARY_SUM");
720+
721+
SetOperand<Tuple2<Integer, Salary>> query =
722+
nativeSql
723+
.from(e)
724+
.innerJoin(d, c -> c.eq(e.departmentId, d.departmentId))
725+
.groupBy(d.departmentId)
726+
.orderBy(c -> c.desc(salarySum))
727+
.select(d.departmentId, salarySum);
728+
729+
List<Tuple2<Integer, Salary>> list = query.fetch();
730+
// desc order
731+
assertEquals(0, list.get(0).component2().getValue().compareTo(new BigDecimal(10875)));
732+
assertEquals(0, list.get(1).component2().getValue().compareTo(new BigDecimal(9400)));
733+
assertEquals(0, list.get(2).component2().getValue().compareTo(new BigDecimal(8750)));
734+
}
735+
692736
@SuppressWarnings("unused")
693737
@Test
694738
void peek() {

0 commit comments

Comments
 (0)