diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java index 861ccc337..9f30e9a29 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java @@ -142,7 +142,7 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran * Tree that knows how to build the master and detail beans from the * resultSet. */ - private final SqlTreeNode rootNode; + private final SqlTreeRoot rootNode; /** * For master detail query. @@ -444,13 +444,13 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran if (manyProperty == null) { // only single resultSet row required to build object so we are done // read a single resultSet row into single bean - nextBean = rootNode.load(this, null, null); + nextBean = rootNode.load(this); return true; } if (nextBean == null) { // very first read - nextBean = rootNode.load(this, null, null); + nextBean = rootNode.load(this); } else { // nextBean set to previously read currentBean nextBean = currentBean; @@ -478,7 +478,7 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran * is different to the nextBean (false if we need to read more rows). */ private boolean checkForDifferentBean() throws SQLException { - currentBean = rootNode.load(this, null, null); + currentBean = rootNode.load(this); return currentBean != nextBean; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java index c537ace29..1befa650b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTree.java @@ -122,8 +122,8 @@ class SqlTree { return inheritanceWhereSql; } - SqlTreeNode getRootNode() { - return rootNode; + SqlTreeRoot getRootNode() { + return (SqlTreeRoot)rootNode; } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java index b341802d1..39844cb59 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java @@ -73,11 +73,6 @@ interface SqlTreeNode { */ EntityBean load(DbReadContext ctx, EntityBean localBean, EntityBean contextBean) throws SQLException; - /** - * Load a version of a @History bean with effective dates. - */ - Version loadVersion(DbReadContext ctx) throws SQLException; - /** * Return true if the query has a many join. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java index 010793506..51ed19d32 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java @@ -192,20 +192,6 @@ class SqlTreeNodeBean implements SqlTreeNode { } } - /** - * Read the version bean. - */ - @Override - @SuppressWarnings("unchecked") - public Version loadVersion(DbReadContext ctx) throws SQLException { - // read the sys period lower and upper bounds - // these are always the first 2 columns in the resultSet - Timestamp start = ctx.getDataReader().getTimestamp(); - Timestamp end = ctx.getDataReader().getTimestamp(); - T bean = (T) load(ctx, null, null); - return new Version<>(bean, start, end); - } - /** * Load that takes into account inheritance. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java index fbab8e6b1..074457a30 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java @@ -178,14 +178,6 @@ class SqlTreeNodeExtraJoin implements SqlTreeNode { return null; } - /** - * Does nothing. - */ - @Override - public Version loadVersion(DbReadContext ctx) { - return null; - } - @Override public boolean hasMany() { return manyJoin; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java index f5e47eac5..20a3037da 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeFormulaWhereJoin.java @@ -99,12 +99,6 @@ class SqlTreeNodeFormulaWhereJoin implements SqlTreeNode { return null; } - @Override - public Version loadVersion(DbReadContext ctx) { - // nothing to do here - return null; - } - @Override public boolean hasMany() { return true; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java index f3d1999ca..c537c4bf7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java @@ -144,12 +144,6 @@ class SqlTreeNodeManyWhereJoin implements SqlTreeNode { return null; } - @Override - public Version loadVersion(DbReadContext ctx) { - // nothing to do here - return null; - } - @Override public boolean hasMany() { return true; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java index 3a7fffd98..e52477cf1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeRoot.java @@ -1,16 +1,21 @@ package io.ebeaninternal.server.query; +import io.ebean.Version; +import io.ebean.bean.EntityBean; import io.ebeaninternal.api.SpiQuery; +import io.ebeaninternal.server.deploy.DbReadContext; import io.ebeaninternal.server.deploy.DbSqlContext; import io.ebeaninternal.server.deploy.TableJoin; +import java.sql.SQLException; +import java.sql.Timestamp; import java.util.List; import java.util.Set; /** * Represents the root node of the Sql Tree. */ -final class SqlTreeNodeRoot extends SqlTreeNodeBean { +final class SqlTreeNodeRoot extends SqlTreeNodeBean implements SqlTreeRoot { private final TableJoin includeJoin; @@ -35,6 +40,25 @@ final class SqlTreeNodeRoot extends SqlTreeNodeBean { return true; } + @Override + public EntityBean load(DbReadContext ctx) throws SQLException { + return load(ctx, null, null); + } + + /** + * Read the version bean. + */ + @Override + @SuppressWarnings("unchecked") + public Version loadVersion(DbReadContext ctx) throws SQLException { + // read the sys period lower and upper bounds + // these are always the first 2 columns in the resultSet + Timestamp start = ctx.getDataReader().getTimestamp(); + Timestamp end = ctx.getDataReader().getTimestamp(); + T bean = (T) load(ctx, null, null); + return new Version<>(bean, start, end); + } + @Override public boolean isSqlDistinct() { return sqlDistinct; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeRoot.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeRoot.java new file mode 100644 index 000000000..64938bc22 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeRoot.java @@ -0,0 +1,34 @@ +package io.ebeaninternal.server.query; + +import io.ebean.Version; +import io.ebean.bean.EntityBean; +import io.ebean.core.type.ScalarDataReader; +import io.ebeaninternal.server.deploy.DbReadContext; + +import java.sql.SQLException; + +/** + * The root level node of the SqlTree. + */ +interface SqlTreeRoot { + + /** + * Load the bean from the DbReadContext. + *

+ * At a high level this actually controls the reading of the data from the + * jdbc resultSet and putting it into the bean etc. + *

+ */ + EntityBean load(DbReadContext ctx) throws SQLException; + + /** + * Load a version of a @History bean with effective dates. + */ + Version loadVersion(DbReadContext ctx) throws SQLException; + + /** + * Return a Scalar single attribute reader based on the first property. + */ + ScalarDataReader getSingleAttributeReader(); + +}