diff --git a/nb-adapters/adapter-dataapi/pom.xml b/nb-adapters/adapter-dataapi/pom.xml
index 2630f0d61..cbf0be2c0 100644
--- a/nb-adapters/adapter-dataapi/pom.xml
+++ b/nb-adapters/adapter-dataapi/pom.xml
@@ -49,7 +49,7 @@
com.datastax.astra
astra-db-java
- 2.1.4
+ 2.3.2
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 42efd195d..306e76d05 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
@@ -26,10 +26,46 @@ import io.nosqlbench.engine.api.templating.TypeAndTarget;
import io.nosqlbench.nb.api.components.core.NBComponent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.util.HashMap;
+import java.util.Map;
import java.util.function.LongFunction;
public class DataApiOpMapper implements OpMapper {
private static final Logger logger = LogManager.getLogger(DataApiOpMapper.class);
+
+ // Maps a deprecated op type to its replacement, or null if there is no replacement.
+ private static final Map DEPRECATED_OP_TYPES;
+ static {
+ DEPRECATED_OP_TYPES = new HashMap<>();
+ // admin ops:
+ DEPRECATED_OP_TYPES.put(DataApiOpType.create_collection_with_class, DataApiOpType.db_create_collection);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.create_collection, DataApiOpType.db_create_collection);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.delete_collection, DataApiOpType.db_delete_collection);
+ // db-admin ops:
+ // in-database ops:
+ // in-collection ops:
+ DEPRECATED_OP_TYPES.put(DataApiOpType.insert_one, DataApiOpType.collection_insert_one);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.insert_one_vector, DataApiOpType.collection_insert_one);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.insert_many, DataApiOpType.collection_insert_many);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.delete_all, DataApiOpType.collection_delete_many);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.delete_many, DataApiOpType.collection_delete_many);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.delete_one, DataApiOpType.collection_delete_one);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.find_one_and_delete, DataApiOpType.collection_find_one_and_delete);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.find, DataApiOpType.collection_find);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.find_vector, DataApiOpType.collection_find);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.find_vector_filter, DataApiOpType.collection_find);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.find_by_id, DataApiOpType.collection_find_one);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.find_distinct, null); // not a Data API primitive, it's client-emulated
+ DEPRECATED_OP_TYPES.put(DataApiOpType.find_one, DataApiOpType.collection_find_one);
+ DEPRECATED_OP_TYPES.put(DataApiOpType.update_one, DataApiOpType.collection_update_one);
+ 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);
+ }
+
private final DataApiDriverAdapter adapter;
public DataApiOpMapper(DataApiDriverAdapter dataApiDriverAdapter) {
@@ -47,7 +83,18 @@ public class DataApiOpMapper implements OpMapper {
"collection"
);
logger.debug(() -> "Using '" + typeAndTarget.enumId + "' op type for op template '" + op.getName() + "'");
+ if (DEPRECATED_OP_TYPES.containsKey(typeAndTarget.enumId)) {
+ DataApiOpType replacement = DEPRECATED_OP_TYPES.get(typeAndTarget.enumId);
+ if (replacement != null) {
+ logger.warn(() -> "Op type '" + typeAndTarget.enumId + "' is deprecated; please switch to '" +
+ replacement + "'. Op template: '" + op.getName() + "'");
+ } else {
+ logger.warn(() -> "Op type '" + typeAndTarget.enumId + "' is discontinued and will be removed" +
+ " in a future release. Op template: '" + op.getName() + "'");
+ }
+ }
return switch (typeAndTarget.enumId) {
+ // TO-DO OPS
// admin ops:
case create_database -> new DataApiCreateDatabaseOpDispenser(adapter, op, typeAndTarget.targetFunction);
case list_databases -> new DataApiListDatabasesOpDispenser(adapter, op, typeAndTarget.targetFunction);
@@ -58,34 +105,60 @@ public class DataApiOpMapper implements OpMapper {
case list_namespaces -> new DataApiListNamespacesOpDispenser(adapter, op, typeAndTarget.targetFunction);
case drop_namespace -> new DataApiDropNamespaceOpDispenser(adapter, op, typeAndTarget.targetFunction);
// in-database ops:
- case create_collection -> new DataApiCreateCollectionOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case delete_collection -> new DataApiDropCollectionOpDispenser(adapter, op, typeAndTarget.targetFunction);
case list_collections -> new DataApiListCollectionsOpDispenser(adapter, op, typeAndTarget.targetFunction);
case list_collection_names ->
new DataApiListCollectionNamesOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case create_collection_with_class -> new DataApiCreateCollectionWithClassOpDispenser(adapter, op, typeAndTarget.targetFunction);
+
+ // LEGACY OPS
+ // admin ops:
+ // db-admin ops:
+ // in-database ops:
+ case create_collection -> new DataApiLegacyCreateCollectionOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case create_collection_with_class -> new DataApiLegacyCreateCollectionWithClassOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case delete_collection -> new DataApiLegacyDeleteCollectionOpDispenser(adapter, op, typeAndTarget.targetFunction);
// in-collection ops:
- 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 find -> new DataApiCollectionFindOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case find_one -> new DataApiCollectionFindOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case find_one_and_delete -> new DataApiCollectionFindOneAndDeleteOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case find_one_and_update -> new DataApiCollectionFindOneAndUpdateOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case find_vector -> new DataApiCollectionFindVectorOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case find_vector_filter -> new DataApiCollectionFindVectorFilterOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case update_one -> new DataApiCollectionUpdateOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case update_many -> new DataApiCollectionUpdateManyOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case delete_one -> new DataApiCollectionDeleteOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case delete_many -> new DataApiCollectionDeleteManyOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case insert_one_vector -> new DataApiCollectionLegacyInsertOneVectorOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case insert_many -> new DataApiCollectionLegacyInsertManyOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case delete_one -> new DataApiCollectionLegacyDeleteOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case delete_many -> new DataApiCollectionLegacyDeleteManyOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case delete_all -> new DataApiCollectionLegacyDeleteAllOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case find_one_and_delete -> new DataApiCollectionLegacyFindOneAndDeleteOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case find -> new DataApiCollectionLegacyFindOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case find_vector -> new DataApiCollectionLegacyFindVectorOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case find_vector_filter -> new DataApiCollectionLegacyFindVectorFilterOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case find_by_id -> new DataApiCollectionLegacyFindByIdOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case find_distinct -> new DataApiCollectionLegacyFindDistinctOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case find_one -> new DataApiCollectionLegacyFindOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case update_one -> new DataApiCollectionLegacyUpdateOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ 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);
- case find_by_id -> new DataApiCollectionFindByIdOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case find_distinct -> new DataApiCollectionFindDistinctOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case count_documents -> new DataApiCollectionCountDocumentsOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case replace_one -> new DataApiCollectionReplaceOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case find_one_and_replace -> new DataApiCollectionFindOneAndReplaceOpDispenser(adapter, op, typeAndTarget.targetFunction);
- case delete_all -> new DataApiCollectionDeleteAllOpDispenser(adapter, op, typeAndTarget.targetFunction);
+
+ // NEW-STYLE OPS
+ // in-database ops:
+ case db_create_collection -> new DataApiDbCreateCollectionOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case db_delete_collection -> new DataApiDbDeleteCollectionOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ // in-collection ops:
+ case collection_insert_one -> new DataApiCollectionInsertOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case collection_insert_many -> new DataApiCollectionInsertManyOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case collection_find -> new DataApiCollectionFindOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case collection_find_one -> new DataApiCollectionFindOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case collection_find_and_rerank -> new DataApiCollectionFindAndRerankOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case collection_update_one -> new DataApiCollectionUpdateOneOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case collection_find_one_and_update -> new DataApiCollectionFindOneAndUpdateOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ case collection_delete_many -> new DataApiCollectionDeleteManyOpDispenser(adapter, op, typeAndTarget.targetFunction);
+ 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/DataApiSpace.java b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/DataApiSpace.java
index 5f579c203..657385f92 100644
--- a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/DataApiSpace.java
+++ b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/DataApiSpace.java
@@ -20,6 +20,9 @@ import com.datastax.astra.client.DataAPIClient;
import com.datastax.astra.client.databases.Database;
import com.datastax.astra.client.admin.AstraDBAdmin;
import com.datastax.astra.client.admin.DatabaseAdmin;
+// TODO: remove this - it's to log Data API requests and responses
+import com.datastax.astra.client.core.options.DataAPIClientOptions;
+
import io.nosqlbench.adapters.api.activityimpl.uniform.BaseSpace;
import io.nosqlbench.nb.api.config.standard.ConfigModel;
import io.nosqlbench.nb.api.config.standard.NBConfigModel;
diff --git a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionCountDocumentsOpDispenser.java b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionCountDocumentsOpDispenser.java
index 63cf997e6..2398817d7 100644
--- a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionCountDocumentsOpDispenser.java
+++ b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionCountDocumentsOpDispenser.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.function.LongFunction;
+import java.util.Optional;
public class DataApiCollectionCountDocumentsOpDispenser extends DataApiOpDispenser {
private static final Logger logger = LogManager.getLogger(DataApiCollectionCountDocumentsOpDispenser.class);
@@ -40,7 +41,13 @@ public class DataApiCollectionCountDocumentsOpDispenser extends DataApiOpDispens
return (l) -> {
Database db = spaceFunction.apply(l).getDatabase();
Filter filter = getFilterFromOp(op, l);
- int upperBound = op.getAsRequiredFunction("upperbound", Integer.class).apply(l);
+ Optional> ubf = op.getAsOptionalFunction("upper_bound", Integer.class);
+ Optional upperBound;
+ if (ubf.isPresent()) {
+ upperBound = Optional.of(ubf.get().apply(l));
+ } else {
+ upperBound = Optional.empty();
+ }
return new DataApiCollectionCountDocumentsOp(
db,
diff --git a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionDeleteOneOpDispenser.java b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionDeleteOneOpDispenser.java
index eba8b453a..98db0b751 100644
--- a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionDeleteOneOpDispenser.java
+++ b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionDeleteOneOpDispenser.java
@@ -55,23 +55,13 @@ public class DataApiCollectionDeleteOneOpDispenser extends DataApiOpDispenser {
private CollectionDeleteOneOptions getCollectionDeleteOneOptions(ParsedOp op, long l) {
CollectionDeleteOneOptions options = new CollectionDeleteOneOptions();
- Sort sort = getSortFromOp(op, l);
- float[] vector = getVectorFromOp(op, l);
- if (sort != null) {
- options = (vector != null) ? options.sort(Sort.vector(vector), sort) : options.sort(sort);
- } else if (vector != null) {
- options = options.sort(Sort.vector(vector));
+ Sort[] sorts = getSortFromOp(op, l);
+ if (sorts != null) {
+ options = options.sort(sorts);
}
return options;
}
- private float[] getVectorFromOp(ParsedOp op, long l) {
- if (op.isDefined("vector")) {
- return getVectorValues(op.get("vector", l));
- }
- return null;
- }
-
@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/DataApiCollectionFindAndRerankOpDispenser.java b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionFindAndRerankOpDispenser.java
new file mode 100644
index 000000000..f4761c7c1
--- /dev/null
+++ b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/opdispensers/DataApiCollectionFindAndRerankOpDispenser.java
@@ -0,0 +1,117 @@
+/*
+ * 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.collections.commands.options.CollectionFindAndRerankOptions;
+import com.datastax.astra.client.core.query.Sort;
+import com.datastax.astra.client.core.query.Filter;
+import com.datastax.astra.client.core.query.Projection;
+import com.datastax.astra.client.core.rerank.RerankServiceOptions;
+import io.nosqlbench.adapter.dataapi.DataApiDriverAdapter;
+import io.nosqlbench.adapter.dataapi.ops.DataApiBaseOp;
+import io.nosqlbench.adapter.dataapi.ops.DataApiCollectionFindAndRerankOp;
+import io.nosqlbench.adapters.api.templating.ParsedOp;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.function.LongFunction;
+import java.util.Map;
+import java.util.Optional;
+
+public class DataApiCollectionFindAndRerankOpDispenser extends DataApiOpDispenser {
+ private static final Logger logger = LogManager.getLogger(DataApiCollectionFindAndRerankOpDispenser.class);
+ private final LongFunction opFunction;
+
+ public DataApiCollectionFindAndRerankOpDispenser(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 = getFilterFromOp(op, l);
+ CollectionFindAndRerankOptions options = getCollectionFindAndRerankOptions(op, l);
+
+ return new DataApiCollectionFindAndRerankOp(
+ db,
+ db.getCollection(targetFunction.apply(l)),
+ filter,
+ options
+ );
+ };
+ }
+
+ private CollectionFindAndRerankOptions getCollectionFindAndRerankOptions(ParsedOp op, long l) {
+ CollectionFindAndRerankOptions options = new CollectionFindAndRerankOptions();
+ Sort sort = getFindAndRerankSortFromOp(op, l);
+ options = options.sort(sort);
+ Projection[] projection = getProjectionFromOp(op, l);
+ if (projection != null) {
+ options = options.projection(projection);
+ }
+ Optional limit = getLimitFromOp(op, l);
+ if (limit.isPresent()) {
+ options = options.limit(limit.get());
+ }
+ Optional includeSortVector = getIncludeSortVectorFromOp(op, l);
+ if (includeSortVector.isPresent()) {
+ options = options.includeSortVector(includeSortVector.get());
+ }
+ Optional includeScores = getIncludeScoresFromOp(op, l);
+ if (includeScores.isPresent()) {
+ options = options.includeScores(includeScores.get());
+ }
+ Optional rerankQuery = getRerankQueryFromOp(op, l);
+ if (rerankQuery.isPresent()) {
+ options = options.rerankQuery(rerankQuery.get());
+ }
+ Optional rerankOn = getRerankOnFromOp(op, l);
+ if (rerankOn.isPresent()) {
+ options = options.rerankOn(rerankOn.get());
+ }
+ Optional