#1333 - ENH: Support "dynamic formula" with findSingleAttributeList() ... e.g. .select("concat(lastName,', ',firstName)")

Support property alias via "AS" ...  concat(lastName,', ',firstName) as lastName
This commit is contained in:
Rob Bygrave
2018-03-06 21:14:26 +13:00
parent 873c14faaf
commit a18cac035b
5 changed files with 41 additions and 7 deletions
@@ -67,7 +67,7 @@ public interface DbSqlContext {
/**
* Parse and add formula with standard table alias replacement.
*/
void appendParseSelect(String parseSelect);
void appendParseSelect(String parseSelect, String alias);
/**
* Append a Sql Formula select. This converts the "${ta}" keyword to the
@@ -16,11 +16,14 @@ class DynamicPropertyAggregationFormula extends DynamicPropertyBase {
private final BeanProperty asTarget;
DynamicPropertyAggregationFormula(String name, ScalarType<?> scalarType, String parsedFormula, boolean aggregate, BeanProperty asTarget) {
private final String alias;
DynamicPropertyAggregationFormula(String name, ScalarType<?> scalarType, String parsedFormula, boolean aggregate, BeanProperty asTarget, String alias) {
super(name, name, null, scalarType);
this.parsedFormula = parsedFormula;
this.aggregate = aggregate;
this.asTarget = asTarget;
this.alias = alias;
}
@Override
@@ -49,7 +52,7 @@ class DynamicPropertyAggregationFormula extends DynamicPropertyBase {
@Override
public void appendSelect(DbSqlContext ctx, boolean subQuery) {
ctx.appendParseSelect(parsedFormula);
ctx.appendParseSelect(parsedFormula, alias);
}
}
@@ -125,7 +125,7 @@ class FormulaPropertyPath {
}
String parsedAggregation = buildFormula(parsed);
return new DynamicPropertyAggregationFormula(logicalName, scalarType, parsedAggregation, isAggregate(), targetProperty);
return new DynamicPropertyAggregationFormula(logicalName, scalarType, parsedAggregation, isAggregate(), targetProperty, alias);
}
private boolean isAggregate() {
@@ -274,11 +274,15 @@ class DefaultDbSqlContext implements DbSqlContext {
}
@Override
public void appendParseSelect(String parseSelect) {
String converted = alias.parse(parseSelect);
public void appendParseSelect(String parseSelect, String columnAlias) {
String converted = this.alias.parse(parseSelect);
sb.append(COMMA);
sb.append(converted);
appendColumnAlias();
if (columnAlias != null) {
sb.append(" ").append(columnAlias);
} else {
appendColumnAlias();
}
}
@Override
@@ -444,4 +444,31 @@ public class TestAggregationCount extends BaseTestCase {
assertThat(sql.get(0)).contains("select max(t0.updtime) from contact t0 where t0.phone is null");
}
@Test
public void formula_mapToProperty() {
ResetBasicData.reset();
LoggedSqlCollector.start();
List<Contact> contacts =
Ebean.find(Contact.class)
.select("email, concat(lastName,', ',firstName) as lastName")
.where().isNull("phone")
.orderBy().asc("lastName")
.findList();
assertThat(contacts).isNotEmpty();
for (Contact name : contacts) {
String lastName = name.getLastName();
assertThat(lastName).contains(", ");
}
List<String> sql = LoggedSqlCollector.stop();
assertThat(sql.get(0)).contains("select t0.id, t0.email, concat(t0.last_name,', ',t0.first_name) lastName from contact t0 where t0.phone is null order by t0.last_name; --bind()");
}
}