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;
        }
 }

Reply via email to