diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryEngine.java index 40f6d1a3c..86a439def 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryEngine.java @@ -20,17 +20,17 @@ public interface RelationalQueryEngine { /** * Find a list of beans using relational query. */ - List findList(RelationalQueryRequest request); + List findList(RelationalQueryRequest request, RowReader reader); /** * Find each query using relational query. */ - void findEach(RelationalQueryRequest request, Consumer consumer); + void findEach(RelationalQueryRequest request, RowReader reader, Consumer consumer); /** * Find each while query using relational query. */ - void findEach(RelationalQueryRequest request, Predicate consumer); + void findEach(RelationalQueryRequest request, RowReader reader, Predicate consumer); /** * Find single attribute. @@ -47,11 +47,6 @@ public interface RelationalQueryEngine { */ T findOneMapper(RelationalQueryRequest request, RowMapper mapper); - /** - * Find list via mapper. - */ - List findListMapper(RelationalQueryRequest request, RowMapper mapper); - /** * Find each via raw consumer. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java index 9f1413031..c0371e546 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java @@ -1,10 +1,6 @@ package io.ebeaninternal.server.core; -import io.ebean.RowConsumer; -import io.ebean.RowMapper; -import io.ebean.SqlQuery; -import io.ebean.SqlRow; -import io.ebean.Transaction; +import io.ebean.*; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiSqlBinding; @@ -63,7 +59,7 @@ public final class RelationalQueryRequest extends AbstractSqlQueryRequest { List findListMapper(RowMapper mapper) { flushJdbcBatchOnQuery(); - return queryEngine.findListMapper(this, mapper); + return queryEngine.findList(this, () -> mapper.map(resultSet, rows++)); } T findOneMapper(RowMapper mapper) { @@ -83,17 +79,17 @@ public final class RelationalQueryRequest extends AbstractSqlQueryRequest { public void findEach(Consumer consumer) { flushJdbcBatchOnQuery(); - queryEngine.findEach(this, consumer); + queryEngine.findEach(this, this::createNewRow, consumer); } public void findEachWhile(Predicate consumer) { flushJdbcBatchOnQuery(); - queryEngine.findEach(this, consumer); + queryEngine.findEach(this, this::createNewRow, consumer); } public List findList() { flushJdbcBatchOnQuery(); - return queryEngine.findList(this); + return queryEngine.findList(this, this::createNewRow); } /** @@ -135,21 +131,14 @@ public final class RelationalQueryRequest extends AbstractSqlQueryRequest { return resultSet; } - public void incrementRows() { - rows++; - } - @Override public boolean next() throws SQLException { - return resultSet.next(); - } - - public List mapList(RowMapper mapper) throws SQLException { - List list = new ArrayList<>(); - while (next()) { - list.add(mapper.map(resultSet, rows++)); + if (!resultSet.next()) { + return false; + } else { + rows++; + return true; } - return list; } public T mapOne(RowMapper mapper) throws SQLException { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/RowReader.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/RowReader.java new file mode 100644 index 000000000..2a7d0b119 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/RowReader.java @@ -0,0 +1,14 @@ +package io.ebeaninternal.server.core; + +import java.sql.SQLException; + +/** + * Read a row building a result for that row. + */ +public interface RowReader { + + /** + * Build and return a result for a row. + */ + T read() throws SQLException; +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java index f49df1d20..655c0863a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java @@ -3,6 +3,7 @@ package io.ebeaninternal.server.query; import io.ebean.RowConsumer; import io.ebean.RowMapper; import io.ebean.SqlRow; +import io.ebean.core.type.DataReader; import io.ebean.core.type.ScalarType; import io.ebean.meta.MetricVisitor; import io.ebean.metric.MetricFactory; @@ -10,10 +11,10 @@ import io.ebean.metric.TimedMetricMap; import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.core.RelationalQueryEngine; import io.ebeaninternal.server.core.RelationalQueryRequest; +import io.ebeaninternal.server.core.RowReader; import io.ebeaninternal.server.persist.Binder; import javax.persistence.PersistenceException; -import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; @@ -59,12 +60,11 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { } @Override - public void findEach(RelationalQueryRequest request, Predicate consumer) { - + public void findEach(RelationalQueryRequest request, RowReader reader, Predicate consumer) { try { request.executeSql(binder, SpiQuery.Type.ITERATE); while (request.next()) { - if (!consumer.test(readRow(request))) { + if (!consumer.test(reader.read())) { break; } } @@ -79,12 +79,11 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { } @Override - public void findEach(RelationalQueryRequest request, Consumer consumer) { - + public void findEach(RelationalQueryRequest request, RowReader reader, Consumer consumer) { try { request.executeSql(binder, SpiQuery.Type.ITERATE); while (request.next()) { - consumer.accept(readRow(request)); + consumer.accept(reader.read()); } request.logSummary(); @@ -112,22 +111,6 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { } } - @Override - public List findListMapper(RelationalQueryRequest request, RowMapper mapper) { - try { - request.executeSql(binder, SpiQuery.Type.LIST); - List list = request.mapList(mapper); - request.logSummary(); - return list; - - } catch (Exception e) { - throw new PersistenceException(errMsg(e.getMessage(), request.getSql()), e); - - } finally { - request.close(); - } - } - @Override public void findEachRow(RelationalQueryRequest request, RowConsumer consumer) { try { @@ -143,51 +126,17 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { } } - @SuppressWarnings("unchecked") - @Override - public List findSingleAttributeList(RelationalQueryRequest request, Class cls) { - ScalarType scalarType = (ScalarType) binder.getScalarType(cls); - return findScalarList(request, scalarType); - } - - private List findScalarList(RelationalQueryRequest request, ScalarType scalarType) { - try { - request.executeSql(binder, SpiQuery.Type.ATTRIBUTE); - List list = new ArrayList<>(); - while (request.next()) { - request.incrementRows(); - list.add(scalarType.read(binder.createDataReader(request.getResultSet()))); - } - - request.logSummary(); - return list; - - } catch (Exception e) { - throw new PersistenceException(errMsg(e.getMessage(), request.getSql()), e); - - } finally { - request.close(); - } - } - @SuppressWarnings("unchecked") @Override public T findSingleAttribute(RelationalQueryRequest request, Class cls) { - ScalarType scalarType = (ScalarType) binder.getScalarType(cls); - return findScalar(request, scalarType); - } - - private T findScalar(RelationalQueryRequest request, ScalarType scalarType) { try { request.executeSql(binder, SpiQuery.Type.ATTRIBUTE); - + final DataReader dataReader = binder.createDataReader(request.getResultSet()); T value = null; - if (request.next()) { - request.incrementRows(); - value = scalarType.read(binder.createDataReader(request.getResultSet())); + if (dataReader.next()) { + value = scalarType.read(dataReader); } - request.logSummary(); return value; @@ -199,16 +148,17 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { } } + @SuppressWarnings("unchecked") @Override - public List findList(RelationalQueryRequest request) { - + public List findSingleAttributeList(RelationalQueryRequest request, Class cls) { + ScalarType scalarType = (ScalarType) binder.getScalarType(cls); try { - request.executeSql(binder, SpiQuery.Type.LIST); - List rows = new ArrayList<>(); - while (request.next()) { - rows.add(readRow(request)); + request.executeSql(binder, SpiQuery.Type.ATTRIBUTE); + final DataReader dataReader = binder.createDataReader(request.getResultSet()); + List rows = new ArrayList<>(); + while (dataReader.next()) { + rows.add(scalarType.read(dataReader)); } - request.logSummary(); return rows; @@ -220,11 +170,22 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { } } - /** - * Read the row from the ResultSet and return as a MapBean. - */ - private SqlRow readRow(RelationalQueryRequest request) throws SQLException { - return request.createNewRow(); + @Override + public List findList(RelationalQueryRequest request, RowReader reader) { + try { + request.executeSql(binder, SpiQuery.Type.LIST); + List rows = new ArrayList<>(); + while (request.next()) { + rows.add(reader.read()); + } + request.logSummary(); + return rows; + } catch (Exception e) { + throw new PersistenceException(errMsg(e.getMessage(), request.getSql()), e); + + } finally { + request.close(); + } } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java index ec5b3c01a..4cf446d0f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java @@ -23,9 +23,9 @@ public class DefaultRelationalQuery implements SpiSqlQuery { private final transient SpiEbeanServer server; - private String label; + private final String query; - private String query; + private String label; private int firstRow; @@ -208,19 +208,25 @@ public class DefaultRelationalQuery implements SpiSqlQuery { return query; } - T mapperFindOne(RowMapper mapper) { + private T mapperFindOne(RowMapper mapper) { return server.findOneMapper(this, mapper); } - List mapperFindList(RowMapper mapper) { + private List mapperFindList(RowMapper mapper) { return server.findListMapper(this, mapper); } + private void mapperFindEach(RowMapper mapper, Consumer consumer) { + server.findEachRow(this, (resultSet, rowNum) -> consumer.accept(mapper.map(resultSet, rowNum))); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) @Override public TypeQuery mapToScalar(Class attributeType) { return new Scalar(attributeType); } + @SuppressWarnings({"rawtypes", "unchecked"}) @Override public TypeQuery mapTo(RowMapper mapper) { return new Mapper(mapper); @@ -272,5 +278,10 @@ public class DefaultRelationalQuery implements SpiSqlQuery { public List findList() { return mapperFindList(mapper); } + + //@Override + public void findEach(Consumer consumer) { + mapperFindEach(mapper, consumer); + } } } diff --git a/ebean-core/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java b/ebean-core/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java index c79f07d21..7745b4ca6 100644 --- a/ebean-core/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java +++ b/ebean-core/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java @@ -2,7 +2,6 @@ package org.tests.query.sqlquery; import io.ebean.BaseTestCase; import io.ebean.DB; -import io.ebean.Ebean; import io.ebean.RowMapper; import io.ebean.SqlQuery; import io.ebean.SqlRow; @@ -361,7 +360,7 @@ public class SqlQueryTests extends BaseTestCase { ResetBasicData.reset(); - int expectedRows = Ebean.find(Order.class).findCount(); + int expectedRows = DB.find(Order.class).findCount(); final AtomicInteger count = new AtomicInteger();