CAY-2481 Methods to return Object[] after SQLTemplate and SQLExec perform refactor and cleanup
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/a043a19d Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/a043a19d Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/a043a19d Branch: refs/heads/master Commit: a043a19d2cd1b6cfc2fde166510b1349bc243e53 Parents: 46f5e09 Author: Nikita Timofeev <stari...@gmail.com> Authored: Thu Oct 11 14:11:55 2018 +0300 Committer: Nikita Timofeev <stari...@gmail.com> Committed: Thu Oct 11 14:11:55 2018 +0300 ---------------------------------------------------------------------- .../access/jdbc/RowDescriptorBuilder.java | 15 +++--- .../cayenne/access/jdbc/SQLTemplateAction.java | 33 ++++++++----- .../org/apache/cayenne/query/SQLSelect.java | 50 +++++++++++++------- .../org/apache/cayenne/query/SQLTemplate.java | 6 +-- 4 files changed, 61 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/a043a19d/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java index 94e11b1..6c92c12 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java @@ -102,10 +102,10 @@ public class RowDescriptorBuilder { int columnLen = (columns != null) ? columns.length : 0; - if (rsLen < columnLen) { + if(mergeColumnsWithRsMetadata && rsLen != columnLen) { + throw new CayenneRuntimeException("Size of 'ResultSetMetadata' not equals to size of 'columns'."); + } else if (rsLen < columnLen) { throw new CayenneRuntimeException("'ResultSetMetadata' has less elements then 'columns'."); - } else if(mergeColumnsWithRsMetadata && rsLen != columnLen) { - throw new CayenneRuntimeException("Size of elements from 'ResultSetMetadata' isn't equals to resultTypesColumns size from query."); } else if (rsLen == columnLen && !mergeColumnsWithRsMetadata) { // 'columns' contains ColumnDescriptor for every column // in resultSetMetadata. This return is for optimization. @@ -265,11 +265,8 @@ public class RowDescriptorBuilder { return typeOverrides != null && typeOverrides.containsKey(columnName); } - public boolean isMergeColumnsWithRsMetadata() { - return mergeColumnsWithRsMetadata; - } - - public void setMergeColumnsWithRsMetadata(boolean mergeColumnsWithRsMetadata) { - this.mergeColumnsWithRsMetadata = mergeColumnsWithRsMetadata; + public RowDescriptorBuilder mergeColumnsWithRsMetadata() { + this.mergeColumnsWithRsMetadata = true; + return this; } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/a043a19d/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java index aa5dbbe..cc6ac56 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java @@ -250,9 +250,6 @@ public class SQLTemplateAction implements SQLAction { boolean iteratedResult = callback.isIteratedResult(); ExtendedTypeMap types = dataNode.getAdapter().getExtendedTypes(); RowDescriptorBuilder builder = configureRowDescriptorBuilder(compiled, resultSet); - if(query.getResultColumnsTypes() != null) { - addColumnDescriptorsToBuilder(builder); - } RowReader<?> rowReader = dataNode.rowReader(builder.getDescriptor(types), queryMetadata); ResultIterator<?> it = new JDBCResultIterator<>(statement, resultSet, rowReader); @@ -289,18 +286,28 @@ public class SQLTemplateAction implements SQLAction { } } - private void addColumnDescriptorsToBuilder(RowDescriptorBuilder builder) { - builder.setMergeColumnsWithRsMetadata(true); - List<Class<?>> typesList = (List<Class<?>>)query.getResultColumnsTypes(); - int size = typesList.size(); + /** + * Creates column descriptors based on compiled statement and query metadata + */ + private ColumnDescriptor[] createColumnDescriptors(SQLStatement compiled) { + // SQLTemplate #result columns take precedence over other ways to determine the type + if (compiled.getResultColumns().length > 0) { + return compiled.getResultColumns(); + } + + // check explicitly set column types + if(query.getResultColumnsTypes() == null) { + return null; + } + + int size = query.getResultColumnsTypes().size(); ColumnDescriptor[] columnDescriptors = new ColumnDescriptor[size]; for(int i = 0; i < size; i++) { ColumnDescriptor columnDescriptor = new ColumnDescriptor(); - columnDescriptor.setJavaClass(typesList.get(i).getName()); + columnDescriptor.setJavaClass(query.getResultColumnsTypes().get(i).getName()); columnDescriptors[i] = columnDescriptor; } - builder.setColumns(columnDescriptors); - + return columnDescriptors; } /** @@ -310,11 +317,11 @@ public class SQLTemplateAction implements SQLAction { throws SQLException { RowDescriptorBuilder builder = new RowDescriptorBuilder() .setResultSet(resultSet) + .setColumns(createColumnDescriptors(compiled)) .validateDuplicateColumnNames(); - // SQLTemplate #result columns take precedence over other ways to determine the type - if (compiled.getResultColumns().length > 0) { - builder.setColumns(compiled.getResultColumns()); + if(query.getResultColumnsTypes() != null) { + builder.mergeColumnsWithRsMetadata(); } ObjEntity entity = queryMetadata.getObjEntity(); http://git-wip-us.apache.org/repos/asf/cayenne/blob/a043a19d/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java index a2ca1af..3d46f6a 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java @@ -44,7 +44,7 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> { private static final long serialVersionUID = -7074293371883740872L; - private Collection<Class<?>> resultColumnsTypes; + private List<Class<?>> resultColumnsTypes; /** * Creates a query that selects DataRows and uses default routing. @@ -78,40 +78,54 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> { } /** + * Creates a query that selects scalar values and uses routing based on the + * provided DataMap name. + */ + public static <T> SQLSelect<T> scalarQuery(Class<T> type, String dataMapName, String sql) { + SQLSelect<T> query = new SQLSelect<>(sql); + query.dataMapName = dataMapName; + return query.resultColumnsTypes(type); + } + + /** + * Creates query that selects scalar value and uses default routing + * * @since 4.1 */ - @SuppressWarnings("unchecked") public static <T> SQLSelect<T> scalarQuery(String sql, Class<T> type) { SQLSelect<T> query = new SQLSelect<>(sql); - return (SQLSelect<T>) query.resultColumnsTypes(type); + return query.resultColumnsTypes(type); } /** + * Creates query that selects scalar values (as Object[]) and uses default routing + * * @since 4.1 */ - @SuppressWarnings("unchecked") - public static SQLSelect<Object[]> scalarQuery(String sql, Class<?>... types) { + public static SQLSelect<Object[]> scalarQuery(String sql, Class<?> firstType, Class<?>... types) { SQLSelect<Object[]> query = new SQLSelect<>(sql); - return (SQLSelect<Object[]>) query.resultColumnsTypes(types); + return query.resultColumnsTypes(firstType).resultColumnsTypes(types); + } + + /** + * Creates query that selects scalar values (as Object[]) and uses routing based on the + * provided DataMap name. + * + * @since 4.1 + */ + public static SQLSelect<Object[]> scalarQuery(String sql, String dataMapName, Class<?> firstType, Class<?>... types) { + SQLSelect<Object[]> query = new SQLSelect<>(sql); + query.dataMapName = dataMapName; + return query.resultColumnsTypes(firstType).resultColumnsTypes(types); } @SuppressWarnings("unchecked") - private SQLSelect resultColumnsTypes(Class<?>... types) { + private <E> SQLSelect<E> resultColumnsTypes(Class<?>... types) { if(resultColumnsTypes == null) { resultColumnsTypes = new ArrayList<>(types.length); } Collections.addAll(resultColumnsTypes, types); - return this; - } - - /** - * Creates a query that selects scalar values and uses routing based on the - * provided DataMap name. - */ - public static <T> SQLSelect<T> scalarQuery(Class<T> type, String dataMapName, String sql) { - SQLSelect<T> query = new SQLSelect<>(sql); - query.dataMapName = dataMapName; - return query.resultColumnsTypes(type); + return (SQLSelect<E>)this; } protected Class<T> persistentType; http://git-wip-us.apache.org/repos/asf/cayenne/blob/a043a19d/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java index 94353d1..fa863c3 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java @@ -83,7 +83,7 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery { private String dataNodeName; protected boolean returnGeneratedKeys; - private Collection<Class<?>> resultColumnsTypes; + private List<Class<?>> resultColumnsTypes; SQLTemplateMetadata metaData = new SQLTemplateMetadata(); @@ -664,11 +664,11 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery { this.returnGeneratedKeys = returnGeneratedKeys; } - public Collection<Class<?>> getResultColumnsTypes() { + public List<Class<?>> getResultColumnsTypes() { return resultColumnsTypes; } - public void setResultColumnsTypes(Collection<Class<?>> resultColumnsTypes) { + public void setResultColumnsTypes(List<Class<?>> resultColumnsTypes) { this.resultColumnsTypes = resultColumnsTypes; } }