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>