You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2016/08/11 08:57:30 UTC

cayenne git commit: refactor CAY-2100: add PostgresBatchAction;

Repository: cayenne
Updated Branches:
  refs/heads/master c208ae6a1 -> 6a9e43d91


refactor CAY-2100: add PostgresBatchAction;


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

Branch: refs/heads/master
Commit: 6a9e43d9112ccab2de998b639db2d7942b61b4b2
Parents: c208ae6
Author: Savva Kolbachev <s....@gmail.com>
Authored: Thu Aug 11 11:57:04 2016 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Thu Aug 11 11:57:04 2016 +0300

----------------------------------------------------------------------
 .../apache/cayenne/access/jdbc/BatchAction.java | 33 ++--------
 .../dba/postgres/PostgresActionBuilder.java     | 12 ++++
 .../dba/postgres/PostgresBatchAction.java       | 63 ++++++++++++++++++++
 3 files changed, 80 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a9e43d9/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
index 0f6d7c8..09e0c96 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
@@ -29,7 +29,6 @@ import org.apache.cayenne.access.translator.DbAttributeBinding;
 import org.apache.cayenne.access.translator.batch.BatchTranslator;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.TypesMapping;
-import org.apache.cayenne.dba.postgres.PostgresAdapter;
 import org.apache.cayenne.log.JdbcEventLogger;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.ObjAttribute;
@@ -183,33 +182,11 @@ public class BatchAction extends BaseSQLAction {
 		}
 	}
 
-	private PreparedStatement prepareStatement(
-			Connection connection,
-			String queryStr,
-			DbAdapter adapter,
-			boolean generatedKeys)
-			throws SQLException {
-
-		if (generatedKeys) {
-
-			if (adapter.unwrap().getClass().equals(PostgresAdapter.class)) {
-				Collection<DbAttribute> generatedAttributes = query.getDbEntity().getGeneratedAttributes();
-				String[] generatedPKColumns = new String[generatedAttributes.size()];
-
-				int i = 0;
-				for (DbAttribute generatedAttribute : generatedAttributes) {
-					if (generatedAttribute.isPrimaryKey()) {
-						generatedPKColumns[i++] = generatedAttribute.getName().toLowerCase();
-					}
-				}
-
-				return connection.prepareStatement(queryStr, generatedPKColumns);
-			}
-
-			return connection.prepareStatement(queryStr, Statement.RETURN_GENERATED_KEYS);
-		}
-
-		return connection.prepareStatement(queryStr);
+	protected PreparedStatement prepareStatement(Connection connection,	String queryStr,
+												 DbAdapter adapter,	boolean generatedKeys) throws SQLException {
+		return (generatedKeys)
+				? connection.prepareStatement(queryStr, Statement.RETURN_GENERATED_KEYS)
+				: connection.prepareStatement(queryStr);
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a9e43d9/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
index b3f77ee..c583eca 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.dba.postgres;
 
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
+import org.apache.cayenne.query.BatchQuery;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SelectQuery;
@@ -35,6 +36,17 @@ class PostgresActionBuilder extends JdbcActionBuilder {
     }
 
     @Override
+    public SQLAction batchAction(BatchQuery query) {
+        // check run strategy...
+
+        // optimistic locking is not supported in batches due to JDBC driver limitations
+        boolean useOptimisticLock = query.isUsingOptimisticLocking();
+
+        boolean runningAsBatch = !useOptimisticLock && dataNode.getAdapter().supportsBatchUpdates();
+        return new PostgresBatchAction(query, dataNode, runningAsBatch);
+    }
+
+    @Override
     public SQLAction procedureAction(ProcedureQuery query) {
         return new PostgresProcedureAction(query, dataNode);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a9e43d9/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresBatchAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresBatchAction.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresBatchAction.java
new file mode 100644
index 0000000..28f5b37
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresBatchAction.java
@@ -0,0 +1,63 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dba.postgres;
+
+import org.apache.cayenne.access.DataNode;
+import org.apache.cayenne.access.jdbc.BatchAction;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.query.BatchQuery;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
+
+public class PostgresBatchAction extends BatchAction {
+
+    /**
+     * @since 4.0
+     */
+    public PostgresBatchAction(BatchQuery query, DataNode dataNode, boolean runningAsBatch) {
+        super(query, dataNode, runningAsBatch);
+    }
+
+    @Override
+    protected PreparedStatement prepareStatement(Connection connection, String queryStr,
+                                                 DbAdapter adapter, boolean generatedKeys) throws SQLException {
+        if (generatedKeys) {
+            Collection<DbAttribute> generatedAttributes = query.getDbEntity().getGeneratedAttributes();
+            String[] generatedPKColumns = new String[generatedAttributes.size()];
+
+            int i = 0;
+            for (DbAttribute generatedAttribute : generatedAttributes) {
+                if (generatedAttribute.isPrimaryKey()) {
+                    generatedPKColumns[i++] = generatedAttribute.getName().toLowerCase();
+                }
+            }
+
+            return connection.prepareStatement(queryStr, Arrays.copyOf(generatedPKColumns, i));
+        }
+
+        return connection.prepareStatement(queryStr);
+    }
+
+}