You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/10/11 11:17:48 UTC

[5/5] cayenne git commit: CAY-2481 Methods to return Object[] after SQLTemplate and SQLExec perform refactor and cleanup

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 <st...@gmail.com>
Authored: Thu Oct 11 14:11:55 2018 +0300
Committer: Nikita Timofeev <st...@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;
 	}
 }