diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/TableJoin.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/TableJoin.java index a5556a2a4..d71b8a50f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/TableJoin.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/TableJoin.java @@ -50,6 +50,11 @@ public final class TableJoin { */ private final TableJoinColumn[] columns; + /** + * A hash that can be used with the query plan. + */ + private final int queryHash; + /** * Create a TableJoin. */ @@ -77,7 +82,26 @@ public final class TableJoin { BeanProperty prop = propMap.get(deployProps[i].getName()); this.properties[i] = prop; } + this.queryHash = calcQueryHash(); + } + /** + * Calculate a hash value for adding to a query plan. + */ + private int calcQueryHash() { + int hc = type.hashCode(); + hc = hc * 31 + (table == null ? 0 : table.hashCode()); + for (int i = 0; i < columns.length; i++) { + hc = hc * 31 + columns[i].queryHash(); + } + return hc; + } + + /** + * Return a hash value for adding to a query plan. + */ + public int queryHash() { + return queryHash; } public String toString() { diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/TableJoinColumn.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/TableJoinColumn.java index ea5cfbfea..0014fcd9c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/TableJoinColumn.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/TableJoinColumn.java @@ -21,7 +21,12 @@ public class TableJoinColumn { private final boolean insertable; private final boolean updateable; - + + /** + * Hash for including in a query plan + */ + private final int queryHash; + /** * Create the pair. */ @@ -30,12 +35,23 @@ public class TableJoinColumn { this.foreignDbColumn = InternString.intern(deploy.getForeignDbColumn()); this.insertable = deploy.isInsertable(); this.updateable = deploy.isUpdateable(); + this.queryHash = hashOf(localDbColumn) * 31 + hashOf(foreignDbColumn); } - + + private int hashOf(String value) { + return (value == null) ? 0 : value.hashCode(); + } + public String toString() { return localDbColumn+" = "+foreignDbColumn; } + /** + * Return a hash for including in a query plan. + */ + public int queryHash() { + return queryHash; + } /** * Return the foreign database column name. diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java index ceb682952..e31691929 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -666,8 +666,7 @@ public class DefaultOrmQuery implements SpiQuery { */ private HashQueryPlan calculateHash(BeanQueryRequest request, HashQueryPlanBuilder builder) { - // exclude bind values and things unrelated to - // the sql being generated + // exclude bind values and things unrelated to the sql being generated if (builder == null) { builder = new HashQueryPlanBuilder(); @@ -680,6 +679,7 @@ public class DefaultOrmQuery implements SpiQuery { builder.add(mapKey); builder.add(id != null); builder.add(rawSql == null ? 0 : rawSql.queryHash()); + builder.add(includeTableJoin != null ? includeTableJoin.queryHash() : 0); if (detail != null) { detail.queryPlanHash(request, builder);