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 2020/03/10 12:57:08 UTC

[cayenne] 03/05: CAY-2650 Support using generated primary keys along with batch inserts cleanup

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 3451da78b8c05afc64c65bf6302e5405e918f349
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Fri Mar 6 17:12:27 2020 +0300

    CAY-2650 Support using generated primary keys along with batch inserts
     cleanup
---
 .../apache/cayenne/access/OperationObserver.java   | 14 +++++++++--
 .../apache/cayenne/access/jdbc/BatchAction.java    | 28 ++++++++++++----------
 2 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java
index d24ba90..9553831 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.access;
 
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.cayenne.ObjectId;
@@ -58,10 +59,19 @@ public interface OperationObserver extends OperationHints {
     void nextRows(Query q, ResultIterator<?> it);
 
     /**
-     * Callback method invoked after each batch of generated values is read during an
-     * update.
+     * Callback method invoked after each batch of generated values is read during an update.
      * 
      * @since 4.0
+     * @deprecated since 4.2, use {@link #nextGeneratedRows(Query, ResultIterator, List)}
+     */
+    @Deprecated
+    default void nextGeneratedRows(Query query, ResultIterator<?> keys, ObjectId idToUpdate) {
+        nextGeneratedRows(query, keys, Collections.singletonList(idToUpdate));
+    }
+
+    /**
+     * Callback method invoked after each batch of generated values is read during an update.
+     * @since 4.2
      */
     void nextGeneratedRows(Query query, ResultIterator<?> keys, List<ObjectId> idsToUpdate);
 
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 e8ba334..d3a92d7 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
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.access.jdbc;
 
+import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.OperationObserver;
@@ -30,7 +31,6 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.log.JdbcEventLogger;
 import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.query.BatchQuery;
 import org.apache.cayenne.query.BatchQueryRow;
 import org.apache.cayenne.query.InsertBatchQuery;
@@ -38,14 +38,12 @@ import org.apache.cayenne.query.InsertBatchQuery;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
 
 /**
  * @since 1.2
@@ -117,7 +115,7 @@ public class BatchAction extends BaseSQLAction {
 
 		DbAdapter adapter = dataNode.getAdapter();
 
-		try (PreparedStatement statement = con.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS)) {
+		try (PreparedStatement statement = prepareStatement(con, sql, adapter, generatesKeys)) {
 			for (BatchQueryRow row : query.getRows()) {
 
 				DbAttributeBinding[] bindings = translator.updateBindings(row);
@@ -206,10 +204,9 @@ public class BatchAction extends BaseSQLAction {
 
 	protected boolean supportsGeneratedKeys(boolean isBatch) {
 		// see if we are configured to support generated keys
-		boolean isSupported = isBatch 
-				? dataNode.getAdapter().supportsGeneratedKeysForBatchInserts() 
+		return isBatch
+				? dataNode.getAdapter().supportsGeneratedKeysForBatchInserts()
 				: dataNode.getAdapter().supportsGeneratedKeys();
-		return isSupported;
 	}
 				
 	/**
@@ -274,8 +271,11 @@ public class BatchAction extends BaseSQLAction {
 			this.keyRowDescriptor = builder.getDescriptor(dataNode.getAdapter().getExtendedTypes());
 		}
 
-		RowReader<?> rowReader = dataNode.rowReader(keyRowDescriptor, query.getMetaData(dataNode.getEntityResolver()),
-				Collections.<ObjAttribute, ColumnDescriptor> emptyMap());
+		RowReader<?> rowReader = dataNode.rowReader(
+				keyRowDescriptor,
+				query.getMetaData(dataNode.getEntityResolver()),
+				Collections.emptyMap()
+		);
 		ResultIterator iterator = new JDBCResultIterator(null, keysRS, rowReader);
 
 		observer.nextGeneratedRows(query, iterator, Collections.singletonList(row.getObjectId()));
@@ -321,9 +321,13 @@ public class BatchAction extends BaseSQLAction {
 		}
 
 		RowReader<?> rowReader = dataNode.rowReader(keyRowDescriptor, query.getMetaData(dataNode.getEntityResolver()),
-				Collections.<ObjAttribute, ColumnDescriptor> emptyMap());
+				Collections.emptyMap());
 		ResultIterator iterator = new JDBCResultIterator(null, keysRS, rowReader);
 
-		observer.nextGeneratedRows(query, iterator, rows.stream().map(r -> r.getObjectId()).collect(Collectors.toList()));
+		List<ObjectId> objectIds = new ArrayList<>(rows.size());
+		for(BatchQueryRow row : rows) {
+			objectIds.add(row.getObjectId());
+		}
+		observer.nextGeneratedRows(query, iterator, objectIds);
 	}
 }