From 7117dfaf63509f53a2aeebc5ba1f66ee483841f8 Mon Sep 17 00:00:00 2001 From: Stefano Lottini <236640031+sl-at-ibm@users.noreply.github.com> Date: Wed, 16 Sep 2026 23:36:37 +0200 Subject: [PATCH] updateMany reworked (legacy+newstyle) --- .../adapter/dataapi/DataApiOpMapper.java | 4 +- ...CollectionLegacyUpdateManyOpDispenser.java | 74 +++++++++++++++++++ ...ataApiCollectionUpdateManyOpDispenser.java | 13 ++-- .../adapter/dataapi/ops/DataApiOpType.java | 5 +- 4 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionLegacyUpdateManyOpDispenser.java diff --git a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/DataApiOpMapper.java b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/DataApiOpMapper.java index 158d0f8f4..5888c2722 100644 --- a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/DataApiOpMapper.java +++ b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/DataApiOpMapper.java @@ -56,6 +56,7 @@ public class DataApiOpMapper implements OpMapper { DEPRECATED_OP_TYPES.put(DataApiOpType.find_one_and_update, DataApiOpType.collection_find_one_and_update); DEPRECATED_OP_TYPES.put(DataApiOpType.replace_one, null); // not a Data API primitive, it's client-emulated DEPRECATED_OP_TYPES.put(DataApiOpType.find_one_and_replace, DataApiOpType.collection_find_one_and_replace); + DEPRECATED_OP_TYPES.put(DataApiOpType.update_many, DataApiOpType.collection_update_many); DEPRECATED_OP_TYPES.put(DataApiOpType.count_documents, DataApiOpType.collection_count_documents); DEPRECATED_OP_TYPES.put(DataApiOpType.estimated_document_count, DataApiOpType.collection_estimated_document_count); } @@ -108,7 +109,6 @@ public class DataApiOpMapper implements OpMapper { case insert_many -> new DataApiCollectionInsertManyOpDispenser(adapter, op, typeAndTarget.targetFunction); case insert_one -> new DataApiCollectionInsertOneOpDispenser(adapter, op, typeAndTarget.targetFunction); case insert_one_vector -> new DataApiCollectionInsertOneVectorOpDispenser(adapter, op, typeAndTarget.targetFunction); - case update_many -> new DataApiCollectionUpdateManyOpDispenser(adapter, op, typeAndTarget.targetFunction); // LEGACY OPS // admin ops: @@ -130,6 +130,7 @@ public class DataApiOpMapper implements OpMapper { case find_one_and_update -> new DataApiCollectionLegacyFindOneAndUpdateOpDispenser(adapter, op, typeAndTarget.targetFunction); case replace_one -> new DataApiCollectionLegacyReplaceOneOpDispenser(adapter, op, typeAndTarget.targetFunction); case find_one_and_replace -> new DataApiCollectionLegacyFindOneAndReplaceOpDispenser(adapter, op, typeAndTarget.targetFunction); + case update_many -> new DataApiCollectionLegacyUpdateManyOpDispenser(adapter, op, typeAndTarget.targetFunction); case count_documents -> new DataApiCollectionLegacyCountDocumentsOpDispenser(adapter, op, typeAndTarget.targetFunction); case estimated_document_count -> new DataApiCollectionEstimatedDocumentCountOpDispenser(adapter, op, typeAndTarget.targetFunction); @@ -144,6 +145,7 @@ public class DataApiOpMapper implements OpMapper { case collection_delete_one -> new DataApiCollectionDeleteOneOpDispenser(adapter, op, typeAndTarget.targetFunction); case collection_find_one_and_delete -> new DataApiCollectionFindOneAndDeleteOpDispenser(adapter, op, typeAndTarget.targetFunction); case collection_find_one_and_replace -> new DataApiCollectionFindOneAndReplaceOpDispenser(adapter, op, typeAndTarget.targetFunction); + case collection_update_many -> new DataApiCollectionUpdateManyOpDispenser(adapter, op, typeAndTarget.targetFunction); case collection_estimated_document_count -> new DataApiCollectionEstimatedDocumentCountOpDispenser(adapter, op, typeAndTarget.targetFunction); case collection_count_documents -> new DataApiCollectionCountDocumentsOpDispenser(adapter, op, typeAndTarget.targetFunction); diff --git a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionLegacyUpdateManyOpDispenser.java b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionLegacyUpdateManyOpDispenser.java new file mode 100644 index 000000000..6cfe17396 --- /dev/null +++ b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionLegacyUpdateManyOpDispenser.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) nosqlbench + * + * Licensed 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 io.nosqlbench.adapter.dataapi.opdispensers; + +import com.datastax.astra.client.databases.Database; +import com.datastax.astra.client.core.query.Filter; +import com.datastax.astra.client.collections.commands.Update; +import com.datastax.astra.client.collections.commands.options.CollectionUpdateManyOptions; +import io.nosqlbench.adapter.dataapi.DataApiDriverAdapter; +import io.nosqlbench.adapter.dataapi.ops.DataApiBaseOp; +import io.nosqlbench.adapter.dataapi.ops.DataApiCollectionUpdateManyOp; +import io.nosqlbench.adapters.api.templating.ParsedOp; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Map; +import java.util.Optional; +import java.util.function.LongFunction; + +public class DataApiCollectionLegacyUpdateManyOpDispenser extends DataApiOpDispenser { + private static final Logger logger = LogManager.getLogger(DataApiCollectionLegacyUpdateManyOpDispenser.class); + private final LongFunction opFunction; + + public DataApiCollectionLegacyUpdateManyOpDispenser(DataApiDriverAdapter adapter, ParsedOp op, LongFunction targetFunction) { + super(adapter, op, targetFunction); + this.opFunction = createOpFunction(op); + } + + private LongFunction createOpFunction(ParsedOp op) { + return (l) -> { + Database db = spaceFunction.apply(l).getDatabase(); + Filter filter = getLegacyFilterFromOp(op, l); + CollectionUpdateManyOptions options = getCollectionUpdateManyOptions(op, l); + LongFunction docMapFunc = op.getAsRequiredFunction("updates", Map.class); + + return new DataApiCollectionUpdateManyOp( + db, + db.getCollection(targetFunction.apply(l)), + filter, + new Update(docMapFunc.apply(l)), + options + ); + }; + } + + private CollectionUpdateManyOptions getCollectionUpdateManyOptions(ParsedOp op, long l) { + CollectionUpdateManyOptions options = new CollectionUpdateManyOptions(); + Optional> upsertFunction = op.getAsOptionalFunction("upsert", Boolean.class); + if (upsertFunction.isPresent()) { + options = options.upsert(upsertFunction.get().apply(l)); + } + + return options; + } + + @Override + public DataApiBaseOp getOp(long cycle) { + return opFunction.apply(cycle); + } +} diff --git a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionUpdateManyOpDispenser.java b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionUpdateManyOpDispenser.java index 7a920d7c4..f37860095 100644 --- a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionUpdateManyOpDispenser.java +++ b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionUpdateManyOpDispenser.java @@ -27,8 +27,6 @@ import io.nosqlbench.adapters.api.templating.ParsedOp; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.Map; -import java.util.Optional; import java.util.function.LongFunction; public class DataApiCollectionUpdateManyOpDispenser extends DataApiOpDispenser { @@ -45,13 +43,13 @@ public class DataApiCollectionUpdateManyOpDispenser extends DataApiOpDispenser { Database db = spaceFunction.apply(l).getDatabase(); Filter filter = getFilterFromOp(op, l); CollectionUpdateManyOptions options = getCollectionUpdateManyOptions(op, l); - LongFunction docMapFunc = op.getAsRequiredFunction("updates", Map.class); + Update update = getUpdateFromOp(op, l); return new DataApiCollectionUpdateManyOp( db, db.getCollection(targetFunction.apply(l)), filter, - new Update(docMapFunc.apply(l)), + update, options ); }; @@ -59,11 +57,10 @@ public class DataApiCollectionUpdateManyOpDispenser extends DataApiOpDispenser { private CollectionUpdateManyOptions getCollectionUpdateManyOptions(ParsedOp op, long l) { CollectionUpdateManyOptions options = new CollectionUpdateManyOptions(); - Optional> upsertFunction = op.getAsOptionalFunction("upsert", Boolean.class); - if (upsertFunction.isPresent()) { - options = options.upsert(upsertFunction.get().apply(l)); + Boolean upsert = getUpsertFromOp(op, l); + if (upsert != null) { + options = options.upsert(upsert); } - return options; } diff --git a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/ops/DataApiOpType.java b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/ops/DataApiOpType.java index 88655f183..0af862c0a 100644 --- a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/ops/DataApiOpType.java +++ b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/ops/DataApiOpType.java @@ -37,8 +37,6 @@ public enum DataApiOpType { insert_many, insert_one, insert_one_vector, - update_many, - replace_one, // LEGACY OPS // admin ops: @@ -58,7 +56,9 @@ public enum DataApiOpType { find_one, update_one, find_one_and_update, + replace_one, find_one_and_replace, + update_many, estimated_document_count, count_documents, @@ -75,6 +75,7 @@ public enum DataApiOpType { collection_update_one, collection_find_one_and_update, collection_find_one_and_replace, + collection_update_many, collection_estimated_document_count, collection_count_documents, }