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/11/05 08:41:47 UTC

[1/4] cayenne git commit: CAY-2481 Methods to return Object[] after SQLTemplate and SQLExec perform

Repository: cayenne
Updated Branches:
  refs/heads/master 831442cb6 -> fb7f004a8


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/18c72d34
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/18c72d34
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/18c72d34

Branch: refs/heads/master
Commit: 18c72d34710646bed3c51a6b64285a597a56c2b6
Parents: 553de26
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Oct 24 09:26:36 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 12:04:14 2018 +0300

----------------------------------------------------------------------
 .../access/jdbc/RowDescriptorBuilder.java       |   2 +-
 .../cayenne/access/jdbc/SQLTemplateAction.java  |  26 +-
 .../cayenne/map/DefaultScalarResultSegment.java |   4 +-
 .../org/apache/cayenne/query/SQLSelect.java     |  84 ++++++-
 .../org/apache/cayenne/query/SQLTemplate.java   |  17 +-
 .../cayenne/query/SQLTemplateMetadata.java      |  29 ++-
 .../org/apache/cayenne/query/SQLSelectIT.java   |  84 ++++++-
 .../org/apache/cayenne/query/SQLTemplateIT.java | 241 ++++++++++++++++++-
 8 files changed, 452 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/18c72d34/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 6c92c12..7ab51b7 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
@@ -106,7 +106,7 @@ public class RowDescriptorBuilder {
             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 (rsLen == columnLen && !mergeColumnsWithRsMetadata) {
+        } else if(rsLen == columnLen && !mergeColumnsWithRsMetadata) {
             // 'columns' contains ColumnDescriptor for every column
             // in resultSetMetadata. This return is for optimization.
             return columns;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/18c72d34/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 cc6ac56..2f27eb0 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
@@ -20,6 +20,7 @@
 package org.apache.cayenne.access.jdbc;
 
 import org.apache.cayenne.CayenneException;
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.OperationObserver;
@@ -31,6 +32,7 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DefaultScalarResultSegment;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.query.QueryMetadata;
@@ -250,8 +252,8 @@ public class SQLTemplateAction implements SQLAction {
 		boolean iteratedResult = callback.isIteratedResult();
 		ExtendedTypeMap types = dataNode.getAdapter().getExtendedTypes();
 		RowDescriptorBuilder builder = configureRowDescriptorBuilder(compiled, resultSet);
+		recreateQueryMetadata(resultSet);
 		RowReader<?> rowReader = dataNode.rowReader(builder.getDescriptor(types), queryMetadata);
-
 		ResultIterator<?> it = new JDBCResultIterator<>(statement, resultSet, rowReader);
 
 		if (iteratedResult) {
@@ -286,13 +288,25 @@ public class SQLTemplateAction implements SQLAction {
 		}
 	}
 
+	private void recreateQueryMetadata(ResultSet resultSet) throws SQLException {
+		if(query.isUseScalar() && queryMetadata.getResultSetMapping() != null && queryMetadata.getResultSetMapping().isEmpty()){
+			for(int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
+				queryMetadata.getResultSetMapping().add(new DefaultScalarResultSegment(String.valueOf(i), i));
+			}
+		}
+	}
+
 	/**
 	 * 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();
+			if(query.getResultColumnsTypes() != null) {
+				throw new CayenneRuntimeException("Caused by setting return types by directives and by parameters in query.");
+			} else {
+				return compiled.getResultColumns();
+			}
 		}
 
 		// check explicitly set column types
@@ -325,7 +339,7 @@ public class SQLTemplateAction implements SQLAction {
 		}
 
 		ObjEntity entity = queryMetadata.getObjEntity();
-		if (entity != null) {
+		if (entity != null && isResultColumnTypesEmpty()) {
 			// TODO: andrus 2008/03/28 support flattened attributes with aliases...
 			for (ObjAttribute attribute : entity.getAttributes()) {
 				String column = attribute.getDbAttributePath();
@@ -339,7 +353,7 @@ public class SQLTemplateAction implements SQLAction {
 		// override numeric Java types based on JDBC defaults for DbAttributes, as Oracle
 		// ResultSetMetadata is not very precise about NUMERIC distinctions...
 		// (BigDecimal vs Long vs. Integer)
-		if (dbEntity != null) {
+		if (dbEntity != null && isResultColumnTypesEmpty()) {
 			for (DbAttribute attribute : dbEntity.getAttributes()) {
 				if (!builder.isOverriden(attribute.getName()) && TypesMapping.isNumeric(attribute.getType())) {
 					builder.overrideColumnType(attribute.getName(), TypesMapping.getJavaBySqlType(attribute.getType()));
@@ -359,6 +373,10 @@ public class SQLTemplateAction implements SQLAction {
 		return builder;
 	}
 
+	private boolean isResultColumnTypesEmpty(){
+		return query.getResultColumnsTypes() == null || query.getResultColumnsTypes().isEmpty();
+	}
+
 	/**
 	 * Extracts a template string from a SQLTemplate query. Exists mainly for
 	 * the benefit of subclasses that can customize returned template.

http://git-wip-us.apache.org/repos/asf/cayenne/blob/18c72d34/cayenne-server/src/main/java/org/apache/cayenne/map/DefaultScalarResultSegment.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DefaultScalarResultSegment.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DefaultScalarResultSegment.java
index 1b25684..b0933dd 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DefaultScalarResultSegment.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DefaultScalarResultSegment.java
@@ -23,12 +23,12 @@ import org.apache.cayenne.query.ScalarResultSegment;
 /**
  * @since 3.0
  */
-class DefaultScalarResultSegment implements ScalarResultSegment {
+public class DefaultScalarResultSegment implements ScalarResultSegment {
 
     private String column;
     private int offset;
 
-    DefaultScalarResultSegment(String column, int offset) {
+    public DefaultScalarResultSegment(String column, int offset) {
         this.column = column;
         this.offset = offset;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/18c72d34/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 3d46f6a..c276a78 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
@@ -29,7 +29,6 @@ import org.apache.cayenne.map.EntityResolver;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -45,12 +44,34 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 	private static final long serialVersionUID = -7074293371883740872L;
 
 	private List<Class<?>> resultColumnsTypes;
+	private boolean useScalar;
+	private boolean isFetchingDataRows;
 
 	/**
 	 * Creates a query that selects DataRows and uses default routing.
 	 */
 	public static SQLSelect<DataRow> dataRowQuery(String sql) {
-		return new SQLSelect<>(sql);
+		return new SQLSelect<>(sql)
+				.fetchingDataRows();
+	}
+
+	/**
+	 * Creates a query that selects DataRows and uses default routing.
+	 * @since 4.1
+	 */
+	public static SQLSelect<DataRow> dataRowQuery(String sql, Class<?>... types) {
+		return new SQLSelect<>(sql)
+				.resultColumnsTypes(types)
+				.fetchingDataRows();
+	}
+
+	/**
+	 * Creates a query that selects DataRows and uses routing based on the
+	 * provided DataMap name.
+	 * @since 4.1
+	 */
+	public static SQLSelect<DataRow> dataRowQuery(String dataMapName, String sql, Class<?>... types) {
+		return dataRowQuery(dataMapName, sql).resultColumnsTypes(types);
 	}
 
 	/**
@@ -60,7 +81,7 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 	public static SQLSelect<DataRow> dataRowQuery(String dataMapName, String sql) {
 		SQLSelect<DataRow> query = new SQLSelect<>(sql);
 		query.dataMapName = dataMapName;
-		return query;
+		return query.fetchingDataRows();
 	}
 
 	/**
@@ -84,7 +105,7 @@ 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;
-		return query.resultColumnsTypes(type);
+		return query.resultColumnsTypes(type).useScalar();
 	}
 
 	/**
@@ -94,7 +115,39 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 	 */
 	public static <T> SQLSelect<T> scalarQuery(String sql, Class<T> type) {
 		SQLSelect<T> query = new SQLSelect<>(sql);
-		return query.resultColumnsTypes(type);
+		return query.resultColumnsTypes(type).useScalar();
+	}
+
+	/**
+	 * Creates query that selects scalar value and uses default routing
+	 *
+	 * @since 4.1
+	 */
+	public static <T> SQLSelect<T> scalarQuery(String sql, String dataMapName, Class<T> type) {
+		SQLSelect<T> query = new SQLSelect<>(sql);
+		query.dataMapName = dataMapName;
+		return query.resultColumnsTypes(type).useScalar();
+	}
+
+	/**
+	 * Creates query that selects scalar value and uses default routing
+	 *
+	 * @since 4.1
+	 */
+	public static SQLSelect<Object[]> scalarQuery(String sql) {
+		SQLSelect<Object[]> query = new SQLSelect<>(sql);
+		return query.useScalar();
+	}
+
+	/**
+	 * 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) {
+		SQLSelect<Object[]> query = new SQLSelect<>(sql);
+		query.dataMapName = dataMapName;
+		return query.useScalar();
 	}
 
 	/**
@@ -104,7 +157,7 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 	 */
 	public static SQLSelect<Object[]> scalarQuery(String sql, Class<?> firstType, Class<?>... types) {
 		SQLSelect<Object[]> query = new SQLSelect<>(sql);
-		return query.resultColumnsTypes(firstType).resultColumnsTypes(types);
+		return query.resultColumnsTypes(firstType).resultColumnsTypes(types).useScalar();
 	}
 
 	/**
@@ -116,7 +169,7 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 	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);
+		return query.resultColumnsTypes(firstType).resultColumnsTypes(types).useScalar();
 	}
 
 	@SuppressWarnings("unchecked")
@@ -185,7 +238,7 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 	}
 
 	public boolean isFetchingDataRows() {
-		return persistentType == null;
+		return isFetchingDataRows;
 	}
 
 	public String getSql() {
@@ -291,7 +344,7 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 		}
 
 		SQLTemplate template = new SQLTemplate();
-		template.setFetchingDataRows(isFetchingDataRows());
+		template.setFetchingDataRows(isFetchingDataRows);
 		template.setRoot(root);
 		template.setDefaultTemplate(getSql());
 		template.setCacheGroup(cacheGroup);
@@ -312,6 +365,7 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 		template.setFetchOffset(offset);
 		template.setPageSize(pageSize);
 		template.setStatementFetchSize(statementFetchSize);
+		template.setUseScalar(useScalar);
 
 		return template;
 	}
@@ -534,4 +588,16 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 		prefetches.merge(node);
 		return this;
 	}
+
+	@SuppressWarnings("unchecked")
+	private <E> SQLSelect<E> fetchingDataRows() {
+		this.isFetchingDataRows = true;
+		return (SQLSelect<E>) this;
+	}
+
+	@SuppressWarnings("unchecked")
+	private <E> SQLSelect<E> useScalar() {
+		this.useScalar = true;
+		return (SQLSelect<E>) this;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/18c72d34/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 fa863c3..55a590d 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
@@ -84,6 +84,7 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
 	protected boolean returnGeneratedKeys;
 
 	private List<Class<?>> resultColumnsTypes;
+	private boolean useScalar;
 
 	SQLTemplateMetadata metaData = new SQLTemplateMetadata();
 
@@ -108,12 +109,11 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
 		setFetchingDataRows(isFetchingDataRows);
 	}
 
-	public SQLTemplate resultColumnsTypes(Class<?> ...types) {
+	public void setResultColumnsTypes(Class<?> ...types) {
 		if(resultColumnsTypes == null) {
 			resultColumnsTypes = new ArrayList<>(types.length);
 		}
 		Collections.addAll(resultColumnsTypes, types);
-		return this;
 	}
 
 	@Override
@@ -671,4 +671,17 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
 	public void setResultColumnsTypes(List<Class<?>> resultColumnsTypes) {
 		this.resultColumnsTypes = resultColumnsTypes;
 	}
+
+	/**
+	 * Sets flag to use scalars.
+	 *
+	 * @since 4.1
+	 */
+	public void setUseScalar(boolean useScalar) {
+	    this.useScalar = useScalar;
+	}
+
+	public boolean isUseScalar() {
+		return useScalar;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/18c72d34/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 1537f8a..3cd99a4 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
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.query;
 
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.SQLResult;
@@ -30,14 +31,36 @@ import java.util.Map;
 /**
  * @since 3.0
  */
-class SQLTemplateMetadata extends BaseQueryMetadata {
+public class SQLTemplateMetadata extends BaseQueryMetadata {
+
+	private boolean isSingleResultSetMapping;
+
+	@Override
+	public boolean isSingleResultSetMapping() {
+		return isSingleResultSetMapping;
+	}
 
 	boolean resolve(Object root, EntityResolver resolver, SQLTemplate query) {
 
 		if (super.resolve(root, resolver)) {
 
+			if((!query.isUseScalar() && !query.isFetchingDataRows()) && (query.getResultColumnsTypes() != null && !query.getResultColumnsTypes().isEmpty())) {
+				throw new CayenneRuntimeException("Error caused by using root in query with resultColumnTypes without scalar or dataRow.");
+			}
+
+			if(query.getResult() != null && query.getResultColumnsTypes() != null) {
+				throw new CayenneRuntimeException("Caused by trying to override result column types of query.");
+			}
+
+			if(query.isFetchingDataRows() && query.isUseScalar()) {
+				throw new CayenneRuntimeException("Can't set both use scalar and fetching data rows.");
+			}
+
 			buildResultSetMappingForColumns(query);
-			resultSetMapping = query.getResult() != null ? query.getResult().getResolvedComponents(resolver) : null;
+			resultSetMapping = query.getResult() != null ?
+					query.getResult().getResolvedComponents(resolver) :
+					query.isUseScalar() ? new ArrayList<>() : null;
+			isSingleResultSetMapping = resultSetMapping != null && resultSetMapping.size() == 1;
 
 			// generate unique cache key...
 			if (QueryCacheStrategy.NO_CACHE == getCacheStrategy()) {
@@ -93,7 +116,7 @@ class SQLTemplateMetadata extends BaseQueryMetadata {
 	}
 
 	private void buildResultSetMappingForColumns(SQLTemplate query) {
-		if(query.getResultColumnsTypes() == null || query.getResultColumnsTypes().isEmpty()) {
+		if(query.getResultColumnsTypes() == null || query.getResultColumnsTypes().isEmpty() || !query.isUseScalar()) {
 			return;
 		}
 		SQLResult result = new SQLResult();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/18c72d34/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 7774c8c..cbc7c83 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
@@ -43,6 +43,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.junit.Assert.*;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
@@ -114,15 +115,90 @@ public class SQLSelectIT extends ServerCase {
 	}
 
 	@Test
-	public void test_ObjectArrayQuery() throws Exception {
+	public void test_DataRowWithTypes() throws Exception {
+		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
+		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		List<DataRow> result = SQLSelect.dataRowQuery("SELECT * FROM ARTIST_CT", Integer.class, String.class, LocalDateTime.class)
+				.columnNameCaps(CapsStrategy.UPPER)
+				.select(context);
+		assertEquals(2, result.size());
+		assertTrue(result.get(0) instanceof DataRow);
+		assertThat(result.get(0).get("DATE_OF_BIRTH"), instanceOf(LocalDateTime.class));
+	}
+
+	@Test
+	public void test_DataRowWithDirectives() throws Exception {
+		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
+		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		List<DataRow> result = SQLSelect.dataRowQuery("SELECT #result('ARTIST_ID' 'java.lang.Double'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST_CT")
+				.select(context);
+		assertEquals(2, result.size());
+		assertTrue(result.get(0) instanceof DataRow);
+		assertTrue(result.get(0).get("ARTIST_ID") instanceof Double);
+	}
+
+	@Test(expected = CayenneRuntimeException.class)
+	public void test_DataRowWithTypesException() throws Exception {
+		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
+		SQLSelect.dataRowQuery("SELECT * FROM ARTIST_CT", Integer.class, String.class)
+				.select(context);
+	}
+
+	@Test
+	public void testObjectArrayWithDefaultTypesReturnAndDirectives() throws Exception {
+		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
+		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		List<Object[]> result = SQLSelect.scalarQuery("SELECT #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST_CT")
+				.select(context);
+
+		assertEquals(2, result.size());
+		assertTrue(result.get(0) instanceof Object[]);
+		assertEquals(2, result.get(0).length);
+		assertTrue(result.get(0)[0] instanceof Long);
+		assertTrue(result.get(0)[1] instanceof String);
+	}
+
+	@Test(expected = CayenneRuntimeException.class)
+	public void testObjectArrayReturnAndDirectives() throws Exception {
+		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
+		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		SQLSelect.scalarQuery("SELECT #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST_CT",
+				Integer.class, String.class).select(context);
+	}
+
+	@Test
+	public void testObjectArrayWithOneObjectDefaultTypesReturnAndDirectives() throws Exception {
+		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
+		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		List<Object[]> result = SQLSelect.scalarQuery("SELECT #result('ARTIST_ID' 'java.lang.Long') FROM ARTIST_CT")
+				.select(context);
+
+		assertEquals(2, result.size());
+		assertTrue(result.get(0) instanceof Object[]);
+		assertEquals(1, result.get(0).length);
+		assertTrue(result.get(0)[0] instanceof Long);
+	}
+
+	@Test
+	public void test_ObjectArrayQueryWithDefaultTypes() throws Exception {
 		createPaintingsDataSet();
-		List<Object[]> result = SQLSelect.scalarQuery("SELECT PAINTING_ID, PAINTING_TITLE, ESTIMATED_PRICE FROM PAINTING", Integer.class, String.class, Double.class)
+		List<Object[]> result = SQLSelect.scalarQuery("SELECT PAINTING_ID, PAINTING_TITLE, ESTIMATED_PRICE FROM PAINTING")
 				.select(context);
 
 		assertEquals(20, result.size());
 		assertEquals(3, result.get(0).length);
 	}
 
+	@Test
+	public void test_ObjectQueryWithDefaultType() throws Exception {
+		createPaintingsDataSet();
+		List<Object[]> result = SQLSelect.scalarQuery("SELECT PAINTING_ID FROM PAINTING")
+				.select(context);
+		assertEquals(20, result.size());
+		assertTrue(result.get(0) instanceof Object[]);
+		assertTrue(result.get(0)[0] instanceof Integer);
+	}
+
 	@Test(expected = CayenneRuntimeException.class)
 	public void test_ObjectArrayQueryException() throws Exception {
 		createPaintingsDataSet();
@@ -148,6 +224,7 @@ public class SQLSelectIT extends ServerCase {
 				Integer.class, String.class, LocalDateTime.class).select(context);
 
 		assertEquals(2, results.size());
+		assertTrue(results.get(0) instanceof Object[]);
 		assertEquals(3, results.get(0).length);
 		assertTrue(results.get(0)[2] instanceof LocalDateTime);
 	}
@@ -353,8 +430,7 @@ public class SQLSelectIT extends ServerCase {
 
 		createPaintingsDataSet();
 
-		int c = SQLSelect.scalarQuery(Integer.class, "SELECT #result('COUNT(*)' 'int') FROM PAINTING").selectOne(
-				context);
+		int c = SQLSelect.scalarQuery("SELECT COUNT(*) FROM PAINTING", Integer.class).selectOne(context);
 
 		assertEquals(20, c);
 	}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/18c72d34/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 9931f8c..da4fff4 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
@@ -25,8 +25,10 @@ import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.SQLResult;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Gallery;
 import org.apache.cayenne.testdo.testmap.Painting;
 import org.apache.cayenne.unit.UnitDbAdapter;
@@ -42,6 +44,7 @@ import java.sql.SQLException;
 import java.time.LocalDateTime;
 import java.util.List;
 
+import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.junit.Assert.*;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
@@ -134,18 +137,232 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test(expected = CayenneRuntimeException.class)
+	public void testExceptionWhenUsingColumnsTypesAndSQLResult(){
+		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 query = new SQLTemplate("SELECT ARTIST_ID P FROM ARTIST", true);
+		query.setResultColumnsTypes(Float.class);
+		SQLResult resultDescriptor = new SQLResult();
+		resultDescriptor.addColumnResult("P");
+		query.setResult(resultDescriptor);
+		context.performQuery(query);
+	}
+
+	@Test(expected = CayenneRuntimeException.class)
+	public void testExceptionWhenUsingColumnsTypesAndSQLResultUsingScalar() {
+		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 query = new SQLTemplate(testDataMap, "SELECT ARTIST_ID, ARTIST_NAME P FROM ARTIST", false);
+		query.setResultColumnsTypes(Float.class, String.class);
+		query.setUseScalar(true);
+		SQLResult resultDescriptor = new SQLResult();
+		resultDescriptor.addColumnResult("P");
+		resultDescriptor.addColumnResult("N");
+		query.setResult(resultDescriptor);
+		context.performQuery(query);
+	}
+
+	@Test
+	public void testWithRootUsingScalar() {
+		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(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
+		q3.setResultColumnsTypes(Double.class, String.class);
+		q3.setUseScalar(true);
+		List<Object[]> result = context.performQuery(q3);
+		assertEquals(2, result.size());
+		assertTrue(result.get(0) instanceof Object[]);
+		assertTrue(result.get(0)[0] instanceof Double);
+	}
+
+	@Test
+	public void testWithRootUsingDataRow() {
+		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(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
+		q3.setResultColumnsTypes(Double.class, String.class);
+		q3.setFetchingDataRows(true);
+		q3.setColumnNamesCapitalization(CapsStrategy.UPPER);
+		List<DataRow> result = context.performQuery(q3);
+		assertEquals(2, result.size());
+		assertTrue(result.get(0) instanceof DataRow);
+		assertThat(result.get(0).get("ARTIST_ID"), instanceOf(Double.class));
+	}
+
+	@Test(expected = CayenneRuntimeException.class)
+	public void testWithRootException() {
+		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(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
+		q3.setResultColumnsTypes(Double.class, String.class);
+		context.performQuery(q3);
+	}
+
+	@Test(expected = CayenneRuntimeException.class)
+	public void testUsingScalarAndDataRow() {
+		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(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
+		q3.setUseScalar(true);
+		q3.setFetchingDataRows(true);
+		context.performQuery(q3);
+	}
+
+	@Test
+	public void testDataRowWithTypes() {
+		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);
+		q3.setResultColumnsTypes(Double.class, String.class);
+		q3.setColumnNamesCapitalization(CapsStrategy.UPPER);
+		List<DataRow> artists = context.performQuery(q3);
+		assertEquals(2, artists.size());
+		assertTrue(artists.get(0) instanceof DataRow);
+		assertThat(artists.get(0).get("ARTIST_ID"), instanceOf(Double.class));
+	}
+
+	@Test
+	public void testDataRowReturnAndDirectives() {
+		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 #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST", true);
+		List<DataRow> result = context.performQuery(q3);
+		assertEquals(2, result.size());
+		assertTrue(result.get(0) instanceof DataRow);
+		assertEquals(2, result.get(0).size());
+		assertTrue(result.get(0).get("ARTIST_ID") instanceof Long);
+		assertTrue(result.get(0).get("ARTIST_NAME") instanceof String);
+	}
+
+	@Test(expected = CayenneRuntimeException.class)
+	public void testDataRowReturnAndDirectivesExc() {
+		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 #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST", true);
+		q3.setResultColumnsTypes(Integer.class, String.class);
+		context.performQuery(q3);
+	}
+
+	@Test
+	public void testObjectArrayReturnAndDirectives() {
+		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 #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST", false);
+		q3.setUseScalar(true);
+		List<Object[]> result = context.performQuery(q3);
+		assertEquals(2, result.size());
+		assertTrue(result.get(0) instanceof Object[]);
+		assertEquals(2, result.get(0).length);
+		assertTrue(result.get(0)[0] instanceof Long);
+		assertTrue(result.get(0)[1] instanceof String);
+	}
+
+	@Test(expected = CayenneRuntimeException.class)
+	public void testObjectArrayReturnAndDirectivesException() {
+		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 #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST", false);
+		q3.setResultColumnsTypes(Integer.class, String.class);
+		q3.setUseScalar(true);
+		context.performQuery(q3);
+	}
+
+	@Test
+	public void testObjectArrayWithSingleObjectReturnAndDirectives() {
+		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 #result('ARTIST_ID' 'java.lang.Long') FROM ARTIST", false);
+		q3.setUseScalar(true);
+		List<Object[]> result = context.performQuery(q3);
+		assertEquals(2, result.size());
+		assertTrue(result.get(0) instanceof Object[]);
+		assertEquals(1, result.get(0).length);
+		assertTrue(result.get(0)[0] instanceof Long);
+	}
+
+	@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);
+		SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST", false);
+		q3.setResultColumnsTypes(Integer.class);
+		q3.setUseScalar(true);
 		context.performQuery(q3);
 	}
 
 	@Test
-	public void testObjectArrayReturn() throws SQLException {
+	public void testObjectArrayWithSingleObjectReturn() {
+		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 FROM ARTIST", false);
+		q3.setUseScalar(true);
+		List<Object[]> artists = context.performQuery(q3);
+		assertEquals(2, artists.size());
+		assertEquals(1, artists.get(0).length);
+		assertTrue(artists.get(0) instanceof Object[]);
+		assertTrue(artists.get(0)[0] instanceof Long);
+	}
+
+	@Test
+	public void testObjectArrayReturnWithDefaultTypes() {
 		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		String sql = "INSERT INTO ARTIST VALUES (15, 'Surikov', null)";
 		String sql1 = "INSERT INTO ARTIST VALUES (16, 'Ivanov', null)";
@@ -154,20 +371,23 @@ public class SQLTemplateIT extends ServerCase {
 		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);
+		SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST", false);
+		q3.setUseScalar(true);
 		List<Object[]> artists = context.performQuery(q3);
 		assertEquals(2, artists.size());
 		assertEquals(2, artists.get(0).length);
+		assertTrue(artists.get(0) instanceof Object[]);
+		assertTrue(artists.get(0)[0] instanceof Long);
 	}
 
 	@Test
-	public void testObjectArrayReturnWithCustomType() throws SQLException {
+	public void testObjectArrayReturn() throws SQLException {
 		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
 		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
-		SQLTemplate q5 = new SQLTemplate(testDataMap, "SELECT * FROM ARTIST_CT", true)
-				.resultColumnsTypes(Integer.class, String.class, LocalDateTime.class);
+		SQLTemplate q5 = new SQLTemplate(testDataMap, "SELECT * FROM ARTIST_CT", false);
+		q5.setResultColumnsTypes(Float.class, String.class, LocalDateTime.class);
+		q5.setUseScalar(true);
 		List dates = context.performQuery(q5);
 		assertEquals(2, dates.size());
 		assertTrue(dates.get(0) instanceof Object[]);
@@ -179,8 +399,9 @@ public class SQLTemplateIT extends ServerCase {
 	public void testSingleObjectReturn() throws SQLException {
 		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
-		SQLTemplate q5 = new SQLTemplate(testDataMap, "SELECT ARTIST_NAME FROM ARTIST_CT", true)
-				.resultColumnsTypes(String.class);
+		SQLTemplate q5 = new SQLTemplate(testDataMap, "SELECT ARTIST_NAME FROM ARTIST_CT", false);
+		q5.setResultColumnsTypes(String.class);
+		q5.setUseScalar(true);
 		List dates = context.performQuery(q5);
 		assertEquals(1, dates.size());
 		assertTrue(dates.get(0) instanceof String);


[3/4] cayenne git commit: Tests cleanup

Posted by nt...@apache.org.
Tests cleanup


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/5ae8ffd1
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/5ae8ffd1
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/5ae8ffd1

Branch: refs/heads/master
Commit: 5ae8ffd1f600a67edd35ff8800f9a53528984ec5
Parents: b1f9ad5
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Oct 31 12:06:53 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 31 12:06:53 2018 +0300

----------------------------------------------------------------------
 .../org/apache/cayenne/query/SQLSelectIT.java   |  55 +++---
 .../org/apache/cayenne/query/SQLTemplateIT.java | 183 +++++++------------
 2 files changed, 88 insertions(+), 150 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/5ae8ffd1/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 cbc7c83..51dbc48 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
@@ -69,15 +69,19 @@ public class SQLSelectIT extends ServerCase {
 		tArtistCt.setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH");
 	}
 
-	protected void createPaintingsDataSet() throws Exception {
+	private void createPaintingsDataSet() throws Exception {
 		for (int i = 1; i <= 20; i++) {
 			tPainting.insert(i, "painting" + i, 10000. * i);
 		}
 	}
 
+	private void createArtistDataSet() throws SQLException {
+		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
+		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+	}
+
 	@Test
 	public void test_DataRows_DataMapNameRoot() throws Exception {
-
 		createPaintingsDataSet();
 
 		SQLSelect<DataRow> q1 = SQLSelect.dataRowQuery("testmap", "SELECT * FROM PAINTING");
@@ -90,7 +94,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_DataRows_DefaultRoot() throws Exception {
-
 		createPaintingsDataSet();
 
 		SQLSelect<DataRow> q1 = SQLSelect.dataRowQuery("SELECT * FROM PAINTING");
@@ -103,7 +106,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_DataRows_ClassRoot() throws Exception {
-
 		createPaintingsDataSet();
 
 		SQLSelect<Painting> q1 = SQLSelect.query(Painting.class, "SELECT * FROM PAINTING").columnNameCaps(
@@ -116,8 +118,8 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_DataRowWithTypes() throws Exception {
-		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
-		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		createArtistDataSet();
+
 		List<DataRow> result = SQLSelect.dataRowQuery("SELECT * FROM ARTIST_CT", Integer.class, String.class, LocalDateTime.class)
 				.columnNameCaps(CapsStrategy.UPPER)
 				.select(context);
@@ -128,8 +130,8 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_DataRowWithDirectives() throws Exception {
-		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
-		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		createArtistDataSet();
+
 		List<DataRow> result = SQLSelect.dataRowQuery("SELECT #result('ARTIST_ID' 'java.lang.Double'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST_CT")
 				.select(context);
 		assertEquals(2, result.size());
@@ -139,15 +141,16 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test(expected = CayenneRuntimeException.class)
 	public void test_DataRowWithTypesException() throws Exception {
-		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
+		createArtistDataSet();
+
 		SQLSelect.dataRowQuery("SELECT * FROM ARTIST_CT", Integer.class, String.class)
 				.select(context);
 	}
 
 	@Test
 	public void testObjectArrayWithDefaultTypesReturnAndDirectives() throws Exception {
-		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
-		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		createArtistDataSet();
+
 		List<Object[]> result = SQLSelect.scalarQuery("SELECT #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST_CT")
 				.select(context);
 
@@ -160,16 +163,16 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test(expected = CayenneRuntimeException.class)
 	public void testObjectArrayReturnAndDirectives() throws Exception {
-		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
-		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		createArtistDataSet();
+
 		SQLSelect.scalarQuery("SELECT #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST_CT",
 				Integer.class, String.class).select(context);
 	}
 
 	@Test
 	public void testObjectArrayWithOneObjectDefaultTypesReturnAndDirectives() throws Exception {
-		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
-		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		createArtistDataSet();
+
 		List<Object[]> result = SQLSelect.scalarQuery("SELECT #result('ARTIST_ID' 'java.lang.Long') FROM ARTIST_CT")
 				.select(context);
 
@@ -182,6 +185,7 @@ public class SQLSelectIT extends ServerCase {
 	@Test
 	public void test_ObjectArrayQueryWithDefaultTypes() throws Exception {
 		createPaintingsDataSet();
+
 		List<Object[]> result = SQLSelect.scalarQuery("SELECT PAINTING_ID, PAINTING_TITLE, ESTIMATED_PRICE FROM PAINTING")
 				.select(context);
 
@@ -192,6 +196,7 @@ public class SQLSelectIT extends ServerCase {
 	@Test
 	public void test_ObjectQueryWithDefaultType() throws Exception {
 		createPaintingsDataSet();
+
 		List<Object[]> result = SQLSelect.scalarQuery("SELECT PAINTING_ID FROM PAINTING")
 				.select(context);
 		assertEquals(20, result.size());
@@ -202,6 +207,7 @@ public class SQLSelectIT extends ServerCase {
 	@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);
 	}
@@ -209,6 +215,7 @@ public class SQLSelectIT extends ServerCase {
 	@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());
@@ -217,8 +224,7 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void testObjectArrayWithCustomType() throws SQLException {
-		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
-		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
+		createArtistDataSet();
 
 		List<Object[]> results = SQLSelect.scalarQuery("SELECT * FROM ARTIST_CT",
 				Integer.class, String.class, LocalDateTime.class).select(context);
@@ -231,7 +237,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_DataRows_ClassRoot_Parameters() throws Exception {
-
 		createPaintingsDataSet();
 
 		SQLSelect<Painting> q1 = SQLSelect.query(Painting.class,
@@ -245,7 +250,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_DataRows_ClassRoot_Bind() throws Exception {
-
 		createPaintingsDataSet();
 
 		SQLSelect<Painting> q1 = SQLSelect.query(Painting.class,
@@ -259,7 +263,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_DataRows_ColumnNameCaps() throws Exception {
-
 		SQLSelect<DataRow> q1 = SQLSelect.dataRowQuery("SELECT * FROM PAINTING WHERE PAINTING_TITLE = 'painting2'");
 		q1.upperColumnNames();
 
@@ -273,7 +276,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_DataRows_FetchLimit() throws Exception {
-
 		createPaintingsDataSet();
 
 		SQLSelect<DataRow> q1 = SQLSelect.dataRowQuery("SELECT * FROM PAINTING");
@@ -284,7 +286,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_DataRows_FetchOffset() throws Exception {
-
 		createPaintingsDataSet();
 
 		SQLSelect<DataRow> q1 = SQLSelect.dataRowQuery("SELECT * FROM PAINTING");
@@ -295,7 +296,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_Append() throws Exception {
-
 		createPaintingsDataSet();
 
 		SQLSelect<Painting> q1 = SQLSelect.query(Painting.class, "SELECT * FROM PAINTING")
@@ -308,7 +308,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_Select() throws Exception {
-
 		createPaintingsDataSet();
 
 		List<Painting> result = SQLSelect
@@ -320,7 +319,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_SelectOne() throws Exception {
-
 		createPaintingsDataSet();
 
 		Painting a = SQLSelect.query(Painting.class, "SELECT * FROM PAINTING WHERE PAINTING_TITLE = #bind($a)")
@@ -403,7 +401,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_SelectLong() throws Exception {
-
 		createPaintingsDataSet();
 
 		long id = SQLSelect
@@ -415,7 +412,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_SelectLongArray() throws Exception {
-
 		createPaintingsDataSet();
 
 		List<Integer> ids = SQLSelect.scalarQuery(Integer.class,
@@ -427,7 +423,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_SelectCount() throws Exception {
-
 		createPaintingsDataSet();
 
 		int c = SQLSelect.scalarQuery("SELECT COUNT(*) FROM PAINTING", Integer.class).selectOne(context);
@@ -437,7 +432,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_ParamsArray_Single() throws Exception {
-
 		createPaintingsDataSet();
 
 		Integer id = SQLSelect
@@ -449,7 +443,6 @@ public class SQLSelectIT extends ServerCase {
 
 	@Test
 	public void test_ParamsArray_Multiple() throws Exception {
-
 		createPaintingsDataSet();
 
 		List<Integer> ids = SQLSelect
@@ -465,7 +458,6 @@ public class SQLSelectIT extends ServerCase {
 	@Ignore("This is supported by Velocity only")
 	// TODO: move this test to new cayenne-velocity module
 	public void test_ParamsArray_Multiple_OptionalChunks() throws Exception {
-
 		tPainting.insert(1, "painting1", 1.0);
 		tPainting.insert(2, "painting2", null);
 
@@ -485,7 +477,6 @@ public class SQLSelectIT extends ServerCase {
 	@Ignore("This is supported by Velocity only")
 	// TODO: move this test to new cayenne-velocity module
 	public void test_Params_Multiple_OptionalChunks() throws Exception {
-
 		tPainting.insert(1, "painting1", 1.0);
 		tPainting.insert(2, "painting2", null);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/5ae8ffd1/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 da4fff4..09a425a 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
@@ -71,7 +71,7 @@ public class SQLTemplateIT extends ServerCase {
 	@Before
 	public void setUp() throws Exception {
 		tArtist = new TableHelper(dbHelper, "ARTIST");
-		tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
+		tArtist.setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH");
 
 		tPainting = new TableHelper(dbHelper, "PAINTING");
 		tPainting.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE", "ESTIMATED_PRICE");
@@ -80,6 +80,11 @@ public class SQLTemplateIT extends ServerCase {
 		tArtistCt.setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH");
 	}
 
+	private void createArtistDataSet() throws SQLException {
+		tArtist.insert(15, "Surikov", new Date(System.currentTimeMillis()));
+		tArtist.insert(16, "Ivanov", new Date(System.currentTimeMillis()));
+	}
+
 	@Test
 	public void testSQLTemplateForDataMap() {
 		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
@@ -89,15 +94,13 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test
-	public void testSQLTemplateForDataMapWithInsert() {
-		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);
+	public void testSQLTemplateForDataMapWithInsert() throws SQLException {
+		createArtistDataSet();
 
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q2 = new SQLTemplate(testDataMap, "SELECT * FROM ARTIST", true);
 		List<DataRow> result = context.performQuery(q2);
-		assertEquals(1, result.size());
+		assertEquals(2, result.size());
 	}
 
 	@Test
@@ -119,12 +122,10 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test
-	public void testSQLTemplateForDataMapWithInsertException() {
-		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);
+	public void testSQLTemplateForDataMapWithInsertException() throws SQLException {
+		createArtistDataSet();
 
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q2 = new SQLTemplate(testDataMap, "SELECT * FROM ARTIST", false);
 		boolean gotRuntimeException = false;
 		try {
@@ -137,11 +138,9 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test(expected = CayenneRuntimeException.class)
-	public void testExceptionWhenUsingColumnsTypesAndSQLResult(){
-		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);
+	public void testExceptionWhenUsingColumnsTypesAndSQLResult() throws SQLException {
+		createArtistDataSet();
+
 		SQLTemplate query = new SQLTemplate("SELECT ARTIST_ID P FROM ARTIST", true);
 		query.setResultColumnsTypes(Float.class);
 		SQLResult resultDescriptor = new SQLResult();
@@ -151,11 +150,10 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test(expected = CayenneRuntimeException.class)
-	public void testExceptionWhenUsingColumnsTypesAndSQLResultUsingScalar() {
+	public void testExceptionWhenUsingColumnsTypesAndSQLResultUsingScalar() throws SQLException {
+		createArtistDataSet();
+
 		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 query = new SQLTemplate(testDataMap, "SELECT ARTIST_ID, ARTIST_NAME P FROM ARTIST", false);
 		query.setResultColumnsTypes(Float.class, String.class);
 		query.setUseScalar(true);
@@ -167,14 +165,9 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test
-	public void testWithRootUsingScalar() {
-		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);
+	public void testWithRootUsingScalar() throws SQLException {
+		createArtistDataSet();
+
 		SQLTemplate q3 = new SQLTemplate(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
 		q3.setResultColumnsTypes(Double.class, String.class);
 		q3.setUseScalar(true);
@@ -185,14 +178,9 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test
-	public void testWithRootUsingDataRow() {
-		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);
+	public void testWithRootUsingDataRow() throws SQLException {
+		createArtistDataSet();
+
 		SQLTemplate q3 = new SQLTemplate(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
 		q3.setResultColumnsTypes(Double.class, String.class);
 		q3.setFetchingDataRows(true);
@@ -204,22 +192,18 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test(expected = CayenneRuntimeException.class)
-	public void testWithRootException() {
-		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);
+	public void testWithRootException() throws SQLException {
+		createArtistDataSet();
+
 		SQLTemplate q3 = new SQLTemplate(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
 		q3.setResultColumnsTypes(Double.class, String.class);
 		context.performQuery(q3);
 	}
 
 	@Test(expected = CayenneRuntimeException.class)
-	public void testUsingScalarAndDataRow() {
-		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);
+	public void testUsingScalarAndDataRow() throws SQLException {
+		createArtistDataSet();
+
 		SQLTemplate q3 = new SQLTemplate(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
 		q3.setUseScalar(true);
 		q3.setFetchingDataRows(true);
@@ -227,15 +211,10 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test
-	public void testDataRowWithTypes() {
-		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);
+	public void testDataRowWithTypes() throws SQLException {
+		createArtistDataSet();
 
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST", true);
 		q3.setResultColumnsTypes(Double.class, String.class);
 		q3.setColumnNamesCapitalization(CapsStrategy.UPPER);
@@ -246,15 +225,10 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test
-	public void testDataRowReturnAndDirectives() {
-		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);
+	public void testDataRowReturnAndDirectives() throws SQLException {
+		createArtistDataSet();
 
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST", true);
 		List<DataRow> result = context.performQuery(q3);
 		assertEquals(2, result.size());
@@ -265,26 +239,20 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test(expected = CayenneRuntimeException.class)
-	public void testDataRowReturnAndDirectivesExc() {
+	public void testDataRowReturnAndDirectivesExc() throws SQLException {
+		createArtistDataSet();
+
 		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 #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST", true);
 		q3.setResultColumnsTypes(Integer.class, String.class);
 		context.performQuery(q3);
 	}
 
 	@Test
-	public void testObjectArrayReturnAndDirectives() {
-		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);
+	public void testObjectArrayReturnAndDirectives() throws SQLException {
+		createArtistDataSet();
 
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST", false);
 		q3.setUseScalar(true);
 		List<Object[]> result = context.performQuery(q3);
@@ -296,15 +264,10 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test(expected = CayenneRuntimeException.class)
-	public void testObjectArrayReturnAndDirectivesException() {
-		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);
+	public void testObjectArrayReturnAndDirectivesException() throws SQLException {
+		createArtistDataSet();
 
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT #result('ARTIST_ID' 'java.lang.Long'), #result('ARTIST_NAME' 'java.lang.String') FROM ARTIST", false);
 		q3.setResultColumnsTypes(Integer.class, String.class);
 		q3.setUseScalar(true);
@@ -312,15 +275,10 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test
-	public void testObjectArrayWithSingleObjectReturnAndDirectives() {
-		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);
+	public void testObjectArrayWithSingleObjectReturnAndDirectives() throws SQLException {
+		createArtistDataSet();
 
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT #result('ARTIST_ID' 'java.lang.Long') FROM ARTIST", false);
 		q3.setUseScalar(true);
 		List<Object[]> result = context.performQuery(q3);
@@ -331,11 +289,10 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test(expected = CayenneRuntimeException.class)
-	public void testObjectArrayReturnWithException() {
+	public void testObjectArrayReturnWithException() throws SQLException {
+		createArtistDataSet();
+
 		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", false);
 		q3.setResultColumnsTypes(Integer.class);
 		q3.setUseScalar(true);
@@ -343,15 +300,10 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test
-	public void testObjectArrayWithSingleObjectReturn() {
-		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);
+	public void testObjectArrayWithSingleObjectReturn() throws SQLException {
+		createArtistDataSet();
 
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT ARTIST_ID FROM ARTIST", false);
 		q3.setUseScalar(true);
 		List<Object[]> artists = context.performQuery(q3);
@@ -362,15 +314,10 @@ public class SQLTemplateIT extends ServerCase {
 	}
 
 	@Test
-	public void testObjectArrayReturnWithDefaultTypes() {
-		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);
+	public void testObjectArrayReturnWithDefaultTypes() throws SQLException {
+		createArtistDataSet();
 
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q3 = new SQLTemplate(testDataMap, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST", false);
 		q3.setUseScalar(true);
 		List<Object[]> artists = context.performQuery(q3);
@@ -382,10 +329,10 @@ public class SQLTemplateIT extends ServerCase {
 
 	@Test
 	public void testObjectArrayReturn() throws SQLException {
+		createArtistDataSet();
+
 		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
-		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
-		tArtistCt.insert(2, "Test1", new Date(System.currentTimeMillis()));
-		SQLTemplate q5 = new SQLTemplate(testDataMap, "SELECT * FROM ARTIST_CT", false);
+		SQLTemplate q5 = new SQLTemplate(testDataMap, "SELECT * FROM ARTIST", false);
 		q5.setResultColumnsTypes(Float.class, String.class, LocalDateTime.class);
 		q5.setUseScalar(true);
 		List dates = context.performQuery(q5);
@@ -397,8 +344,9 @@ public class SQLTemplateIT extends ServerCase {
 
 	@Test
 	public void testSingleObjectReturn() throws SQLException {
-		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		tArtistCt.insert(1, "Test", new Date(System.currentTimeMillis()));
+
+		DataMap testDataMap = context.getEntityResolver().getDataMap("testmap");
 		SQLTemplate q5 = new SQLTemplate(testDataMap, "SELECT ARTIST_NAME FROM ARTIST_CT", false);
 		q5.setResultColumnsTypes(String.class);
 		q5.setUseScalar(true);
@@ -471,7 +419,6 @@ public class SQLTemplateIT extends ServerCase {
 	public void testSQLTemplateSelectNullObjects() throws Exception {
 		tPainting.insert(1, null, "p1", 10);
 
-
 		String sql = "SELECT p.GALLERY_ID FROM PAINTING p";
 		SQLTemplate q1 = new SQLTemplate(Gallery.class, sql);
 		q1.setColumnNamesCapitalization(CapsStrategy.UPPER);
@@ -495,8 +442,8 @@ public class SQLTemplateIT extends ServerCase {
 
 	@Test
 	public void testSQLTemplateWithDisjointByIdPrefetch() throws Exception {
-		tArtist.insert(1, "artist1");
-		tArtist.insert(2, "artist2");
+		tArtist.insert(1, "artist1", null);
+		tArtist.insert(2, "artist2", null);
 
 		tPainting.insert(1, 1, "p1", 10);
 		tPainting.insert(2, 2, "p2", 20);


[4/4] cayenne git commit: Merge PR #336

Posted by nt...@apache.org.
Merge PR #336


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/fb7f004a
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/fb7f004a
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/fb7f004a

Branch: refs/heads/master
Commit: fb7f004a8a4518ffc672991547f42aa95fec851f
Parents: 831442c 5ae8ffd
Author: Nikita Timofeev <st...@gmail.com>
Authored: Mon Nov 5 11:10:28 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Mon Nov 5 11:10:28 2018 +0300

----------------------------------------------------------------------
 .../access/jdbc/RowDescriptorBuilder.java       |   2 +-
 .../cayenne/access/jdbc/SQLTemplateAction.java  |  25 +-
 .../cayenne/map/DefaultScalarResultSegment.java |   4 +-
 .../org/apache/cayenne/query/SQLSelect.java     |  84 ++++++-
 .../org/apache/cayenne/query/SQLTemplate.java   |  17 +-
 .../cayenne/query/SQLTemplateMetadata.java      |  29 ++-
 .../org/apache/cayenne/query/SQLSelectIT.java   | 117 +++++++--
 .../org/apache/cayenne/query/SQLTemplateIT.java | 244 ++++++++++++++++---
 .../asciidoc/_cayenne-guide/part2/queries.adoc  |  31 ++-
 9 files changed, 467 insertions(+), 86 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/fb7f004a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
----------------------------------------------------------------------


[2/4] cayenne git commit: Update docs

Posted by nt...@apache.org.
Update docs


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/b1f9ad5b
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/b1f9ad5b
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/b1f9ad5b

Branch: refs/heads/master
Commit: b1f9ad5b333442e6e51286fa1a3379f83919411c
Parents: 18c72d3
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Oct 24 12:57:26 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:23:25 2018 +0300

----------------------------------------------------------------------
 .../asciidoc/_cayenne-guide/part2/queries.adoc  | 31 ++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/b1f9ad5b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries.adoc
----------------------------------------------------------------------
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries.adoc
index c93076f..0230a54 100644
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries.adoc
+++ b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries.adoc
@@ -296,8 +296,9 @@ Artist artistWithId1 = SelectById.query(Artist.class, 1)
 
 `SQLSelect` and `SQLExec` are essentially a "fluent" versions of older `SQLTemplate` query.
 `SQLSelect` can be used (as name suggests) to select custom data in form of entities,
-separate columns or collection of `DataRow`. `SQLExec` is designed to just execute any raw SQL code
-(e.g. updates, deletes, DDLs, etc.) This queries support all directives described in <<SQLTemplate>> section.
+separate columns, collection of `DataRow` or Object[]. `SQLExec` is designed to just execute any raw SQL code
+(e.g. updates, deletes, DDLs, etc.) This queries support all directives described in <<SQLTemplate>> section. Also you can predefine
+result type of columns.
 
 Here is example of how to use SQLSelect:
 
@@ -317,6 +318,16 @@ List<String> paintingNames = SQLSelect
     .scalarQuery(String.class, "SELECT PAINTING_TITLE FROM PAINTING WHERE ESTIMATED_PRICE > #bind($price)")
     .params("price", 100000)
     .select(context);
+
+// Selecting DataRow with predefined types
+List<DataRow> result = SQLSelect
+    .dataRowQuery("SELECT * FROM ARTIST_CT", Integer.class, String.class, LocalDateTime.class)
+    .select(context);
+
+// Selecting Object[] with predefined types
+List<Object[]> result = SQLSelect
+    .scalarQuery("SELECT * FROM ARTIST_CT", Integer.class, String.class, LocalDateTime.class)
+    .select(context);
 ----
 
 
@@ -873,6 +884,22 @@ query.setResult(resultDescriptor);
 List<Object[]> data = context.performQuery(query);
 ----
 
+You can fetch list of scalars, list of Object[] or list of DataRow with predefined result column types or using default types.
+[source, Java]
+----
+// Selecting Object[] with predefined types
+SQLTemplate q3 = new SQLTemplate(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
+ 		q3.setResultColumnsTypes(Double.class, String.class);
+ 		q3.setUseScalar(true);
+List<Object[]> result = context.performQuery(q3);
+
+// Selecting DataRow with predefined types
+SQLTemplate q3 = new SQLTemplate(Artist.class, "SELECT ARTIST_ID, ARTIST_NAME FROM ARTIST");
+        q3.setResultColumnsTypes(Double.class, String.class);
+        q3.setFetchingDataRows(true);
+List<DataRow> result = context.performQuery(q3);
+----
+
 Another trick related to mapping result sets is making Cayenne recognize prefetched entities in the result set.
 This emulates "joint" prefetching of `SelectQuery`, and is achieved by special column naming.
 Columns belonging to the "root" entity of the query should use unqualified names corresponding to the root `DbEntity` columns.