From ea7fceae49aa441786c6d7aff0c9547dcf6d2477 Mon Sep 17 00:00:00 2001 From: Jonathan Shook Date: Mon, 4 Nov 2024 16:42:05 -0600 Subject: [PATCH] jshook/nosqlbench-2057-flattenop (#2067) * remove ChainingOp * typos and other minor fixes * remove Op, ChainingOp, flatten to CycleOp, derive RunnableOp * refactor qdrant for aligned op types * refactor mongodb for aligned op types * refactor cqld4 for aligned op types * minor API alignment refactor gcpspanner for aligned op types * minor API alignment refactor gcpspanner for aligned op types add license * fix cqld4 batch statement mapper * fix cql base op mapper * remove var inference * remove emitter for runnable op --- .../AzureAISearchDriverAdapter.java | 4 +- .../azureaisearch/AzureAISearchOpMapper.java | 5 +- .../AzureAISearchBaseOpDispenser.java | 2 +- .../adapter/cqld4/Cqld4DriverAdapter.java | 6 +-- .../opdispensers/Cqld4BaseOpDispenser.java | 2 +- .../opdispensers/Cqld4GremlinOpDispenser.java | 2 +- .../cqld4/opmappers/CqlD4BatchStmtMapper.java | 4 +- .../cqld4/opmappers/Cqld4BaseOpMapper.java | 9 +--- .../cqld4/opmappers/Cqld4CoreOpMapper.java | 17 +++--- .../cqld4/opmappers/Cqld4CqlBaseOpMapper.java | 2 + .../opmappers/Cqld4FluentGraphOpMapper.java | 7 --- .../adapter/cqld4/optypes/Cqld4BaseOp.java | 5 +- .../cqld4/optypes/Cqld4CqlBatchStatement.java | 4 ++ .../adapter/cqld4/optypes/Cqld4CqlOp.java | 22 ++++---- .../adapter/cqld4/optypes/Cqld4CqlOpImpl.java | 40 ++++++++++++++ .../cqld4/optypes/Cqld4FluentGraphOp.java | 2 +- .../cqld4/optypes/Cqld4RainbowTableOp.java | 4 +- .../cqld4/optypes/Cqld4ScriptGraphOp.java | 2 +- .../adapter/dataapi/ops/DataApiBaseOp.java | 2 +- .../gcpspanner/GCPSpannerDriverAdapter.java | 4 +- .../gcpspanner/GCPSpannerOpMapper.java | 7 +-- .../GCPSpannerBaseOpDispenser.java | 2 +- .../gcpspanner/ops/GCPSpannerBaseOp.java | 1 - .../nosqlbench/adapter/http/core/HttpOp.java | 2 +- .../adapter/mongodb/core/MongoOpMapper.java | 3 -- .../mongodb/core/MongodbDriverAdapter.java | 7 ++- .../dispensers/MongoCommandOpDispenser.java | 3 -- .../dispensers/MongoDbUpdateOpDispenser.java | 20 ++++--- .../adapter/mongodb/ops/MongoDbUpdateOp.java | 30 +++++++++++ .../mongodb/ops/MongoDirectCommandOp.java | 2 +- .../adapter/mongodb/ops/MongoOp.java | 24 +++++++++ .../adapter/qdrant/QdrantDriverAdapter.java | 4 +- .../adapter/qdrant/QdrantOpMapper.java | 7 +-- .../opdispensers/QdrantBaseOpDispenser.java | 17 +++--- .../QdrantCollectionExistsOpDispenser.java | 4 +- .../QdrantCollectionInfoOpDispenser.java | 5 +- .../QdrantCountPointsOpDispenser.java | 4 +- .../QdrantCreateCollectionOpDispenser.java | 5 +- .../QdrantCreatePayloadIndexOpDispenser.java | 5 +- .../QdrantDeleteCollectionOpDispenser.java | 17 +++--- ...drantListCollectionAliasesOpDispenser.java | 5 +- .../QdrantListCollectionsOpDispenser.java | 19 ++++--- .../QdrantListSnapshotsOpDispenser.java | 12 +++-- .../QdrantSearchPointsOpDispenser.java | 4 +- .../QdrantUpsertPointsOpDispenser.java | 4 +- .../adapter/qdrant/ops/QdrantBaseOp.java | 14 ++--- .../qdrant/ops/QdrantCollectionExistsOp.java | 4 +- .../qdrant/ops/QdrantCollectionInfoOp.java | 4 +- .../qdrant/ops/QdrantCountPointsOp.java | 4 +- .../qdrant/ops/QdrantCreateCollectionOp.java | 4 +- .../ops/QdrantCreatePayloadIndexOp.java | 4 +- .../qdrant/ops/QdrantDeleteCollectionOp.java | 4 +- .../ops/QdrantListCollectionAliasesOp.java | 4 +- .../qdrant/ops/QdrantListCollectionsOp.java | 6 +-- .../qdrant/ops/QdrantListSnapshotsOp.java | 4 +- .../qdrant/ops/QdrantSearchPointsOp.java | 4 +- .../qdrant/ops/QdrantUpsertPointsOp.java | 4 +- .../adapter/tcpclient/TcpClientOp.java | 2 + .../adapter/diag/DriverAdapterLoader.java | 4 +- .../api/activityimpl/BaseOpDispenser.java | 5 +- .../api/activityimpl/OpDispenser.java | 6 +-- .../adapters/api/activityimpl/OpMapper.java | 9 ++-- .../docs/BundledDriverAdapterDocs.java | 4 +- .../uniform/BaseDriverAdapter.java | 5 +- .../api/activityimpl/uniform/BaseSpace.java | 7 +-- .../activityimpl/uniform/DriverAdapter.java | 5 +- .../uniform/flowtypes/ChainingOp.java | 43 --------------- .../uniform/flowtypes/CycleOp.java | 9 +--- .../activityimpl/uniform/flowtypes/Op.java | 37 ------------- .../uniform/flowtypes/OpGenerator.java | 2 +- .../uniform/flowtypes/RunnableOp.java | 42 +++++++-------- .../uniform/flowtypes/ops_pre_2057.png | Bin 0 -> 43130 bytes .../uniform/opwrappers/DryCycleOp.java | 1 - .../DryCycleOpDispenserWrapper.java | 1 - .../uniform/opwrappers/DryRunableOp.java | 32 ----------- .../DryRunnableOpDispenserWrapper.java | 51 ------------------ .../EmitterCycleOpDispenserWrapper.java | 1 - .../opwrappers/EmitterOpDispenserWrapper.java | 6 +-- .../uniform/opwrappers/EmitterRunnableOp.java | 32 ----------- .../EmitterRunnableOpDispenserWrapper.java | 50 ----------------- .../uniform/opwrappers/PollingOp.java | 5 +- .../api/activityapi/planning/OpSource.java | 3 +- .../engine/api/activityimpl/OpWrappers.java | 30 ++--------- .../api/activityimpl/SimpleActivity.java | 19 +++---- .../uniform/StandardActivity.java | 20 +++---- .../uniform/actions/StandardAction.java | 19 ++----- .../{IPV4Addrses.java => IPV4Address.java} | 2 +- 87 files changed, 331 insertions(+), 539 deletions(-) create mode 100644 nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlOpImpl.java create mode 100644 nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoDbUpdateOp.java create mode 100644 nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoOp.java delete mode 100644 nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ChainingOp.java delete mode 100644 nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/Op.java create mode 100644 nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ops_pre_2057.png delete mode 100644 nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryRunableOp.java delete mode 100644 nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryRunnableOpDispenserWrapper.java delete mode 100644 nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterRunnableOp.java delete mode 100644 nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterRunnableOpDispenserWrapper.java rename nb-virtdata/virtdata-lib-realer/src/main/java/io/nosqlbench/virtdata/library/realer/todo/inet/{IPV4Addrses.java => IPV4Address.java} (96%) 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 93a566537..d24aea3ec 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 @@ -32,14 +32,14 @@ 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 { +public class AzureAISearchDriverAdapter extends BaseDriverAdapter, AzureAISearchSpace> { public AzureAISearchDriverAdapter(NBComponent parentComponent, NBLabels labels) { super(parentComponent, labels); } @Override - public OpMapper getOpMapper() { + public OpMapper,AzureAISearchSpace> getOpMapper() { return new AzureAISearchOpMapper(this); } diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchOpMapper.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchOpMapper.java index 872ef2306..b34946c56 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchOpMapper.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/AzureAISearchOpMapper.java @@ -16,6 +16,7 @@ package io.nosqlbench.adapter.azureaisearch; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -34,7 +35,7 @@ import io.nosqlbench.engine.api.templating.TypeAndTarget; import java.util.function.LongFunction; -public class AzureAISearchOpMapper implements OpMapper { +public class AzureAISearchOpMapper implements OpMapper, AzureAISearchSpace> { private static final Logger logger = LogManager.getLogger(AzureAISearchOpMapper.class); private final AzureAISearchDriverAdapter adapter; @@ -60,7 +61,7 @@ public class AzureAISearchOpMapper implements OpMapper apply(ParsedOp op, LongFunction spaceInitF) { + public OpDispenser> apply(ParsedOp op, LongFunction spaceInitF) { TypeAndTarget typeAndTarget = op.getTypeAndTarget(AzureAISearchOpType.class, String.class, "type", "target"); diff --git a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchBaseOpDispenser.java b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchBaseOpDispenser.java index dd32f9566..74a892c6c 100644 --- a/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchBaseOpDispenser.java +++ b/nb-adapters/adapter-azure-aisearch/src/main/java/io/nosqlbench/adapter/azureaisearch/opsdispenser/AzureAISearchBaseOpDispenser.java @@ -29,7 +29,7 @@ import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.templating.ParsedOp; public abstract class AzureAISearchBaseOpDispenser - extends BaseOpDispenser { + extends BaseOpDispenser, AzureAISearchSpace> { protected final LongFunction azureAISearchSpaceFunction; protected final LongFunction clientFunction; 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 63796f0d8..d7a4cc85f 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 @@ -18,13 +18,11 @@ 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.flowtypes.Op; import io.nosqlbench.nb.api.labels.NBLabels; import io.nosqlbench.nb.api.components.core.NBComponent; import io.nosqlbench.nb.annotations.Service; @@ -39,7 +37,7 @@ 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, Cqld4Space> { private final static Logger logger = LogManager.getLogger(Cqld4DriverAdapter.class); public Cqld4DriverAdapter(NBComponent parentComponent, NBLabels labels) { @@ -47,7 +45,7 @@ public class Cqld4DriverAdapter extends BaseDriverAdapter getOpMapper() { + public OpMapper, Cqld4Space> getOpMapper() { NBConfiguration config = getConfiguration(); return new Cqld4CoreOpMapper(this, config); } 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 7fdcf2706..1dff52384 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 @@ -43,7 +43,7 @@ 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"); diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4GremlinOpDispenser.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4GremlinOpDispenser.java index d190d8e1b..315cc04a3 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4GremlinOpDispenser.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4GremlinOpDispenser.java @@ -31,7 +31,7 @@ import io.nosqlbench.adapters.api.templating.ParsedOp; import java.util.Optional; import java.util.function.LongFunction; -public class Cqld4GremlinOpDispenser extends BaseOpDispenser { +public class Cqld4GremlinOpDispenser extends BaseOpDispenser, Cqld4Space> { private final LongFunction stmtFunc; private final LongFunction sessionFunc; diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/CqlD4BatchStmtMapper.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/CqlD4BatchStmtMapper.java index cd908b327..7d8c66ac7 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/CqlD4BatchStmtMapper.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/CqlD4BatchStmtMapper.java @@ -16,6 +16,7 @@ package io.nosqlbench.adapter.cqld4.opmappers; +import com.datastax.oss.driver.api.core.cql.Row; import io.nosqlbench.adapter.cqld4.Cqld4DriverAdapter; import io.nosqlbench.adapter.cqld4.Cqld4Space; import io.nosqlbench.adapter.cqld4.opdispensers.CqlD4BatchStmtDispenser; @@ -25,9 +26,10 @@ import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.engine.api.templating.TypeAndTarget; +import java.util.List; import java.util.function.LongFunction; -public class CqlD4BatchStmtMapper extends Cqld4CqlBaseOpMapper { +public class CqlD4BatchStmtMapper> extends Cqld4CqlBaseOpMapper { private final TypeAndTarget target; diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4BaseOpMapper.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4BaseOpMapper.java index a8b854283..eb26d3d81 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4BaseOpMapper.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4BaseOpMapper.java @@ -20,21 +20,16 @@ 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.Cqld4BaseOp; -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.activityimpl.uniform.flowtypes.Op; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.templating.ParsedOp; -import io.nosqlbench.engine.api.templating.TypeAndTarget; -import io.nosqlbench.nb.api.config.standard.NBConfiguration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.function.LongFunction; -public abstract class Cqld4BaseOpMapper implements OpMapper { +public abstract class Cqld4BaseOpMapper> implements OpMapper { protected final static Logger logger = LogManager.getLogger(Cqld4BaseOpMapper.class); protected final Cqld4DriverAdapter adapter; diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4CoreOpMapper.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4CoreOpMapper.java index 5cb7280d2..627751a25 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4CoreOpMapper.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4CoreOpMapper.java @@ -19,8 +19,7 @@ package io.nosqlbench.adapter.cqld4.opmappers; 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.adapters.api.activityimpl.uniform.DriverAdapter; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.nb.api.config.standard.NBConfiguration; import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.templating.ParsedOp; @@ -31,12 +30,11 @@ import org.apache.logging.log4j.Logger; import java.util.function.LongFunction; -public class Cqld4CoreOpMapper extends Cqld4BaseOpMapper { +public class Cqld4CoreOpMapper extends Cqld4BaseOpMapper> { private final static Logger logger = LogManager.getLogger(Cqld4CoreOpMapper.class); - public Cqld4CoreOpMapper(Cqld4DriverAdapter adapter, - NBConfiguration config) { + public Cqld4CoreOpMapper(Cqld4DriverAdapter adapter, NBConfiguration config) { super(adapter); } @@ -53,16 +51,17 @@ public class Cqld4CoreOpMapper extends Cqld4BaseOpMapper { */ @Override - public OpDispenser apply(ParsedOp op, LongFunction cqld4SpaceLongFunction) { + public OpDispenser> apply(ParsedOp op, LongFunction cqld4SpaceLongFunction) { CqlD4OpType opType = CqlD4OpType.prepared; TypeAndTarget target = op.getTypeAndTarget(CqlD4OpType.class, String.class, "type", "stmt"); - logger.info(() -> "Using " + target.enumId + " statement form for '" + op.getName()+"'"); + logger.info(() -> "Using " + target.enumId + " statement form for '" + op.getName() + "'"); - return (OpDispenser) switch (target.enumId) { + return (OpDispenser>) switch (target.enumId) { case raw, simple, prepared, batch -> new Cqld4CqlOpMapper(adapter).apply(op, spaceFunc); case gremlin -> new Cqld4GremlinOpMapper(adapter, target.targetFunction).apply(op, spaceFunc); case fluent -> new Cqld4FluentGraphOpMapper(adapter, target).apply(op, spaceFunc); - case rainbow -> new CqlD4RainbowTableMapper(adapter, sessionFunc, target.targetFunction).apply(op, spaceFunc); + case rainbow -> + new CqlD4RainbowTableMapper(adapter, sessionFunc, target.targetFunction).apply(op, spaceFunc); default -> throw new OpConfigError("Unsupported op type " + opType); // case sst -> new Cqld4SsTableMapper(adapter, sessionFunc, target.targetFunction).apply(op); }; diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4CqlBaseOpMapper.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4CqlBaseOpMapper.java index 7b188aeaf..6e57780d6 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4CqlBaseOpMapper.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4CqlBaseOpMapper.java @@ -22,6 +22,7 @@ import io.nosqlbench.adapter.cqld4.Cqld4DriverAdapter; import io.nosqlbench.adapter.cqld4.Cqld4Space; import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlOp; import io.nosqlbench.adapters.api.activityimpl.OpDispenser; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.templating.ParsedOp; import java.util.function.LongFunction; @@ -34,4 +35,5 @@ public abstract class Cqld4CqlBaseOpMapper extends Cqld4Ba @Override public abstract OpDispenser apply(ParsedOp op, LongFunction spaceInitF); + } diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4FluentGraphOpMapper.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4FluentGraphOpMapper.java index b912446c9..1273761db 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4FluentGraphOpMapper.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opmappers/Cqld4FluentGraphOpMapper.java @@ -17,21 +17,14 @@ package io.nosqlbench.adapter.cqld4.opmappers; import com.datastax.dse.driver.api.core.graph.DseGraph; -import com.datastax.oss.driver.api.core.CqlSession; import groovy.lang.Binding; import groovy.lang.GroovyShell; import groovy.lang.Script; import io.nosqlbench.adapter.cqld4.Cqld4DriverAdapter; import io.nosqlbench.adapter.cqld4.Cqld4Space; import io.nosqlbench.adapter.cqld4.opdispensers.Cqld4FluentGraphOpDispenser; -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.OpDispenser; -import io.nosqlbench.adapters.api.activityimpl.OpMapper; -import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; -import io.nosqlbench.adapters.api.activityimpl.uniform.Space; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.engine.api.templating.TypeAndTarget; import io.nosqlbench.nb.api.errors.OpConfigError; diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4BaseOp.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4BaseOp.java index d9a190d28..69fb6aca0 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4BaseOp.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4BaseOp.java @@ -18,7 +18,8 @@ package io.nosqlbench.adapter.cqld4.optypes; */ -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -public interface Cqld4BaseOp extends Op { +public interface Cqld4BaseOp extends CycleOp { } diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlBatchStatement.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlBatchStatement.java index c6429fe90..3697296ac 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlBatchStatement.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlBatchStatement.java @@ -18,9 +18,13 @@ package io.nosqlbench.adapter.cqld4.optypes; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.BatchStatement; +import com.datastax.oss.driver.api.core.cql.Row; import io.nosqlbench.adapter.cqld4.RSProcessors; import io.nosqlbench.adapter.cqld4.instruments.CqlOpMetrics; +import java.util.ArrayList; +import java.util.List; + public class Cqld4CqlBatchStatement extends Cqld4CqlOp { private final BatchStatement stmt; diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlOp.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlOp.java index 2232ba61c..801e0c779 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlOp.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlOp.java @@ -17,10 +17,7 @@ package io.nosqlbench.adapter.cqld4.optypes; import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.cql.AsyncResultSet; -import com.datastax.oss.driver.api.core.cql.BoundStatement; -import com.datastax.oss.driver.api.core.cql.Row; -import com.datastax.oss.driver.api.core.cql.Statement; +import com.datastax.oss.driver.api.core.cql.*; import io.nosqlbench.adapter.cqld4.Cqld4CqlReboundStatement; import io.nosqlbench.adapter.cqld4.LWTRebinder; import io.nosqlbench.adapter.cqld4.RSProcessors; @@ -50,7 +47,7 @@ import java.util.concurrent.*; public abstract class Cqld4CqlOp - implements Cqld4BaseOp, CycleOp>, VariableCapture, OpGenerator, OpResultSize { + implements Cqld4BaseOp>, VariableCapture, OpGenerator, OpResultSize { private final static Logger logger = LogManager.getLogger(Cqld4CqlOp.class); @@ -101,7 +98,8 @@ public abstract class Cqld4CqlOp this.metrics = metrics; } - public final ArrayList apply(long cycle) { + @Override + public List apply(long cycle) { Statement statement = getStmt(); logger.trace(() -> "apply() invoked, statement obtained, executing async with page size: " + statement.getPageSize() + " thread local rows: "); @@ -136,15 +134,16 @@ public abstract class Cqld4CqlOp metrics.recordFetchedRows(fetchedRows); metrics.recordFetchedBytes(fetchedBytes); } + } // logger.trace(() -> "\n\n--- Rows collected for cycle: " + cycle + " count: " // + rs.size() + " dt: " + System.nanoTime()); // // results.set(completeRowSet); // processors.flush(); - } - private static class PrintableRowList extends ArrayList { + + public static class PrintableRowList extends ArrayList { public PrintableRowList(List values) { super(values); } @@ -159,10 +158,9 @@ public abstract class Cqld4CqlOp } } - // private BiFunction handler @Override - public Op getNextOp() { - Op next = nextOp; + public CycleOp getNextOp() { + CycleOp next = nextOp; nextOp = null; return next; } @@ -181,7 +179,7 @@ public abstract class Cqld4CqlOp } private CompletionStage> collect(AsyncResultSet resultSet, ArrayList rowList, final long cycle) { - fetchedBytes+=resultSet.getExecutionInfo().getResponseSizeInBytes(); + fetchedBytes += resultSet.getExecutionInfo().getResponseSizeInBytes(); if (++fetchedPages > maxPages) { throw new UnexpectedPagingException(resultSet, getQueryString(), fetchedPages, maxPages, getStmt().getPageSize()); } diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlOpImpl.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlOpImpl.java new file mode 100644 index 000000000..9daeef660 --- /dev/null +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4CqlOpImpl.java @@ -0,0 +1,40 @@ +package io.nosqlbench.adapter.cqld4.optypes; + +/* + * 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 com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.cql.Statement; +import io.nosqlbench.adapter.cqld4.RSProcessors; +import io.nosqlbench.adapter.cqld4.instruments.CqlOpMetrics; + +public class Cqld4CqlOpImpl extends Cqld4CqlOp { + public Cqld4CqlOpImpl(CqlSession session, int maxPages, boolean retryReplace, int maxLwtRetries, RSProcessors processors, CqlOpMetrics metrics) { + super(session, maxPages, retryReplace, maxLwtRetries, processors, metrics); + } + + @Override + public Statement getStmt() { + return null; + } + + @Override + public String getQueryString() { + return ""; + } +} diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4FluentGraphOp.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4FluentGraphOp.java index 17b67b072..877818e4b 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4FluentGraphOp.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4FluentGraphOp.java @@ -22,7 +22,7 @@ import com.datastax.oss.driver.api.core.CqlSession; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.OpResultSize; -public class Cqld4FluentGraphOp implements Cqld4BaseOp, CycleOp, OpResultSize { +public class Cqld4FluentGraphOp implements Cqld4BaseOp, OpResultSize { private final CqlSession session; private final FluentGraphStatement stmt; private int resultSize=0; diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4RainbowTableOp.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4RainbowTableOp.java index 26900be27..129aad489 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4RainbowTableOp.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4RainbowTableOp.java @@ -23,7 +23,7 @@ import java.util.Map; // Need to create RainbowTableStatement public class Cqld4RainbowTableOp - implements Cqld4BaseOp, CycleOp, VariableCapture, OpGenerator, OpResultSize { + implements Cqld4BaseOp, VariableCapture, OpGenerator, OpResultSize { // private final CqlSession session; // private final RainbowTableStatement stmt; @@ -35,7 +35,7 @@ public class Cqld4RainbowTableOp } @Override - public Op getNextOp() { + public CycleOp getNextOp() { throw new RuntimeException("implement me"); } diff --git a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4ScriptGraphOp.java b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4ScriptGraphOp.java index 632c9dda9..9f9dac08e 100644 --- a/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4ScriptGraphOp.java +++ b/nb-adapters/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/optypes/Cqld4ScriptGraphOp.java @@ -22,7 +22,7 @@ import com.datastax.oss.driver.api.core.CqlSession; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.OpResultSize; -public class Cqld4ScriptGraphOp implements Cqld4BaseOp, CycleOp, OpResultSize { +public class Cqld4ScriptGraphOp implements Cqld4BaseOp, OpResultSize { private final CqlSession session; private final ScriptGraphStatement stmt; private int resultSize=0; diff --git a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/ops/DataApiBaseOp.java b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/ops/DataApiBaseOp.java index 255d1d804..b120c890f 100644 --- a/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/ops/DataApiBaseOp.java +++ b/nb-adapters/adapter-dataapi/src/main/java/io/nosqlbench/adapter/dataapi/ops/DataApiBaseOp.java @@ -21,7 +21,7 @@ import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -public abstract class DataApiBaseOp implements CycleOp { +public abstract class DataApiBaseOp implements CycleOp { protected static final Logger logger = LogManager.getLogger(DataApiBaseOp.class); protected final Database db; diff --git a/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/GCPSpannerDriverAdapter.java b/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/GCPSpannerDriverAdapter.java index b9eb95433..830ad51af 100644 --- a/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/GCPSpannerDriverAdapter.java +++ b/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/GCPSpannerDriverAdapter.java @@ -32,14 +32,14 @@ import java.util.function.LongFunction; import static io.nosqlbench.adapter.gcpspanner.GCPSpannerAdapterUtils.SPANNER; @Service(value = DriverAdapter.class, selector = SPANNER) -public class GCPSpannerDriverAdapter extends BaseDriverAdapter { +public class GCPSpannerDriverAdapter extends BaseDriverAdapter, GCPSpannerSpace> { public GCPSpannerDriverAdapter(NBComponent parentComponent, NBLabels labels) { super(parentComponent, labels); } @Override - public OpMapper getOpMapper() { + public OpMapper,GCPSpannerSpace> getOpMapper() { return new GCPSpannerOpMapper(this); } diff --git a/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/GCPSpannerOpMapper.java b/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/GCPSpannerOpMapper.java index d935a021e..9d6e077e5 100644 --- a/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/GCPSpannerOpMapper.java +++ b/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/GCPSpannerOpMapper.java @@ -30,7 +30,7 @@ import org.apache.logging.log4j.Logger; import java.util.function.IntFunction; import java.util.function.LongFunction; -public class GCPSpannerOpMapper implements OpMapper { +public class GCPSpannerOpMapper implements OpMapper, GCPSpannerSpace> { private static final Logger logger = LogManager.getLogger(GCPSpannerOpMapper.class); private final GCPSpannerDriverAdapter adapter; @@ -56,12 +56,12 @@ public class GCPSpannerOpMapper implements OpMapper apply(ParsedOp op, LongFunction spaceInitF) { + public OpDispenser> apply(ParsedOp op, LongFunction spaceInitF) { TypeAndTarget typeAndTarget = op.getTypeAndTarget(GCPSpannerOpType.class, String.class, "type", "target"); logger.info(() -> "Using '" + typeAndTarget.enumId + "' op type for op template '" + op.getName() + "'"); - return switch (typeAndTarget.enumId) { + OpDispenser> dispenser = switch (typeAndTarget.enumId) { case drop_database_ddl -> new GCPSpannerDropDatabaseDdlOpDispenser(adapter, op, typeAndTarget.targetFunction); case create_database_ddl -> @@ -71,5 +71,6 @@ public class GCPSpannerOpMapper implements OpMapper new GCPSpannerInsertOpDispenser(adapter, op, typeAndTarget.targetFunction); case execute_dml -> new GCPSpannerExecuteDmlOpDispenser(adapter, op, typeAndTarget.targetFunction); }; + return dispenser; } } diff --git a/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/opdispensers/GCPSpannerBaseOpDispenser.java b/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/opdispensers/GCPSpannerBaseOpDispenser.java index 68e5c8c1c..593af56f9 100644 --- a/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/opdispensers/GCPSpannerBaseOpDispenser.java +++ b/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/opdispensers/GCPSpannerBaseOpDispenser.java @@ -32,7 +32,7 @@ import java.util.function.LongFunction; * for creating GCP Spanner operations. */ public abstract class GCPSpannerBaseOpDispenser - extends BaseOpDispenser { + extends BaseOpDispenser, GCPSpannerSpace> { /** * A function that provides the target string based on a long input. */ diff --git a/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/ops/GCPSpannerBaseOp.java b/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/ops/GCPSpannerBaseOp.java index dfd7c320e..65096fae3 100644 --- a/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/ops/GCPSpannerBaseOp.java +++ b/nb-adapters/adapter-gcp-spanner/src/main/java/io/nosqlbench/adapter/gcpspanner/ops/GCPSpannerBaseOp.java @@ -18,7 +18,6 @@ package io.nosqlbench.adapter.gcpspanner.ops; import com.google.cloud.spanner.Spanner; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/nb-adapters/adapter-http/src/main/java/io/nosqlbench/adapter/http/core/HttpOp.java b/nb-adapters/adapter-http/src/main/java/io/nosqlbench/adapter/http/core/HttpOp.java index 9eb871ab4..3d0fe432a 100644 --- a/nb-adapters/adapter-http/src/main/java/io/nosqlbench/adapter/http/core/HttpOp.java +++ b/nb-adapters/adapter-http/src/main/java/io/nosqlbench/adapter/http/core/HttpOp.java @@ -27,7 +27,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; -public class HttpOp implements CycleOp { +public class HttpOp implements CycleOp { public final Pattern ok_status; public final Pattern ok_body; diff --git a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/core/MongoOpMapper.java b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/core/MongoOpMapper.java index 7526e9d58..a813dd457 100644 --- a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/core/MongoOpMapper.java +++ b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/core/MongoOpMapper.java @@ -18,20 +18,17 @@ package io.nosqlbench.adapter.mongodb.core; import io.nosqlbench.adapter.mongodb.dispensers.MongoCommandOpDispenser; import io.nosqlbench.adapter.mongodb.ops.MongoDirectCommandOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.Space; import io.nosqlbench.adapters.api.activityimpl.uniform.ConcurrentSpaceCache; import io.nosqlbench.nb.api.config.standard.NBConfiguration; import io.nosqlbench.nb.api.errors.BasicError; import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.activityimpl.OpMapper; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.engine.api.templating.TypeAndTarget; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Optional; -import java.util.function.IntFunction; import java.util.function.LongFunction; public class MongoOpMapper implements OpMapper { diff --git a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/core/MongodbDriverAdapter.java b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/core/MongodbDriverAdapter.java index 090e38ea5..931091b80 100644 --- a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/core/MongodbDriverAdapter.java +++ b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/core/MongodbDriverAdapter.java @@ -17,31 +17,30 @@ package io.nosqlbench.adapter.mongodb.core; import io.nosqlbench.adapter.mongodb.ops.MongoDirectCommandOp; +import io.nosqlbench.adapter.mongodb.ops.MongoOp; 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.flowtypes.Op; import io.nosqlbench.nb.api.labels.NBLabels; import io.nosqlbench.nb.api.components.core.NBComponent; import io.nosqlbench.nb.annotations.Service; -import java.util.function.IntFunction; import java.util.function.LongFunction; /** * Special thanks to Justin Chu who authored the original NoSQLBench MongoDB ActivityType. */ @Service(value = DriverAdapter.class, selector = "mongodb") -public class MongodbDriverAdapter extends BaseDriverAdapter { +public class MongodbDriverAdapter extends BaseDriverAdapter, MongoSpace> { public MongodbDriverAdapter(NBComponent parentComponent, NBLabels labels) { super(parentComponent, labels); } @Override - public OpMapper getOpMapper() { + public OpMapper,MongoSpace> getOpMapper() { return new MongoOpMapper(this, getConfiguration(), getSpaceCache()); } diff --git a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/dispensers/MongoCommandOpDispenser.java b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/dispensers/MongoCommandOpDispenser.java index bb31c567c..db6431895 100644 --- a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/dispensers/MongoCommandOpDispenser.java +++ b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/dispensers/MongoCommandOpDispenser.java @@ -20,14 +20,11 @@ import io.nosqlbench.adapter.mongodb.core.MongoSpace; import io.nosqlbench.adapter.mongodb.ops.MongoDirectCommandOp; import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; -import io.nosqlbench.adapters.api.activityimpl.uniform.Space; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import io.nosqlbench.adapters.api.templating.ParsedOp; import org.bson.Document; import org.bson.conversions.Bson; import java.util.Map; -import java.util.function.IntFunction; import java.util.function.LongFunction; public class MongoCommandOpDispenser extends BaseOpDispenser { diff --git a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/dispensers/MongoDbUpdateOpDispenser.java b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/dispensers/MongoDbUpdateOpDispenser.java index 82b5af140..0b7090d3b 100644 --- a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/dispensers/MongoDbUpdateOpDispenser.java +++ b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/dispensers/MongoDbUpdateOpDispenser.java @@ -20,9 +20,14 @@ import com.mongodb.client.MongoClient; import com.mongodb.client.MongoDatabase; import io.nosqlbench.adapter.mongodb.core.MongoSpace; import io.nosqlbench.adapter.mongodb.core.MongodbDriverAdapter; +import io.nosqlbench.adapter.mongodb.ops.MongoDbUpdateOp; +import io.nosqlbench.adapter.mongodb.ops.MongoDirectCommandOp; +import io.nosqlbench.adapter.mongodb.ops.MongoOp; import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.templating.ParsedOp; +import org.bson.BsonDocument; +import org.bson.conversions.Bson; import java.util.function.LongFunction; @@ -30,9 +35,9 @@ import java.util.function.LongFunction; * https://www.mongodb.com/docs/manual/reference/command/update/#mongodb-dbcommand-dbcmd.update * https://www.mongodb.com/docs/drivers/java/sync/current/usage-examples/updateOne/ */ -public class MongoDbUpdateOpDispenser extends BaseOpDispenser { +public class MongoDbUpdateOpDispenser extends BaseOpDispenser, MongoSpace> { private final LongFunction spaceF; - private final LongFunction opF; + private final LongFunction> opF; private final LongFunction collectionF; public MongoDbUpdateOpDispenser(MongodbDriverAdapter adapter, ParsedOp pop, LongFunction collectionF) { @@ -42,15 +47,16 @@ public class MongoDbUpdateOpDispenser extends BaseOpDispenser { this.opF = createOpF(pop); } - private LongFunction createOpF(ParsedOp pop) { + private LongFunction> createOpF(ParsedOp pop) { LongFunction clientF = cycle -> spaceF.apply(cycle).getClient(); LongFunction docF = l -> clientF.apply(l).getDatabase(collectionF.apply(l)); - return l -> new Op() {}; + // TODO This needs to be completed for at least one working example of a specialized op form. + return l -> new MongoDirectCommandOp(clientF.apply(l),docF.apply(l).getName(),new BsonDocument()); } @Override - public Op getOp(long value) { - Op op = opF.apply(value); + public MongoOp getOp(long value) { + MongoOp op = opF.apply(value); return op; } diff --git a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoDbUpdateOp.java b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoDbUpdateOp.java new file mode 100644 index 000000000..4bcf167aa --- /dev/null +++ b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoDbUpdateOp.java @@ -0,0 +1,30 @@ +package io.nosqlbench.adapter.mongodb.ops; + +/* + * 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.adapters.api.activityimpl.uniform.flowtypes.CycleOp; +import org.bson.Document; + +public class MongoDbUpdateOp implements CycleOp { + + @Override + public Document apply(long value) { + return null; + } +} diff --git a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoDirectCommandOp.java b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoDirectCommandOp.java index 48eb83ea0..5f95e8b61 100644 --- a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoDirectCommandOp.java +++ b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoDirectCommandOp.java @@ -21,7 +21,7 @@ import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import org.bson.Document; import org.bson.conversions.Bson; -public class MongoDirectCommandOp implements CycleOp { +public class MongoDirectCommandOp implements MongoOp { private final MongoClient client; private final Bson rqBson; diff --git a/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoOp.java b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoOp.java new file mode 100644 index 000000000..a43bcaccd --- /dev/null +++ b/nb-adapters/adapter-mongodb/src/main/java/io/nosqlbench/adapter/mongodb/ops/MongoOp.java @@ -0,0 +1,24 @@ +package io.nosqlbench.adapter.mongodb.ops; + +/* + * 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.adapters.api.activityimpl.uniform.flowtypes.CycleOp; + +public interface MongoOp extends CycleOp { +} diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/QdrantDriverAdapter.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/QdrantDriverAdapter.java index 26a784278..02be9e9c2 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/QdrantDriverAdapter.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/QdrantDriverAdapter.java @@ -33,14 +33,14 @@ import java.util.function.LongFunction; import static io.nosqlbench.adapter.qdrant.QdrantAdapterUtils.QDRANT; @Service(value = DriverAdapter.class, selector = QDRANT) -public class QdrantDriverAdapter extends BaseDriverAdapter { +public class QdrantDriverAdapter extends BaseDriverAdapter, QdrantSpace> { public QdrantDriverAdapter(NBComponent parentComponent, NBLabels labels) { super(parentComponent, labels); } @Override - public OpMapper getOpMapper() { + public OpMapper,QdrantSpace> getOpMapper() { return new QdrantOpMapper(this); } diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/QdrantOpMapper.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/QdrantOpMapper.java index f5eab3e0d..696a1dc58 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/QdrantOpMapper.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/QdrantOpMapper.java @@ -30,7 +30,7 @@ import org.apache.logging.log4j.Logger; import java.util.function.IntFunction; import java.util.function.LongFunction; -public class QdrantOpMapper implements OpMapper { +public class QdrantOpMapper implements OpMapper,QdrantSpace> { private static final Logger logger = LogManager.getLogger(QdrantOpMapper.class); private final QdrantDriverAdapter adapter; @@ -52,7 +52,7 @@ public class QdrantOpMapper implements OpMapper { * @return The correct {@link QdrantBaseOpDispenser} subclass based on the op type */ @Override - public OpDispenser apply(ParsedOp op, LongFunction spaceInitF) { + public OpDispenser> apply(ParsedOp op, LongFunction spaceInitF) { TypeAndTarget typeAndTarget = op.getTypeAndTarget( QdrantOpType.class, String.class, @@ -61,7 +61,7 @@ public class QdrantOpMapper implements OpMapper { ); logger.info(() -> "Using '" + typeAndTarget.enumId + "' op type for op template '" + op.getName() + "'"); - return switch (typeAndTarget.enumId) { + OpDispenser> dispenser = switch (typeAndTarget.enumId) { case delete_collection -> new QdrantDeleteCollectionOpDispenser(adapter, op, typeAndTarget.targetFunction); case create_collection -> new QdrantCreateCollectionOpDispenser(adapter, op, typeAndTarget.targetFunction); case create_payload_index -> @@ -78,6 +78,7 @@ public class QdrantOpMapper implements OpMapper { // default -> throw new RuntimeException("Unrecognized op type '" + typeAndTarget.enumId.name() + "' while " + // "mapping parsed op " + op); }; + return dispenser; } } diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantBaseOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantBaseOpDispenser.java index 1cf28b3ad..c7076f76f 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantBaseOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantBaseOpDispenser.java @@ -41,12 +41,13 @@ import java.util.function.LongFunction; import static io.qdrant.client.ConditionFactory.*; -public abstract class QdrantBaseOpDispenser extends BaseOpDispenser { +public abstract class QdrantBaseOpDispenser + extends BaseOpDispenser, QdrantSpace> { protected final LongFunction qdrantSpaceFunction; protected final LongFunction clientFunction; - private final LongFunction> opF; - private final LongFunction paramF; + private final LongFunction> opF; + private final LongFunction paramF; protected QdrantBaseOpDispenser(QdrantDriverAdapter adapter, ParsedOp op, LongFunction targetF) { super((DriverAdapter)adapter, op); @@ -59,21 +60,21 @@ public abstract class QdrantBaseOpDispenser extends BaseOpDispenser getParamFunc( + 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 QdrantBaseOp getOp(long value) { + public QdrantBaseOp getOp(long value) { return opF.apply(value); } @@ -477,7 +478,7 @@ public abstract class QdrantBaseOpDispenser extends BaseOpDispenser { +public class QdrantCollectionExistsOpDispenser extends QdrantBaseOpDispenser { public QdrantCollectionExistsOpDispenser(QdrantDriverAdapter adapter, ParsedOp op, LongFunction targetFunction) { super(adapter, op, targetFunction); } @@ -41,7 +41,7 @@ public class QdrantCollectionExistsOpDispenser extends QdrantBaseOpDispenser> createOpFunc( + public LongFunction> createOpFunc( LongFunction paramF, LongFunction clientF, ParsedOp op, diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCollectionInfoOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCollectionInfoOpDispenser.java index 169fe36ef..1e10e9750 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCollectionInfoOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCollectionInfoOpDispenser.java @@ -21,10 +21,11 @@ import io.nosqlbench.adapter.qdrant.ops.QdrantBaseOp; import io.nosqlbench.adapter.qdrant.ops.QdrantCollectionInfoOp; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.qdrant.client.QdrantClient; +import io.qdrant.client.grpc.Collections; import java.util.function.LongFunction; -public class QdrantCollectionInfoOpDispenser extends QdrantBaseOpDispenser { +public class QdrantCollectionInfoOpDispenser extends QdrantBaseOpDispenser { public QdrantCollectionInfoOpDispenser(QdrantDriverAdapter adapter, ParsedOp op, LongFunction targetFunction) { super(adapter, op, targetFunction); } @@ -36,7 +37,7 @@ public class QdrantCollectionInfoOpDispenser extends QdrantBaseOpDispenser> createOpFunc( + public LongFunction> createOpFunc( LongFunction paramF, LongFunction clientF, ParsedOp op, diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCountPointsOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCountPointsOpDispenser.java index 8577cbf35..d48dba9f4 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCountPointsOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCountPointsOpDispenser.java @@ -26,7 +26,7 @@ import io.qdrant.client.grpc.Points.Filter; import java.util.function.LongFunction; -public class QdrantCountPointsOpDispenser extends QdrantBaseOpDispenser { +public class QdrantCountPointsOpDispenser extends QdrantBaseOpDispenser { public QdrantCountPointsOpDispenser(QdrantDriverAdapter adapter, ParsedOp op, LongFunction targetFunction) { super(adapter, op, targetFunction); } @@ -50,7 +50,7 @@ public class QdrantCountPointsOpDispenser extends QdrantBaseOpDispenser> createOpFunc( + public LongFunction> createOpFunc( LongFunction paramF, LongFunction clientF, ParsedOp op, diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCreateCollectionOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCreateCollectionOpDispenser.java index 0f0805785..aa1a4b9bb 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCreateCollectionOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCreateCollectionOpDispenser.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Optional; import java.util.function.LongFunction; +import io.qdrant.client.grpc.Collections; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -48,7 +49,7 @@ import io.qdrant.client.grpc.Collections.VectorParamsMap; import io.qdrant.client.grpc.Collections.VectorsConfig; import io.qdrant.client.grpc.Collections.WalConfigDiff; -public class QdrantCreateCollectionOpDispenser extends QdrantBaseOpDispenser { +public class QdrantCreateCollectionOpDispenser extends QdrantBaseOpDispenser { private static final Logger logger = LogManager.getLogger(QdrantCreateCollectionOpDispenser.class); /** @@ -364,7 +365,7 @@ public class QdrantCreateCollectionOpDispenser extends QdrantBaseOpDispenser> createOpFunc( + public LongFunction> createOpFunc( LongFunction paramF, LongFunction clientF, ParsedOp op, diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCreatePayloadIndexOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCreatePayloadIndexOpDispenser.java index b69afb7fa..37b7844e2 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCreatePayloadIndexOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantCreatePayloadIndexOpDispenser.java @@ -21,6 +21,7 @@ import io.nosqlbench.adapter.qdrant.ops.QdrantBaseOp; import io.nosqlbench.adapter.qdrant.ops.QdrantCreatePayloadIndexOp; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.qdrant.client.QdrantClient; +import io.qdrant.client.grpc.Points; import io.qdrant.client.grpc.Points.CreateFieldIndexCollection; import io.qdrant.client.grpc.Points.FieldType; import io.qdrant.client.grpc.Points.WriteOrdering; @@ -29,7 +30,7 @@ import io.qdrant.client.grpc.Points.WriteOrderingType; import java.util.Optional; import java.util.function.LongFunction; -public class QdrantCreatePayloadIndexOpDispenser extends QdrantBaseOpDispenser { +public class QdrantCreatePayloadIndexOpDispenser extends QdrantBaseOpDispenser { public QdrantCreatePayloadIndexOpDispenser( QdrantDriverAdapter adapter, ParsedOp op, @@ -65,7 +66,7 @@ public class QdrantCreatePayloadIndexOpDispenser extends QdrantBaseOpDispenser> createOpFunc( + public LongFunction> createOpFunc( LongFunction paramF, LongFunction clientF, ParsedOp op, diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantDeleteCollectionOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantDeleteCollectionOpDispenser.java index 94fbd7d09..30bea7a55 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantDeleteCollectionOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantDeleteCollectionOpDispenser.java @@ -21,11 +21,14 @@ import io.nosqlbench.adapter.qdrant.ops.QdrantBaseOp; import io.nosqlbench.adapter.qdrant.ops.QdrantDeleteCollectionOp; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.qdrant.client.QdrantClient; +import io.qdrant.client.grpc.Collections; import io.qdrant.client.grpc.Collections.DeleteCollection; +import java.util.List; import java.util.function.LongFunction; -public class QdrantDeleteCollectionOpDispenser extends QdrantBaseOpDispenser { +public class QdrantDeleteCollectionOpDispenser + extends QdrantBaseOpDispenser { /** * Create a new {@link QdrantDeleteCollectionOpDispenser} subclassed from {@link QdrantBaseOpDispenser}. @@ -42,21 +45,15 @@ public class QdrantDeleteCollectionOpDispenser extends QdrantBaseOpDispenser getParamFunc( - LongFunction clientF, - ParsedOp op, - LongFunction targetF) { + public LongFunction getParamFunc(LongFunction clientF, ParsedOp op, LongFunction targetF) { LongFunction ebF = l -> DeleteCollection.newBuilder().setCollectionName(targetF.apply(l)); return l -> ebF.apply(l).build(); } @Override - public LongFunction> createOpFunc( - LongFunction paramF, - LongFunction clientF, - ParsedOp op, - LongFunction targetF) { + public LongFunction> createOpFunc(LongFunction paramF, LongFunction clientF, ParsedOp op, LongFunction targetF) { return l -> new QdrantDeleteCollectionOp(clientF.apply(l), paramF.apply(l)); } + } diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListCollectionAliasesOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListCollectionAliasesOpDispenser.java index a7e110ffa..3e672e486 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListCollectionAliasesOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListCollectionAliasesOpDispenser.java @@ -23,9 +23,10 @@ import io.nosqlbench.adapters.api.templating.ParsedOp; import io.qdrant.client.QdrantClient; import io.qdrant.client.grpc.Collections.ListCollectionAliasesRequest; +import java.util.List; import java.util.function.LongFunction; -public class QdrantListCollectionAliasesOpDispenser extends QdrantBaseOpDispenser { +public class QdrantListCollectionAliasesOpDispenser extends QdrantBaseOpDispenser> { public QdrantListCollectionAliasesOpDispenser(QdrantDriverAdapter adapter, ParsedOp op, LongFunction targetFunction) { super(adapter, op, targetFunction); @@ -42,7 +43,7 @@ public class QdrantListCollectionAliasesOpDispenser extends QdrantBaseOpDispense } @Override - public LongFunction> createOpFunc( + public LongFunction>> createOpFunc( LongFunction paramF, LongFunction clientF, ParsedOp op, LongFunction targetF) { return l -> new QdrantListCollectionAliasesOp(clientF.apply(l), paramF.apply(l)); diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListCollectionsOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListCollectionsOpDispenser.java index b91db472a..274701e0c 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListCollectionsOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListCollectionsOpDispenser.java @@ -22,24 +22,29 @@ import io.nosqlbench.adapter.qdrant.ops.QdrantListCollectionsOp; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.qdrant.client.QdrantClient; +import java.util.List; import java.util.function.LongFunction; -public class QdrantListCollectionsOpDispenser extends QdrantBaseOpDispenser { +public class QdrantListCollectionsOpDispenser extends QdrantBaseOpDispenser> { public QdrantListCollectionsOpDispenser(QdrantDriverAdapter adapter, ParsedOp op, LongFunction targetFunction) { super(adapter, op, targetFunction); } @Override - public LongFunction getParamFunc(LongFunction clientF, ParsedOp op, LongFunction targetF) { - return l -> ""; + public LongFunction getParamFunc(LongFunction clientF, ParsedOp op, + LongFunction targetF) { + return null; } @Override - public LongFunction> createOpFunc( - LongFunction paramF, + public LongFunction>> createOpFunc( + LongFunction paramF, LongFunction clientF, - ParsedOp op, LongFunction targetF) { - return l -> new QdrantListCollectionsOp(clientF.apply(l), null); + ParsedOp op, + LongFunction targetF + ) { + return l -> new QdrantListCollectionsOp(clientF.apply(l), null); } + } diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListSnapshotsOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListSnapshotsOpDispenser.java index b7df7cb3d..3f9630fc1 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListSnapshotsOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantListSnapshotsOpDispenser.java @@ -21,11 +21,13 @@ import io.nosqlbench.adapter.qdrant.ops.QdrantBaseOp; import io.nosqlbench.adapter.qdrant.ops.QdrantListSnapshotsOp; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.qdrant.client.QdrantClient; +import io.qdrant.client.grpc.SnapshotsService; import io.qdrant.client.grpc.SnapshotsService.ListSnapshotsRequest; +import java.util.List; import java.util.function.LongFunction; -public class QdrantListSnapshotsOpDispenser extends QdrantBaseOpDispenser { +public class QdrantListSnapshotsOpDispenser extends QdrantBaseOpDispenser> { public QdrantListSnapshotsOpDispenser(QdrantDriverAdapter adapter, ParsedOp op, LongFunction targetFunction) { super(adapter, op, targetFunction); } @@ -41,9 +43,11 @@ public class QdrantListSnapshotsOpDispenser extends QdrantBaseOpDispenser> createOpFunc(LongFunction paramF, - LongFunction clientF, - ParsedOp op, LongFunction targetF) { + public LongFunction>> createOpFunc( + LongFunction paramF, + LongFunction clientF, + ParsedOp op, LongFunction targetF + ) { return l -> new QdrantListSnapshotsOp(clientF.apply(l), paramF.apply(l)); } } diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantSearchPointsOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantSearchPointsOpDispenser.java index bb8d91fc2..63e999344 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantSearchPointsOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantSearchPointsOpDispenser.java @@ -33,13 +33,13 @@ import java.util.Map; import java.util.Optional; import java.util.function.LongFunction; -public class QdrantSearchPointsOpDispenser extends QdrantBaseOpDispenser { +public class QdrantSearchPointsOpDispenser extends QdrantBaseOpDispenser> { public QdrantSearchPointsOpDispenser(QdrantDriverAdapter adapter, ParsedOp op, LongFunction targetFunction) { super(adapter, op, targetFunction); } @Override - public LongFunction> createOpFunc( + public LongFunction>> createOpFunc( LongFunction paramF, LongFunction clientF, ParsedOp op, LongFunction targetF) { diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantUpsertPointsOpDispenser.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantUpsertPointsOpDispenser.java index c03f6f938..eb120f7b2 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantUpsertPointsOpDispenser.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/opdispensers/QdrantUpsertPointsOpDispenser.java @@ -36,7 +36,7 @@ import java.util.*; import java.util.function.BiConsumer; import java.util.function.LongFunction; -public class QdrantUpsertPointsOpDispenser extends QdrantBaseOpDispenser { +public class QdrantUpsertPointsOpDispenser extends QdrantBaseOpDispenser { private static final Logger logger = LogManager.getLogger(QdrantUpsertPointsOpDispenser.class); /** @@ -181,7 +181,7 @@ public class QdrantUpsertPointsOpDispenser extends QdrantBaseOpDispenserUpsert Points */ @Override - public LongFunction> createOpFunc( + public LongFunction> createOpFunc( LongFunction paramF, LongFunction clientF, ParsedOp op, diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantBaseOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantBaseOp.java index 3fa6ff24d..b236d4b79 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantBaseOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantBaseOp.java @@ -23,32 +23,32 @@ import org.apache.logging.log4j.Logger; import java.util.function.LongFunction; -public abstract class QdrantBaseOp implements CycleOp { +public abstract class QdrantBaseOp implements CycleOp { protected final static Logger logger = LogManager.getLogger(QdrantBaseOp.class); protected final QdrantClient client; - protected final T request; + protected final REQUEST request; protected final LongFunction apiCall; - public QdrantBaseOp(QdrantClient client, T requestParam) { + public QdrantBaseOp(QdrantClient client, REQUEST requestParam) { this.client = client; this.request = requestParam; this.apiCall = this::applyOp; } - public QdrantBaseOp(QdrantClient client, T requestParam, LongFunction call) { + public QdrantBaseOp(QdrantClient client, REQUEST requestParam, LongFunction call) { this.client = client; 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) { RuntimeException rte = (RuntimeException) e; @@ -56,7 +56,7 @@ public abstract class QdrantBaseOp implements CycleOp { } } - public abstract Object applyOp(long value); + public abstract RESULT applyOp(long value); @Override public String toString() { diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCollectionExistsOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCollectionExistsOp.java index 9ddcd42fd..4bd10572b 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCollectionExistsOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCollectionExistsOp.java @@ -21,13 +21,13 @@ import io.qdrant.client.grpc.Collections.CollectionExistsRequest; import java.time.Duration; -public class QdrantCollectionExistsOp extends QdrantBaseOp { +public class QdrantCollectionExistsOp extends QdrantBaseOp { public QdrantCollectionExistsOp(QdrantClient client, CollectionExistsRequest request) { super(client, request); } @Override - public Object applyOp(long value) { + public Boolean applyOp(long value) { Boolean response; try { response = client.collectionExistsAsync(request.getCollectionName(), Duration.ofSeconds(600)).get(); diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCollectionInfoOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCollectionInfoOp.java index e34e234df..16fd42b64 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCollectionInfoOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCollectionInfoOp.java @@ -21,13 +21,13 @@ import io.qdrant.client.grpc.Collections.CollectionInfo; import java.time.Duration; -public class QdrantCollectionInfoOp extends QdrantBaseOp { +public class QdrantCollectionInfoOp extends QdrantBaseOp { public QdrantCollectionInfoOp(QdrantClient client, String request) { super(client, request); } @Override - public Object applyOp(long value) { + public CollectionInfo applyOp(long value) { CollectionInfo response; try { response = client.getCollectionInfoAsync(request, Duration.ofSeconds(600)).get(); diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCountPointsOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCountPointsOp.java index 968aebe53..96db935f1 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCountPointsOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCountPointsOp.java @@ -22,13 +22,13 @@ import io.qdrant.client.grpc.Points.CountPoints; import java.time.Duration; import java.util.concurrent.ExecutionException; -public class QdrantCountPointsOp extends QdrantBaseOp { +public class QdrantCountPointsOp extends QdrantBaseOp { public QdrantCountPointsOp(QdrantClient client, CountPoints request) { super(client, request); } @Override - public Object applyOp(long value) { + public Long applyOp(long value) { long result; try { boolean hasFilters = request.getFilter() != null && (request.getFilter().getMustCount() > 0 diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCreateCollectionOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCreateCollectionOp.java index 9c47ce0bf..4396fab75 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCreateCollectionOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCreateCollectionOp.java @@ -23,7 +23,7 @@ import io.qdrant.client.grpc.Collections.CreateCollection; import java.util.concurrent.ExecutionException; -public class QdrantCreateCollectionOp extends QdrantBaseOp { +public class QdrantCreateCollectionOp extends QdrantBaseOp { /** * Create a new {@link ParsedOp} encapsulating a call to the Qdrant create collection method. * @@ -35,7 +35,7 @@ public class QdrantCreateCollectionOp extends QdrantBaseOp { } @Override - public Object applyOp(long value) { + public CollectionOperationResponse applyOp(long value) { CollectionOperationResponse response = null; try { response = client.createCollectionAsync(request).get(); diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCreatePayloadIndexOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCreatePayloadIndexOp.java index b8431e184..a0d23843c 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCreatePayloadIndexOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantCreatePayloadIndexOp.java @@ -23,13 +23,13 @@ import io.qdrant.client.grpc.Points.UpdateResult; import java.time.Duration; -public class QdrantCreatePayloadIndexOp extends QdrantBaseOp { +public class QdrantCreatePayloadIndexOp extends QdrantBaseOp { public QdrantCreatePayloadIndexOp(QdrantClient client, CreateFieldIndexCollection request) { super(client, request); } @Override - public Object applyOp(long value) { + public UpdateResult applyOp(long value) { UpdateResult response; try { response = client.createPayloadIndexAsync( diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantDeleteCollectionOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantDeleteCollectionOp.java index 2b56cbacc..8be575e16 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantDeleteCollectionOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantDeleteCollectionOp.java @@ -22,13 +22,13 @@ import io.qdrant.client.grpc.Collections.DeleteCollection; import java.util.concurrent.ExecutionException; -public class QdrantDeleteCollectionOp extends QdrantBaseOp { +public class QdrantDeleteCollectionOp extends QdrantBaseOp { public QdrantDeleteCollectionOp(QdrantClient client, DeleteCollection request) { super(client, request); } @Override - public Object applyOp(long value) { + public CollectionOperationResponse applyOp(long value) { CollectionOperationResponse response = null; try { response = client.deleteCollectionAsync(request.getCollectionName()).get(); diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListCollectionAliasesOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListCollectionAliasesOp.java index 5a3664f1d..f3b82972e 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListCollectionAliasesOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListCollectionAliasesOp.java @@ -22,13 +22,13 @@ import io.qdrant.client.grpc.Collections.ListCollectionAliasesRequest; import java.time.Duration; import java.util.List; -public class QdrantListCollectionAliasesOp extends QdrantBaseOp { +public class QdrantListCollectionAliasesOp extends QdrantBaseOp> { public QdrantListCollectionAliasesOp(QdrantClient client, ListCollectionAliasesRequest request) { super(client, request); } @Override - public Object applyOp(long value) { + public List applyOp(long value) { List response; try { response = client.listCollectionAliasesAsync(request.getCollectionName(), Duration.ofSeconds(600)).get(); diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListCollectionsOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListCollectionsOp.java index 3843c4249..9f906368c 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListCollectionsOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListCollectionsOp.java @@ -21,12 +21,12 @@ import io.qdrant.client.QdrantClient; import java.time.Duration; import java.util.List; -public class QdrantListCollectionsOp extends QdrantBaseOp { +public class QdrantListCollectionsOp extends QdrantBaseOp> { public QdrantListCollectionsOp(QdrantClient client, Object request) { - super(client, request); + super(client, (Void)request); } @Override - public Object applyOp(long value) { + public List applyOp(long value) { List response; try { response = client.listCollectionsAsync(Duration.ofSeconds(300)).get(); diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListSnapshotsOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListSnapshotsOp.java index 8f816fcd4..612a0f58a 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListSnapshotsOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantListSnapshotsOp.java @@ -23,13 +23,13 @@ import io.qdrant.client.grpc.SnapshotsService.SnapshotDescription; import java.time.Duration; import java.util.List; -public class QdrantListSnapshotsOp extends QdrantBaseOp { +public class QdrantListSnapshotsOp extends QdrantBaseOp> { public QdrantListSnapshotsOp(QdrantClient client, ListSnapshotsRequest request) { super(client, request); } @Override - public Object applyOp(long value) { + public List applyOp(long value) { List response; try { response = client.listSnapshotAsync(request.getCollectionName(), Duration.ofSeconds(600)).get(); diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantSearchPointsOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantSearchPointsOp.java index a371056ce..0157c5a37 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantSearchPointsOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantSearchPointsOp.java @@ -23,13 +23,13 @@ import io.qdrant.client.grpc.Points.SearchPoints; import java.util.List; import java.util.concurrent.ExecutionException; -public class QdrantSearchPointsOp extends QdrantBaseOp { +public class QdrantSearchPointsOp extends QdrantBaseOp> { public QdrantSearchPointsOp(QdrantClient client, SearchPoints request) { super(client, request); } @Override - public Object applyOp(long value) { + public List applyOp(long value) { List response = null; try { logger.debug("[QdrantSearchPointsOp] Cycle {} has request: {}", value, request.toString()); diff --git a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantUpsertPointsOp.java b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantUpsertPointsOp.java index ec6f5bba5..b4a02bc97 100644 --- a/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantUpsertPointsOp.java +++ b/nb-adapters/adapter-qdrant/src/main/java/io/nosqlbench/adapter/qdrant/ops/QdrantUpsertPointsOp.java @@ -22,13 +22,13 @@ import io.qdrant.client.grpc.Points.UpsertPoints; import java.util.concurrent.ExecutionException; -public class QdrantUpsertPointsOp extends QdrantBaseOp { +public class QdrantUpsertPointsOp extends QdrantBaseOp { public QdrantUpsertPointsOp(QdrantClient client, UpsertPoints request) { super(client, request); } @Override - public Object applyOp(long value) { + public UpdateResult applyOp(long value) { UpdateResult response = null; String responseStatus; long responseOperationId; diff --git a/nb-adapters/adapter-tcp/src/main/java/io/nosqlbench/adapter/tcpclient/TcpClientOp.java b/nb-adapters/adapter-tcp/src/main/java/io/nosqlbench/adapter/tcpclient/TcpClientOp.java index a742c4580..202f5a397 100644 --- a/nb-adapters/adapter-tcp/src/main/java/io/nosqlbench/adapter/tcpclient/TcpClientOp.java +++ b/nb-adapters/adapter-tcp/src/main/java/io/nosqlbench/adapter/tcpclient/TcpClientOp.java @@ -27,6 +27,8 @@ public class TcpClientOp implements RunnableOp { this.ctx = ctx; this.text = text; } + + @Override public void run() { ctx.writeflush(text); } diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapter/diag/DriverAdapterLoader.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapter/diag/DriverAdapterLoader.java index de5ee0a8f..807b83f47 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapter/diag/DriverAdapterLoader.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapter/diag/DriverAdapterLoader.java @@ -20,10 +20,10 @@ package io.nosqlbench.adapter.diag; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.nb.api.labels.NBLabels; import io.nosqlbench.nb.api.components.core.NBComponent; public interface DriverAdapterLoader { - public DriverAdapter load(NBComponent parent, NBLabels childLabels); + public ,B extends Space> DriverAdapter load(NBComponent parent, NBLabels childLabels); } diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java index d100b98e8..5c8a4133a 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java @@ -20,7 +20,7 @@ import com.codahale.metrics.Timer; import groovy.lang.Binding; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.evalctx.*; import io.nosqlbench.adapters.api.metrics.ThreadLocalNamedTimers; import io.nosqlbench.adapters.api.templating.ParsedOp; @@ -46,7 +46,8 @@ import java.util.concurrent.TimeUnit; * @param * The type of operation */ -public abstract class BaseOpDispenser extends NBBaseComponent implements OpDispenser{ +public abstract class BaseOpDispenser,SPACE extends Space> + extends NBBaseComponent implements OpDispenser { protected final static Logger logger = LogManager.getLogger(BaseOpDispenser.class); public static final String VERIFIER = "verifier"; public static final String VERIFIER_INIT = "verifier-init"; diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpDispenser.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpDispenser.java index 9a5a823fd..fd34cde36 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpDispenser.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpDispenser.java @@ -16,7 +16,7 @@ package io.nosqlbench.adapters.api.activityimpl; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.evalctx.CycleFunction; import java.util.function.LongFunction; @@ -67,9 +67,9 @@ import java.util.function.LongFunction; * * @param The parameter type of the actual operation which will be used * to hold all the details for executing an operation, - * something that implements {@link Op}. + * something that implements {@link io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp}. */ -public interface OpDispenser extends LongFunction, OpResultTracker { +public interface OpDispenser> extends LongFunction, OpResultTracker { /** * The apply method in an op dispenser should do all the work of diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpMapper.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpMapper.java index 8bd2acc74..078fe2802 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpMapper.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpMapper.java @@ -18,12 +18,10 @@ package io.nosqlbench.adapters.api.activityimpl; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.templating.ParsedOp; import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.IntFunction; import java.util.function.LongFunction; /** @@ -83,7 +81,7 @@ import java.util.function.LongFunction; * to hold all the details for executing an operation, * generally something that implements {@link Runnable}. */ -public interface OpMapper +public interface OpMapper, SPACETYPE extends Space> extends BiFunction, OpDispenser> { /** @@ -96,6 +94,7 @@ public interface OpMapper * @param spaceInitF * @return An OpDispenser which can be used to synthesize real operations. */ - OpDispenser apply(ParsedOp op, LongFunction spaceInitF); + @Override + OpDispenser apply(ParsedOp op, LongFunction spaceInitF); } diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/docs/BundledDriverAdapterDocs.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/docs/BundledDriverAdapterDocs.java index c247f9fbf..2c66f52c8 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/docs/BundledDriverAdapterDocs.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/docs/BundledDriverAdapterDocs.java @@ -19,7 +19,7 @@ package io.nosqlbench.adapters.api.activityimpl.docs; import io.nosqlbench.adapter.diag.DriverAdapterLoader; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.nb.api.docsapi.BundledMarkdownManifest; import io.nosqlbench.nb.api.docsapi.Docs; import io.nosqlbench.nb.api.docsapi.DocsBinder; @@ -41,7 +41,7 @@ public class BundledDriverAdapterDocs implements BundledMarkdownManifest { List> namedProviders = loader.getNamedProviders(); for (SimpleServiceLoader.Component namedProvider : namedProviders) { DriverAdapterLoader driverAdapterLoader = namedProvider.provider.get(); - DriverAdapter driverAdapter = driverAdapterLoader.load( + DriverAdapter, Space> driverAdapter = driverAdapterLoader.load( NBComponent.EMPTY_COMPONENT, NBLabels.forKV() ); diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseDriverAdapter.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseDriverAdapter.java index ad95d6f60..2c6d87163 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseDriverAdapter.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseDriverAdapter.java @@ -16,8 +16,8 @@ package io.nosqlbench.adapters.api.activityimpl.uniform; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import io.nosqlbench.adapters.api.activityimpl.uniform.fieldmappers.FieldDestructuringMapper; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.nb.api.config.standard.*; import io.nosqlbench.nb.api.labels.NBLabels; @@ -33,10 +33,9 @@ import java.util.Optional; import java.util.function.Function; import java.util.function.LongFunction; import java.util.function.LongToIntFunction; -import java.util.function.LongUnaryOperator; import java.util.stream.Collectors; -public abstract class BaseDriverAdapter extends NBBaseComponent implements DriverAdapter, NBConfigurable, NBReconfigurable { +public abstract class BaseDriverAdapter, S extends Space> extends NBBaseComponent implements DriverAdapter, NBConfigurable, NBReconfigurable { private final static Logger logger = LogManager.getLogger("ADAPTER"); private ConcurrentSpaceCache spaceCache; diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseSpace.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseSpace.java index 21e3a1fd8..75428e2f9 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseSpace.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseSpace.java @@ -18,10 +18,7 @@ package io.nosqlbench.adapters.api.activityimpl.uniform; */ -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; - -import java.util.function.IntFunction; -import java.util.function.LongFunction; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; public class BaseSpace > implements Space { @@ -39,7 +36,7 @@ public class BaseSpace > implements Space { } public static class BasicSpace extends BaseSpace implements Space { - public BasicSpace(DriverAdapter adapter, long idx) { + public BasicSpace(DriverAdapter, BasicSpace> adapter, long idx) { super(adapter, idx); } } diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverAdapter.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverAdapter.java index 629ea1fb6..e3551938c 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverAdapter.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverAdapter.java @@ -18,7 +18,7 @@ package io.nosqlbench.adapters.api.activityimpl.uniform; import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.activityimpl.OpMapper; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.nb.api.docsapi.Docs; import io.nosqlbench.nb.api.docsapi.DocsBinder; import io.nosqlbench.adapters.api.templating.ParsedOp; @@ -33,7 +33,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; -import java.util.function.IntFunction; import java.util.function.LongFunction; /** @@ -56,7 +55,7 @@ import java.util.function.LongFunction; * during construction of R type operations, or even for individual * operations. */ -public interface DriverAdapter extends NBComponent { +public interface DriverAdapter, SPACETYPE extends Space> extends NBComponent { /** *

diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ChainingOp.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ChainingOp.java deleted file mode 100644 index d9db8409f..000000000 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ChainingOp.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2022-2023 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.adapters.api.activityimpl.uniform.flowtypes; - -import java.util.function.Function; - -/** - *

ChainingOp<I,O>: f(I) -> O<I,O>

- *

- * Run a function on the current cached result in the current thread and replace it - * with the result of the function. ChainingOps are one way of invoking - * logic within a cycle. However, they are not intended to stand alone. - * A ChainingOp must always have an input to work on, - * provided by either a {@link CycleOp} OR another call to a {@link ChainingOp}

- * - * @param Some input type, as determined by a previous {@link CycleOp} or {@link ChainingOp} on the same thread. - * @param Some output type. - */ -public interface ChainingOp extends Op, Function { - - /** - * Transform a value from a previous action and provide the result for a subsequent action. - * - * @param lastResult object form a previous operation or action - * @return a new result - */ - @Override - O apply(I lastResult); -} diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/CycleOp.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/CycleOp.java index 98bb56da6..bc08b8208 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/CycleOp.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/CycleOp.java @@ -27,12 +27,6 @@ import java.util.function.LongFunction; * and produces a value of type T. It is implemented as * {@link LongFunction} of T.

* - *

This variant of {@link Op} has the ability to see the cycle - * which was previously used to select the op implementation.

- * - *

It also has the ability to emit an value which can be seen a subsequent operation, if - * and only if it is a {@link ChainingOp}s.

- * *

Designer Notes

*

* If you are using the value in this call to select a specific type of behavior, it is very @@ -43,12 +37,11 @@ import java.util.function.LongFunction; *

* */ -public interface CycleOp extends Op, LongFunction { +public interface CycleOp extends LongFunction { /** *

Run an action for the given cycle.

* * @param value The cycle value for which an operation is run - * @return A result object which may be used by a subsequent {@link ChainingOp} */ @Override T apply(long value); diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/Op.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/Op.java deleted file mode 100644 index 65b3b8cc5..000000000 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/Op.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2022-2023 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.adapters.api.activityimpl.uniform.flowtypes; - -/** - *

This is the root type of any operation which is used in a NoSQLBench - * DriverAdapter. It is a tagging interface for incremental type validation - * in the NB runtime. You probably don't want to use it directly.

- * - *

Instead, use one of these: - *

    - *
  • {@link CycleOp}
  • - An interface that will called if there is nothing to consume - * the result type from your operation. In some cases preparing a result body to - * hand down the chain is more costly, so implementing this interface allows the runtime - * to be more optimized. - *
  • {@link ChainingOp}
  • - *
  • {@link RunnableOp}
  • - *
- *

- */ -// TODO: optimize the runtime around the specific op type -public interface Op { -} diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpGenerator.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpGenerator.java index 1b5b1a34d..8fe6cde6c 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpGenerator.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpGenerator.java @@ -31,5 +31,5 @@ package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes; * */ public interface OpGenerator { - Op getNextOp(); + CycleOp getNextOp(); } diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableOp.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableOp.java index 0bab5c267..524123edf 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableOp.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableOp.java @@ -1,34 +1,28 @@ +package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes; + /* - * Copyright (c) 2022-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. * 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. + * + * 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.adapters.api.activityimpl.uniform.flowtypes; -/** - *

RunnableOp

- *

This is the simplest form of an executable operation in NoSQLBench. - * It is simply an operation is run for side-effect only.

- */ -public interface RunnableOp extends Op, Runnable { +public interface RunnableOp extends CycleOp,Runnable { - /** - * Invoke the operation. If you need to see the value of the current - * cycle, then you can use {@link CycleOp} instead. If you need to - * use a cached result of a previous operation, then you may need to - * use {@link ChainingOp}. - */ @Override - void run(); + default Void apply(long value) { + run(); + return null; + } } diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ops_pre_2057.png b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ops_pre_2057.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c7415d532b1f39d8beb2b3e43cef65492ecbba GIT binary patch literal 43130 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

-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 literal 0 HcmV?d00001 diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryCycleOp.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryCycleOp.java index 549ac043e..f8574b11c 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryCycleOp.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryCycleOp.java @@ -17,7 +17,6 @@ package io.nosqlbench.adapters.api.activityimpl.uniform.opwrappers; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp; public class DryCycleOp implements CycleOp { diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryCycleOpDispenserWrapper.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryCycleOpDispenserWrapper.java index d8a7b0129..e9402b3f9 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryCycleOpDispenserWrapper.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryCycleOpDispenserWrapper.java @@ -21,7 +21,6 @@ import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp; import io.nosqlbench.adapters.api.templating.ParsedOp; public class DryCycleOpDispenserWrapper extends BaseOpDispenser, S> { diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryRunableOp.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryRunableOp.java deleted file mode 100644 index 2d541bb7f..000000000 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryRunableOp.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2022-2024 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.adapters.api.activityimpl.uniform.opwrappers; - -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp; - -public class DryRunableOp implements RunnableOp { - - private final RunnableOp op; - - public DryRunableOp(RunnableOp op) { - this.op = op; - } - - @Override - public void run() { - } -} diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryRunnableOpDispenserWrapper.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryRunnableOpDispenserWrapper.java deleted file mode 100644 index 7faf56add..000000000 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/DryRunnableOpDispenserWrapper.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2022-2024 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.adapters.api.activityimpl.uniform.opwrappers; - -import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser; -import io.nosqlbench.adapters.api.activityimpl.OpDispenser; -import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; -import io.nosqlbench.adapters.api.activityimpl.uniform.Space; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp; -import io.nosqlbench.adapters.api.templating.ParsedOp; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class DryRunnableOpDispenserWrapper extends BaseOpDispenser { - private final OpDispenser realDispenser; - - public DryRunnableOpDispenserWrapper( - DriverAdapter adapter, - ParsedOp pop, - OpDispenser realDispenser - ) { - super(adapter, pop); - this.realDispenser = realDispenser; - logger.warn( - "initialized {} for dry run only. " + - "This op will be synthesized for each cycle, but will not be executed.", - pop.getName() - ); - - } - - @Override - public DryRunableOp getOp(long cycle) { - RunnableOp op = realDispenser.getOp(cycle); - return new DryRunableOp(op); - } -} diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterCycleOpDispenserWrapper.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterCycleOpDispenserWrapper.java index dc587a6d6..22fc1b10c 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterCycleOpDispenserWrapper.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterCycleOpDispenserWrapper.java @@ -21,7 +21,6 @@ import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp; import io.nosqlbench.adapters.api.templating.ParsedOp; public class EmitterCycleOpDispenserWrapper extends BaseOpDispenser, S> { diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterOpDispenserWrapper.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterOpDispenserWrapper.java index 904e964a2..4eb8d88d8 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterOpDispenserWrapper.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterOpDispenserWrapper.java @@ -21,14 +21,14 @@ import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import io.nosqlbench.adapters.api.templating.ParsedOp; -public class EmitterOpDispenserWrapper extends BaseOpDispenser { +public class EmitterOpDispenserWrapper extends BaseOpDispenser, Space> { private final OpDispenser> realDispenser; - public EmitterOpDispenserWrapper(DriverAdapter adapter, ParsedOp pop, OpDispenser> realDispenser) { + public EmitterOpDispenserWrapper(DriverAdapter,Space> adapter, ParsedOp pop, + OpDispenser> realDispenser) { super(adapter, pop); this.realDispenser = realDispenser; } diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterRunnableOp.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterRunnableOp.java deleted file mode 100644 index b0ba625c3..000000000 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterRunnableOp.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2022-2024 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.adapters.api.activityimpl.uniform.opwrappers; - -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp; - -public class EmitterRunnableOp implements RunnableOp { - - private final RunnableOp runnableOp; - public EmitterRunnableOp(RunnableOp runnableOp) { - this.runnableOp = runnableOp; - } - - @Override - public void run() { - runnableOp.run(); - } -} diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterRunnableOpDispenserWrapper.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterRunnableOpDispenserWrapper.java deleted file mode 100644 index 2d90774c7..000000000 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/EmitterRunnableOpDispenserWrapper.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2022-2024 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.adapters.api.activityimpl.uniform.opwrappers; - -import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser; -import io.nosqlbench.adapters.api.activityimpl.OpDispenser; -import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; -import io.nosqlbench.adapters.api.activityimpl.uniform.Space; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp; -import io.nosqlbench.adapters.api.templating.ParsedOp; - -public class EmitterRunnableOpDispenserWrapper extends BaseOpDispenser { - - private final OpDispenser realDispenser; - - public EmitterRunnableOpDispenserWrapper( - DriverAdapter adapter, - ParsedOp pop, - OpDispenser realDispenser - ) { - super(adapter, pop); - this.realDispenser = realDispenser; - logger.warn( - "initialized {} for to emit the result type to stdout. ", - pop.getName() - ); - - } - - @Override - public EmitterRunnableOp getOp(long cycle) { - RunnableOp cycleOp = realDispenser.getOp(cycle); - return new EmitterRunnableOp(cycleOp); - } -} diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/PollingOp.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/PollingOp.java index ebdad3add..bcad502b9 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/PollingOp.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/opwrappers/PollingOp.java @@ -17,14 +17,11 @@ package io.nosqlbench.adapters.api.activityimpl.uniform.opwrappers; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.OpGenerator; import io.nosqlbench.adapters.api.evalctx.CycleFunction; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.function.Predicate; - public class PollingOp implements CycleOp, OpGenerator { private final static Logger logger = LogManager.getLogger(PollingOp.class); @@ -52,7 +49,7 @@ public class PollingOp implements CycleOp, OpGenerator { } @Override - public synchronized Op getNextOp() { + public synchronized CycleOp getNextOp() { return nextOp; } diff --git a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityapi/planning/OpSource.java b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityapi/planning/OpSource.java index 138f16780..9b88561df 100644 --- a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityapi/planning/OpSource.java +++ b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityapi/planning/OpSource.java @@ -17,7 +17,6 @@ package io.nosqlbench.engine.api.activityapi.planning; import io.nosqlbench.adapters.api.activityimpl.OpDispenser; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import java.util.function.LongFunction; @@ -29,7 +28,7 @@ import java.util.function.LongFunction; */ public interface OpSource extends LongFunction { - static OpSource of(OpSequence> seq) { + static > OpSource of(OpSequence> seq) { return (long l) -> seq.apply(l).getOp(l); } diff --git a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/OpWrappers.java b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/OpWrappers.java index 30d45924f..be32097e4 100644 --- a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/OpWrappers.java +++ b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/OpWrappers.java @@ -22,14 +22,9 @@ import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp; import io.nosqlbench.adapters.api.activityimpl.uniform.opwrappers.DryCycleOpDispenserWrapper; -import io.nosqlbench.adapters.api.activityimpl.uniform.opwrappers.DryRunnableOpDispenserWrapper; import io.nosqlbench.adapters.api.activityimpl.uniform.opwrappers.EmitterCycleOpDispenserWrapper; -import io.nosqlbench.adapters.api.activityimpl.uniform.opwrappers.EmitterRunnableOpDispenserWrapper; import io.nosqlbench.adapters.api.templating.ParsedOp; -import io.nosqlbench.nb.api.errors.OpConfigError; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -37,7 +32,7 @@ public class OpWrappers { public final static Logger logger = LogManager.getLogger(OpWrappers.class); - public static OpDispenser wrapOptionally( + public static , SPACE extends Space> OpDispenser wrapOptionally( DriverAdapter adapter, OpDispenser dispenser, ParsedOp pop, @@ -46,27 +41,8 @@ public class OpWrappers { Dryrun dryrun = Dryrun.valueOf(dryrunSpec); return switch (dryrun) { case none -> dispenser; - case op -> { - Op exampleOp = dispenser.getOp(0L); - yield switch (exampleOp) { - case RunnableOp runnableOp -> new DryRunnableOpDispenserWrapper(adapter, pop, dispenser); - case CycleOp cycleOp -> new DryCycleOpDispenserWrapper(adapter, pop, dispenser); - default -> throw new OpConfigError( - "Unable to wrap op named '" - + pop.getDefinedNames() + "' for dry run, since" - + "only RunnableOp and CycleOp types are supported"); - }; - } - case emit -> { - Op exampleOp = dispenser.getOp(0L); - yield switch (exampleOp) { - case RunnableOp runnableOp -> new EmitterRunnableOpDispenserWrapper(adapter, pop, dispenser); - case CycleOp cycleOp -> new EmitterCycleOpDispenserWrapper(adapter, pop, dispenser); - default -> - throw new OpConfigError("Unable to make op named '" + pop.getName() + "' emit a value, " + - "since only RunnableOp and CycleOp types are supported"); - }; - } + case op -> new DryCycleOpDispenserWrapper(adapter, pop, dispenser); + case emit -> new EmitterCycleOpDispenserWrapper(adapter, pop, dispenser); }; } } diff --git a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java index 06736c3ab..f02cd8566 100644 --- a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java +++ b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java @@ -26,11 +26,6 @@ import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; import io.nosqlbench.adapters.api.activityimpl.uniform.decorators.SyntheticOpTemplateProvider; import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp; -import io.nosqlbench.adapters.api.activityimpl.uniform.opwrappers.DryRunnableOpDispenserWrapper; -import io.nosqlbench.adapters.api.activityimpl.uniform.opwrappers.EmitterCycleOpDispenserWrapper; -import io.nosqlbench.adapters.api.activityimpl.uniform.opwrappers.EmitterRunnableOpDispenserWrapper; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.engine.api.activityapi.core.*; import io.nosqlbench.engine.api.activityapi.core.progress.ActivityMetricProgressMeter; @@ -396,10 +391,10 @@ public class SimpleActivity extends NBStatusComponent implements Activity, Invok } - protected OpSequence> createOpSourceFromParsedOps( + protected OpSequence>> createOpSourceFromParsedOps( // Map> adapterCache, // Map> mapperCache, - List> adapters, + List, Space>> adapters, List pops ) { try { @@ -415,7 +410,7 @@ public class SimpleActivity extends NBStatusComponent implements Activity, Invok .getOptionalString("seq") .map(SequencerType::valueOf) .orElse(SequencerType.bucket); - SequencePlanner> planner = new SequencePlanner<>(sequencerType); + SequencePlanner>> planner = new SequencePlanner<>(sequencerType); for (int i = 0; i < pops.size(); i++) { long ratio = ratios.get(i); @@ -427,17 +422,17 @@ public class SimpleActivity extends NBStatusComponent implements Activity, Invok continue; } - DriverAdapter adapter = adapters.get(i); - OpMapper opMapper = adapter.getOpMapper(); + DriverAdapter, Space> adapter = adapters.get(i); + OpMapper, Space> opMapper = adapter.getOpMapper(); LongFunction spaceFunc = adapter.getSpaceFunc(pop); - OpDispenser dispenser = opMapper.apply(pop, spaceFunc); + OpDispenser> dispenser = opMapper.apply(pop, spaceFunc); String dryrunSpec = pop.takeStaticConfigOr("dryrun", "none"); dispenser = OpWrappers.wrapOptionally(adapter, dispenser, pop, dryrunSpec); // if (strict) { // optemplate.assertConsumed(); // } - planner.addOp((OpDispenser) dispenser, ratio); + planner.addOp((OpDispenser>) dispenser, ratio); } catch (Exception e) { throw new OpConfigError("Error while mapping op from template named '" + pop.getName() + "': " + e.getMessage(), e); } diff --git a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java index b2a297021..d236bab8a 100644 --- a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java +++ b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java @@ -25,7 +25,7 @@ import io.nosqlbench.adapters.api.activityimpl.OpMapper; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.activityimpl.uniform.Space; import io.nosqlbench.adapters.api.activityimpl.uniform.decorators.SyntheticOpTemplateProvider; -import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; +import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.nb.api.engine.metrics.instruments.MetricCategory; import io.nosqlbench.nb.api.lifecycle.Shutdownable; @@ -60,10 +60,10 @@ import java.util.concurrent.ConcurrentHashMap; * @param * The context type for the activity, AKA the 'space' for a named driver instance and its associated object graph */ -public class StandardActivity extends SimpleActivity implements SyntheticOpTemplateProvider, ActivityDefObserver { +public class StandardActivity extends SimpleActivity implements SyntheticOpTemplateProvider, ActivityDefObserver { private static final Logger logger = LogManager.getLogger("ACTIVITY"); - private final OpSequence> sequence; - private final ConcurrentHashMap> adapters = new ConcurrentHashMap<>(); + private final OpSequence>> sequence; + private final ConcurrentHashMap,Space>> adapters = new ConcurrentHashMap<>(); public StandardActivity(NBComponent parent, ActivityDef activityDef) { super(parent, activityDef); @@ -93,11 +93,11 @@ public class StandardActivity extends SimpleActivity implements List pops = new ArrayList<>(); - List> adapterlist = new ArrayList<>(); + List, Space>> adapterlist = new ArrayList<>(); NBConfigModel supersetConfig = ConfigModel.of(StandardActivity.class).add(yamlmodel); Optional defaultDriverOption = defaultDriverName; - ConcurrentHashMap> mappers = new ConcurrentHashMap<>(); + ConcurrentHashMap, ? extends Space>> mappers = new ConcurrentHashMap<>(); for (OpTemplate ot : opTemplates) { // ParsedOp incompleteOpDef = new ParsedOp(ot, NBConfiguration.empty(), List.of(), this); String driverName = ot.getOptionalStringParam("driver", String.class) @@ -113,7 +113,7 @@ public class StandardActivity extends SimpleActivity implements // HERE if (!adapters.containsKey(driverName)) { - DriverAdapter adapter = Optional.of(driverName) + DriverAdapter,Space> adapter = Optional.of(driverName) .flatMap( name -> ServiceSelector.of( name, @@ -145,7 +145,7 @@ public class StandardActivity extends SimpleActivity implements supersetConfig.assertValidConfig(activityDef.getParams().getStringStringMap()); - DriverAdapter adapter = adapters.get(driverName); + DriverAdapter, Space> adapter = adapters.get(driverName); adapterlist.add(adapter); ParsedOp pop = new ParsedOp(ot, adapter.getConfiguration(), List.of(adapter.getPreprocessor()), this); Optional discard = pop.takeOptionalStaticValue("driver", String.class); @@ -195,7 +195,7 @@ public class StandardActivity extends SimpleActivity implements } - public OpSequence> getOpSequence() { + public OpSequence>> getOpSequence() { return sequence; } @@ -262,7 +262,7 @@ public class StandardActivity extends SimpleActivity implements */ @Override public void shutdownActivity() { - for (Map.Entry> entry : adapters.entrySet()) { + for (Map.Entry,Space>> entry : adapters.entrySet()) { String adapterName = entry.getKey(); DriverAdapter adapter = entry.getValue(); for (Space space : adapter.getSpaceCache()) { diff --git a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/actions/StandardAction.java b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/actions/StandardAction.java index 05d4bd507..d45e01e86 100644 --- a/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/actions/StandardAction.java +++ b/nb-engine/nb-engine-core/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/actions/StandardAction.java @@ -46,7 +46,7 @@ import java.util.concurrent.TimeUnit; * @param * The type of operation */ -public class StandardAction, R extends Op> implements SyncAction, ActivityDefObserver { +public class StandardAction, R extends java.util.function.LongFunction> implements SyncAction, ActivityDefObserver { private final static Logger logger = LogManager.getLogger("ACTION"); private final Timer executeTimer; private final Histogram triesHistogram; @@ -54,7 +54,7 @@ public class StandardAction, R extends Op> impl private final Timer resultTimer; private final Timer bindTimer; private final NBErrorHandler errorHandler; - private final OpSequence> opsequence; + private final OpSequence>> opsequence; private final int maxTries; private final Timer verifierTimer; @@ -73,8 +73,8 @@ public class StandardAction, R extends Op> impl @Override public int runCycle(long cycle) { - OpDispenser dispenser=null; - Op op = null; + OpDispenser> dispenser=null; + CycleOp op = null; try (Timer.Context ct = bindTimer.time()) { dispenser = opsequence.apply(cycle); @@ -96,16 +96,7 @@ public class StandardAction, R extends Op> impl dispenser.onStart(cycle); try (Timer.Context ct = executeTimer.time()) { - if (op instanceof RunnableOp runnableOp) { - runnableOp.run(); - } else if (op instanceof CycleOp cycleOp) { - result = cycleOp.apply(cycle); - } else if (op instanceof ChainingOp chainingOp) { - result = chainingOp.apply(result); - } else { - throw new RuntimeException("The op implementation did not implement any active logic. Implement " + - "one of [RunnableOp, CycleOp, or ChainingOp]"); - } + result = op.apply(cycle); // TODO: break out validation timer from execute try (Timer.Context ignored = verifierTimer.time()) { CycleFunction verifier = dispenser.getVerifier(); diff --git a/nb-virtdata/virtdata-lib-realer/src/main/java/io/nosqlbench/virtdata/library/realer/todo/inet/IPV4Addrses.java b/nb-virtdata/virtdata-lib-realer/src/main/java/io/nosqlbench/virtdata/library/realer/todo/inet/IPV4Address.java similarity index 96% rename from nb-virtdata/virtdata-lib-realer/src/main/java/io/nosqlbench/virtdata/library/realer/todo/inet/IPV4Addrses.java rename to nb-virtdata/virtdata-lib-realer/src/main/java/io/nosqlbench/virtdata/library/realer/todo/inet/IPV4Address.java index c5a4317ed..e353ff162 100644 --- a/nb-virtdata/virtdata-lib-realer/src/main/java/io/nosqlbench/virtdata/library/realer/todo/inet/IPV4Addrses.java +++ b/nb-virtdata/virtdata-lib-realer/src/main/java/io/nosqlbench/virtdata/library/realer/todo/inet/IPV4Address.java @@ -16,5 +16,5 @@ package io.nosqlbench.virtdata.library.realer.todo.inet; -public class IPV4Addrses { +public class IPV4Address { }