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);
}
}