From 8c7df3212a1546bda56b94631ea34c2699dc62e1 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Mon, 1 Mar 2021 17:44:13 +1300 Subject: [PATCH] Refactor internals add SqlTreeRoot as follow up to #2179 Adds SqlTreeRoot interface to make it more explicit that SqlTreeNodeRoot is the only valid top level node in the sql tree (and as such has the root level load() method) --- .../io/ebeaninternal/server/query/CQuery.java | 8 ++--- .../ebeaninternal/server/query/SqlTree.java | 4 +-- .../server/query/SqlTreeNode.java | 5 --- .../server/query/SqlTreeNodeBean.java | 14 -------- .../server/query/SqlTreeNodeExtraJoin.java | 8 ----- .../query/SqlTreeNodeFormulaWhereJoin.java | 6 ---- .../query/SqlTreeNodeManyWhereJoin.java | 6 ---- .../server/query/SqlTreeNodeRoot.java | 26 +++++++++++++- .../server/query/SqlTreeRoot.java | 34 +++++++++++++++++++ 9 files changed, 65 insertions(+), 46 deletions(-) create mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeRoot.java 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(); + +}