From 4fdd39fff992830fc446a5191234ac7dbb3e8775 Mon Sep 17 00:00:00 2001
From: Jonathan Shook
Date: Tue, 25 Jul 2023 11:31:46 -0500
Subject: [PATCH 01/14] adapters api changes for vector branch and other fixes
---
adapters-api/pom.xml | 5 +
.../api/activityconfig/MultiMapLookup.java | 4 +-
.../api/activityconfig/OpsLoader.java | 16 +-
.../api/activityconfig/rawyaml/OpsOwner.java | 2 +-
.../api/activityconfig/rawyaml/RawOpDef.java | 28 ++-
.../activityconfig/rawyaml/RawOpFields.java | 2 +-
.../activityconfig/rawyaml/RawOpsBlock.java | 2 +-
.../api/activityconfig/rawyaml/RawOpsDoc.java | 4 +-
.../activityconfig/rawyaml/RawOpsDocList.java | 2 +-
.../activityconfig/rawyaml/RawOpsLoader.java | 4 +-
.../activityconfig/rawyaml/RawScenarios.java | 4 +-
.../activityconfig/rawyaml/RawYamlLoader.java | 4 +-
.../api/activityconfig/rawyaml/Tags.java | 4 +-
.../api/activityconfig/yaml/OpData.java | 4 +-
.../api/activityconfig/yaml/OpDef.java | 6 +-
.../api/activityconfig/yaml/OpTemplate.java | 9 +-
.../activityconfig/yaml/OpTemplateFormat.java | 6 +-
.../api/activityconfig/yaml/OpsBlock.java | 8 +-
.../api/activityconfig/yaml/OpsDoc.java | 6 +-
.../api/activityconfig/yaml/OpsDocList.java | 10 +-
.../api/activityconfig/yaml/Scenarios.java | 6 +-
.../api/activityimpl/BaseOpDispenser.java | 201 ++++++++++++++++++
.../api/activityimpl/OpDispenser.java | 8 +-
.../api/activityimpl/OpMapper.java | 11 +-
.../api/activityimpl/OpResultTracker.java | 4 +-
.../api/activityimpl/StandardCycleOp.java | 6 +-
.../docs/BundledDriverAdapterDocs.java | 4 +-
.../uniform/BaseDriverAdapter.java | 8 +-
.../activityimpl/uniform/DriverAdapter.java | 12 +-
.../uniform/DriverSpaceCache.java | 2 +-
.../api/activityimpl/uniform/DryRunOp.java | 26 +--
.../uniform/DryRunOpDispenserWrapper.java | 37 ++++
.../activityimpl/uniform/ResultProcessor.java | 4 +-
.../SyntheticOpTemplateProvider.java | 8 +-
.../FieldDestructuringMapper.java | 4 +-
.../uniform/flowtypes/ChainingOp.java | 4 +-
.../uniform/flowtypes/CycleOp.java | 11 +-
.../activityimpl/uniform/flowtypes/Op.java | 2 +-
.../uniform/flowtypes/OpGenerator.java | 4 +-
.../uniform/flowtypes/OpResultSize.java | 4 +-
.../uniform/flowtypes/RunnableOp.java | 4 +-
.../uniform/flowtypes/RunnableSource.java | 4 +-
.../uniform/flowtypes/VariableCapture.java | 2 +-
.../evalcontext/CompoundCycleFunction.java | 69 ++++++
.../api/evalcontext/CycleFunction.java | 38 ++++
.../api/evalcontext/CycleFunctions.java | 59 +++++
.../api/evalcontext/ExpressionDetails.java | 8 +-
.../GroovyBooleanCycleFunction.java | 34 +++
.../api/evalcontext/GroovyCycleFunction.java | 146 +++++++++++++
.../GroovyObjectEqualityFunction.java | 58 +++++
.../api/evalcontext/ResultMismatchError.java | 50 +++++
.../evalcontext/ResultVerificationError.java | 50 +++++
.../api/evalcontext/VariableInjectable.java | 28 +++
.../metrics/EndToEndMetricsAdapterUtil.java | 2 +-
.../MessageSequenceNumberSendingHandler.java | 4 +-
.../ReceivedMessageSequenceTracker.java | 2 +-
.../api/metrics/ThreadLocalNamedTimers.java | 4 +-
.../api/specifications/SpecDocsManifest.java | 2 +-
.../api/templating/CommandTemplate.java | 4 +-
.../templating/DriverAdapterDecorators.java | 8 +-
.../api/templating/EnumSetter.java | 4 +-
.../api/templating/ParsedOp.java | 15 +-
.../api/templating/StrInterpolator.java | 4 +-
.../api/util/AdaptersApiVersionInfo.java | 2 +-
.../api/util/TagFilter.java | 2 +-
.../api/activityimpl/BaseOpDispenser.java | 139 ------------
.../api/activityimpl/uniform/DryRunOp.java | 33 ---
.../uniform/DryRunOpDispenserWrapper.java | 38 ----
.../02_workload_structure.md | 8 +-
.../07_template_variables.md | 77 ++++---
.../activityconfig/MultiMapLookupTest.java | 4 +-
.../api/activityconfig/OpsLoaderTest.java | 6 +-
.../rawyaml/BindingEscapingTest.java | 4 +-
.../api/activityconfig/rawyaml/OpDefTest.java | 12 +-
.../rawyaml/OpEscapingTest.java | 9 +-
.../rawyaml/OpVariationTests.java | 2 +-
.../rawyaml/RawYamlTemplateLoaderTest.java | 7 +-
.../SpecificationDocsManifest.java | 2 +-
.../UniformWorkloadSpecificationTest.java | 2 +-
.../specifications/YamlSpecValidator.java | 12 +-
.../yaml/OpDetailOverrideTest.java | 4 +-
.../activityconfig/yaml/OpsDocListTest.java | 13 +-
.../yaml/ParsedWorkloadTemplateTest.java | 4 +-
.../CompoundCycleFunctionTest.java | 65 ++++++
.../GroovyBooleanCycleFunctionTest.java | 57 +++++
...ssageSequenceNumberSendingHandlerTest.java | 4 +-
.../ReceivedMessageSequenceTrackerTest.java | 2 +-
.../api/templating/ParsedOpTest.java | 12 +-
.../api/templating/StrInterpolatorTest.java | 9 +-
.../adapters}/api/util/TagFilterTest.java | 4 +-
90 files changed, 1190 insertions(+), 438 deletions(-)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/MultiMapLookup.java (97%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/OpsLoader.java (92%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/OpsOwner.java (98%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/RawOpDef.java (78%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/RawOpFields.java (98%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/RawOpsBlock.java (94%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/RawOpsDoc.java (97%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/RawOpsDocList.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/RawOpsLoader.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/RawScenarios.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/RawYamlLoader.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/Tags.java (94%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/OpData.java (98%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/OpDef.java (95%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/OpTemplate.java (97%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/OpTemplateFormat.java (93%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/OpsBlock.java (93%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/OpsDoc.java (94%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/OpsDocList.java (94%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/Scenarios.java (86%)
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/OpDispenser.java (95%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/OpMapper.java (92%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/OpResultTracker.java (89%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/StandardCycleOp.java (84%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/docs/BundledDriverAdapterDocs.java (93%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/BaseDriverAdapter.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/DriverAdapter.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/DriverSpaceCache.java (97%)
rename nb-api/src/main/java/io/nosqlbench/api/errors/ExpectedResultVerificationError.java => adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DryRunOp.java (51%)
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DryRunOpDispenserWrapper.java
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/ResultProcessor.java (94%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/decorators/SyntheticOpTemplateProvider.java (86%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/fieldmappers/FieldDestructuringMapper.java (95%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/flowtypes/ChainingOp.java (93%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/flowtypes/CycleOp.java (84%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/flowtypes/Op.java (95%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/flowtypes/OpGenerator.java (92%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/flowtypes/OpResultSize.java (90%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/flowtypes/RunnableOp.java (91%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/flowtypes/RunnableSource.java (86%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/activityimpl/uniform/flowtypes/VariableCapture.java (94%)
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CompoundCycleFunction.java
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CycleFunction.java
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CycleFunctions.java
rename engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ops/fluent/FluentOp.java => adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ExpressionDetails.java (78%)
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyBooleanCycleFunction.java
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyCycleFunction.java
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyObjectEqualityFunction.java
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ResultMismatchError.java
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ResultVerificationError.java
create mode 100644 adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/VariableInjectable.java
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/metrics/EndToEndMetricsAdapterUtil.java (97%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/metrics/MessageSequenceNumberSendingHandler.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/metrics/ReceivedMessageSequenceTracker.java (99%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/metrics/ThreadLocalNamedTimers.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/specifications/SpecDocsManifest.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/templating/CommandTemplate.java (99%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/templating/DriverAdapterDecorators.java (82%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/templating/EnumSetter.java (96%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/templating/ParsedOp.java (98%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/templating/StrInterpolator.java (98%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/util/AdaptersApiVersionInfo.java (98%)
rename adapters-api/src/main/java/io/nosqlbench/{engine => adapters}/api/util/TagFilter.java (99%)
delete mode 100644 adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/BaseOpDispenser.java
delete mode 100644 adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/DryRunOp.java
delete mode 100644 adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/DryRunOpDispenserWrapper.java
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/MultiMapLookupTest.java (92%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/OpsLoaderTest.java (90%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/BindingEscapingTest.java (94%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/OpDefTest.java (94%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/OpEscapingTest.java (85%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/OpVariationTests.java (98%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/rawyaml/RawYamlTemplateLoaderTest.java (94%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/specifications/SpecificationDocsManifest.java (93%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/specifications/UniformWorkloadSpecificationTest.java (96%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/specifications/YamlSpecValidator.java (94%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/OpDetailOverrideTest.java (96%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/OpsDocListTest.java (93%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/activityconfig/yaml/ParsedWorkloadTemplateTest.java (95%)
create mode 100644 adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/CompoundCycleFunctionTest.java
create mode 100644 adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/GroovyBooleanCycleFunctionTest.java
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/metrics/MessageSequenceNumberSendingHandlerTest.java (96%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/metrics/ReceivedMessageSequenceTrackerTest.java (99%)
rename adapters-api/src/test/java/io/nosqlbench/{engine => adapters}/api/templating/ParsedOpTest.java (95%)
rename {engine-api/src/test/java/io/nosqlbench/engine => adapters-api/src/test/java/io/nosqlbench/adapters}/api/templating/StrInterpolatorTest.java (96%)
rename {engine-api/src/test/java/io/nosqlbench/engine => adapters-api/src/test/java/io/nosqlbench/adapters}/api/util/TagFilterTest.java (98%)
diff --git a/adapters-api/pom.xml b/adapters-api/pom.xml
index e4d21ee10..44a598aca 100644
--- a/adapters-api/pom.xml
+++ b/adapters-api/pom.xml
@@ -72,6 +72,11 @@
2.13.11
+
+ org.apache.groovy
+ groovy
+
+
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/MultiMapLookup.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/MultiMapLookup.java
similarity index 97%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/MultiMapLookup.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/MultiMapLookup.java
index cf60f74b0..ff404bd50 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/MultiMapLookup.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/MultiMapLookup.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig;
+package io.nosqlbench.adapters.api.activityconfig;
import org.jetbrains.annotations.NotNull;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/OpsLoader.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/OpsLoader.java
similarity index 92%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/OpsLoader.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/OpsLoader.java
index cd64f1606..f0e51337f 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/OpsLoader.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/OpsLoader.java
@@ -14,17 +14,17 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig;
+package io.nosqlbench.adapters.api.activityconfig;
import com.amazonaws.util.StringInputStream;
import io.nosqlbench.api.content.Content;
import io.nosqlbench.api.content.NBIO;
import io.nosqlbench.api.errors.BasicError;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpsDocList;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpsLoader;
-import io.nosqlbench.engine.api.activityconfig.yaml.OpTemplateFormat;
-import io.nosqlbench.engine.api.activityconfig.yaml.OpsDocList;
-import io.nosqlbench.engine.api.templating.StrInterpolator;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpsDocList;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpsLoader;
+import io.nosqlbench.adapters.api.activityconfig.yaml.OpTemplateFormat;
+import io.nosqlbench.adapters.api.activityconfig.yaml.OpsDocList;
+import io.nosqlbench.adapters.api.templating.StrInterpolator;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import scala.Option;
@@ -81,9 +81,7 @@ public class OpsLoader {
transformer.checkpointAccesses().forEach((k, v) -> {
layered.addTemplateVariable(k, v);
- if (params.containsKey(k)) {
- params.remove(k);
- }
+ params.remove(k);
});
return layered;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/OpsOwner.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/OpsOwner.java
similarity index 98%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/OpsOwner.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/OpsOwner.java
index 420a57a67..1d3270810 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/OpsOwner.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/OpsOwner.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
import io.nosqlbench.api.errors.BasicError;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpDef.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpDef.java
similarity index 78%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpDef.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpDef.java
index 07fa007f2..ae8931c3d 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpDef.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpDef.java
@@ -14,10 +14,12 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
import io.nosqlbench.api.errors.BasicError;
import io.nosqlbench.api.errors.OpConfigError;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import java.util.*;
@@ -25,7 +27,13 @@ import java.util.*;
* See specification for what this should do in UniformWorkloadSpecificationTest
*/
public class RawOpDef extends RawOpFields {
+ private final static Logger logger = LogManager.getLogger(RawOpDef.class);
+ /**
+ * Contains all the op fields. If the key params is used, then fields are divided
+ * between the op fields map and the params map, with the non-specified one soaking up the dangling
+ * op fields. (Those not under 'op' or 'params' and which are not reserverd words)
+ */
private Object op;
private final static List opFieldSynonyms = List.of("stmt", "statement", "op", "operation");
@@ -57,9 +65,19 @@ public class RawOpDef extends RawOpFields {
}
}
if (found.size() == 1) {
- Object op = map.remove(found.iterator().next());
- setOp(op);
- } else if (found.size() > 1) {
+ String keyName = found.iterator().next();
+ Object op = map.remove(keyName);
+ if (op instanceof CharSequence s) {
+ if (!keyName.equals("stmt")) {
+ logger.warn("Used implied stmt field under name '" + keyName + "'. You can just use 'stmt: ... "+ s +"' or the equivalent to avoid this warning.");
+ }
+ map.put("stmt",s.toString());
+// setOp(new LinkedHashMap(Map.of("stmt",s.toString())));
+ } else {
+ setOp(op);
+ }
+ }
+ if (found.size() > 1) {
throw new BasicError("You used " + found + " as an op name, but only one of these is allowed at a time.");
} else if ((getName() == null || getName().isEmpty()) && op == null && map.size() > 0) {
Map.Entry first = map.entrySet().iterator().next();
@@ -93,6 +111,8 @@ public class RawOpDef extends RawOpFields {
public String getStmt() {
if (op instanceof CharSequence) {
return op.toString();
+ } else if (op instanceof Map m && m.get("stmt") instanceof CharSequence cs) {
+ return cs.toString();
} else {
throw new BasicError("tried to access a non-char statement definition with #getStmt()");
}
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpFields.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpFields.java
similarity index 98%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpFields.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpFields.java
index 3491dce09..0e34a45cf 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpFields.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpFields.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
import io.nosqlbench.api.errors.BasicError;
import org.apache.logging.log4j.Logger;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsBlock.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsBlock.java
similarity index 94%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsBlock.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsBlock.java
index 5384202b7..8ec2db8e5 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsBlock.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsBlock.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
import java.util.Map;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsDoc.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsDoc.java
similarity index 97%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsDoc.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsDoc.java
index ec21a7008..8bbfa3d4e 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsDoc.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsDoc.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
-import io.nosqlbench.engine.api.util.AdaptersApiVersionInfo;
+import io.nosqlbench.adapters.api.util.AdaptersApiVersionInfo;
import java.util.ArrayList;
import java.util.List;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsDocList.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsDocList.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsDocList.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsDocList.java
index 6cf742f77..f9db92dda 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsDocList.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsDocList.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
import java.util.List;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsLoader.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsLoader.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsLoader.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsLoader.java
index be513c25d..f5157ce29 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawOpsLoader.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawOpsLoader.java
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
import io.nosqlbench.api.content.Content;
import io.nosqlbench.api.content.NBIO;
import io.nosqlbench.api.errors.BasicError;
import io.nosqlbench.api.errors.OpConfigError;
-import io.nosqlbench.engine.api.templating.StrInterpolator;
+import io.nosqlbench.adapters.api.templating.StrInterpolator;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.snakeyaml.engine.v2.api.Load;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawScenarios.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawScenarios.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawScenarios.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawScenarios.java
index f23d2ccd5..3ae64577c 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawScenarios.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawScenarios.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
import io.nosqlbench.api.errors.BasicError;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawYamlLoader.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawYamlLoader.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawYamlLoader.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawYamlLoader.java
index fa91b3b97..02d7437f8 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/RawYamlLoader.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/RawYamlLoader.java
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
import io.nosqlbench.api.content.Content;
import io.nosqlbench.api.content.NBIO;
import io.nosqlbench.api.errors.BasicError;
import io.nosqlbench.api.errors.OpConfigError;
-import io.nosqlbench.engine.api.templating.StrInterpolator;
+import io.nosqlbench.adapters.api.templating.StrInterpolator;
import org.apache.logging.log4j.Logger;
import org.snakeyaml.engine.v2.api.Load;
import org.snakeyaml.engine.v2.api.LoadSettings;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/Tags.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/Tags.java
similarity index 94%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/Tags.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/Tags.java
index 86450650e..c581205a0 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/rawyaml/Tags.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/rawyaml/Tags.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.rawyaml;
+package io.nosqlbench.adapters.api.activityconfig.rawyaml;
import io.nosqlbench.api.engine.util.Tagged;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpData.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpData.java
similarity index 98%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpData.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpData.java
index 7908b19d8..20d4abd21 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpData.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpData.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.yaml;
+package io.nosqlbench.adapters.api.activityconfig.yaml;
import java.security.InvalidParameterException;
import java.util.LinkedHashMap;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpDef.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpDef.java
similarity index 95%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpDef.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpDef.java
index 59e445460..6ffdca805 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpDef.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpDef.java
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.yaml;
+package io.nosqlbench.adapters.api.activityconfig.yaml;
-import io.nosqlbench.engine.api.activityconfig.MultiMapLookup;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpDef;
+import io.nosqlbench.adapters.api.activityconfig.MultiMapLookup;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpDef;
import io.nosqlbench.api.errors.BasicError;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpTemplate.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpTemplate.java
similarity index 97%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpTemplate.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpTemplate.java
index b827f6ade..a81830acf 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpTemplate.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpTemplate.java
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.yaml;
+package io.nosqlbench.adapters.api.activityconfig.yaml;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import io.nosqlbench.adapters.api.templating.ParsedOp;
import io.nosqlbench.api.engine.util.Tagged;
import io.nosqlbench.api.config.params.Element;
import io.nosqlbench.api.config.params.NBParams;
@@ -35,7 +36,7 @@ import java.util.function.Function;
*
* The OpTemplate is a structurally normalized type which presents the user-provided op template to the NoSQLBench
* loading and templating mechanisms. This type is not generally used directly for new driver development. It is the
- * backing data which is used by {@link io.nosqlbench.engine.api.templating.ParsedOp}, which is used in drivers to map
+ * backing data which is used by {@link ParsedOp}, which is used in drivers to map
* op templates to function to be used for a given cycle value.
*
*
@@ -86,8 +87,8 @@ public abstract class OpTemplate implements Tagged {
if (type.isAssignableFrom(object.getClass())) {
map.put(pname, type.cast(object));
} else {
- throw new RuntimeException("With param named '" + pname + "" +
- "' You can't assign an object of type '" + object.getClass().getSimpleName() + "" +
+ throw new RuntimeException("With param named '" + pname +
+ "' You can't assign an object of type '" + object.getClass().getSimpleName() +
"' to '" + type.getSimpleName() + "'. Maybe the YAML format is suggesting the wrong type.");
}
}
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpTemplateFormat.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpTemplateFormat.java
similarity index 93%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpTemplateFormat.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpTemplateFormat.java
index fc3e5e098..e0257a1ac 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpTemplateFormat.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpTemplateFormat.java
@@ -14,14 +14,16 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.yaml;
+package io.nosqlbench.adapters.api.activityconfig.yaml;
+
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpsDocList;
import java.net.URI;
import java.nio.file.Path;
/**
* The formats which are recognized as source data for the workload. Any serialization may be supported
- * which can be converted from a character string to an {@link io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpsDocList} structure.
+ * which can be converted from a character string to an {@link RawOpsDocList} structure.
*
* Those which are derived from paths may be determined by their filename extension. Others, which are provided from internal
* NoSQLBench sources, may only be invoked explicitly.
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpsBlock.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpsBlock.java
similarity index 93%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpsBlock.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpsBlock.java
index 6143d6a5f..e125516a2 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpsBlock.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpsBlock.java
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.yaml;
+package io.nosqlbench.adapters.api.activityconfig.yaml;
-import io.nosqlbench.engine.api.activityconfig.MultiMapLookup;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpDef;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpsBlock;
+import io.nosqlbench.adapters.api.activityconfig.MultiMapLookup;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpDef;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpsBlock;
import io.nosqlbench.api.engine.util.Tagged;
import org.jetbrains.annotations.NotNull;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpsDoc.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpsDoc.java
similarity index 94%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpsDoc.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpsDoc.java
index 4b0d00b2f..d527fb702 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpsDoc.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpsDoc.java
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.yaml;
+package io.nosqlbench.adapters.api.activityconfig.yaml;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpsBlock;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpsDoc;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpsBlock;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpsDoc;
import io.nosqlbench.api.engine.util.Tagged;
import java.util.ArrayList;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpsDocList.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpsDocList.java
similarity index 94%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpsDocList.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpsDocList.java
index 9c2923041..c09f444f2 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/OpsDocList.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/OpsDocList.java
@@ -14,12 +14,12 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.yaml;
+package io.nosqlbench.adapters.api.activityconfig.yaml;
-import io.nosqlbench.engine.api.activityconfig.OpsLoader;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpsDoc;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawOpsDocList;
-import io.nosqlbench.engine.api.util.TagFilter;
+import io.nosqlbench.adapters.api.activityconfig.OpsLoader;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpsDoc;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawOpsDocList;
+import io.nosqlbench.adapters.api.util.TagFilter;
import io.nosqlbench.api.config.standard.ConfigModel;
import io.nosqlbench.api.config.standard.NBConfigModel;
import io.nosqlbench.api.config.standard.NBConfigModelExpander;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/Scenarios.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/Scenarios.java
similarity index 86%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/Scenarios.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/Scenarios.java
index eefb5b926..ff47d1ea2 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityconfig/yaml/Scenarios.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityconfig/yaml/Scenarios.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityconfig.yaml;
+package io.nosqlbench.adapters.api.activityconfig.yaml;
-import io.nosqlbench.engine.api.activityconfig.rawyaml.RawScenarios;
+import io.nosqlbench.adapters.api.activityconfig.rawyaml.RawScenarios;
import java.util.List;
import java.util.Map;
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java
new file mode 100644
index 000000000..dcb075a6e
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java
@@ -0,0 +1,201 @@
+/*
+ * 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;
+
+import com.codahale.metrics.Histogram;
+import com.codahale.metrics.Timer;
+import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter;
+import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op;
+import io.nosqlbench.adapters.api.evalcontext.CycleFunction;
+import io.nosqlbench.adapters.api.evalcontext.CycleFunctions;
+import io.nosqlbench.adapters.api.evalcontext.GroovyBooleanCycleFunction;
+import io.nosqlbench.adapters.api.evalcontext.GroovyObjectEqualityFunction;
+import io.nosqlbench.adapters.api.metrics.ThreadLocalNamedTimers;
+import io.nosqlbench.adapters.api.templating.ParsedOp;
+import io.nosqlbench.api.config.NBLabeledElement;
+import io.nosqlbench.api.config.NBLabels;
+import io.nosqlbench.api.engine.metrics.ActivityMetrics;
+import io.nosqlbench.api.errors.OpConfigError;
+import io.nosqlbench.virtdata.core.templates.ParsedTemplateString;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * See {@link OpDispenser} for details on how to use this type.
+ *
+ * Some details are tracked per op template, which aligns to the life-cycle of the op dispenser.
+ * Thus, each op dispenser is where the stats for all related operations are kept.
+ *
+ * @param
+ * The type of operation
+ */
+public abstract class BaseOpDispenser implements OpDispenser, NBLabeledElement {
+ private final static Logger logger = LogManager.getLogger(BaseOpDispenser.class);
+ public static final String VERIFIER = "verifier";
+ public static final String EXPECTED_RESULT = "expected-result";
+ public static final String VERIFIER_IMPORTS = "verifier-imports";
+ public static final String START_TIMERS = "start-timers";
+ public static final String STOP_TIMERS = "stop-timers";
+
+ private final String opName;
+ protected final DriverAdapter adapter;
+ private final NBLabels labels;
+ private boolean instrument;
+ private Histogram resultSizeHistogram;
+ private Timer successTimer;
+ private Timer errorTimer;
+ private final String[] timerStarts;
+ private final String[] timerStops;
+
+ /**
+ * package imports used with "verifiers" or "expected-result" are accumulated here
+ */
+ private final List verifierImports = new ArrayList();
+ /**
+ * optional invokable functions which throw exceptions when results are not verifiable.
+ * This variable is kept here for diagnostics and debugging. The actual instance used within
+ * each thread is provided by a {@link ThreadLocal} via {@link #getVerifier()}
+ */
+ private final CycleFunction _verifier;
+ private final ThreadLocal> tlVerifier;
+
+ protected BaseOpDispenser(final DriverAdapter adapter, final ParsedOp op) {
+ opName = op.getName();
+ this.adapter = adapter;
+ labels = op.getLabels();
+
+ this.timerStarts = op.takeOptionalStaticValue(START_TIMERS, String.class)
+ .map(s -> s.split(", *"))
+ .orElse(null);
+
+ this.timerStops = op.takeOptionalStaticValue(STOP_TIMERS, String.class)
+ .map(s -> s.split(", *"))
+ .orElse(null);
+
+ if (null != timerStarts)
+ for (final String timerStart : this.timerStarts) ThreadLocalNamedTimers.addTimer(op, timerStart);
+
+ this.configureInstrumentation(op);
+ this.configureVerifierImports(op);
+ List> verifiers = new ArrayList<>();
+ verifiers.addAll(configureEqualityVerifier(op));
+ verifiers.addAll(configureAssertionVerifiers(op));
+ this._verifier = CycleFunctions.of((a, b) -> a && b, verifiers, true);
+ this.tlVerifier = ThreadLocal.withInitial(() -> _verifier.newInstance());
+ }
+
+ private CycleFunction cloneVerifiers() {
+ return this._verifier.newInstance();
+ }
+
+ public CycleFunction getVerifier() {
+ return this.tlVerifier.get();
+ }
+
+ private void configureVerifierImports(ParsedOp op) {
+ List imports = op.takeOptionalStaticValue(VERIFIER_IMPORTS, List.class)
+ .orElse(List.of());
+ for (Object element : imports) {
+ if (element instanceof CharSequence cs) {
+ this.verifierImports.add(cs.toString());
+ } else {
+ throw new RuntimeException("Imports must be a character sequence.");
+ }
+ }
+ }
+
+ private List extends CycleFunction> configureAssertionVerifiers(ParsedOp op) {
+ Map namedVerifiers = op.getTemplateMap().takeAsNamedTemplates(VERIFIER);
+ List> verifierFunctions = new ArrayList<>();
+ try {
+ namedVerifiers.forEach((verifierName,stringTemplate) -> {
+ GroovyBooleanCycleFunction verifier =
+ new GroovyBooleanCycleFunction(verifierName, stringTemplate, verifierImports);
+ logger.info("configured verifier:" + verifier);
+ verifierFunctions.add(verifier);
+ });
+ return verifierFunctions;
+ } catch (Exception gre) {
+ throw new OpConfigError("error in verifier:" + gre.getMessage(), gre);
+ }
+ }
+
+ private List extends CycleFunction> configureEqualityVerifier(ParsedOp op) {
+ try {
+ return op.takeAsOptionalStringTemplate(EXPECTED_RESULT)
+ .map(tpl -> new GroovyObjectEqualityFunction(op.getName()+"-"+EXPECTED_RESULT, tpl, verifierImports))
+ .map(vl -> {
+ logger.info("Configured equality verifier: " + vl);
+ return vl;
+ })
+ .map(v -> List.of(v))
+ .orElse(List.of());
+ } catch (Exception gre) {
+ throw new OpConfigError("error in verifier:" + gre.getMessage(), gre);
+ }
+ }
+
+ String getOpName() {
+ return this.opName;
+ }
+
+ public DriverAdapter getAdapter() {
+ return this.adapter;
+ }
+
+ private void configureInstrumentation(final ParsedOp pop) {
+ instrument = pop.takeStaticConfigOr("instrument", false);
+ if (this.instrument) {
+ final int hdrDigits = pop.getStaticConfigOr("hdr_digits", 4).intValue();
+ successTimer = ActivityMetrics.timer(pop, "success", hdrDigits);
+ errorTimer = ActivityMetrics.timer(pop, "error", hdrDigits);
+ resultSizeHistogram = ActivityMetrics.histogram(pop, "resultset-size", hdrDigits);
+ }
+ }
+
+ @Override
+ public void onStart(final long cycleValue) {
+ if (null != timerStarts) ThreadLocalNamedTimers.TL_INSTANCE.get().start(this.timerStarts);
+ }
+
+ @Override
+ public void onSuccess(final long cycleValue, final long nanoTime, final long resultSize) {
+ if (this.instrument) {
+ this.successTimer.update(nanoTime, TimeUnit.NANOSECONDS);
+ if (-1 < resultSize) this.resultSizeHistogram.update(resultSize);
+ }
+ if (null != timerStops) ThreadLocalNamedTimers.TL_INSTANCE.get().stop(this.timerStops);
+ }
+
+ @Override
+ public void onError(final long cycleValue, final long resultNanos, final Throwable t) {
+
+ if (this.instrument) this.errorTimer.update(resultNanos, TimeUnit.NANOSECONDS);
+ if (null != timerStops) ThreadLocalNamedTimers.TL_INSTANCE.get().stop(this.timerStops);
+ }
+
+ @Override
+ public NBLabels getLabels() {
+ return this.labels;
+ }
+
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/OpDispenser.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpDispenser.java
similarity index 95%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/OpDispenser.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpDispenser.java
index 097744a5f..3723c3e2b 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/OpDispenser.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpDispenser.java
@@ -14,9 +14,10 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl;
+package io.nosqlbench.adapters.api.activityimpl;
+
+import io.nosqlbench.adapters.api.evalcontext.CycleFunction;
-import java.io.Serializable;
import java.util.function.LongFunction;
/**
@@ -82,6 +83,7 @@ public interface OpDispenser extends LongFunction, OpResultTracker {
*/
T apply(long value);
- Serializable getExpectedResultExpression();
+
+ CycleFunction getVerifier();
}
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/OpMapper.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpMapper.java
similarity index 92%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/OpMapper.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpMapper.java
index d1c95cddd..066c5fa8f 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/OpMapper.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpMapper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl;
+package io.nosqlbench.adapters.api.activityimpl;
-import io.nosqlbench.engine.api.activityimpl.uniform.flowtypes.Op;
-import io.nosqlbench.engine.api.templating.ParsedOp;
+import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter;
+import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op;
+import io.nosqlbench.adapters.api.templating.ParsedOp;
import java.util.function.Function;
@@ -68,7 +69,7 @@ import java.util.function.Function;
* The logic which is implemented in the OpMapper must follow closely with the op construction
* rules provided to the user. Conversely, the driver maintainer should take care to provide
* rules of construction and examples in the documentation.
- * Each {@link io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter} has a unique
+ * Each {@link DriverAdapter} has a unique
* name. The documentation
* for each of these should be kept in the bundled resources in a top-level markdown file that
* matches the driver name.
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/OpResultTracker.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpResultTracker.java
similarity index 89%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/OpResultTracker.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpResultTracker.java
index e8e9bed0b..019d502ea 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/OpResultTracker.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/OpResultTracker.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl;
+package io.nosqlbench.adapters.api.activityimpl;
public interface OpResultTracker {
void onStart(long cycleValue);
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/StandardCycleOp.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/StandardCycleOp.java
similarity index 84%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/StandardCycleOp.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/StandardCycleOp.java
index e49684231..48240d94b 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/StandardCycleOp.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/StandardCycleOp.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl;
+package io.nosqlbench.adapters.api.activityimpl;
-import io.nosqlbench.engine.api.activityimpl.uniform.flowtypes.CycleOp;
+import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.CycleOp;
import java.util.function.LongFunction;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/docs/BundledDriverAdapterDocs.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/docs/BundledDriverAdapterDocs.java
similarity index 93%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/docs/BundledDriverAdapterDocs.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/docs/BundledDriverAdapterDocs.java
index ce18e7294..920f1195e 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/docs/BundledDriverAdapterDocs.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/docs/BundledDriverAdapterDocs.java
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.docs;
+package io.nosqlbench.adapters.api.activityimpl.docs;
+import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter;
import io.nosqlbench.api.docsapi.BundledMarkdownManifest;
import io.nosqlbench.api.docsapi.Docs;
import io.nosqlbench.api.docsapi.DocsBinder;
import io.nosqlbench.api.spi.SimpleServiceLoader;
-import io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.annotations.Service;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/BaseDriverAdapter.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseDriverAdapter.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/BaseDriverAdapter.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseDriverAdapter.java
index dbb04456a..9ba7a801d 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/BaseDriverAdapter.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/BaseDriverAdapter.java
@@ -14,12 +14,12 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform;
+package io.nosqlbench.adapters.api.activityimpl.uniform;
+import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op;
import io.nosqlbench.api.config.standard.*;
-import io.nosqlbench.engine.api.activityimpl.uniform.fieldmappers.FieldDestructuringMapper;
-import io.nosqlbench.engine.api.activityimpl.uniform.flowtypes.Op;
-import io.nosqlbench.engine.api.templating.ParsedOp;
+import io.nosqlbench.adapters.api.activityimpl.uniform.fieldmappers.FieldDestructuringMapper;
+import io.nosqlbench.adapters.api.templating.ParsedOp;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/DriverAdapter.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverAdapter.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/DriverAdapter.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverAdapter.java
index a3aab98e6..f4468a7fe 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/DriverAdapter.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverAdapter.java
@@ -14,14 +14,14 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform;
+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.api.docsapi.Docs;
import io.nosqlbench.api.docsapi.DocsBinder;
-import io.nosqlbench.engine.api.activityimpl.OpDispenser;
-import io.nosqlbench.engine.api.activityimpl.OpMapper;
-import io.nosqlbench.engine.api.activityimpl.uniform.flowtypes.Op;
-import io.nosqlbench.engine.api.templating.ParsedOp;
+import io.nosqlbench.adapters.api.templating.ParsedOp;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.annotations.Service;
import io.nosqlbench.api.config.standard.NBConfiguration;
@@ -107,7 +107,7 @@ public interface DriverAdapter {
* the fields in the op template before they are interpreted canonically.
* At this level, the transform is applied once to the input map
* (once per op template) to yield the map that is provided to
- * {@link io.nosqlbench.engine.api.activityimpl.OpMapper} implementations.
+ * {@link OpMapper} implementations.
*
* @return A function to pre-process the op template fields.
*/
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/DriverSpaceCache.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverSpaceCache.java
similarity index 97%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/DriverSpaceCache.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverSpaceCache.java
index 207792538..a58007586 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/DriverSpaceCache.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DriverSpaceCache.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform;
+package io.nosqlbench.adapters.api.activityimpl.uniform;
import java.util.Collections;
import java.util.Map;
diff --git a/nb-api/src/main/java/io/nosqlbench/api/errors/ExpectedResultVerificationError.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DryRunOp.java
similarity index 51%
rename from nb-api/src/main/java/io/nosqlbench/api/errors/ExpectedResultVerificationError.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DryRunOp.java
index 44d70c594..9b5bdabd6 100644
--- a/nb-api/src/main/java/io/nosqlbench/api/errors/ExpectedResultVerificationError.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DryRunOp.java
@@ -14,25 +14,19 @@
* limitations under the License.
*/
-package io.nosqlbench.api.errors;
+package io.nosqlbench.adapters.api.activityimpl.uniform;
-import java.io.Serializable;
+import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op;
+import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.RunnableOp;
-public class ExpectedResultVerificationError extends RuntimeException {
- private final int triesLeft;
- private final Serializable expectedResultExpression;
+public class DryRunOp implements RunnableOp {
- public ExpectedResultVerificationError(int triesLeft, Serializable expectedResultExpression) {
- this.triesLeft = triesLeft;
- this.expectedResultExpression = expectedResultExpression;
+ private final Op op;
+
+ public DryRunOp(Op op) {
+ this.op = op;
}
-
- public int getTriesLeft() {
- return triesLeft;
+ @Override
+ public void run() {
}
-
- public Serializable getExpectedResultExpression() {
- return expectedResultExpression;
- }
-
}
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DryRunOpDispenserWrapper.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DryRunOpDispenserWrapper.java
new file mode 100644
index 000000000..13bee89fa
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/DryRunOpDispenserWrapper.java
@@ -0,0 +1,37 @@
+/*
+ * 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;
+
+import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser;
+import io.nosqlbench.adapters.api.activityimpl.OpDispenser;
+import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op;
+import io.nosqlbench.adapters.api.templating.ParsedOp;
+
+public class DryRunOpDispenserWrapper extends BaseOpDispenser {
+
+ private final OpDispenser extends Op> realDispenser;
+
+ public DryRunOpDispenserWrapper(DriverAdapter adapter, ParsedOp pop, OpDispenser extends Op> realDispenser) {
+ super(adapter, pop);
+ this.realDispenser = realDispenser;
+ }
+ @Override
+ public DryRunOp apply(long cycle) {
+ Op op = realDispenser.apply(cycle);
+ return new DryRunOp(op);
+ }
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/ResultProcessor.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/ResultProcessor.java
similarity index 94%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/ResultProcessor.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/ResultProcessor.java
index 6c7438331..84ab84f34 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/ResultProcessor.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/ResultProcessor.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform;
+package io.nosqlbench.adapters.api.activityimpl.uniform;
/**
* A result processor can consume data from a result which is contains of a set of
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/decorators/SyntheticOpTemplateProvider.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/decorators/SyntheticOpTemplateProvider.java
similarity index 86%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/decorators/SyntheticOpTemplateProvider.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/decorators/SyntheticOpTemplateProvider.java
index 8aab2f340..1d85b9266 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/decorators/SyntheticOpTemplateProvider.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/decorators/SyntheticOpTemplateProvider.java
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.decorators;
+package io.nosqlbench.adapters.api.activityimpl.uniform.decorators;
-import io.nosqlbench.engine.api.activityconfig.yaml.OpTemplate;
-import io.nosqlbench.engine.api.activityconfig.yaml.OpsDocList;
-import io.nosqlbench.engine.api.templating.DriverAdapterDecorators;
+import io.nosqlbench.adapters.api.activityconfig.yaml.OpTemplate;
+import io.nosqlbench.adapters.api.activityconfig.yaml.OpsDocList;
+import io.nosqlbench.adapters.api.templating.DriverAdapterDecorators;
import java.util.List;
import java.util.Map;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/fieldmappers/FieldDestructuringMapper.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/fieldmappers/FieldDestructuringMapper.java
similarity index 95%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/fieldmappers/FieldDestructuringMapper.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/fieldmappers/FieldDestructuringMapper.java
index d07c26f0f..9e46f7163 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/fieldmappers/FieldDestructuringMapper.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/fieldmappers/FieldDestructuringMapper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.fieldmappers;
+package io.nosqlbench.adapters.api.activityimpl.uniform.fieldmappers;
import java.util.LinkedHashMap;
import java.util.Map;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/ChainingOp.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ChainingOp.java
similarity index 93%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/ChainingOp.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ChainingOp.java
index 019001331..d9db8409f 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/ChainingOp.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/ChainingOp.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.flowtypes;
+package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes;
import java.util.function.Function;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/CycleOp.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/CycleOp.java
similarity index 84%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/CycleOp.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/CycleOp.java
index 58dfe8e1f..98bb56da6 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/CycleOp.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/CycleOp.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,10 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.flowtypes;
+package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes;
+
+import io.nosqlbench.adapters.api.activityimpl.OpDispenser;
+import io.nosqlbench.adapters.api.activityimpl.OpMapper;
import java.util.function.LongFunction;
@@ -34,8 +37,8 @@ import java.util.function.LongFunction;
*
* If you are using the value in this call to select a specific type of behavior, it is very
* likely a candidate for factoring into separate op implementations.
- * The {@link io.nosqlbench.engine.api.activityimpl.OpMapper}
- * and {@link io.nosqlbench.engine.api.activityimpl.OpDispenser} abstractions are meant to move
+ * The {@link OpMapper}
+ * and {@link OpDispenser} abstractions are meant to move
* op type selection and scheduling to earlier in the activity.
*
*
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/Op.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/Op.java
similarity index 95%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/Op.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/Op.java
index 11b47d603..4d271da13 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/Op.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/Op.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.flowtypes;
+package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes;
/**
*
This is the root type of any operation which is used in a NoSQLBench
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/OpGenerator.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpGenerator.java
similarity index 92%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/OpGenerator.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpGenerator.java
index f42700fbe..1b5b1a34d 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/OpGenerator.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpGenerator.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.flowtypes;
+package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes;
/**
*
If an Op implements OpGenerator, then it will be asked for chained
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/OpResultSize.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpResultSize.java
similarity index 90%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/OpResultSize.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpResultSize.java
index 6527529a2..368b7d7a0 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/OpResultSize.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/OpResultSize.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.flowtypes;
+package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes;
/**
* Provide the result size for an operation.
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/RunnableOp.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableOp.java
similarity index 91%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/RunnableOp.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableOp.java
index 0cfc2f984..0bab5c267 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/RunnableOp.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableOp.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.flowtypes;
+package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes;
/**
*
RunnableOp
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/RunnableSource.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableSource.java
similarity index 86%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/RunnableSource.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableSource.java
index 1d838c336..12fbfd29f 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/RunnableSource.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/RunnableSource.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.flowtypes;
+package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes;
import java.util.function.Supplier;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/VariableCapture.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/VariableCapture.java
similarity index 94%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/VariableCapture.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/VariableCapture.java
index f53349558..19c3043d2 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/flowtypes/VariableCapture.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/uniform/flowtypes/VariableCapture.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityimpl.uniform.flowtypes;
+package io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes;
import io.nosqlbench.virtdata.core.templates.ParsedTemplateString;
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CompoundCycleFunction.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CompoundCycleFunction.java
new file mode 100644
index 000000000..147adef77
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CompoundCycleFunction.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 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.evalcontext;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BinaryOperator;
+
+public class CompoundCycleFunction implements CycleFunction {
+
+ private final List> functions = new ArrayList<>();
+ private final BinaryOperator reducer;
+
+ public CompoundCycleFunction(BinaryOperator reducer, CycleFunction ... functions) {
+ this(reducer, Arrays.asList(functions));
+
+ }
+ public CompoundCycleFunction(BinaryOperator reducer, List> functions) {
+ this.functions.addAll(functions);
+ this.reducer = reducer;
+ }
+
+ @Override
+ public T apply(long value) {
+ return functions.stream()
+ .map(f -> f.apply(value))
+ .reduce(reducer)
+ .get();
+ }
+
+ @Override
+ public CycleFunction newInstance() {
+ ArrayList> newFunctionList = new ArrayList<>(this.functions.size());
+ for (CycleFunction function : this.functions) {
+ newFunctionList.add(function.newInstance());
+ }
+ return new CompoundCycleFunction(reducer, newFunctionList);
+ }
+
+ @Override
+ public String getExpressionDetails() {
+ return String.join(
+ ", ",
+ functions.stream().map(f -> f.getExpressionDetails()).toList()
+ );
+ }
+
+ @Override
+ public void setVariable(String name, V value) {
+ for (CycleFunction function : functions) {
+ function.setVariable(name, value);
+ }
+ }
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CycleFunction.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CycleFunction.java
new file mode 100644
index 000000000..dce32ad17
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CycleFunction.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 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.evalcontext;
+
+import java.util.function.LongFunction;
+
+public interface CycleFunction extends LongFunction, VariableInjectable, ExpressionDetails {
+
+ /**
+ * Produce a result from a cycle. This is an encapsulating type for any implementations which need
+ * to
+ * @param value the function argument
+ * @return
+ */
+ @Override
+ T apply(long value);
+
+ /**
+ * Get a new instance of a CycleFunction, based on the current one, but with its own instance of any
+ * non-threadsafe elements.
+ * @return A new CycleFunction
+ */
+ CycleFunction newInstance();
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CycleFunctions.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CycleFunctions.java
new file mode 100644
index 000000000..6821b617f
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/CycleFunctions.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 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.evalcontext;
+
+import java.util.List;
+import java.util.function.BinaryOperator;
+
+public class CycleFunctions {
+ public static CycleFunction of(BinaryOperator reducer, List> verifiers, T defaultResult) {
+ if (verifiers.size()==0) {
+ return new NOOPVerifier<>(defaultResult);
+ } else if (verifiers.size()==1) {
+ return verifiers.get(0);
+ } else {
+ return new CompoundCycleFunction<>(reducer, verifiers);
+ }
+ }
+
+ public static class NOOPVerifier implements CycleFunction {
+ private final V defaultResult;
+
+ public NOOPVerifier(V defaultResult) {
+ this.defaultResult = defaultResult;
+ }
+
+ @Override
+ public V apply(long value) {
+ return defaultResult;
+ }
+
+ @Override
+ public CycleFunction newInstance() {
+ return new NOOPVerifier<>(defaultResult);
+ }
+
+ @Override
+ public String getExpressionDetails() {
+ return "return "+ defaultResult;
+ }
+
+ @Override
+ public void setVariable(String name, V value) {
+ }
+ }
+}
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ops/fluent/FluentOp.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ExpressionDetails.java
similarity index 78%
rename from engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ops/fluent/FluentOp.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ExpressionDetails.java
index a05fc9724..c5b49c816 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ops/fluent/FluentOp.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ExpressionDetails.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * Copyright (c) 2023 nosqlbench
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.activityapi.core.ops.fluent;
-
-public interface FluentOp {
+package io.nosqlbench.adapters.api.evalcontext;
+public interface ExpressionDetails {
+ String getExpressionDetails();
}
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyBooleanCycleFunction.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyBooleanCycleFunction.java
new file mode 100644
index 000000000..65ccbf96b
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyBooleanCycleFunction.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 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.evalcontext;
+
+import io.nosqlbench.virtdata.core.templates.ParsedTemplateString;
+
+import java.util.List;
+
+public class GroovyBooleanCycleFunction extends GroovyCycleFunction {
+
+ public GroovyBooleanCycleFunction(String name, ParsedTemplateString template, List imports) {
+ super(name, template, imports);
+ }
+
+ @Override
+ public Boolean apply(long value) {
+ return super.apply(value);
+ }
+
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyCycleFunction.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyCycleFunction.java
new file mode 100644
index 000000000..8c459d4db
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyCycleFunction.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 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.evalcontext;
+
+import groovy.lang.Binding;
+import groovy.lang.GroovyShell;
+import groovy.lang.Script;
+import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser;
+import io.nosqlbench.virtdata.core.bindings.Bindings;
+import io.nosqlbench.virtdata.core.bindings.BindingsTemplate;
+import io.nosqlbench.virtdata.core.templates.BindPoint;
+import io.nosqlbench.virtdata.core.templates.ParsedTemplateString;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.control.customizers.ImportCustomizer;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class GroovyCycleFunction implements CycleFunction {
+ private final static Logger logger = LogManager.getLogger(GroovyBooleanCycleFunction.class);
+ private final String name;
+ private final List imports;
+
+ protected String scriptText; // Groovy script as provided
+ protected final Script script; // Groovy Script as compiled
+ protected final Binding variableBindings; // Groovy binding layer
+ protected final Bindings bindingFunctions; // NB bindings
+
+ /**
+ * Instantiate a cycle function from basic types
+ * @param scriptText The raw script text, not including any bind point or capture point syntax
+ * @param bindingSpecs The names and recipes of bindings which are referenced in the scriptText
+ * @param imports The package imports to be installed into the execution environment
+ */
+ public GroovyCycleFunction(String name, String scriptText, Map bindingSpecs, List imports) {
+ this.name = name;
+ this.scriptText =scriptText;
+ this.imports = imports;
+
+ // scripting env variable bindings
+ this.variableBindings = new Binding();
+
+ // virtdata bindings to be evaluated at cycle time
+ this.bindingFunctions = new BindingsTemplate().addFieldBindings(bindingSpecs).resolveBindings();
+
+ this.script = compileScript(this.scriptText, imports);
+ }
+
+ public GroovyCycleFunction(String name, ParsedTemplateString template, List imports) {
+ this(
+ name,
+ template.getPositionalStatement(),
+ resolveBindings(template.getBindPoints()),
+ imports
+ );
+ }
+
+ private Script compileScript(String scriptText, List imports) {
+ // add classes which are in the imports to the groovy evaluation context
+ String[] verifiedClasses = expandClassNames(imports);
+
+ CompilerConfiguration compilerConfiguration = new CompilerConfiguration();
+ ImportCustomizer importer = new ImportCustomizer().addImports(verifiedClasses);
+ compilerConfiguration.addCompilationCustomizers(importer);
+
+ GroovyShell gshell = new GroovyShell(new Binding(), compilerConfiguration);
+ return gshell.parse(scriptText);
+ }
+
+ private static Map resolveBindings(List bindPoints) {
+ return new BindingsTemplate(bindPoints).getMap();
+ }
+
+
+ protected String[] expandClassNames(List groovyImportedClasses) {
+ ClassLoader loader = BaseOpDispenser.class.getClassLoader();
+
+ List classNames = new ArrayList<>();
+ for (String candidateName : groovyImportedClasses) {
+ if (candidateName.endsWith(".*")) {
+ throw new RuntimeException("You can not use wildcard package imports like '" + candidateName + "'");
+ }
+ try {
+ loader.loadClass(candidateName);
+ classNames.add(candidateName);
+ logger.debug(() -> "added import " + candidateName);
+ } catch (Exception e) {
+ throw new RuntimeException("Class '" + candidateName + "' was not found for groovy imports.");
+ }
+ }
+ return classNames.toArray(new String[0]);
+ }
+
+ @Override
+ public String getExpressionDetails() {
+ return this.scriptText;
+ }
+
+
+ @Override
+ public void setVariable(String name, V value) {
+ this.variableBindings.setVariable(name, value);
+ }
+
+ @Override
+ public T apply(long value) {
+ Map values = bindingFunctions.getAllMap(value);
+ values.forEach((k,v)-> variableBindings.setVariable(k,v));
+ T result= (T) script.run();
+ return result;
+ }
+
+ @Override
+ public CycleFunction newInstance() {
+ return new GroovyCycleFunction(name, scriptText, bindingFunctions,imports);
+ }
+
+ private GroovyCycleFunction(String name, String scriptText, Bindings bindingFunctions, List imports) {
+ this.name = name;
+ this.scriptText = scriptText;
+ this.bindingFunctions = bindingFunctions;
+ this.imports = imports;
+
+ this.script = compileScript(scriptText,imports);
+ this.variableBindings=script.getBinding();
+ }
+
+
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyObjectEqualityFunction.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyObjectEqualityFunction.java
new file mode 100644
index 000000000..cbefd1c6f
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/GroovyObjectEqualityFunction.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 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.evalcontext;
+
+import io.nosqlbench.virtdata.core.templates.ParsedTemplateString;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This evaluator uses {@link Object#equals(Object)} to compare the results of an operation with
+ * a constructed value. The script used is meant to only construct the object to compare with.
+ * All context variables can be injected into the script context except for one, the result
+ * variable. This is intercepted and then used as a basis for comparison to the result of executing the
+ * script.
+ */
+public class GroovyObjectEqualityFunction extends GroovyCycleFunction {
+
+ private Object result;
+
+ public GroovyObjectEqualityFunction(String name, ParsedTemplateString template, List imports) {
+ super(name, template, imports);
+ }
+
+ @Override
+ public Boolean apply(long value) {
+ Map values = bindingFunctions.getAllMap(value);
+ values.forEach((k,v)-> variableBindings.setVariable(k,v));
+ Object scriptResult= script.run();
+ return scriptResult.equals(result);
+ }
+
+ /**
+ * Intercept and reserve the value of the result injected variable for comparison to the evaluated script result later.
+ */
+ public void setVariable(String name, Object value) {
+ if (name.equals("result")) {
+ this.result = value;
+ return;
+ }
+
+ super.setVariable(name, value);
+ }
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ResultMismatchError.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ResultMismatchError.java
new file mode 100644
index 000000000..9b4b9e760
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ResultMismatchError.java
@@ -0,0 +1,50 @@
+/*
+ * 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.evalcontext;
+
+import java.io.Serializable;
+
+public class ResultMismatchError extends RuntimeException {
+ private final int triesLeft;
+ private final String expressionDetails;
+
+ public ResultMismatchError(String message, int triesLeft, String expressionDetails) {
+ super("Error while verifying result with " + triesLeft + " tries remaining: " + message);
+ this.triesLeft = triesLeft;
+ this.expressionDetails = expressionDetails;
+ }
+
+ public ResultMismatchError(Throwable throwable, int triesLeft, String expressionDetails) {
+ super("Error while verifying result with " + triesLeft + " tries remaining: " + throwable.getMessage(),throwable);
+ this.triesLeft = triesLeft;
+ this.expressionDetails = expressionDetails;
+ }
+
+ @Override
+ public String getMessage() {
+ return super.getMessage();
+ }
+
+ public int getTriesLeft() {
+ return triesLeft;
+ }
+
+ public Serializable getExpressionDetails() {
+ return expressionDetails;
+ }
+
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ResultVerificationError.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ResultVerificationError.java
new file mode 100644
index 000000000..15c8ad7c3
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/ResultVerificationError.java
@@ -0,0 +1,50 @@
+/*
+ * 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.evalcontext;
+
+import java.io.Serializable;
+
+public class ResultVerificationError extends RuntimeException {
+ private final int triesLeft;
+ private final String expressionDetails;
+
+ public ResultVerificationError(String message, int triesLeft, String expressionDetails) {
+ super("Error while verifying result with " + triesLeft + " tries remaining: " + message);
+ this.triesLeft = triesLeft;
+ this.expressionDetails = expressionDetails;
+ }
+
+ public ResultVerificationError(Throwable throwable, int triesLeft, String expressionDetails) {
+ super("Error while verifying result with " + triesLeft + " tries remaining: " + throwable.getMessage(),throwable);
+ this.triesLeft = triesLeft;
+ this.expressionDetails = expressionDetails;
+ }
+
+ @Override
+ public String getMessage() {
+ return super.getMessage();
+ }
+
+ public int getTriesLeft() {
+ return triesLeft;
+ }
+
+ public Serializable getExpressionDetails() {
+ return expressionDetails;
+ }
+
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/VariableInjectable.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/VariableInjectable.java
new file mode 100644
index 000000000..d4980614c
--- /dev/null
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/evalcontext/VariableInjectable.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 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.evalcontext;
+
+/**
+ * Implementors of this type can have variables set on them for later use.
+ */
+public interface VariableInjectable {
+
+ /**
+ * Set a variable by name.
+ */
+ void setVariable(String name, V value);
+}
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/EndToEndMetricsAdapterUtil.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/EndToEndMetricsAdapterUtil.java
similarity index 97%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/EndToEndMetricsAdapterUtil.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/EndToEndMetricsAdapterUtil.java
index 6d5ba33c8..48f7f9d55 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/EndToEndMetricsAdapterUtil.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/EndToEndMetricsAdapterUtil.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.metrics;
+package io.nosqlbench.adapters.api.metrics;
import java.util.Map;
import java.util.Map.Entry;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/MessageSequenceNumberSendingHandler.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/MessageSequenceNumberSendingHandler.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/MessageSequenceNumberSendingHandler.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/MessageSequenceNumberSendingHandler.java
index 92da3caca..e55864907 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/MessageSequenceNumberSendingHandler.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/MessageSequenceNumberSendingHandler.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.metrics;
+package io.nosqlbench.adapters.api.metrics;
-import io.nosqlbench.engine.api.metrics.EndToEndMetricsAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE;
+import io.nosqlbench.adapters.api.metrics.EndToEndMetricsAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE;
import org.apache.commons.lang3.RandomUtils;
import java.util.ArrayDeque;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/ReceivedMessageSequenceTracker.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ReceivedMessageSequenceTracker.java
similarity index 99%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/ReceivedMessageSequenceTracker.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ReceivedMessageSequenceTracker.java
index 04d6393c1..d09258103 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/ReceivedMessageSequenceTracker.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ReceivedMessageSequenceTracker.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.metrics;
+package io.nosqlbench.adapters.api.metrics;
import com.codahale.metrics.Counter;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/ThreadLocalNamedTimers.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ThreadLocalNamedTimers.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/ThreadLocalNamedTimers.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ThreadLocalNamedTimers.java
index 113a47988..276805680 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/metrics/ThreadLocalNamedTimers.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ThreadLocalNamedTimers.java
@@ -14,12 +14,12 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.metrics;
+package io.nosqlbench.adapters.api.metrics;
import com.codahale.metrics.Timer;
import com.codahale.metrics.Timer.Context;
import io.nosqlbench.api.engine.metrics.ActivityMetrics;
-import io.nosqlbench.engine.api.templating.ParsedOp;
+import io.nosqlbench.adapters.api.templating.ParsedOp;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/specifications/SpecDocsManifest.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/specifications/SpecDocsManifest.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/specifications/SpecDocsManifest.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/specifications/SpecDocsManifest.java
index f5e56a5c8..91a2ee00d 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/specifications/SpecDocsManifest.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/specifications/SpecDocsManifest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.specifications;
+package io.nosqlbench.adapters.api.specifications;
import io.nosqlbench.api.content.Content;
import io.nosqlbench.api.content.NBIO;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/templating/CommandTemplate.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/CommandTemplate.java
similarity index 99%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/templating/CommandTemplate.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/CommandTemplate.java
index 4329e5698..aec92957c 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/templating/CommandTemplate.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/CommandTemplate.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.templating;
+package io.nosqlbench.adapters.api.templating;
-import io.nosqlbench.engine.api.activityconfig.yaml.OpTemplate;
+import io.nosqlbench.adapters.api.activityconfig.yaml.OpTemplate;
import io.nosqlbench.api.config.params.ParamsParser;
import io.nosqlbench.api.errors.BasicError;
import io.nosqlbench.virtdata.core.bindings.BindingsTemplate;
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/templating/DriverAdapterDecorators.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/DriverAdapterDecorators.java
similarity index 82%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/templating/DriverAdapterDecorators.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/DriverAdapterDecorators.java
index 9d757b54c..383a1b104 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/templating/DriverAdapterDecorators.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/DriverAdapterDecorators.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,11 +14,13 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.templating;
+package io.nosqlbench.adapters.api.templating;
+
+import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter;
/**
* This type simply captures (by extension) any optional decorator
- * interfaces which may be implemented by a {@link io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter}.
+ * interfaces which may be implemented by a {@link DriverAdapter}.
* Thus, it is mostly for documentation.
*
* Decorator interfaces are used within NoSQLBench where implementations are truly optional,
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/templating/EnumSetter.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/EnumSetter.java
similarity index 96%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/templating/EnumSetter.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/EnumSetter.java
index c3f9c2a74..22e0044d0 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/templating/EnumSetter.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/EnumSetter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 nosqlbench
+ * 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.templating;
+package io.nosqlbench.adapters.api.templating;
/**
* Provide a way to configure a target object of type T, given an enumeration which describes the distinct property
diff --git a/adapters-api/src/main/java/io/nosqlbench/engine/api/templating/ParsedOp.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/ParsedOp.java
similarity index 98%
rename from adapters-api/src/main/java/io/nosqlbench/engine/api/templating/ParsedOp.java
rename to adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/ParsedOp.java
index d359ebbde..eb585cf87 100644
--- a/adapters-api/src/main/java/io/nosqlbench/engine/api/templating/ParsedOp.java
+++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/ParsedOp.java
@@ -14,8 +14,9 @@
* limitations under the License.
*/
-package io.nosqlbench.engine.api.templating;
+package io.nosqlbench.adapters.api.templating;
+import io.nosqlbench.adapters.api.activityconfig.yaml.OpTemplate;
import io.nosqlbench.api.config.NBLabeledElement;
import io.nosqlbench.api.config.NBLabels;
import io.nosqlbench.api.config.fieldreaders.DynamicFieldReader;
@@ -23,7 +24,9 @@ import io.nosqlbench.api.config.fieldreaders.StaticFieldReader;
import io.nosqlbench.api.config.standard.NBConfigError;
import io.nosqlbench.api.config.standard.NBConfiguration;
import io.nosqlbench.api.errors.OpConfigError;
-import io.nosqlbench.engine.api.activityconfig.yaml.OpTemplate;
+import io.nosqlbench.engine.api.templating.ObjectCache;
+import io.nosqlbench.engine.api.templating.ParsedTemplateMap;
+import io.nosqlbench.engine.api.templating.TypeAndTarget;
import io.nosqlbench.engine.api.templating.binders.ArrayBinder;
import io.nosqlbench.engine.api.templating.binders.ListBinder;
import io.nosqlbench.engine.api.templating.binders.OrderedMapBinder;
@@ -428,6 +431,10 @@ public class ParsedOp implements LongFunction
+ *
+ *
+ *
Mapping between forms
+ *
+ *
The array value can be derived with {@link #apply(long)}, {@link #getArray(int[])} (int[])}, and
+ * {@link #getArray(String)},
+ * given ordinal, indexes, or encoding as a starting point, respectively. This all ultimately use the one-way
+ * function which you provide, thus you can't go from array form to the others.
+ *
+ *
Mapping between the other three is fairly trivial:
+ *
+ *
You can get indexes from ordinal and encoding with {@link #getIndexes(long)} and
+ * {@link #getArray(String)}.
+ *
You can get encoding from ordinal and indexes with {@link #getEncoding(long)} and
+ * {@link #getEncoding(int[])}.
+ *
You can get ordinal from indexes or encoding with {@link #getOrdinal(int[])} and
+ * {@link #getOrdinal(String)}.
+ *
+ *
+ *
+ * This makes it easy to derive textual identifiers for specific combinations of elements such as a vector, use them
+ * for
+ * cross-checks such as with correctness testing, and represent specific test values in a very convenient form within
+ * deterministic testing harnesses like NoSQLBench.
+ *
+ * @param
+ * The generic type of the value which is mapped into each array position
+ */
+@ThreadSafeMapper
+@Categories({Category.combinitoric, Category.conversion})
+public class Combiner implements LongFunction {
+
+ /**
+ * converts an index for a given column position into a value type.
+ */
+ private final LongFunction elementFunction;
+ /**
+ * Used for instancing the correct type of array, since arrays can't be reified from generics
+ */
+ private final Class extends T> elementClazz;
+ /**
+ * The columnar character sequences which represent radix values
+ */
+ private final char[][] charsets;
+
+ /**
+ * The columnar radix factors, cached
+ */
+ private final long[] modulo;
+ /**
+ * Columnar indexes from the character to the index values, for reverse mapping
+ */
+ private final int[][] inverted;
+
+ /**
+ * Construct a combiner which can compose unique combinations of array data.
+ *
+ * @param spec
+ * The string specifier, as explained in {@link Combiner} docs.
+ * @param elementFunction
+ * The function that indexes into a unique population of T elements
+ * @param elementClazz
+ * The component type for the values array which are produced by {@link #apply(long)}
+ */
+ public Combiner(String spec, LongFunction elementFunction, Class extends T> elementClazz) {
+ this.charsets = Combiner.parseSpec(spec);
+ this.elementFunction = elementFunction;
+ this.elementClazz = elementClazz;
+ this.modulo = computeRadixFactors(charsets);
+ this.inverted = invertedIndexFor(this.charsets);
+ }
+
+
+ /**
+ * Parse the spec, yielding an array of character arrays. each position in the spec delimited
+ * by comma or semicolon is represented by an array. Each array is then constructed from
+ * {@link #rangeFor(String)}.
+ *
+ * @param rangesSpec
+ * A range set specifier
+ * @return An array of char arrays
+ */
+ public static char[][] parseSpec(String rangesSpec) {
+ String[] ranges = rangesSpec.split("[,;]");
+ List specs = new ArrayList<>();
+ for (String range : ranges) {
+ if (range.matches("(.*?)\\*(\\d+)")) {
+ int rangeAt = range.lastIndexOf('*');
+ int times = Integer.parseInt(range.substring(rangeAt + 1));
+ for (int i = 0; i < times; i++) {
+ specs.add(range.substring(0, rangeAt));
+ }
+ } else {
+ specs.add(range);
+ }
+ }
+ char[][] cs = new char[specs.size()][];
+ for (int i = 0; i < specs.size(); i++) {
+ char[] range = rangeFor(specs.get(i));
+ cs[i] = range;
+ }
+ return cs;
+ }
+
+ /**
+ * Parse the range and return set of characters in an array. Any occurrences of a range specifier
+ * like {@code a-z} are expanded into the two characters and every on in between, in ordinal order.
+ * Otherwise, the characters are taken as they are presented. Each range is built and sanity
+ * checked by {@link #rangeFor} to ensure ordering is valid as well as that the characters are
+ * all in the printable range of ordinal 32 to ordinal 126.
+ *
+ * @param range
+ * a character range specifier like 'a-z' or '1357'
+ * @return An array of characters
+ */
+ public static char[] rangeFor(String range) {
+ range = range.replaceAll("\\n", "\n").replaceAll("\\r", "\r");
+ List chars = new ArrayList<>();
+ int pos = 0;
+ while (pos < range.length()) {
+ if (range.length() > pos + 2 && range.charAt(pos + 1) == '-') {
+ List rangeChars = rangeFor(range.substring(pos, pos + 1), range.substring(pos + 2, pos + 3));
+ chars.addAll(rangeChars);
+ pos += 3;
+ } else {
+ chars.add(range.substring(pos, pos + 1).charAt(0));
+ pos += 1;
+ }
+ }
+ char[] charAry = new char[chars.size()];
+ for (int i = 0; i < chars.size(); i++) {
+ charAry[i] = chars.get(i);
+ }
+ return charAry;
+ }
+
+ /**
+ * Create a list of characters from the US ASCII plane based on a start and end character.
+ *
+ * @param startChar
+ * A single ASCII character
+ * @param endChar
+ * A single ASCII character, must be equal to or come after startChar
+ * @return A list of characters in the range
+ */
+ public static List rangeFor(String startChar, String endChar) {
+ int start = startChar.getBytes(StandardCharsets.US_ASCII)[0];
+ int end = endChar.getBytes(StandardCharsets.US_ASCII)[0];
+ assertPrintable(start);
+ assertPrintable(end);
+ assertOrder(start, end);
+ List chars = new ArrayList<>();
+ ByteBuffer bb = ByteBuffer.allocate(1);
+ for (int i = start; i <= end; i++) {
+ bb.clear();
+ bb.put(0, (byte) i);
+ CharBuffer decoded = StandardCharsets.US_ASCII.decode(bb);
+ chars.add(decoded.get(0));
+ }
+ return chars;
+ }
+
+ private static void assertOrder(int start, int end) {
+ if (end < start) {
+ throw new RuntimeException("char '" + (char) end + "' (" + end + ") occurs after '" + (char) start + "' (" + start + "). Are you sure this is the right spec? (reverse the order)");
+ }
+
+ }
+
+ private static void assertPrintable(int asciiCode) {
+ if (asciiCode > 126 || asciiCode < 32) {
+ throw new RuntimeException("ASCII character for code " + asciiCode + " is outside the range of printable characters.");
+ }
+ }
+
+ public static int[][] invertedIndexFor(String charsetsSpecifier) {
+ char[][] chars = parseSpec(charsetsSpecifier);
+ return invertedIndexFor(chars);
+ }
+
+ public static int[][] invertedIndexFor(char[][] charsetColumns) {
+ int[][] inverted = new int[charsetColumns.length][];
+ for (int charsetIdx = 0; charsetIdx < charsetColumns.length; charsetIdx++) {
+ char[] charsForColumn = charsetColumns[charsetIdx];
+ inverted[charsetIdx] = indexesByChar(charsForColumn);
+ }
+ return inverted;
+ }
+
+ private static int[] indexesByChar(char[] charsForColumn) {
+ int maxval = Integer.MIN_VALUE;
+ for (char c : charsForColumn) {
+ maxval = (int) c > maxval ? (int) c : maxval;
+ }
+ int[] idx = new int[maxval + 1];
+ Arrays.fill(idx, -1);
+
+ for (int i = 0; i < charsForColumn.length; i++) {
+ idx[charsForColumn[i]] = i;
+ }
+ return idx;
+ }
+
+ /**
+ * Return an array of {@link T} elements by indexing into the sequence
+ * of character sets and their relative cardinality to derive column-specific
+ * index, and then converting them to the type T through the provided function.
+ *
+ * @param value
+ * the function argument
+ * @return a T which is identified by the provided value, unique if value is
+ * less than the maximum number of combinations, but repeated otherwise
+ */
+ @Override
+ public T[] apply(long value) {
+ @SuppressWarnings("Unchecked")
+ T[] ary = (T[]) Array.newInstance(elementClazz, charsets.length);
+ for (int colIdx = 0; colIdx < charsets.length; colIdx++) {
+ int valueSelector = (int) ((value / modulo[colIdx]) % Integer.MAX_VALUE);
+ ary[colIdx] = elementFunction.apply(valueSelector);
+ value %= modulo[colIdx];
+ }
+ return ary;
+ }
+
+ /**
+ * @param indexes
+ * indexes derived from {@link #getIndexes(long)}
+ * @return a T[]
+ */
+ public T[] getArray(int[] indexes) {
+ T[] ary = (T[]) Array.newInstance(elementClazz, charsets.length);
+ for (int colIdx = 0; colIdx < indexes.length; colIdx++) {
+ ary[colIdx] = elementFunction.apply(indexes[colIdx]);
+ }
+ return ary;
+ }
+
+ public T[] getArray(String encoding) {
+ long ordinal = getOrdinal(encoding);
+ return apply(ordinal);
+ }
+
+ public String getEncoding(long ordinal) {
+ return getEncoding(getIndexes(ordinal));
+ }
+
+ public String getEncoding(int[] indexes) {
+ StringBuilder sb = new StringBuilder(charsets.length);
+ for (int i = 0; i < indexes.length; i++) {
+ sb.append(charsets[i][indexes[i]]);
+ }
+ return sb.toString();
+ }
+
+
+ /**
+ * Get the indexes directly which are used by {@link #apply(long)}
+ *
+ * @param value
+ * @return an offset array for each column in the provided charset specifiers
+ */
+ public int[] getIndexes(long value) {
+ int[] ary = new int[charsets.length];
+ for (int colIdx = 0; colIdx < charsets.length; colIdx++) {
+ int valueSelector = (int) ((value / modulo[colIdx]) % Integer.MAX_VALUE);
+ ary[colIdx] = valueSelector;
+ value %= modulo[colIdx];
+ }
+ return ary;
+ }
+
+ /**
+ * @param encoding
+ * the string encoding for the given ordinal
+ * @return the indexes used to select a value from the value function for each position in the output array
+ */
+ public int[] getIndexes(String encoding) {
+ int[] indexes = new int[charsets.length];
+ char[] chars = encoding.toCharArray();
+ for (int i = 0; i < charsets.length; i++) {
+ indexes[i] = inverted[i][chars[i]];
+ }
+ return indexes;
+ }
+
+ /**
+ * Using the provided name, derive the ordinal value which matches it.
+ *
+ * @param name
+ * - the textual name, expressed as an ASCII string
+ * @return the long which can be used to construct the matching name or related array.
+ */
+ public long getOrdinal(String name) {
+ char[] chars = name.toCharArray();
+ long ordinal = 0;
+ for (int i = 0; i < chars.length; i++) {
+ ordinal += (modulo[i] * inverted[i][chars[i]]);
+ }
+ return ordinal;
+ }
+
+ /**
+ * Using the provided column offsets, derive the ordinal value which matches it.
+ *
+ * @param indexes
+ * - the indexes used to derive an array of values, or equivalently a name
+ * @return the long which can be used to construct the matching name or related array.
+ */
+ public long getOrdinal(int[] indexes) {
+ long ordinal = 0;
+ for (int i = 0; i < indexes.length; i++) {
+ ordinal += (modulo[i] *= indexes[i]);
+ }
+ return ordinal;
+ }
+
+
+ public static long[] computeRadixFactors(char[][] charsets) {
+ long modulo = 1L;
+ long[] m = new long[charsets.length];
+ for (int i = charsets.length - 1; i >= 0; i--) {
+ m[i] = modulo;
+ modulo = Math.multiplyExact(modulo, charsets[i].length);
+ }
+// m[m.length-1]=modulo;
+ return m;
+ }
+
+}
diff --git a/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/util/DoubleCombiner.java b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/util/DoubleCombiner.java
new file mode 100644
index 000000000..a266c81e6
--- /dev/null
+++ b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/util/DoubleCombiner.java
@@ -0,0 +1,182 @@
+/*
+ * 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.virtdata.library.basics.shared.util;
+
+import io.nosqlbench.virtdata.api.annotations.Categories;
+import io.nosqlbench.virtdata.api.annotations.Category;
+import io.nosqlbench.virtdata.api.annotations.ThreadSafeMapper;
+
+import java.util.Arrays;
+import java.util.function.LongFunction;
+import java.util.function.LongToDoubleFunction;
+
+
+/**
+ * For comprehensive docs on how this works, please see the javadocs for
+ * {@link Combiner}<T>. This class is merely a primitive specialization.
+ */
+@ThreadSafeMapper
+@Categories({Category.combinitoric, Category.conversion})
+public class DoubleCombiner implements LongFunction {
+
+ /**
+ * converts an index for a given column position into a value type.
+ */
+ private final LongToDoubleFunction elementFunction;
+ /**
+ * The columnar character sequences which represent radix values
+ */
+ private final char[][] charsets;
+
+ /**
+ * The columnar radix factors, cached
+ */
+ private final long[] modulo;
+ /**
+ * Columnar indexes from the character to the index values, for reverse mapping
+ */
+ private final int[][] inverted;
+
+ /**
+ * Construct a combiner which can compose unique combinations of array data.
+ *
+ * @param spec
+ * The string specifier, as explained in {@link DoubleCombiner} docs.
+ * @param elementFunction
+ * The function that indexes into a unique population of T elements
+ */
+ public DoubleCombiner(String spec, LongToDoubleFunction elementFunction) {
+ this.charsets = Combiner.parseSpec(spec);
+ this.elementFunction = elementFunction;
+ this.modulo = computeRadixFactors(charsets);
+ this.inverted = Combiner.invertedIndexFor(this.charsets);
+ }
+
+ protected static long maxRadixDigits(String spec) {
+ return Arrays.stream(Combiner.parseSpec(spec)).mapToInt(c->c.length).max().orElse(0);
+ }
+
+ @Override
+ public double[] apply(long value) {
+ double[] ary = new double[charsets.length];
+ for (int colIdx = 0; colIdx < charsets.length; colIdx++) {
+ int valueSelector = (int) ((value / modulo[colIdx]) % Integer.MAX_VALUE);
+ ary[colIdx] = elementFunction.applyAsDouble(valueSelector);
+ value %= modulo[colIdx];
+ }
+ return ary;
+ }
+
+ public double[] getArray(int[] indexes) {
+ double[] ary = new double[charsets.length];
+ for (int colIdx = 0; colIdx < indexes.length; colIdx++) {
+ ary[colIdx] = elementFunction.applyAsDouble(indexes[colIdx]);
+ }
+ return ary;
+ }
+
+ public double[] getArray(String encoding) {
+ long ordinal = getOrdinal(encoding);
+ return apply(ordinal);
+ }
+
+ public String getEncoding(long ordinal) {
+ return getEncoding(getIndexes(ordinal));
+ }
+
+ public String getEncoding(int[] indexes) {
+ StringBuilder sb = new StringBuilder(charsets.length);
+ for (int i = 0; i < indexes.length; i++) {
+ sb.append(charsets[i][indexes[i]]);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Get the indexes directly which are used by {@link #apply(long)}
+ *
+ * @param value
+ * @return an offset array for each column in the provided charset specifiers
+ */
+ public int[] getIndexes(long value) {
+ int[] ary = new int[charsets.length];
+ for (int colIdx = 0; colIdx < charsets.length; colIdx++) {
+ int valueSelector = (int) ((value / modulo[colIdx]) % Integer.MAX_VALUE);
+ ary[colIdx] = valueSelector;
+ value %= modulo[colIdx];
+ }
+ return ary;
+ }
+
+ /**
+ * @param encoding
+ * the string encoding for the given ordinal
+ * @return the indexes used to select a value from the value function for each position in the output array
+ */
+ public int[] getIndexes(String encoding) {
+ int[] indexes = new int[charsets.length];
+ char[] chars = encoding.toCharArray();
+ for (int i = 0; i < charsets.length; i++) {
+ indexes[i] = inverted[i][chars[i]];
+ }
+ return indexes;
+ }
+
+ /**
+ * Using the provided name, derive the ordinal value which matches it.
+ *
+ * @param name
+ * - the textual name, expressed as an ASCII string
+ * @return the long which can be used to construct the matching name or related array.
+ */
+ public long getOrdinal(String name) {
+ char[] chars = name.toCharArray();
+ long ordinal = 0;
+ for (int i = 0; i < chars.length; i++) {
+ ordinal += (modulo[i] * inverted[i][chars[i]]);
+ }
+ return ordinal;
+ }
+
+ /**
+ * Using the provided column offsets, derive the ordinal value which matches it.
+ *
+ * @param indexes
+ * - the indexes used to derive an array of values, or equivalently a name
+ * @return the long which can be used to construct the matching name or related array.
+ */
+ public long getOrdinal(int[] indexes) {
+ long ordinal = 0;
+ for (int i = 0; i < indexes.length; i++) {
+ ordinal += (modulo[i] *= indexes[i]);
+ }
+ return ordinal;
+ }
+
+
+ public static long[] computeRadixFactors(char[][] charsets) {
+ long modulo = 1L;
+ long[] m = new long[charsets.length];
+ for (int i = charsets.length - 1; i >= 0; i--) {
+ m[i] = modulo;
+ modulo = Math.multiplyExact(modulo, charsets[i].length);
+ }
+// m[m.length-1]=modulo;
+ return m;
+ }
+
+}
diff --git a/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/util/Stringify.java b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/util/Stringify.java
new file mode 100644
index 000000000..857b0060f
--- /dev/null
+++ b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/util/Stringify.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 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.virtdata.library.basics.shared.util;
+
+import io.nosqlbench.virtdata.api.annotations.Categories;
+import io.nosqlbench.virtdata.api.annotations.Category;
+import io.nosqlbench.virtdata.api.annotations.ThreadSafeMapper;
+
+import java.util.Arrays;
+import java.util.function.Function;
+
+@ThreadSafeMapper
+@Categories(Category.diagnostics)
+public class Stringify implements Function