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:44 UTC
[1/5] cayenne git commit: CAY-2481 Methods to return Object[] after
SQLTemplate and SQLExec perform
Repository: cayenne
Updated Branches:
refs/heads/master eba4b720e -> a043a19d2
CAY-2481 Methods to return Object[] after SQLTemplate and SQLExec perform
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/cefcc922
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/cefcc922
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/cefcc922
Branch: refs/heads/master
Commit: cefcc9229babb893626426c2c8ecb1483fe33e6e
Parents: 20b166a
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Oct 10 15:47:20 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 10 15:54:45 2018 +0300
----------------------------------------------------------------------
RELEASE-NOTES.txt | 1 +
.../access/jdbc/RowDescriptorBuilder.java | 46 ++++++++-----
.../cayenne/access/jdbc/SQLTemplateAction.java | 18 ++++-
.../org/apache/cayenne/query/SQLSelect.java | 61 ++++++++++-------
.../org/apache/cayenne/query/SQLTemplate.java | 18 +++++
.../cayenne/query/SQLTemplateMetadata.java | 13 ++++
.../org/apache/cayenne/query/SQLSelectIT.java | 53 +++++++++++++--
.../org/apache/cayenne/query/SQLTemplateIT.java | 69 ++++++++++++++++++--
8 files changed, 230 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cefcc922/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 2905bab..ed5da9a 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -19,6 +19,7 @@ CAY-2471 Support multiple XML project versions
CAY-2473 Modeler: cleanup attributes and relationship editors
CAY-2474 Modeler: swap buttons in dialog toolbar
CAY-2475 Modeler: move inheritance icon to name column in objAttr table and objRel table
+CAY-2481 Methods to return Object[] after SQLTemplate and SQLExec perform
Bug Fixes:
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cefcc922/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 4831dc3..94e11b1 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
@@ -18,6 +18,12 @@
****************************************************************/
package org.apache.cayenne.access.jdbc;
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.access.types.ExtendedType;
+import org.apache.cayenne.access.types.ExtendedTypeMap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
@@ -29,12 +35,6 @@ import java.util.Map;
import java.util.Set;
import java.util.function.Function;
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.access.types.ExtendedType;
-import org.apache.cayenne.access.types.ExtendedTypeMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
/**
* A builder class that helps to assemble {@link RowDescriptor} instances from various
* types of inputs.
@@ -57,6 +57,8 @@ public class RowDescriptorBuilder {
protected Function<String, String> caseTransformer;
protected Map<String, String> typeOverrides;
+ private boolean mergeColumnsWithRsMetadata;
+
protected boolean validateDuplicateColumnNames;
/**
@@ -102,7 +104,9 @@ public class RowDescriptorBuilder {
if (rsLen < columnLen) {
throw new CayenneRuntimeException("'ResultSetMetadata' has less elements then 'columns'.");
- } else if (rsLen == columnLen) {
+ } 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.
return columns;
@@ -160,14 +164,18 @@ public class RowDescriptorBuilder {
// go through columnArray to find ColumnDescriptor for specified column
for (int i = 0; i < len; i++) {
if (columnArray[i] != null) {
- String columnRowKey = columnArray[i].getDataRowKey();
-
- // TODO: andrus, 10/14/2009 - 'equalsIgnoreCase' check can result in
- // subtle bugs in DBs with case-sensitive column names (or when quotes are
- // used to force case sensitivity). Alternatively using 'equals' may miss
- // columns in case-insensitive situations.
- if (columnRowKey != null && columnRowKey.equalsIgnoreCase(rowKey)) {
- return columnArray[i];
+ if(mergeColumnsWithRsMetadata) {
+ return new ColumnDescriptor(rowKey, resultSetMetadata.getColumnType(position), columnArray[position - 1].getJavaClass());
+ } else {
+ String columnRowKey = columnArray[i].getDataRowKey();
+
+ // TODO: andrus, 10/14/2009 - 'equalsIgnoreCase' check can result in
+ // subtle bugs in DBs with case-sensitive column names (or when quotes are
+ // used to force case sensitivity). Alternatively using 'equals' may miss
+ // columns in case-insensitive situations.
+ if (columnRowKey != null && columnRowKey.equalsIgnoreCase(rowKey)) {
+ return columnArray[i];
+ }
}
}
}
@@ -256,4 +264,12 @@ public class RowDescriptorBuilder {
public boolean isOverriden(String columnName) {
return typeOverrides != null && typeOverrides.containsKey(columnName);
}
+
+ public boolean isMergeColumnsWithRsMetadata() {
+ return mergeColumnsWithRsMetadata;
+ }
+
+ public void setMergeColumnsWithRsMetadata(boolean mergeColumnsWithRsMetadata) {
+ this.mergeColumnsWithRsMetadata = mergeColumnsWithRsMetadata;
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cefcc922/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 51b3934..aa5dbbe 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
@@ -248,9 +248,11 @@ public class SQLTemplateAction implements SQLAction {
ResultSet resultSet, OperationObserver callback, final long startTime) throws Exception {
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);
@@ -287,6 +289,20 @@ public class SQLTemplateAction implements SQLAction {
}
}
+ private void addColumnDescriptorsToBuilder(RowDescriptorBuilder builder) {
+ builder.setMergeColumnsWithRsMetadata(true);
+ List<Class<?>> typesList = (List<Class<?>>)query.getResultColumnsTypes();
+ int size = typesList.size();
+ ColumnDescriptor[] columnDescriptors = new ColumnDescriptor[size];
+ for(int i = 0; i < size; i++) {
+ ColumnDescriptor columnDescriptor = new ColumnDescriptor();
+ columnDescriptor.setJavaClass(typesList.get(i).getName());
+ columnDescriptors[i] = columnDescriptor;
+ }
+ builder.setColumns(columnDescriptors);
+
+ }
+
/**
* @since 3.0
*/
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cefcc922/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 a21505d..a2ca1af 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
@@ -18,12 +18,6 @@
****************************************************************/
package org.apache.cayenne.query;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.DataRow;
import org.apache.cayenne.ObjectContext;
@@ -32,7 +26,14 @@ import org.apache.cayenne.ResultIterator;
import org.apache.cayenne.ResultIteratorCallback;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.SQLResult;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
* A selecting query based on raw SQL and featuring fluent API.
@@ -43,6 +44,8 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
private static final long serialVersionUID = -7074293371883740872L;
+ private Collection<Class<?>> resultColumnsTypes;
+
/**
* Creates a query that selects DataRows and uses default routing.
*/
@@ -71,9 +74,34 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
* Creates a query that selects scalar values and uses default routing.
*/
public static <T> SQLSelect<T> scalarQuery(Class<T> type, String sql) {
+ return scalarQuery(sql, type);
+ }
+
+ /**
+ * @since 4.1
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> SQLSelect<T> scalarQuery(String sql, Class<T> type) {
SQLSelect<T> query = new SQLSelect<>(sql);
- query.scalarType = type;
- return query;
+ return (SQLSelect<T>) query.resultColumnsTypes(type);
+ }
+
+ /**
+ * @since 4.1
+ */
+ @SuppressWarnings("unchecked")
+ public static SQLSelect<Object[]> scalarQuery(String sql, Class<?>... types) {
+ SQLSelect<Object[]> query = new SQLSelect<>(sql);
+ return (SQLSelect<Object[]>) query.resultColumnsTypes(types);
+ }
+
+ @SuppressWarnings("unchecked")
+ private SQLSelect resultColumnsTypes(Class<?>... types) {
+ if(resultColumnsTypes == null) {
+ resultColumnsTypes = new ArrayList<>(types.length);
+ }
+ Collections.addAll(resultColumnsTypes, types);
+ return this;
}
/**
@@ -83,12 +111,10 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
public static <T> SQLSelect<T> scalarQuery(Class<T> type, String dataMapName, String sql) {
SQLSelect<T> query = new SQLSelect<>(sql);
query.dataMapName = dataMapName;
- query.scalarType = type;
- return query;
+ return query.resultColumnsTypes(type);
}
protected Class<T> persistentType;
- protected Class<T> scalarType;
protected String dataMapName;
protected StringBuilder sqlBuffer;
protected QueryCacheStrategy cacheStrategy;
@@ -148,10 +174,6 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
return persistentType == null;
}
- public boolean isFetchingScalars() {
- return scalarType != null;
- }
-
public String getSql() {
String sql = sqlBuffer.toString();
return sql.length() > 0 ? sql : null;
@@ -260,6 +282,7 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
template.setDefaultTemplate(getSql());
template.setCacheGroup(cacheGroup);
template.setCacheStrategy(cacheStrategy);
+ template.setResultColumnsTypes(resultColumnsTypes);
if (prefetches != null) {
template.addPrefetch(prefetches);
}
@@ -276,12 +299,6 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
template.setPageSize(pageSize);
template.setStatementFetchSize(statementFetchSize);
- if (isFetchingScalars()) {
- SQLResult resultMap = new SQLResult();
- resultMap.addColumnResult("x");
- template.setResult(resultMap);
- }
-
return template;
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cefcc922/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 cc1ded8..94353d1 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,6 +83,8 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
private String dataNodeName;
protected boolean returnGeneratedKeys;
+ private Collection<Class<?>> resultColumnsTypes;
+
SQLTemplateMetadata metaData = new SQLTemplateMetadata();
/**
@@ -106,6 +108,14 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
setFetchingDataRows(isFetchingDataRows);
}
+ public SQLTemplate resultColumnsTypes(Class<?> ...types) {
+ if(resultColumnsTypes == null) {
+ resultColumnsTypes = new ArrayList<>(types.length);
+ }
+ Collections.addAll(resultColumnsTypes, types);
+ return this;
+ }
+
@Override
public void setRoot(Object value) {
// allow null root...
@@ -653,4 +663,12 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
public void setReturnGeneratedKeys(boolean returnGeneratedKeys) {
this.returnGeneratedKeys = returnGeneratedKeys;
}
+
+ public Collection<Class<?>> getResultColumnsTypes() {
+ return resultColumnsTypes;
+ }
+
+ public void setResultColumnsTypes(Collection<Class<?>> resultColumnsTypes) {
+ this.resultColumnsTypes = resultColumnsTypes;
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cefcc922/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
index 96d329a..1537f8a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
@@ -20,6 +20,7 @@ package org.apache.cayenne.query;
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.SQLResult;
import java.util.ArrayList;
import java.util.Collections;
@@ -35,6 +36,7 @@ class SQLTemplateMetadata extends BaseQueryMetadata {
if (super.resolve(root, resolver)) {
+ buildResultSetMappingForColumns(query);
resultSetMapping = query.getResult() != null ? query.getResult().getResolvedComponents(resolver) : null;
// generate unique cache key...
@@ -89,4 +91,15 @@ class SQLTemplateMetadata extends BaseQueryMetadata {
return false;
}
+
+ private void buildResultSetMappingForColumns(SQLTemplate query) {
+ if(query.getResultColumnsTypes() == null || query.getResultColumnsTypes().isEmpty()) {
+ return;
+ }
+ SQLResult result = new SQLResult();
+ for(int i = 0; i < query.getResultColumnsTypes().size(); i++) {
+ result.addColumnResult(String.valueOf(i));
+ }
+ query.setResult(result);
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cefcc922/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java
index 0912040..6193920 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java
@@ -18,6 +18,7 @@
****************************************************************/
package org.apache.cayenne.query;
+import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.DataRow;
import org.apache.cayenne.ResultBatchIterator;
import org.apache.cayenne.ResultIterator;
@@ -34,15 +35,14 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
+import java.sql.SQLException;
import java.sql.Types;
+import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
public class SQLSelectIT extends ServerCase {
@@ -55,12 +55,16 @@ public class SQLSelectIT extends ServerCase {
private TableHelper tPainting;
+ private TableHelper tArtistCt;
+
@Before
public void before() {
-
tPainting = new TableHelper(dbHelper, "PAINTING")
.setColumns("PAINTING_ID", "PAINTING_TITLE", "ESTIMATED_PRICE").setColumnTypes(Types.INTEGER,
Types.VARCHAR, Types.DECIMAL);
+
+ tArtistCt = new TableHelper(dbHelper, "ARTIST_CT");
+ tArtistCt.setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH");
}
protected void createPaintingsDataSet() throws Exception {
@@ -109,6 +113,45 @@ public class SQLSelectIT extends ServerCase {
}
@Test
+ public void test_ObjectArrayQuery() throws Exception {
+ createPaintingsDataSet();
+ List<Object[]> result = SQLSelect.scalarQuery("SELECT PAINTING_ID, PAINTING_TITLE, ESTIMATED_PRICE FROM PAINTING", Integer.class, String.class, Double.class)
+ .select(context);
+
+ assertEquals(20, result.size());
+ assertEquals(3, result.get(0).length);
+ }
+
+ @Test(expected = CayenneRuntimeException.class)
+ public void test_ObjectArrayQueryException() throws Exception {
+ createPaintingsDataSet();
+ SQLSelect<Object[]> query = SQLSelect.scalarQuery("SELECT PAINTING_ID, PAINTING_TITLE, ESTIMATED_PRICE FROM PAINTING", Integer.class, String.class);
+ context.performQuery(query);
+ }
+
+ @Test
+ public void test_SingleObjectQuery() throws Exception {
+ createPaintingsDataSet();
+ List<Integer> result = SQLSelect.scalarQuery("SELECT PAINTING_ID FROM PAINTING", Integer.class)
+ .select(context);
+ assertEquals(20, result.size());
+ assertTrue(result.get(0) instanceof Integer);
+ }
+
+ @Test
+ public void testObjectArrayWithCustomType() throws SQLException {
+ tArtistCt.insert(1, "Test", "2018-10-10");
+ tArtistCt.insert(2, "Test1", "2017-09-09");
+
+ List<Object[]> results = SQLSelect.scalarQuery("SELECT * FROM ARTIST_CT",
+ Integer.class, String.class, LocalDateTime.class).select(context);
+
+ assertEquals(2, results.size());
+ assertEquals(3, results.get(0).length);
+ assertTrue(results.get(0)[2] instanceof LocalDateTime);
+ }
+
+ @Test
public void test_DataRows_ClassRoot_Parameters() throws Exception {
createPaintingsDataSet();
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cefcc922/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java
index 36dfb7a..ad2fa04 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java
@@ -38,12 +38,10 @@ import org.junit.Before;
import org.junit.Test;
import java.sql.SQLException;
+import java.time.LocalDateTime;
import java.util.List;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
public class SQLTemplateIT extends ServerCase {
@@ -64,6 +62,8 @@ public class SQLTemplateIT extends ServerCase {
private TableHelper tArtist;
+ private TableHelper tArtistCt;
+
@Before
public void setUp() throws Exception {
tArtist = new TableHelper(dbHelper, "ARTIST");
@@ -71,6 +71,9 @@ public class SQLTemplateIT extends ServerCase {
tPainting = new TableHelper(dbHelper, "PAINTING");
tPainting.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE", "ESTIMATED_PRICE");
+
+ tArtistCt = new TableHelper(dbHelper, "ARTIST_CT");
+ tArtistCt.setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH");
}
@Test
@@ -129,6 +132,60 @@ public class SQLTemplateIT extends ServerCase {
gotRuntimeException);
}
+ @Test(expected = CayenneRuntimeException.class)
+ public void testObjectArrayReturnWithException() {
+ DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
+ String sql = "INSERT INTO ARTIST VALUES (15, 'Surikov', null)";
+ SQLTemplate q1 = new SQLTemplate(testDataMap, sql, true);
+ context.performNonSelectingQuery(q1);
+ SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST", true)
+ .resultColumnsTypes(Integer.class);
+ context.performQuery(q3);
+ }
+
+ @Test
+ public void testObjectArrayReturn() throws SQLException {
+ DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
+ String sql = "INSERT INTO ARTIST VALUES (15, 'Surikov', null)";
+ String sql1 = "INSERT INTO ARTIST VALUES (16, 'Ivanov', null)";
+ SQLTemplate q1 = new SQLTemplate(testDataMap, sql, true);
+ context.performNonSelectingQuery(q1);
+ SQLTemplate q2 = new SQLTemplate(testDataMap, sql1, true);
+ context.performNonSelectingQuery(q2);
+
+ SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST", true)
+ .resultColumnsTypes(Integer.class, String.class);
+ List<Object[]> artists = context.performQuery(q3);
+ assertEquals(2, artists.size());
+ assertEquals(2, artists.get(0).length);
+ }
+
+ @Test
+ public void testObjectArrayReturnWithCustomType() throws SQLException {
+ DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
+ tArtistCt.insert(1, "Test", "2018-10-10");
+ tArtistCt.insert(2, "Test1", "2017-09-09");
+ SQLTemplate q5 = new SQLTemplate(testDataMap, "SELECT * FROM ARTIST_CT", true)
+ .resultColumnsTypes(Integer.class, String.class, LocalDateTime.class);
+ List dates = context.performQuery(q5);
+ assertEquals(2, dates.size());
+ assertTrue(dates.get(0) instanceof Object[]);
+ assertEquals(3, ((Object[])dates.get(0)).length);
+ assertTrue(((Object[])dates.get(0))[2] instanceof LocalDateTime);
+ }
+
+ @Test
+ public void testSingleObjectReturn() throws SQLException {
+ DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
+ tArtistCt.insert(1, "Test", "2018-10-10");
+ SQLTemplate q5 = new SQLTemplate(testDataMap, "SELECT ARTIST_NAME FROM ARTIST_CT", true)
+ .resultColumnsTypes(String.class);
+ List dates = context.performQuery(q5);
+ assertEquals(1, dates.size());
+ assertTrue(dates.get(0) instanceof String);
+ assertEquals("Test", dates.get(0));
+ }
+
@Test
public void testSQLTemplate_PositionalParams() throws SQLException {
@@ -160,7 +217,7 @@ public class SQLTemplateIT extends ServerCase {
}
@Test(expected = CayenneRuntimeException.class)
- public void testSQLTemplate_PositionalParams_ToFewParams() throws SQLException {
+ public void testSQLTemplate_PositionalParams_ToFewParams() {
String sql = "INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ESTIMATED_PRICE) "
+ "VALUES ($b, '$n', #bind($c 'INTEGER'))";
@@ -238,7 +295,7 @@ public class SQLTemplateIT extends ServerCase {
}
@Test(expected = CayenneRuntimeException.class)
- public void testSQLTemplateWithDisjointPrefetch() throws Exception {
+ public void testSQLTemplateWithDisjointPrefetch() {
String sql = "SELECT p.* FROM PAINTING p";
SQLTemplate q1 = new SQLTemplate(Painting.class, sql);
q1.addPrefetch(Painting.TO_ARTIST.disjoint());
[5/5] cayenne git commit: CAY-2481 Methods to return Object[] after
SQLTemplate and SQLExec perform refactor and cleanup
Posted by nt...@apache.org.
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;
}
}
[4/5] cayenne git commit: Configure snapshot deploy to apache
snapshot repo
Posted by nt...@apache.org.
Configure snapshot deploy to apache snapshot repo
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/46f5e094
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/46f5e094
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/46f5e094
Branch: refs/heads/master
Commit: 46f5e094e933d3a9561a8d74df828cd6c734354c
Parents: 1c0b7ba
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Oct 11 11:46:14 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Oct 11 11:46:14 2018 +0300
----------------------------------------------------------------------
build-tools/cayenne-checkers/pom.xml | 5 +++++
pom.xml | 13 +++++++++++++
2 files changed, 18 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/46f5e094/build-tools/cayenne-checkers/pom.xml
----------------------------------------------------------------------
diff --git a/build-tools/cayenne-checkers/pom.xml b/build-tools/cayenne-checkers/pom.xml
index c046bf9..6bfad50 100644
--- a/build-tools/cayenne-checkers/pom.xml
+++ b/build-tools/cayenne-checkers/pom.xml
@@ -33,6 +33,11 @@
<name>Apache Release Distribution Repository</name>
<url>https://repository.apache.org/service/local/staging/deploy/maven2</url>
</repository>
+ <snapshotRepository>
+ <id>apache.snapshots.https</id>
+ <name>Apache Development Snapshot Repository</name>
+ <url>https://repository.apache.org/content/repositories/snapshots</url>
+ </snapshotRepository>
</distributionManagement>
<licenses>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/46f5e094/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 40cda97..dff5cf6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -503,6 +503,14 @@
<enabled>true</enabled>
</releases>
</repository>
+ <repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>https://repository.apache.org/snapshots</url>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ </repository>
</repositories>
<pluginRepositories>
<pluginRepository>
@@ -956,6 +964,11 @@
<name>Apache Release Distribution Repository</name>
<url>https://repository.apache.org/service/local/staging/deploy/maven2</url>
</repository>
+ <snapshotRepository>
+ <id>apache.snapshots.https</id>
+ <name>Apache Development Snapshot Repository</name>
+ <url>https://repository.apache.org/content/repositories/snapshots</url>
+ </snapshotRepository>
</distributionManagement>
<profiles>
[2/5] cayenne git commit: Merge PR #331
Posted by nt...@apache.org.
Merge PR #331
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/ed5018cd
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/ed5018cd
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/ed5018cd
Branch: refs/heads/master
Commit: ed5018cd3edd80a69528160cd164abbcd5c6c48e
Parents: eba4b72 cefcc92
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Oct 10 17:01:22 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Oct 10 17:01:22 2018 +0300
----------------------------------------------------------------------
RELEASE-NOTES.txt | 1 +
.../access/jdbc/RowDescriptorBuilder.java | 46 ++++++++-----
.../cayenne/access/jdbc/SQLTemplateAction.java | 18 ++++-
.../org/apache/cayenne/query/SQLSelect.java | 61 ++++++++++-------
.../org/apache/cayenne/query/SQLTemplate.java | 18 +++++
.../cayenne/query/SQLTemplateMetadata.java | 13 ++++
.../org/apache/cayenne/query/SQLSelectIT.java | 53 +++++++++++++--
.../org/apache/cayenne/query/SQLTemplateIT.java | 69 ++++++++++++++++++--
8 files changed, 230 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
[3/5] cayenne git commit: CAY-2484 maven plugins missing in 4.1.M2
release
Posted by nt...@apache.org.
CAY-2484 maven plugins missing in 4.1.M2 release
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/1c0b7ba6
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/1c0b7ba6
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/1c0b7ba6
Branch: refs/heads/master
Commit: 1c0b7ba69c88a648bda29dae4cdd4b62e54c1d0f
Parents: ed5018c
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Oct 11 11:45:34 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Oct 11 11:45:34 2018 +0300
----------------------------------------------------------------------
RELEASE-NOTES.txt | 1 +
maven-plugins/cayenne-tools-itest/pom.xml | 8 +++++++-
maven-plugins/pom.xml | 7 -------
3 files changed, 8 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c0b7ba6/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index ed5da9a..714a8ff 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -39,6 +39,7 @@ CAY-2470 Can't bind SQLExec parameters in a loop
CAY-2472 Clear cached replacement query on mutation in all indirect queries
CAY-2476 Modeller: Fixed wrong behaviour of code generation dialog
CAY-2480 cayenne:cdbgen and cayenne:cgen have identical text in cayenne-maven-plugin
+CAY-2484 maven plugins missing in 4.1.M2 release
----------------------------------
Release: 4.1.M2
http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c0b7ba6/maven-plugins/cayenne-tools-itest/pom.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-tools-itest/pom.xml b/maven-plugins/cayenne-tools-itest/pom.xml
index 76d5260..939b170 100644
--- a/maven-plugins/cayenne-tools-itest/pom.xml
+++ b/maven-plugins/cayenne-tools-itest/pom.xml
@@ -64,7 +64,13 @@
<build>
<plugins>
-
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
<plugin>
<groupId>org.apache.cayenne.plugins</groupId>
<artifactId>cayenne-maven-plugin</artifactId>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c0b7ba6/maven-plugins/pom.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/pom.xml b/maven-plugins/pom.xml
index 4e2c579..87d6a00 100644
--- a/maven-plugins/pom.xml
+++ b/maven-plugins/pom.xml
@@ -112,13 +112,6 @@
</execution>
</executions>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-deploy-plugin</artifactId>
- <configuration>
- <skip>true</skip>
- </configuration>
- </plugin>
</plugins>
</build>
</project>