diff --git a/assembly.xml b/assembly.xml index ff2fece2d..abb408308 100644 --- a/assembly.xml +++ b/assembly.xml @@ -1,5 +1,5 @@ - 4.0.0 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - adapter-azure-aisearch - jar + adapter-azure-aisearch + jar - - mvn-defaults - io.nosqlbench - ${revision} - ../../mvn-defaults - + + mvn-defaults + io.nosqlbench + ${revision} + ../../mvn-defaults + - ${project.artifactId} - - An nosqlbench adapter driver module for the Azure AI Search database. - + ${project.artifactId} + + An nosqlbench adapter driver module for the Azure AI Search database. + - - - io.nosqlbench - nb-annotations - ${revision} - compile - - - io.nosqlbench - adapters-api - ${revision} - compile - - - com.azure - azure-search-documents - - - com.azure - azure-identity - - - \ No newline at end of file + + + io.nosqlbench + nb-annotations + ${revision} + compile + + + io.nosqlbench + adapters-api + ${revision} + compile + + + + com.azure + azure-search-documents + 11.7.0 + + + + com.azure + azure-identity + 1.13.2 + + + + diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchDriverAdapter.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchDriverAdapter.java index 0377bde16..93a566537 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchDriverAdapter.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchDriverAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 nosqlbench + * 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. @@ -17,6 +17,7 @@ package io.nosqlbench.adapter.azureaisearch; import java.util.function.Function; +import java.util.function.LongFunction; import io.nosqlbench.adapter.azureaisearch.ops.AzureAISearchBaseOp; import io.nosqlbench.adapters.api.activityimpl.OpMapper; @@ -31,20 +32,20 @@ import io.nosqlbench.nb.api.labels.NBLabels; import static io.nosqlbench.adapter.azureaisearch.AzureAISearchAdapterUtils.AZURE_AI_SEARCH; @Service(value = DriverAdapter.class, selector = AZURE_AI_SEARCH) -public class AzureAISearchDriverAdapter extends BaseDriverAdapter, AzureAISearchSpace> { +public class AzureAISearchDriverAdapter extends BaseDriverAdapter { public AzureAISearchDriverAdapter(NBComponent parentComponent, NBLabels labels) { super(parentComponent, labels); } @Override - public OpMapper> getOpMapper() { + public OpMapper getOpMapper() { return new AzureAISearchOpMapper(this); } @Override - public Function getSpaceInitializer(NBConfiguration cfg) { - return (s) -> new AzureAISearchSpace(s, cfg); + public LongFunction getSpaceInitializer(NBConfiguration cfg) { + return (s) -> new AzureAISearchSpace(this,s, cfg); } @Override @@ -52,4 +53,4 @@ public class AzureAISearchDriverAdapter extends BaseDriverAdapter> { - private static final Logger logger = LogManager.getLogger(AzureAISearchOpMapper.class); - private final AzureAISearchDriverAdapter adapter; +import java.util.function.LongFunction; - /** - * Create a new {@code AzureAISearchOpMapper} implementing the {@link OpMapper}. - * interface. - * - * @param adapter The associated {@link AzureAISearchDriverAdapter} - */ - public AzureAISearchOpMapper(AzureAISearchDriverAdapter adapter) { - this.adapter = adapter; - } +public class AzureAISearchOpMapper implements OpMapper { + private static final Logger logger = LogManager.getLogger(AzureAISearchOpMapper.class); + private final AzureAISearchDriverAdapter adapter; - /** - * Given an instance of a {@link ParsedOp} returns the appropriate - * {@link AzureAISearchBaseOpDispenser} subclass. - * - * @param op The {@link ParsedOp} to be evaluated - * @return The correct {@link AzureAISearchBaseOpDispenser} subclass based on - * the op type - */ - @Override - public OpDispenser> apply(ParsedOp op) { - TypeAndTarget typeAndTarget = op.getTypeAndTarget(AzureAISearchOpType.class, - String.class, "type", "target"); - logger.info(() -> "Using '" + typeAndTarget.enumId + "' op type for op template '" + op.getName() + "'"); + /** + * Create a new {@code AzureAISearchOpMapper} implementing the {@link OpMapper}. + * interface. + * + * @param adapter + * The associated {@link AzureAISearchDriverAdapter} + */ + public AzureAISearchOpMapper(AzureAISearchDriverAdapter adapter) { + this.adapter = adapter; + } - return switch (typeAndTarget.enumId) { - case delete_index -> new AzureAISearchDeleteIndexOpDispenser(adapter, op, typeAndTarget.targetFunction); - case create_or_update_index -> - new AzureAISearchCreateOrUpdateIndexOpDispenser(adapter, op, typeAndTarget.targetFunction); - case list_indexes -> new AzureAISearchListIndexesOpDispenser(adapter, op, typeAndTarget.targetFunction); - case upload_documents -> new AzureAISearchUploadDocumentsOpDispenser(adapter, op, typeAndTarget.targetFunction); - case search_documents -> new AzureAISearchSearchDocumentsOpDispenser(adapter, op, typeAndTarget.targetFunction); + /** + * Given an instance of a {@link ParsedOp} returns the appropriate + * {@link AzureAISearchBaseOpDispenser} subclass. + * + * @param op + * The {@link ParsedOp} to be evaluated + * @param spaceInitF + * @return The correct {@link AzureAISearchBaseOpDispenser} subclass based on + * the op type + */ + @Override + public OpDispenser apply(ParsedOp op, LongFunction spaceInitF) { + + TypeAndTarget typeAndTarget = op.getTypeAndTarget(AzureAISearchOpType.class, + String.class, "type", "target"); + logger.info(() -> "Using '" + typeAndTarget.enumId + "' op type for op template '" + op.getName() + "'"); + + return switch (typeAndTarget.enumId) { + case delete_index -> new AzureAISearchDeleteIndexOpDispenser(adapter, op, typeAndTarget.targetFunction); + case create_or_update_index -> + new AzureAISearchCreateOrUpdateIndexOpDispenser(adapter, op, typeAndTarget.targetFunction); + case list_indexes -> new AzureAISearchListIndexesOpDispenser(adapter, op, typeAndTarget.targetFunction); + case upload_documents -> + new AzureAISearchUploadDocumentsOpDispenser(adapter, op, typeAndTarget.targetFunction); + case search_documents -> + new AzureAISearchSearchDocumentsOpDispenser(adapter, op, typeAndTarget.targetFunction); // default -> throw new RuntimeException( // "Unrecognized op type '" + typeAndTarget.enumId.name() + "' while " + "mapping parsed op " + op); - }; - } + }; + } + } diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchSpace.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchSpace.java index c818d2e0a..512acf578 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchSpace.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchSpace.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; +import io.nosqlbench.adapters.api.activityimpl.uniform.BaseSpace; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -50,9 +51,8 @@ import io.nosqlbench.nb.api.config.standard.Param; * "https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/search/azure-search-documents/">Azure * AI Search Java searchIndexClient */ -public class AzureAISearchSpace implements AutoCloseable { +public class AzureAISearchSpace extends BaseSpace { private final static Logger logger = LogManager.getLogger(AzureAISearchSpace.class); - private final String name; private final NBConfiguration cfg; protected SearchIndexClient searchIndexClient; @@ -62,11 +62,11 @@ public class AzureAISearchSpace implements AutoCloseable { * contextual information needed to interact with the Azure AI Search * database instance. * - * @param name The name of this space + * @param idx The name of this space * @param cfg The configuration ({@link NBConfiguration}) for this nb run */ - public AzureAISearchSpace(String name, NBConfiguration cfg) { - this.name = name; + public AzureAISearchSpace(AzureAISearchDriverAdapter adapter, long idx, NBConfiguration cfg) { + super(adapter,idx); this.cfg = cfg; } diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchBaseOp.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchBaseOp.java index 259501591..011ee2d3f 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchBaseOp.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchBaseOp.java @@ -26,33 +26,32 @@ import com.azure.search.documents.indexes.SearchIndexClient; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -public abstract class AzureAISearchBaseOp implements CycleOp { +public abstract class AzureAISearchBaseOp implements CycleOp { protected final static Logger logger = LogManager.getLogger(AzureAISearchBaseOp.class); protected final SearchIndexClient searchIndexClient; - protected final T request; - protected final LongFunction apiCall; + protected final REQUEST request; + protected final LongFunction apiCall; - public AzureAISearchBaseOp(SearchIndexClient searchIndexClient, T requestParam) { + public AzureAISearchBaseOp(SearchIndexClient searchIndexClient, REQUEST requestParam) { this.searchIndexClient = searchIndexClient; this.request = requestParam; this.apiCall = this::applyOp; } - public AzureAISearchBaseOp(SearchIndexClient searchIndexClient, T requestParam, LongFunction call) { + public AzureAISearchBaseOp(SearchIndexClient searchIndexClient, REQUEST requestParam, LongFunction call) { this.searchIndexClient = searchIndexClient; this.request = requestParam; this.apiCall = call; } @Override - public final Object apply(long value) { + public final RESULT apply(long value) { logger.trace(() -> "applying op: " + this); try { - Object result = applyOp(value); - + RESULT result = applyOp(value); return result; } catch (Exception e) { if (e instanceof RuntimeException rte) { @@ -63,7 +62,7 @@ public abstract class AzureAISearchBaseOp implements CycleOp { } }; - public abstract Object applyOp(long value); + public abstract RESULT applyOp(long value); @Override public String toString() { diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchClientBaseOp.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchClientBaseOp.java index 0f0be2c8d..e8feb1b20 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchClientBaseOp.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchClientBaseOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 nosqlbench + * 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. @@ -17,12 +17,14 @@ package io.nosqlbench.adapter.azureaisearch.ops; import com.azure.search.documents.SearchClient; import com.azure.search.documents.indexes.SearchIndexClient; +import com.azure.search.documents.util.AutocompletePagedIterable; +import com.azure.search.documents.util.SearchPagedIterable; -public abstract class AzureAISearchClientBaseOp extends AzureAISearchBaseOp { +public abstract class AzureAISearchClientBaseOp extends AzureAISearchBaseOp { protected final SearchClient searchClient; - public AzureAISearchClientBaseOp(SearchIndexClient searchIdxClient, SearchClient searchClnt, T requestParam) { + public AzureAISearchClientBaseOp(SearchIndexClient searchIdxClient, SearchClient searchClnt, REQUEST requestParam) { super(searchIdxClient, requestParam); this.searchClient = searchClnt; } -} \ No newline at end of file +} diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchCreateOrUpdateIndexOp.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchCreateOrUpdateIndexOp.java index cc1a2816a..99ece67bb 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchCreateOrUpdateIndexOp.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchCreateOrUpdateIndexOp.java @@ -18,14 +18,14 @@ package io.nosqlbench.adapter.azureaisearch.ops; import com.azure.search.documents.indexes.SearchIndexClient; import com.azure.search.documents.indexes.models.SearchIndex; -public class AzureAISearchCreateOrUpdateIndexOp extends AzureAISearchBaseOp { +public class AzureAISearchCreateOrUpdateIndexOp extends AzureAISearchBaseOp { public AzureAISearchCreateOrUpdateIndexOp(SearchIndexClient client, SearchIndex request) { super(client, request); } @Override - public Object applyOp(long value) { + public SearchIndex applyOp(long value) { SearchIndex createResponse = null; try { createResponse = searchIndexClient.createOrUpdateIndex(request); diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchDeleteIndexOp.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchDeleteIndexOp.java index c504a4014..a973a3949 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchDeleteIndexOp.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchDeleteIndexOp.java @@ -17,14 +17,14 @@ package io.nosqlbench.adapter.azureaisearch.ops; import com.azure.search.documents.indexes.SearchIndexClient; -public class AzureAISearchDeleteIndexOp extends AzureAISearchBaseOp { +public class AzureAISearchDeleteIndexOp extends AzureAISearchBaseOp { public AzureAISearchDeleteIndexOp(SearchIndexClient client, String request) { super(client, request); } @Override - public Object applyOp(long value) { + public String applyOp(long value) { try { searchIndexClient.deleteIndex(request); logger.debug("Successfully deleted the index: {}", request); @@ -34,4 +34,4 @@ public class AzureAISearchDeleteIndexOp extends AzureAISearchBaseOp { return "Deleted"; } -} \ No newline at end of file +} diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchListIndexesOp.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchListIndexesOp.java index 93f1449ed..98b56f363 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchListIndexesOp.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchListIndexesOp.java @@ -19,14 +19,14 @@ import com.azure.core.http.rest.PagedIterable; import com.azure.search.documents.indexes.SearchIndexClient; import com.azure.search.documents.indexes.models.SearchIndex; -public class AzureAISearchListIndexesOp extends AzureAISearchBaseOp { +public class AzureAISearchListIndexesOp extends AzureAISearchBaseOp { public AzureAISearchListIndexesOp(SearchIndexClient client, String request) { super(client, request); } @Override - public Object applyOp(long value) { + public String applyOp(long value) { try { PagedIterable response = searchIndexClient.listIndexes(); response.forEach((index) -> { diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchSearchDocumentsOp.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchSearchDocumentsOp.java index dda8bac62..499f5475f 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchSearchDocumentsOp.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/ops/AzureAISearchSearchDocumentsOp.java @@ -19,9 +19,10 @@ import com.azure.core.util.Context; import com.azure.search.documents.SearchClient; import com.azure.search.documents.indexes.SearchIndexClient; import com.azure.search.documents.models.SearchOptions; +import com.azure.search.documents.util.AutocompletePagedIterable; import com.azure.search.documents.util.SearchPagedIterable; -public class AzureAISearchSearchDocumentsOp extends AzureAISearchClientBaseOp { +public class AzureAISearchSearchDocumentsOp extends AzureAISearchClientBaseOp { public AzureAISearchSearchDocumentsOp(SearchIndexClient searchIndexClient, SearchClient searchClient, SearchOptions request) { @@ -29,7 +30,7 @@ public class AzureAISearchSearchDocumentsOp extends AzureAISearchClientBaseOp { +public class AzureAISearchUploadDocumentsOp extends AzureAISearchClientBaseOp { public AzureAISearchUploadDocumentsOp(SearchIndexClient searchIndexClient, SearchClient searchClient, SearchDocument request) { @@ -30,7 +30,7 @@ public class AzureAISearchUploadDocumentsOp extends AzureAISearchClientBaseOp - extends BaseOpDispenser, AzureAISearchSpace> { +public abstract class AzureAISearchBaseOpDispenser + extends BaseOpDispenser { protected final LongFunction azureAISearchSpaceFunction; protected final LongFunction clientFunction; - private final LongFunction> opF; - private final LongFunction paramF; + private final LongFunction> opF; + private final LongFunction paramF; @SuppressWarnings("rawtypes") protected AzureAISearchBaseOpDispenser(AzureAISearchDriverAdapter adapter, ParsedOp op, @@ -57,14 +57,14 @@ public abstract class AzureAISearchBaseOpDispenser return (AzureAISearchDriverAdapter) adapter; } - public abstract LongFunction getParamFunc(LongFunction clientF, ParsedOp op, + public abstract LongFunction getParamFunc(LongFunction clientF, ParsedOp op, LongFunction targetF); - public abstract LongFunction> createOpFunc(LongFunction paramF, + public abstract LongFunction> createOpFunc(LongFunction paramF, LongFunction clientF, ParsedOp op, LongFunction targetF); @Override - public AzureAISearchBaseOp getOp(long value) { + public AzureAISearchBaseOp getOp(long value) { return opF.apply(value); } diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchCreateOrUpdateIndexOpDispenser.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchCreateOrUpdateIndexOpDispenser.java index 54b88a8e2..3e567c44b 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchCreateOrUpdateIndexOpDispenser.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchCreateOrUpdateIndexOpDispenser.java @@ -53,7 +53,7 @@ import io.nosqlbench.nb.api.errors.OpConfigError; * "https://learn.microsoft.com/en-us/java/api/com.azure.search.documents?view=azure-java-stable">Index * docs */ -public class AzureAISearchCreateOrUpdateIndexOpDispenser extends AzureAISearchBaseOpDispenser { +public class AzureAISearchCreateOrUpdateIndexOpDispenser extends AzureAISearchBaseOpDispenser { private SearchField searchField; private VectorSearchProfile vsProfile; @@ -290,7 +290,7 @@ public class AzureAISearchCreateOrUpdateIndexOpDispenser extends AzureAISearchBa } @Override - public LongFunction> createOpFunc(LongFunction paramF, + public LongFunction> createOpFunc(LongFunction paramF, LongFunction clientF, ParsedOp op, LongFunction targetF) { return l -> new AzureAISearchCreateOrUpdateIndexOp(clientF.apply(l), paramF.apply(l)); } diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchDeleteIndexOpDispenser.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchDeleteIndexOpDispenser.java index d1bfda555..e656d2ce7 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchDeleteIndexOpDispenser.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchDeleteIndexOpDispenser.java @@ -26,7 +26,7 @@ import io.nosqlbench.adapters.api.templating.ParsedOp; /** * Delete an Azure AI Search index. - * + * * @see Delete * Index docs. @@ -34,7 +34,7 @@ import io.nosqlbench.adapters.api.templating.ParsedOp; * "https://learn.microsoft.com/en-us/rest/api/searchservice/">REST * API. */ -public class AzureAISearchDeleteIndexOpDispenser extends AzureAISearchBaseOpDispenser { +public class AzureAISearchDeleteIndexOpDispenser extends AzureAISearchBaseOpDispenser { public AzureAISearchDeleteIndexOpDispenser(AzureAISearchDriverAdapter adapter, ParsedOp op, LongFunction targetF) { @@ -48,7 +48,7 @@ public class AzureAISearchDeleteIndexOpDispenser extends AzureAISearchBaseOpDisp } @Override - public LongFunction> createOpFunc(LongFunction paramF, + public LongFunction> createOpFunc(LongFunction paramF, LongFunction clientF, ParsedOp op, LongFunction targetF) { return l -> new AzureAISearchDeleteIndexOp(clientF.apply(l), paramF.apply(l)); } diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchListIndexesOpDispenser.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchListIndexesOpDispenser.java index ced6d0a1c..849ea854e 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchListIndexesOpDispenser.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchListIndexesOpDispenser.java @@ -27,7 +27,7 @@ import io.nosqlbench.adapters.api.templating.ParsedOp; /** * Lists the indexes available. */ -public class AzureAISearchListIndexesOpDispenser extends AzureAISearchBaseOpDispenser { +public class AzureAISearchListIndexesOpDispenser extends AzureAISearchBaseOpDispenser { public AzureAISearchListIndexesOpDispenser(AzureAISearchDriverAdapter adapter, ParsedOp op, LongFunction targetF) { super(adapter, op, targetF); @@ -40,8 +40,8 @@ public class AzureAISearchListIndexesOpDispenser extends AzureAISearchBaseOpDisp } @Override - public LongFunction> createOpFunc(LongFunction paramF, + public LongFunction> createOpFunc(LongFunction paramF, LongFunction clientF, ParsedOp op, LongFunction targetF) { return l -> new AzureAISearchListIndexesOp(clientF.apply(l), paramF.apply(l)); } -} \ No newline at end of file +} diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchSearchDocumentsOpDispenser.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchSearchDocumentsOpDispenser.java index 8b9506230..437dd5a65 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchSearchDocumentsOpDispenser.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchSearchDocumentsOpDispenser.java @@ -26,6 +26,7 @@ import com.azure.search.documents.models.VectorQuery; import com.azure.search.documents.models.VectorSearchOptions; import com.azure.search.documents.models.VectorizedQuery; +import com.azure.search.documents.util.SearchPagedIterable; import io.nosqlbench.adapter.azureaisearch.AzureAISearchDriverAdapter; import io.nosqlbench.adapter.azureaisearch.ops.AzureAISearchBaseOp; import io.nosqlbench.adapter.azureaisearch.ops.AzureAISearchSearchDocumentsOp; @@ -40,7 +41,7 @@ import io.nosqlbench.nb.api.errors.OpConfigError; * "https://learn.microsoft.com/en-us/azure/search/vector-search-how-to-query?tabs=query-2024-07-01%2Cfilter-2024-07-01%2Cbuiltin-portal#vector-query-request">How * to query/vector search */ -public class AzureAISearchSearchDocumentsOpDispenser extends AzureAISearchBaseOpDispenser { +public class AzureAISearchSearchDocumentsOpDispenser extends AzureAISearchBaseOpDispenser { public AzureAISearchSearchDocumentsOpDispenser(AzureAISearchDriverAdapter adapter, ParsedOp op, LongFunction targetF) { super(adapter, op, targetF); @@ -70,7 +71,7 @@ public class AzureAISearchSearchDocumentsOpDispenser extends AzureAISearchBaseOp } @Override - public LongFunction> createOpFunc(LongFunction paramF, + public LongFunction> createOpFunc(LongFunction paramF, LongFunction clientF, ParsedOp op, LongFunction targetF) { return l -> new AzureAISearchSearchDocumentsOp(clientF.apply(l), clientF.apply(l).getSearchClient(targetF.apply(l)), paramF.apply(l)); diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchUploadDocumentsOpDispenser.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchUploadDocumentsOpDispenser.java index fa11d5fc8..60e5f0f36 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchUploadDocumentsOpDispenser.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchUploadDocumentsOpDispenser.java @@ -21,6 +21,7 @@ import java.util.function.LongFunction; import com.azure.search.documents.SearchDocument; import com.azure.search.documents.indexes.SearchIndexClient; +import com.azure.search.documents.models.IndexDocumentsResult; import io.nosqlbench.adapter.azureaisearch.AzureAISearchDriverAdapter; import io.nosqlbench.adapter.azureaisearch.ops.AzureAISearchBaseOp; import io.nosqlbench.adapter.azureaisearch.ops.AzureAISearchUploadDocumentsOp; @@ -34,7 +35,7 @@ import io.nosqlbench.adapters.api.templating.ParsedOp; * "https://learn.microsoft.com/en-us/java/api/com.azure.search.documents?view=azure-java-stable">Index * docs */ -public class AzureAISearchUploadDocumentsOpDispenser extends AzureAISearchBaseOpDispenser { +public class AzureAISearchUploadDocumentsOpDispenser extends AzureAISearchBaseOpDispenser { public AzureAISearchUploadDocumentsOpDispenser(AzureAISearchDriverAdapter adapter, ParsedOp op, LongFunction targetF) { super(adapter, op, targetF); @@ -55,7 +56,7 @@ public class AzureAISearchUploadDocumentsOpDispenser extends AzureAISearchBaseOp } @Override - public LongFunction> createOpFunc(LongFunction paramF, + public LongFunction> createOpFunc(LongFunction paramF, LongFunction clientF, ParsedOp op, LongFunction targetF) { return l -> new AzureAISearchUploadDocumentsOp(clientF.apply(l), clientF.apply(l).getSearchClient(targetF.apply(l)), paramF.apply(l)); diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/CqlDriverAdapterLoader.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/CqlDriverAdapterLoader.java index 92a760345..ea2366edd 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/CqlDriverAdapterLoader.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/CqlDriverAdapterLoader.java @@ -1,7 +1,7 @@ package io.nosqlbench.adapter.cqld4; /* - * Copyright (c) 2022 nosqlbench + * 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. diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4DriverAdapter.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4DriverAdapter.java index 736e40ef5..63796f0d8 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4DriverAdapter.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4DriverAdapter.java @@ -17,12 +17,13 @@ package io.nosqlbench.adapter.cqld4; import io.nosqlbench.adapter.cqld4.opmappers.Cqld4CoreOpMapper; +import io.nosqlbench.adapter.cqld4.optypes.Cqld4BaseOp; +import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlOp; import io.nosqlbench.nb.api.config.standard.NBConfigModel; import io.nosqlbench.nb.api.config.standard.NBConfiguration; import io.nosqlbench.adapters.api.activityimpl.OpMapper; import io.nosqlbench.adapters.api.activityimpl.uniform.BaseDriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; -import io.nosqlbench.adapters.api.activityimpl.uniform.DriverSpaceCache; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import io.nosqlbench.nb.api.labels.NBLabels; import io.nosqlbench.nb.api.components.core.NBComponent; @@ -35,9 +36,10 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.Function; +import java.util.function.LongFunction; @Service(value = DriverAdapter.class, selector = "cqld4") -public class Cqld4DriverAdapter extends BaseDriverAdapter { +public class Cqld4DriverAdapter extends BaseDriverAdapter { private final static Logger logger = LogManager.getLogger(Cqld4DriverAdapter.class); public Cqld4DriverAdapter(NBComponent parentComponent, NBLabels labels) { @@ -45,15 +47,14 @@ public class Cqld4DriverAdapter extends BaseDriverAdapter { } @Override - public OpMapper getOpMapper() { - DriverSpaceCache spaceCache = getSpaceCache(); + public OpMapper getOpMapper() { NBConfiguration config = getConfiguration(); - return new Cqld4CoreOpMapper(this, config, spaceCache); + return new Cqld4CoreOpMapper(this, config); } @Override - public Function getSpaceInitializer(NBConfiguration cfg) { - return s -> new Cqld4Space(s,cfg); + public LongFunction getSpaceInitializer(NBConfiguration cfg) { + return s -> new Cqld4Space(this,s,cfg); } @Override diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4DriverAdapterLoader.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4DriverAdapterLoader.java index 96b93e291..c561bd707 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4DriverAdapterLoader.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4DriverAdapterLoader.java @@ -1,7 +1,7 @@ package io.nosqlbench.adapter.cqld4; /* - * Copyright (c) 2022 nosqlbench + * 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. diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4Processors.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4Processors.java index 8d4108e84..112beeda9 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4Processors.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4Processors.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 nosqlbench + * 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. diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4Space.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4Space.java index f6bf017c9..dc0343437 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4Space.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/Cqld4Space.java @@ -19,6 +19,7 @@ package io.nosqlbench.adapter.cqld4; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.CqlSessionBuilder; import com.datastax.oss.driver.api.core.config.*; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; import com.datastax.oss.driver.api.core.session.SessionBuilder; import com.datastax.oss.driver.internal.core.config.composite.CompositeDriverConfigLoader; import com.datastax.oss.driver.internal.core.loadbalancing.helper.NodeFilterToDistanceEvaluatorAdapter; @@ -28,6 +29,8 @@ import io.nosqlbench.adapter.cqld4.optionhelpers.OptionHelpers; import io.nosqlbench.adapter.cqld4.wrapper.Cqld4LoadBalancerObserver; import io.nosqlbench.adapter.cqld4.wrapper.Cqld4SessionBuilder; import io.nosqlbench.adapter.cqld4.wrapper.NodeSummary; +import io.nosqlbench.adapters.api.activityimpl.uniform.BaseSpace; +import io.nosqlbench.adapters.api.activityimpl.uniform.ConcurrentIndexCache; import io.nosqlbench.nb.api.config.standard.*; import io.nosqlbench.nb.api.errors.OpConfigError; import io.nosqlbench.nb.api.nbio.Content; @@ -45,16 +48,17 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.function.LongFunction; import java.util.stream.Collectors; -public class Cqld4Space implements AutoCloseable { +public class Cqld4Space extends BaseSpace { private final static Logger logger = LogManager.getLogger(Cqld4Space.class); - private final String space; - CqlSession session; + private CqlSession session; + private ConcurrentIndexCache preparedStmtCache = new ConcurrentIndexCache<>("pstmts"); - public Cqld4Space(String space, NBConfiguration cfg) { - this.space = space; + public Cqld4Space(Cqld4DriverAdapter adapter, long spaceidx, NBConfiguration cfg) { + super(adapter,spaceidx); session = createSession(cfg); } @@ -301,7 +305,6 @@ public class Cqld4Space implements AutoCloseable { } return Optional.of(mainloader); } - } public CqlSession getSession() { @@ -338,10 +341,19 @@ public class Cqld4Space implements AutoCloseable { @Override public void close() { try { + this.preparedStmtCache.clear(); this.getSession().close(); } catch (Exception e) { - logger.warn("auto-closeable cql session threw exception in cql space(" + this.space + "): " + e); + logger.warn("auto-closeable cql session threw exception in cql space(" + getName() + "): " + e); throw e; } } + + public PreparedStatement getOrCreatePreparedStatement( + int refkey, + LongFunction psF + ) { + PreparedStatement ps = preparedStmtCache.get(refkey, psF); + return ps; + } } diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/LWTRebinder.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/LWTRebinder.java index 20d0186f4..e40bbcf4c 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/LWTRebinder.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/LWTRebinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 nosqlbench + * 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. diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/diagnostics/CQLD4PreparedStmtDiagnostics.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/diagnostics/CQLD4PreparedStmtDiagnostics.java index 3aa504981..42f8ce0a8 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/diagnostics/CQLD4PreparedStmtDiagnostics.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/diagnostics/CQLD4PreparedStmtDiagnostics.java @@ -30,6 +30,7 @@ import com.datastax.oss.driver.api.core.type.VectorType; import com.datastax.oss.driver.api.core.type.codec.ExtraTypeCodecs; import com.datastax.oss.driver.api.core.type.codec.TypeCodec; import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlOp; +import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlPreparedStatement; import io.nosqlbench.nb.api.errors.OpConfigError; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -130,7 +131,7 @@ public class CQLD4PreparedStmtDiagnostics { }; } - public static Cqld4CqlOp rebindWithDiagnostics( + public static Cqld4CqlPreparedStatement rebindWithDiagnostics( PreparedStatement preparedStmt, LongFunction fieldsF, long cycle, diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/exceptions/CqlGenericCycleException.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/exceptions/CqlGenericCycleException.java index 0ffd4e311..ab4c79ac1 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/exceptions/CqlGenericCycleException.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/exceptions/CqlGenericCycleException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 nosqlbench + * 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. diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/exceptions/UndefinedResultSetException.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/exceptions/UndefinedResultSetException.java index 4dc2bb093..9e347a5ed 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/exceptions/UndefinedResultSetException.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/exceptions/UndefinedResultSetException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 nosqlbench + * 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. diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/instruments/CqlOpMetrics.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/instruments/CqlOpMetrics.java index c2d034f9d..d6751d56c 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/instruments/CqlOpMetrics.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/instruments/CqlOpMetrics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 nosqlbench + * 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. diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/CqlD4BatchStmtDispenser.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/CqlD4BatchStmtDispenser.java index 74501e223..d33a2fb38 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/CqlD4BatchStmtDispenser.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/CqlD4BatchStmtDispenser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 nosqlbench + * 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. @@ -18,41 +18,43 @@ package io.nosqlbench.adapter.cqld4.opdispensers; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.*; +import io.nosqlbench.adapter.cqld4.Cqld4DriverAdapter; +import io.nosqlbench.adapter.cqld4.Cqld4Space; import io.nosqlbench.adapter.cqld4.optionhelpers.BatchTypeEnum; import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlBatchStatement; import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlOp; import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.activityimpl.OpMapper; +import io.nosqlbench.adapters.api.activityimpl.uniform.BaseSpace; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.templating.ParsedOp; import org.jetbrains.annotations.NotNull; import java.util.function.LongFunction; -public class CqlD4BatchStmtDispenser extends Cqld4BaseOpDispenser { +public class CqlD4BatchStmtDispenser extends Cqld4CqlBaseOpDispenser { private final int repeat; private final ParsedOp subop; private final OpMapper submapper; - private LongFunction opfunc; + private LongFunction opfunc; public CqlD4BatchStmtDispenser( - DriverAdapter adapter, - LongFunction sessionFunc, + Cqld4DriverAdapter adapter, ParsedOp op, int repeat, ParsedOp subop, - OpDispenser subopDispenser + OpDispenser subopDispenser ) { - super(adapter, sessionFunc, op); + super(adapter, op); this.repeat = repeat; this.subop = subop; this.opfunc = createStmtFunc(op, subopDispenser); this.submapper = adapter.getOpMapper(); - subopDispenser = submapper.apply(subop); + subopDispenser = submapper.apply(subop, adapter.getSpaceFunc(op)); } - private LongFunction createStmtFunc(ParsedOp topOp, OpDispenser subopDispenser) { + private LongFunction createStmtFunc(ParsedOp topOp, OpDispenser subopDispenser) { Cqld4CqlOp exampleOp = subopDispenser.apply(0L); Statement example = exampleOp.getStmt(); if (!(example instanceof BatchableStatement b)) { @@ -61,33 +63,34 @@ public class CqlD4BatchStmtDispenser extends Cqld4BaseOpDispenser { } BatchTypeEnum bte = topOp.getEnumFromFieldOr(BatchTypeEnum.class, BatchTypeEnum.unlogged, "batchtype"); LongFunction bsbf = l -> new BatchStatementBuilder(bte.batchtype); - LongFunction bsf = getBatchAccumulator(bsbf, subopDispenser); - bsf = getEnhancedStmtFunc(bsf,topOp); + LongFunction bsf = getBatchAccumulator(bsbf, subopDispenser); + bsf = getEnhancedStmtFunc(bsf, topOp); return bsf; } @NotNull - private LongFunction getBatchAccumulator(LongFunction bsb, OpDispenser subopDispenser) { + private LongFunction getBatchAccumulator(LongFunction bsb, OpDispenser subopDispenser) { LongFunction f = l -> { - long base=l*repeat; + long base = l * repeat; BatchStatementBuilder bsa = bsb.apply(l); for (int i = 0; i < repeat; i++) { - Cqld4CqlOp op = subopDispenser.apply(base+i); + Cqld4CqlOp op = subopDispenser.apply(base + i); BatchableStatement stmt = (BatchableStatement) op.getStmt(); - bsa= bsa.addStatement(stmt); + bsa = bsa.addStatement(stmt); } return bsa; }; - LongFunction bsf = (long l) -> f.apply(l).build(); + LongFunction bsf = (long l) -> f.apply(l).build(); return bsf; } @Override - public Cqld4CqlOp getOp(long value) { + public Cqld4CqlBatchStatement getOp(long value) { Statement bstmt = opfunc.apply(value); return new Cqld4CqlBatchStatement( - getSessionFunc().apply(value), + sessionF.apply(value), (BatchStatement) bstmt, getMaxPages(), getMaxLwtRetries(), diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/CqlD4RainbowTableDispenser.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/CqlD4RainbowTableDispenser.java index 41e05e134..55dea084b 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/CqlD4RainbowTableDispenser.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/CqlD4RainbowTableDispenser.java @@ -17,25 +17,28 @@ package io.nosqlbench.adapter.cqld4.opdispensers; import com.datastax.oss.driver.api.core.CqlSession; +import io.nosqlbench.adapter.cqld4.Cqld4DriverAdapter; +import io.nosqlbench.adapter.cqld4.Cqld4Space; import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlOp; +import io.nosqlbench.adapter.cqld4.optypes.Cqld4RainbowTableOp; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.templating.ParsedOp; import java.util.function.LongFunction; -public class CqlD4RainbowTableDispenser extends Cqld4BaseOpDispenser { +public class CqlD4RainbowTableDispenser extends Cqld4BaseOpDispenser { // private final LongFunction stmtFunc; private final LongFunction targetFunction; - public CqlD4RainbowTableDispenser(DriverAdapter adapter, LongFunction sessionFunc, LongFunction targetFunction, ParsedOp cmd) { - super(adapter, sessionFunc,cmd); + public CqlD4RainbowTableDispenser(Cqld4DriverAdapter adapter, LongFunction targetFunction, ParsedOp cmd) { + super(adapter, cmd); this.targetFunction=targetFunction; // this.tableFunc =createTableFunc(cmd); } @Override - public Cqld4CqlOp getOp(long cycle) { + public Cqld4RainbowTableOp getOp(long cycle) { throw new RuntimeException("implement me"); // return new Cqld4RainbowTableOp( // getSessionFunc().apply(value), diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4BaseOpDispenser.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4BaseOpDispenser.java index 1b9e17551..7fdcf2706 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4BaseOpDispenser.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4BaseOpDispenser.java @@ -24,8 +24,10 @@ import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; import com.datastax.oss.driver.api.core.cql.*; import com.datastax.oss.driver.api.core.metadata.Node; import com.datastax.oss.driver.api.core.metadata.token.Token; +import io.nosqlbench.adapter.cqld4.Cqld4DriverAdapter; import io.nosqlbench.adapter.cqld4.Cqld4Space; import io.nosqlbench.adapter.cqld4.instruments.CqlOpMetrics; +import io.nosqlbench.adapter.cqld4.optypes.Cqld4BaseOp; import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlOp; import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; @@ -38,23 +40,25 @@ import org.apache.logging.log4j.Logger; import java.nio.ByteBuffer; import java.time.Duration; import java.util.Map; +import java.util.function.IntFunction; import java.util.function.LongFunction; -public abstract class Cqld4BaseOpDispenser extends BaseOpDispenser implements CqlOpMetrics { +public abstract class Cqld4BaseOpDispenser extends BaseOpDispenser implements CqlOpMetrics { private final static Logger logger = LogManager.getLogger("CQLD4"); private final int maxpages; - private final LongFunction sessionFunc; private final boolean isRetryReplace; private final int maxLwtRetries; private final Histogram rowsHistogram; private final Histogram pagesHistogram; private final Histogram payloadBytesHistogram; + protected final LongFunction sessionF; - public Cqld4BaseOpDispenser(DriverAdapter adapter, LongFunction sessionFunc, ParsedOp op) { - super(adapter, op); - this.sessionFunc = sessionFunc; + public Cqld4BaseOpDispenser(Cqld4DriverAdapter adapter, + ParsedOp op) { + super((DriverAdapter) adapter, op); + this.sessionF = l -> adapter.getSpaceCache().get(l).getSession(); this.maxpages = op.getStaticConfigOr("maxpages", 1); this.isRetryReplace = op.getStaticConfigOr("retryreplace", false); this.maxLwtRetries = op.getStaticConfigOr("maxlwtretries", 1); @@ -90,11 +94,6 @@ public abstract class Cqld4BaseOpDispenser extends BaseOpDispenser getSessionFunc() { - return sessionFunc; - } - /** * All implementations of a CQL Statement Dispenser should be using the method * provided by this function. This ensures that {@link Statement}-level attributes @@ -106,27 +105,50 @@ public abstract class Cqld4BaseOpDispenser extends BaseOpDispenser getEnhancedStmtFunc(LongFunction basefunc, ParsedOp op) { + protected LongFunction getEnhancedStmtFunc( + LongFunction basefunc, + ParsedOp op + ) { + LongFunction partial = basefunc; - LongFunction partial = basefunc; - partial = op.enhanceEnumOptionally(partial, "cl", DefaultConsistencyLevel.class, Statement::setConsistencyLevel); - partial = op.enhanceEnumOptionally(partial, "consistency_level", DefaultConsistencyLevel.class, Statement::setConsistencyLevel); - partial = op.enhanceEnumOptionally(partial, "scl", DefaultConsistencyLevel.class, Statement::setSerialConsistencyLevel); - partial = op.enhanceEnumOptionally(partial, "serial_consistency_level", DefaultConsistencyLevel.class, Statement::setSerialConsistencyLevel); - partial = op.enhanceFuncOptionally(partial, "idempotent", Boolean.class, Statement::setIdempotent); - partial = op.enhanceFuncOptionally(partial, "timeout", double.class, (statement, l) -> statement.setTimeout(Duration.ofMillis((long) (l * 1000L)))); - partial = op.enhanceFuncOptionally(partial, "custom_payload", Map.class, Statement::setCustomPayload); - partial = op.enhanceFuncOptionally(partial, "execution_profile", DriverExecutionProfile.class, Statement::setExecutionProfile); - partial = op.enhanceFuncOptionally(partial, "execution_profile_name", String.class, Statement::setExecutionProfileName); - partial = op.enhanceFuncOptionally(partial, "node", Node.class, Statement::setNode); - partial = op.enhanceFuncOptionally(partial, "now_in_seconds", int.class, Statement::setNowInSeconds); - partial = op.enhanceFuncOptionally(partial, "page_size", int.class, Statement::setPageSize); - partial = op.enhanceFuncOptionally(partial, "query_timestamp", long.class, Statement::setQueryTimestamp); - partial = op.enhanceFuncOptionally(partial, "routing_key", ByteBuffer.class, Statement::setRoutingKey); - partial = op.enhanceFuncOptionally(partial, "routing_keys", ByteBuffer[].class, Statement::setRoutingKey); - partial = op.enhanceFuncOptionally(partial, "routing_token", Token.class, Statement::setRoutingToken); - partial = op.enhanceFuncOptionally(partial, "tracing", boolean.class, Statement::setTracing); - partial = op.enhanceFuncOptionally(partial, "showstmt", boolean.class, this::showstmt); + // This form is need to overcome limitations in covariant type-checking with method references + + partial = op.enhanceEnumOptionally(partial, "cl", DefaultConsistencyLevel.class, + (s, cl) -> (S) s.setConsistencyLevel(cl)); + partial = op.enhanceEnumOptionally(partial, "consistency_level", DefaultConsistencyLevel.class, + (s,v) -> (S) s.setConsistencyLevel(v)); + partial = op.enhanceEnumOptionally(partial, "scl", DefaultConsistencyLevel.class, + (s,v) -> (S) s.setSerialConsistencyLevel(v)); + partial = op.enhanceEnumOptionally(partial, "serial_consistency_level", DefaultConsistencyLevel.class, + (s,v) -> (S) s.setSerialConsistencyLevel(v)); + + partial = op.enhanceFuncOptionally(partial, "idempotent", Boolean.class, + (s,v) -> (S) s.setIdempotent(v)); + partial = op.enhanceFuncOptionally(partial, "custom_payload", Map.class, + (s,v) -> (S) s.setCustomPayload(v)); + partial = op.enhanceFuncOptionally(partial, "execution_profile", DriverExecutionProfile.class, + (s,v) -> (S) s.setExecutionProfile(v)); + partial = op.enhanceFuncOptionally(partial, "execution_profile_name", String.class, + (s,v) -> (S) s.setExecutionProfileName(v)); + partial = op.enhanceFuncOptionally(partial, "node", Node.class, + (s,v) -> (S) s.setNode(v)); + partial = op.enhanceFuncOptionally(partial, "now_in_seconds", int.class, + (s,v) -> (S) s.setNowInSeconds(v)); + partial = op.enhanceFuncOptionally(partial, "page_size", int.class, + (s,v) -> (S) s.setPageSize(v)); + partial = op.enhanceFuncOptionally(partial, "query_timestamp", long.class, + (s,v) -> (S) s.setQueryTimestamp(v)); + partial = op.enhanceFuncOptionally(partial, "routing_key", ByteBuffer.class, + (s,v) -> (S) s.setRoutingKey(v)); + partial = op.enhanceFuncOptionally(partial, "routing_keys", ByteBuffer[].class, + (s,v) -> (S) s.setRoutingKey(v)); + partial = op.enhanceFuncOptionally(partial, "routing_token", Token.class, + (s,v) -> (S) s.setRoutingToken(v)); + partial = op.enhanceFuncOptionally(partial, "tracing", boolean.class, + (s,v) -> (S) s.setTracing(v)); + partial = op.enhanceFuncOptionally(partial, "timeout", double.class, + (statement, l) -> (S) statement.setTimeout(Duration.ofMillis((long) ((l * 1000L))))); + partial = op.enhanceFuncOptionally(partial, "showstmt", boolean.class, (s,v) -> (S) this.showstmt(s,v)); return partial; } diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4CqlBaseOpDispenser.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4CqlBaseOpDispenser.java new file mode 100644 index 000000000..8921cb38e --- /dev/null +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4CqlBaseOpDispenser.java @@ -0,0 +1,34 @@ +package io.nosqlbench.adapter.cqld4.opdispensers; + +/* + * 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. + */ + + +import io.nosqlbench.adapter.cqld4.Cqld4DriverAdapter; +import io.nosqlbench.adapter.cqld4.optypes.Cqld4BaseOp; +import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlOp; +import io.nosqlbench.adapters.api.templating.ParsedOp; + +public abstract class Cqld4CqlBaseOpDispenser extends Cqld4BaseOpDispenser { + + public Cqld4CqlBaseOpDispenser(Cqld4DriverAdapter adapter, ParsedOp op) { + super(adapter, op); + } + + @Override + public abstract T getOp(long value); +} diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4FluentGraphOpDispenser.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4FluentGraphOpDispenser.java index 145cd07cb..c42e3124f 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4FluentGraphOpDispenser.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4FluentGraphOpDispenser.java @@ -20,11 +20,12 @@ import com.datastax.dse.driver.api.core.graph.FluentGraphStatement; import com.datastax.dse.driver.api.core.graph.FluentGraphStatementBuilder; import com.datastax.oss.driver.api.core.CqlSession; import groovy.lang.Script; +import io.nosqlbench.adapter.cqld4.Cqld4DriverAdapter; import io.nosqlbench.adapter.cqld4.Cqld4Space; +import io.nosqlbench.adapter.cqld4.optypes.Cqld4BaseOp; +import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlOp; import io.nosqlbench.adapter.cqld4.optypes.Cqld4FluentGraphOp; -import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.virtdata.core.bindings.Bindings; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; @@ -34,37 +35,34 @@ import java.util.Map; import java.util.function.LongFunction; import java.util.function.Supplier; -public class Cqld4FluentGraphOpDispenser extends BaseOpDispenser { +public class Cqld4FluentGraphOpDispenser extends Cqld4BaseOpDispenser { private final LongFunction graphnameFunc; - private final LongFunction sessionFunc; private final Bindings virtdataBindings; private final ThreadLocal