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