From e4e850717de4138581116a7dab0e264edf545d7c Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Wed, 9 Nov 2016 20:50:33 +0100 Subject: [PATCH] FIX: @Formula: support for discriminator & joins added --- .../server/deploy/BeanPropertyAssoc.java | 7 ++++--- .../server/deploy/BeanPropertyAssocOne.java | 8 ++++---- .../server/deploy/id/ImportedIdSimple.java | 11 +++++++++-- .../deploy/meta/DeployBeanPropertyAssocOne.java | 9 +++++++++ .../server/query/DefaultDbSqlContext.java | 6 ++++-- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssoc.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssoc.java index 2e85c8377..f41e5839d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssoc.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssoc.java @@ -330,7 +330,7 @@ public abstract class BeanPropertyAssoc extends BeanProperty { if (descriptor.isRawSqlBased()) { String dbColumn = owner.getDbColumn(); - return new ImportedIdSimple(owner, dbColumn, idProp, 0); + return new ImportedIdSimple(owner, dbColumn, null, idProp, 0); } TableJoinColumn[] cols = join.columns(); @@ -373,16 +373,17 @@ public abstract class BeanPropertyAssoc extends BeanProperty { String matchColumn = col.getForeignDbColumn(); String localColumn = col.getLocalDbColumn(); + String localSqlFormula = col.getLocalSqlFormula(); for (int j = 0; j < props.length; j++) { if (props[j].getDbColumn().equalsIgnoreCase(matchColumn)) { - return new ImportedIdSimple(owner, localColumn, props[j], j); + return new ImportedIdSimple(owner, localColumn, localSqlFormula, props[j], j); } } for (int j = 0; j < others.length; j++) { if (others[j].getDbColumn().equalsIgnoreCase(matchColumn)) { - return new ImportedIdSimple(owner, localColumn, others[j], j + props.length); + return new ImportedIdSimple(owner, localColumn, localSqlFormula, others[j], j + props.length); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java index 1d4ff4b3f..ef723bd65 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java @@ -561,9 +561,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc { @Override public void appendSelect(DbSqlContext ctx, boolean subQuery) { - if (formula) { - ctx.appendFormulaSelect(sqlFormulaSelect); - } else if (!isTransient) { + if (!isTransient) { localHelp.appendSelect(ctx, subQuery); } } @@ -571,8 +569,10 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc { @Override public void appendFrom(DbSqlContext ctx, SqlJoinType joinType) { if (!isTransient) { - // TODO JOINS localHelp.appendFrom(ctx, joinType); + if (sqlFormulaJoin != null) { + ctx.appendFormulaJoin(sqlFormulaJoin, joinType); + } } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/ImportedIdSimple.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/ImportedIdSimple.java index 85fdf7b17..06ac324b9 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/ImportedIdSimple.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/ImportedIdSimple.java @@ -37,6 +37,8 @@ public final class ImportedIdSimple implements ImportedId, Comparable owner; protected final String localDbColumn; + + protected final String localSqlFormula; protected final String logicalName; @@ -44,9 +46,10 @@ public final class ImportedIdSimple implements ImportedId, Comparable owner, String localDbColumn, BeanProperty foreignProperty, int position) { + public ImportedIdSimple(BeanPropertyAssoc owner, String localDbColumn, String localSqlFormula, BeanProperty foreignProperty, int position) { this.owner = owner; this.localDbColumn = InternString.intern(localDbColumn); + this.localSqlFormula = InternString.intern(localSqlFormula); this.foreignProperty = foreignProperty; this.position = position; this.logicalName = InternString.intern(owner.getName() + "." + foreignProperty.getName()); @@ -103,7 +106,11 @@ public final class ImportedIdSimple implements ImportedId, Comparable extends DeployBeanPropertyAssoc { tableJoin.setLocalColumn(dbColumn); } } + + @Override + public void setSqlFormula(String formulaSelect, String formulaJoin) { + super.setSqlFormula(formulaSelect, formulaJoin); + DeployTableJoinColumn[] columns = tableJoin.columns(); + if (columns.length == 1) { + columns[0].setLocalSqlFormula(formulaSelect); + } + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultDbSqlContext.java b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultDbSqlContext.java index 0329ddbb4..5896f6165 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultDbSqlContext.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultDbSqlContext.java @@ -138,7 +138,7 @@ class DefaultDbSqlContext implements DbSqlContext { } if (pair.getForeignSqlFormula() != null) { - sb.append(pair.getForeignSqlFormula().replace(tableAliasPlaceHolder, a2)); + sb.append(StringHelper.replaceString(pair.getForeignSqlFormula(), tableAliasPlaceHolder, a2)); } else { sb.append(a2).append(".").append(pair.getForeignDbColumn()); } @@ -146,7 +146,7 @@ class DefaultDbSqlContext implements DbSqlContext { sb.append(" = "); if (pair.getLocalSqlFormula() != null) { - sb.append(pair.getLocalSqlFormula().replace(tableAliasPlaceHolder, a1)); + sb.append(StringHelper.replaceString(pair.getLocalSqlFormula(), tableAliasPlaceHolder, a1)); } else { sb.append(a1).append(".").append(pair.getLocalDbColumn()); } @@ -255,6 +255,8 @@ class DefaultDbSqlContext implements DbSqlContext { sb.append(COMMA); sb.append(converted); + + appendColumnAlias(); } @Override