diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtils.java b/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtils.java new file mode 100644 index 000000000..f02592c3b --- /dev/null +++ b/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtils.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.engine.extensions.vectormath; + +import com.datastax.oss.driver.api.core.cql.Row; + +import java.util.List; + +public class CqlUtils { + + public static long[] cqlRowFieldsToLongArray(String fieldName, List rows) { + return rows.stream().mapToLong(r -> r.getLong(fieldName)).toArray(); + } + + public static String[] cqlRowFieldsToStringArray(String fieldName, List rows) { + return rows.stream().map(r -> r.getString(fieldName)).toArray(String[]::new); + } + + public static int[] cqlRowListToIntArray(String fieldName, List rows) { + return rows.stream().mapToInt(r -> r.getInt(fieldName)).toArray(); + } + + +} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/VectorMathPluginInfo.java b/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtilsPluginInfo.java similarity index 72% rename from adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/VectorMathPluginInfo.java rename to adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtilsPluginInfo.java index 1828100a2..6d1fd5478 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/VectorMathPluginInfo.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtilsPluginInfo.java @@ -18,19 +18,19 @@ package io.nosqlbench.engine.extensions.vectormath; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class,selector = "vectormath") -public class VectorMathPluginInfo implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class,selector = "cql_utils") +public class CqlUtilsPluginInfo implements ScriptingExtensionPluginInfo { @Override public String getDescription() { return "various methods and utilities for working with vector math in a scripted environment"; } @Override - public VectorMath getExtensionObject(Logger logger, MetricRegistry metricRegistry, LabeledScenarioContext scriptContext) { - return new VectorMath(); + public CqlUtils getExtensionObject(Logger logger, MetricRegistry metricRegistry, LabeledScenarioContext scriptContext) { + return new CqlUtils(); } } diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/VectorMath.java b/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/VectorMath.java deleted file mode 100644 index a529d0b21..000000000 --- a/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/VectorMath.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.engine.extensions.vectormath; - -import com.datastax.oss.driver.api.core.cql.Row; - -import java.util.Arrays; -import java.util.List; - -public class VectorMath { - - public static long[] rowFieldsToLongArray(String fieldName, List rows) { - return rows.stream().mapToLong(r -> r.getLong(fieldName)).toArray(); - } - - public static String[] rowFieldsToStringArray(String fieldName, List rows) { - return rows.stream().map(r -> r.getString(fieldName)).toArray(String[]::new); - } - - public static long[] stringArrayAsALongArray(String[] strings) { - long[] longs = new long[strings.length]; - for (int i = 0; i < longs.length; i++) { - longs[i]=Long.parseLong(strings[i]); - } - return longs; - } - - public static int[] stringArrayAsIntArray(String[] strings) { - int[] ints = new int[strings.length]; - for (int i = 0; i < ints.length; i++) { - ints[i]=Integer.parseInt(strings[i]); - } - return ints; - } - - public static int[] rowListToIntArray(String fieldName, List rows) { - return rows.stream().mapToInt(r -> r.getInt(fieldName)).toArray(); - } - - public static double computeRecall(long[] referenceIndexes, long[] sampleIndexes) { - Arrays.sort(referenceIndexes); - Arrays.sort(sampleIndexes); - long[] intersection = Intersections.find(referenceIndexes,sampleIndexes); - return (double)intersection.length/(double)referenceIndexes.length; - } - - public static double computeRecall(int[] referenceIndexes, int[] sampleIndexes) { - Arrays.sort(referenceIndexes); - Arrays.sort(sampleIndexes); - int[] intersection = Intersections.find(referenceIndexes,sampleIndexes); - return (double)intersection.length/(double)referenceIndexes.length; - } - - -} diff --git a/adapter-cqld4/src/test/java/io/nosqlbench/engine/extensions/vectormath/VectorMathTest.java b/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/scriptingutils/PineconeScriptingUtils.java similarity index 54% rename from adapter-cqld4/src/test/java/io/nosqlbench/engine/extensions/vectormath/VectorMathTest.java rename to adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/scriptingutils/PineconeScriptingUtils.java index 334a6c008..7e89f0323 100644 --- a/adapter-cqld4/src/test/java/io/nosqlbench/engine/extensions/vectormath/VectorMathTest.java +++ b/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/scriptingutils/PineconeScriptingUtils.java @@ -14,27 +14,19 @@ * limitations under the License. */ -package io.nosqlbench.engine.extensions.vectormath; +package io.nosqlbench.engine.extensions.scriptingutils; -import org.junit.jupiter.api.Test; -class VectorMathTest { +import io.pinecone.proto.QueryResponse; +import io.pinecone.proto.ScoredVector; - private VectorMath vm = new VectorMath(); +public class PineconeScriptingUtils { - @Test - void computeRecallForRowListVsLongIndexList() { - VectorMath.computeRecall(new long[]{}, new long[]{}); + public String[] responseIdsToStringArray(QueryResponse response) { + return response.getMatchesList().stream().map(ScoredVector::getId).toArray(String[]::new); } - @Test - void computeRecallForRowListVsIntIndexList() { + public int[] responseIdsToIntArray(QueryResponse response) { + return response.getMatchesList().stream().mapToInt(r -> Integer.parseInt(r.getId())).toArray(); } - @Test - void computeRecallForRowListVsIntIndexArray() { - } - - @Test - void computeRecallForRowListVsLongIndexArray() { - } } diff --git a/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/vectormath/PineconeVectorMathPluginInfo.java b/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/scriptingutils/PineconeScriptingUtilsPluginInfo.java similarity index 66% rename from adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/vectormath/PineconeVectorMathPluginInfo.java rename to adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/scriptingutils/PineconeScriptingUtilsPluginInfo.java index a15cd4419..010d51b4e 100644 --- a/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/vectormath/PineconeVectorMathPluginInfo.java +++ b/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/scriptingutils/PineconeScriptingUtilsPluginInfo.java @@ -14,23 +14,23 @@ * limitations under the License. */ -package io.nosqlbench.engine.extensions.vectormath; +package io.nosqlbench.engine.extensions.scriptingutils; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class,selector = "pinecone_vectormath") -public class PineconeVectorMathPluginInfo implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class,selector = "pinecone_utils") +public class PineconeScriptingUtilsPluginInfo implements ScriptingExtensionPluginInfo { @Override public String getDescription() { return "various methods and utilities for working with vector math in a scripted environment"; } @Override - public PineconeVectorMath getExtensionObject(Logger logger, MetricRegistry metricRegistry, LabeledScenarioContext scriptContext) { - return new PineconeVectorMath(); + public PineconeScriptingUtils getExtensionObject(Logger logger, MetricRegistry metricRegistry, LabeledScenarioContext scriptContext) { + return new PineconeScriptingUtils(); } } diff --git a/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/vectormath/PineconeIntersections.java b/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/vectormath/PineconeIntersections.java deleted file mode 100644 index ae8e4094a..000000000 --- a/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/vectormath/PineconeIntersections.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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.engine.extensions.vectormath; - -import java.util.Arrays; - -public class PineconeIntersections { - - public static long[] find(long[] reference, long[] sample) { - long[] result = new long[reference.length]; - int a_index = 0, b_index = 0, acc_index = -1; - long a_element, b_element; - while (a_index < reference.length && b_index < sample.length) { - a_element = reference[a_index]; - b_element = sample[b_index]; - if (a_element == b_element) { - result = resize(result); - result[++acc_index] = a_element; - a_index++; - b_index++; - } else if (b_element < a_element) { - b_index++; - } else { - a_index++; - } - } - return Arrays.copyOfRange(result,0,acc_index+1); - } - - public static int[] find(int[] reference, int[] sample) { - int[] result = new int[reference.length]; - int a_index = 0, b_index = 0, acc_index = -1; - int a_element, b_element; - while (a_index < reference.length && b_index < sample.length) { - a_element = reference[a_index]; - b_element = sample[b_index]; - if (a_element == b_element) { - result = resize(result); - result[++acc_index] = a_element; - a_index++; - b_index++; - } else if (b_element < a_element) { - b_index++; - } else { - a_index++; - } - } - return Arrays.copyOfRange(result,0,acc_index+1); - } - - public static int[] resize(int[] arr) { - int len = arr.length; - int[] copy = new int[len + 1]; - for (int i = 0; i < len; i++) { - copy[i] = arr[i]; - } - return copy; - } - - public static long[] resize(long[] arr) { - int len = arr.length; - long[] copy = new long[len + 1]; - for (int i = 0; i < len; i++) { - copy[i] = arr[i]; - } - return copy; - } - -} diff --git a/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/vectormath/PineconeVectorMath.java b/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/vectormath/PineconeVectorMath.java deleted file mode 100644 index edc17394e..000000000 --- a/adapter-pinecone/src/main/java/io/nosqlbench/engine/extensions/vectormath/PineconeVectorMath.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.engine.extensions.vectormath; - -import io.pinecone.proto.QueryResponse; -import io.pinecone.proto.ScoredVector; - -import java.util.Arrays; - -public class PineconeVectorMath { - - public static long[] stringArrayAsALongArray(String[] strings) { - long[] longs = new long[strings.length]; - for (int i = 0; i < longs.length; i++) { - longs[i]=Long.parseLong(strings[i]); - } - return longs; - } - - public static int[] stringArrayAsIntArray(String[] strings) { - int[] ints = new int[strings.length]; - for (int i = 0; i < ints.length; i++) { - ints[i]=Integer.parseInt(strings[i]); - } - return ints; - } - - public static String[] idsToStringArray(QueryResponse response) { - return response.getMatchesList().stream().map(ScoredVector::getId).toArray(String[]::new); - } - - public static int[] idsToIntArray(QueryResponse response) { - return response.getMatchesList().stream().mapToInt(r -> Integer.parseInt(r.getId())).toArray(); - } - - public static double computeRecall(long[] referenceIndexes, long[] sampleIndexes) { - Arrays.sort(referenceIndexes); - Arrays.sort(sampleIndexes); - long[] intersection = PineconeIntersections.find(referenceIndexes,sampleIndexes); - return (double)intersection.length/(double)referenceIndexes.length; - } - - public static double computeRecall(int[] referenceIndexes, int[] sampleIndexes) { - Arrays.sort(referenceIndexes); - Arrays.sort(sampleIndexes); - int[] intersection = PineconeIntersections.find(referenceIndexes,sampleIndexes); - return (double)intersection.length/(double)referenceIndexes.length; - } - -} 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 index 3354d3879..2305f4a5d 100644 --- 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 @@ -68,7 +68,8 @@ public abstract class BaseOpDispenser implements OpDispenser /** * package imports used with "verifiers" or "expected-result" are accumulated here */ - private final List verifierImports = new ArrayList(); + private final List verifierImports = new ArrayList<>(); + private final List> verifierStaticImports = 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 @@ -129,7 +130,7 @@ public abstract class BaseOpDispenser implements OpDispenser try { initBlocks.forEach((initName, stringTemplate) -> { GroovyCycleFunction initFunction = - new GroovyCycleFunction<>(initName,stringTemplate,verifierImports,variables); + new GroovyCycleFunction<>(initName,stringTemplate,verifierImports,verifierStaticImports,variables); logger.info("configured verifier init:" + initFunction); initFunction.setVariable("_parsed_op",op); initFunction.apply(0L); @@ -143,7 +144,7 @@ public abstract class BaseOpDispenser implements OpDispenser try { namedVerifiers.forEach((verifierName,stringTemplate) -> { GroovyBooleanCycleFunction verifier = - new GroovyBooleanCycleFunction(verifierName, stringTemplate, verifierImports, variables); + new GroovyBooleanCycleFunction(verifierName, stringTemplate, verifierImports, verifierStaticImports, variables); logger.info("configured verifier:" + verifier); verifierFunctions.add(verifier); }); @@ -153,7 +154,7 @@ public abstract class BaseOpDispenser implements OpDispenser try { op.takeAsOptionalStringTemplate(EXPECTED_RESULT) - .map(tpl -> new GroovyObjectEqualityFunction(op.getName()+"-"+EXPECTED_RESULT, tpl, verifierImports, variables)) + .map(tpl -> new GroovyObjectEqualityFunction(op.getName()+"-"+EXPECTED_RESULT, tpl, verifierImports, verifierStaticImports, variables)) .map(vl -> { logger.info("Configured equality verifier: " + vl); return vl; 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 index d92a3df30..79cb33763 100644 --- 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 @@ -23,8 +23,8 @@ import java.util.List; public class GroovyBooleanCycleFunction extends GroovyCycleFunction { - public GroovyBooleanCycleFunction(String name, ParsedTemplateString template, List imports, Binding binding) { - super(name, template, imports, binding); + public GroovyBooleanCycleFunction(String name, ParsedTemplateString template, List imports, List> staticSymbolImports, Binding binding) { + super(name, template, imports, staticSymbolImports, binding); } @Override 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 index 1686146b3..86b0bcd08 100644 --- 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 @@ -21,7 +21,7 @@ import groovy.lang.GroovyShell; import groovy.lang.Script; import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser; import io.nosqlbench.api.extensions.SandboxExtensionFinder; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.virtdata.core.bindings.Bindings; import io.nosqlbench.virtdata.core.bindings.BindingsTemplate; import io.nosqlbench.virtdata.core.templates.BindPoint; @@ -39,12 +39,14 @@ public class GroovyCycleFunction implements CycleFunction { private final static Logger logger = LogManager.getLogger(GroovyBooleanCycleFunction.class); private final String name; private final List imports; - private final List enabledServices = new ArrayList<>(List.of("vectormath")); +// private final List enabledServices = new ArrayList<>(List.of("vectormath")); + private final List enabledServices = new ArrayList<>(); 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 + private final List> staticImports; /** * Instantiate a cycle function from basic types @@ -56,10 +58,11 @@ public class GroovyCycleFunction implements CycleFunction { * @param imports * The package imports to be installed into the execution environment */ - public GroovyCycleFunction(String name, String scriptText, Map bindingSpecs, List imports, Binding binding) { + public GroovyCycleFunction(String name, String scriptText, Map bindingSpecs, List imports, List> staticImports, Binding binding) { this.name = name; this.scriptText = scriptText; this.imports = imports; + this.staticImports = staticImports; // scripting env variable bindings this.variableBindings = binding!=null? binding : new Binding(); @@ -67,12 +70,13 @@ public class GroovyCycleFunction implements CycleFunction { // virtdata bindings to be evaluated at cycle time this.bindingFunctions = new BindingsTemplate().addFieldBindings(bindingSpecs).resolveBindings(); - this.script = compileScript(this.scriptText, imports, binding); + this.script = compileScript(this.scriptText, imports, staticImports, binding); addServices(); } private void addServices() { - for (final ScriptingPluginInfo extensionDescriptor : SandboxExtensionFinder.findAll()) { + for (final ScriptingExtensionPluginInfo extensionDescriptor : SandboxExtensionFinder.findAll()) { + staticImports.addAll(extensionDescriptor.autoImportStaticMethodClasses()); if (!extensionDescriptor.isAutoLoading()) { logger.info(() -> "Not loading " + extensionDescriptor + ", autoloading is false"); continue; @@ -94,28 +98,35 @@ public class GroovyCycleFunction implements CycleFunction { } } - public GroovyCycleFunction(String name, ParsedTemplateString template, List imports, Binding binding) { + public GroovyCycleFunction(String name, ParsedTemplateString template, List imports, List> staticImports, Binding binding) { this( name, template.getPositionalStatement(), resolveBindings(template.getBindPoints()), imports, + staticImports, binding ); } - private Script compileScript(String scriptText, List imports, Binding binding) { + private Script compileScript(String scriptText, List imports, List> staticImports, Binding binding) { // add classes which are in the imports to the groovy evaluation context String[] verifiedClasses = expandClassNames(imports); + String[] verifiedStaticImports = expandStaticImports(staticImports); CompilerConfiguration compilerConfiguration = new CompilerConfiguration(); ImportCustomizer importer = new ImportCustomizer().addImports(verifiedClasses); + importer.addStaticStars(verifiedStaticImports); compilerConfiguration.addCompilationCustomizers(importer); GroovyShell gshell = new GroovyShell(binding!=null? binding:new Binding(), compilerConfiguration); return gshell.parse(scriptText); } + private String[] expandStaticImports(List> staticImports) { + return staticImports.stream().map(Class::getCanonicalName).toArray(String[]::new); + } + private static Map resolveBindings(List bindPoints) { return new BindingsTemplate(bindPoints).getMap(); } @@ -166,16 +177,17 @@ public class GroovyCycleFunction implements CycleFunction { */ @Override public CycleFunction newInstance() { - return new GroovyCycleFunction(name, scriptText, bindingFunctions, imports, this.variableBindings.getVariables()); + return new GroovyCycleFunction(name, scriptText, bindingFunctions, imports, staticImports, this.variableBindings.getVariables()); } - private GroovyCycleFunction(String name, String scriptText, Bindings bindingFunctions, List imports, Map originalBinding) { + private GroovyCycleFunction(String name, String scriptText, Bindings bindingFunctions, List imports, List> staticImports, Map originalBinding) { this.name = name; this.scriptText = scriptText; this.bindingFunctions = bindingFunctions; this.imports = imports; + this.staticImports = staticImports; - this.script = compileScript(scriptText, imports, new Binding()); + this.script = compileScript(scriptText, imports, staticImports, new Binding()); this.variableBindings = script.getBinding(); originalBinding.forEach((k,v) -> variableBindings.setVariable(k.toString(),v)); } 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 index d20f35b9c..70c1a5027 100644 --- 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 @@ -33,8 +33,8 @@ public class GroovyObjectEqualityFunction extends GroovyCycleFunction { private Object result; - public GroovyObjectEqualityFunction(String name, ParsedTemplateString template, List imports, Binding binding) { - super(name, template, imports, binding); + public GroovyObjectEqualityFunction(String name, ParsedTemplateString template, List imports, List> staticImports, Binding binding) { + super(name, template, imports, staticImports, binding); } @Override diff --git a/adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/CompoundCycleFunctionTest.java b/adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/CompoundCycleFunctionTest.java index 67386e9a0..8ef62a497 100644 --- a/adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/CompoundCycleFunctionTest.java +++ b/adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/CompoundCycleFunctionTest.java @@ -25,8 +25,8 @@ import static org.assertj.core.api.Assertions.assertThat; public class CompoundCycleFunctionTest { - private final GroovyCycleFunction truthy = new GroovyCycleFunction<>("truthy", "true;", Map.of(), List.of(),null); - private final GroovyCycleFunction falsy = new GroovyCycleFunction<>("falsy", "false;", Map.of(), List.of(), null); + private final GroovyCycleFunction truthy = new GroovyCycleFunction<>("truthy", "true;", Map.of(), List.of(), List.of(),null); + private final GroovyCycleFunction falsy = new GroovyCycleFunction<>("falsy", "false;", Map.of(), List.of(), List.of(), null); @Test public void testReducerFirstOrLastResult() { diff --git a/adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/GroovyBooleanCycleFunctionTest.java b/adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/GroovyBooleanCycleFunctionTest.java index 42cbfed7b..6b85c5554 100644 --- a/adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/GroovyBooleanCycleFunctionTest.java +++ b/adapters-api/src/test/java/io/nosqlbench/adapters/api/evalcontext/GroovyBooleanCycleFunctionTest.java @@ -36,7 +36,7 @@ public class GroovyBooleanCycleFunctionTest { Map.of("numbername", "NumberNameToString()") ); List imports = List.of(); - GroovyBooleanCycleFunction function = new GroovyBooleanCycleFunction("test1", parsedTemplate, imports, null); + GroovyBooleanCycleFunction function = new GroovyBooleanCycleFunction("test1", parsedTemplate, imports, List.of(), null); Boolean result = function.apply(2); assertThat(result).isTrue(); } @@ -49,7 +49,7 @@ public class GroovyBooleanCycleFunctionTest { Map.of("numbername", "NumberNameToString()") ); List imports = List.of(); - GroovyCycleFunction function = new GroovyBooleanCycleFunction("test2", parsedTemplate, imports, null); + GroovyCycleFunction function = new GroovyBooleanCycleFunction("test2", parsedTemplate, imports, List.of(),null); System.out.println(function); assertThatThrownBy(() -> function.apply(3L)).isInstanceOf(MissingPropertyException.class); } diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/Scenario.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/Scenario.java index c09d8aeb7..601f4e869 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/Scenario.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/Scenario.java @@ -25,7 +25,7 @@ import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.api.metadata.ScenarioMetadata; import io.nosqlbench.api.metadata.ScenarioMetadataAware; import io.nosqlbench.api.metadata.SystemId; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.engine.api.scripting.ScriptEnvBuffer; import io.nosqlbench.engine.core.annotation.Annotators; import io.nosqlbench.engine.core.lifecycle.ExecutionMetricsResult; @@ -211,7 +211,7 @@ public class Scenario implements Callable, NBLabeledElem this.scriptEngine.put("metrics", new PolyglotMetricRegistryBindings(metricRegistry)); this.scriptEngine.put("activities", new ActivityBindings(scenarioController)); - for (final ScriptingPluginInfo extensionDescriptor : SandboxExtensionFinder.findAll()) { + for (final ScriptingExtensionPluginInfo extensionDescriptor : SandboxExtensionFinder.findAll()) { if (!extensionDescriptor.isAutoLoading()) { this.logger.info(() -> "Not loading " + extensionDescriptor + ", autoloading is false"); continue; diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctionPluginInfo.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctionPluginInfo.java new file mode 100644 index 000000000..055ccd0c4 --- /dev/null +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctionPluginInfo.java @@ -0,0 +1,43 @@ +/* + * 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.engine.extensions.computefunctions; + +import com.codahale.metrics.MetricRegistry; +import io.nosqlbench.api.config.LabeledScenarioContext; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; +import io.nosqlbench.nb.annotations.Service; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +@Service(value = ScriptingExtensionPluginInfo.class,selector = "compute") +public class ComputeFunctionPluginInfo implements ScriptingExtensionPluginInfo { + @Override + public String getDescription() { + return "Various small math utilities."; + } + + @Override + public ComputeFunctions getExtensionObject(Logger logger, MetricRegistry metricRegistry, LabeledScenarioContext scriptContext) { + return new ComputeFunctions(); + } + + @Override + public List> autoImportStaticMethodClasses() { + return List.of(ComputeFunctions.class); + } +} diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctions.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctions.java new file mode 100644 index 000000000..0f5cc1476 --- /dev/null +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctions.java @@ -0,0 +1,71 @@ +/* + * 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.engine.extensions.computefunctions; + +import java.util.Arrays; + +public class ComputeFunctions { + + /** + * Compute the recall as the proportion of matching indices divided by the expected indices + * @param referenceIndexes long array of indices + * @param sampleIndexes long array of indices + * @return a fractional measure of matching vs expected indices + */ + public static double recall(long[] referenceIndexes, long[] sampleIndexes) { + Arrays.sort(referenceIndexes); + Arrays.sort(sampleIndexes); + long[] intersection = Intersections.find(referenceIndexes, sampleIndexes); + return (double) intersection.length / (double) referenceIndexes.length; + } + + /** + * Compute the recall as the proportion of matching indices divided by the expected indices + * @param referenceIndexes int array of indices + * @param sampleIndexes int array of indices + * @return a fractional measure of matching vs expected indices + */ + public static double recall(int[] referenceIndexes, int[] sampleIndexes) { + Arrays.sort(referenceIndexes); + Arrays.sort(sampleIndexes); + int intersection = Intersections.count(referenceIndexes, sampleIndexes); + return (double) intersection / (double) referenceIndexes.length; + } + + /** + * Compute the intersection of two long arrays + */ + public static long[] intersection(long[] a, long[] b) { + return Intersections.find(a,b); + } + + /** + * Compute the intersection of two int arrays + */ + public static int[] intersection(int[] reference, int[] sample) { + return Intersections.find(reference, sample); + } + + /** + * Compute the size of the intersection of two int arrays + */ + public static int intersectionSize(int[] reference, int[] sample) { + return Intersections.count(reference, sample); + } + + +} diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/Intersections.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/Intersections.java similarity index 92% rename from adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/Intersections.java rename to engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/Intersections.java index 24caaad05..9db074467 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/Intersections.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/Intersections.java @@ -14,12 +14,31 @@ * limitations under the License. */ -package io.nosqlbench.engine.extensions.vectormath; +package io.nosqlbench.engine.extensions.computefunctions; import java.util.Arrays; public class Intersections { + public static int count(int[] reference, int[] sample) { + int a_index = 0, b_index = 0, matches = 0; + int a_element, b_element; + while (a_index < reference.length && b_index < sample.length) { + a_element = reference[a_index]; + b_element = sample[b_index]; + if (a_element == b_element) { + ++matches; + a_index++; + b_index++; + } else if (b_element < a_element) { + b_index++; + } else { + a_index++; + } + } + return matches; + } + public static long count(long[] reference, long[] sample) { int a_index = 0, b_index = 0, matches = 0; long a_element, b_element; @@ -39,27 +58,6 @@ public class Intersections { return matches; } - public static long[] find(long[] reference, long[] sample) { - long[] result = new long[reference.length]; - int a_index = 0, b_index = 0, acc_index = -1; - long a_element, b_element; - while (a_index < reference.length && b_index < sample.length) { - a_element = reference[a_index]; - b_element = sample[b_index]; - if (a_element == b_element) { - result = resize(result); - result[++acc_index] = a_element; - a_index++; - b_index++; - } else if (b_element < a_element) { - b_index++; - } else { - a_index++; - } - } - return Arrays.copyOfRange(result,0,acc_index+1); - } - public static int[] find(int[] reference, int[] sample) { int[] result = new int[reference.length]; int a_index = 0, b_index = 0, acc_index = -1; @@ -80,15 +78,16 @@ public class Intersections { } return Arrays.copyOfRange(result,0,acc_index+1); } - - public static int count(int[] reference, int[] sample) { - int a_index = 0, b_index = 0, matches = 0; - int a_element, b_element; + public static long[] find(long[] reference, long[] sample) { + long[] result = new long[reference.length]; + int a_index = 0, b_index = 0, acc_index = -1; + long a_element, b_element; while (a_index < reference.length && b_index < sample.length) { a_element = reference[a_index]; b_element = sample[b_index]; if (a_element == b_element) { - ++matches; + result = resize(result); + result[++acc_index] = a_element; a_index++; b_index++; } else if (b_element < a_element) { @@ -97,25 +96,22 @@ public class Intersections { a_index++; } } - return matches; + return Arrays.copyOfRange(result,0,acc_index+1); } - public static int[] resize(int[] arr) { + private static int[] resize(int[] arr) { int len = arr.length; int[] copy = new int[len + 1]; - for (int i = 0; i < len; i++) { - copy[i] = arr[i]; - } + System.arraycopy(arr, 0, copy, 0, len); return copy; } - public static long[] resize(long[] arr) { + private static long[] resize(long[] arr) { int len = arr.length; long[] copy = new long[len + 1]; - for (int i = 0; i < len; i++) { - copy[i] = arr[i]; - } + System.arraycopy(arr, 0, copy, 0, len); return copy; } + } diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/conversions/ConversionUtilsPluginInfo.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/conversions/ConversionUtilsPluginInfo.java new file mode 100644 index 000000000..740b0c9fe --- /dev/null +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/conversions/ConversionUtilsPluginInfo.java @@ -0,0 +1,43 @@ +/* + * 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.engine.extensions.conversions; + +import com.codahale.metrics.MetricRegistry; +import io.nosqlbench.api.config.LabeledScenarioContext; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; +import io.nosqlbench.nb.annotations.Service; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +@Service(value = ScriptingExtensionPluginInfo.class,selector = "convert") +public class ConversionUtilsPluginInfo implements ScriptingExtensionPluginInfo { + @Override + public String getDescription() { + return "Utilities to convert between common basic data types"; + } + + @Override + public ConverterUtils getExtensionObject(Logger logger, MetricRegistry metricRegistry, LabeledScenarioContext scriptContext) { + return new ConverterUtils(); + } + + @Override + public List> autoImportStaticMethodClasses() { + return List.of(ConverterUtils.class); + } +} diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/conversions/ConverterUtils.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/conversions/ConverterUtils.java new file mode 100644 index 000000000..3af9e9c9a --- /dev/null +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/conversions/ConverterUtils.java @@ -0,0 +1,35 @@ +/* + * 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.engine.extensions.conversions; + +public class ConverterUtils { + public static int[] toIntArray(String[] strings) { + int[] ints = new int[strings.length]; + for (int i = 0; i < ints.length; i++) { + ints[i]=Integer.parseInt(strings[i]); + } + return ints; + } + + public static long[] toLongArray(String[] strings) { + long[] longs = new long[strings.length]; + for (int i = 0; i < longs.length; i++) { + longs[i]=Long.parseLong(strings[i]); + } + return longs; + } +} diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/CSVMetricsPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/CSVMetricsPluginData.java index 9a1b6c5ed..eb5471173 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/CSVMetricsPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/CSVMetricsPluginData.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.extensions.csvmetrics; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class, selector = "csvmetrics") -public class CSVMetricsPluginData implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class, selector = "csvmetrics") +public class CSVMetricsPluginData implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvoutput/CsvOutputPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvoutput/CsvOutputPluginData.java index 88da17183..6be84015e 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvoutput/CsvOutputPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvoutput/CsvOutputPluginData.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.extensions.csvoutput; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class,selector = "csvoutput") -public class CsvOutputPluginData implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class,selector = "csvoutput") +public class CsvOutputPluginData implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/example/ExamplePluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/example/ExamplePluginData.java index afd863582..742f49cbb 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/example/ExamplePluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/example/ExamplePluginData.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.extensions.example; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class, selector = "adder") -public class ExamplePluginData implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class, selector = "adder") +public class ExamplePluginData implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/files/FileAccessPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/files/FileAccessPluginData.java index 7d3e9ae76..47d327885 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/files/FileAccessPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/files/FileAccessPluginData.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.extensions.files; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class, selector = "files") -public class FileAccessPluginData implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class, selector = "files") +public class FileAccessPluginData implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/globalvars/GlobalVarsScriptingPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/globalvars/GlobalVarsScriptingExtensionPluginData.java similarity index 83% rename from engine-extensions/src/main/java/io/nosqlbench/engine/extensions/globalvars/GlobalVarsScriptingPluginData.java rename to engine-extensions/src/main/java/io/nosqlbench/engine/extensions/globalvars/GlobalVarsScriptingExtensionPluginData.java index bdb8b5af0..f1d95cf9e 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/globalvars/GlobalVarsScriptingPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/globalvars/GlobalVarsScriptingExtensionPluginData.java @@ -18,15 +18,15 @@ package io.nosqlbench.engine.extensions.globalvars; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import io.nosqlbench.virtdata.library.basics.core.threadstate.SharedState; import org.apache.logging.log4j.Logger; import java.util.concurrent.ConcurrentHashMap; -@Service(value = ScriptingPluginInfo.class, selector = "globalvars") -public class GlobalVarsScriptingPluginData implements ScriptingPluginInfo> { +@Service(value = ScriptingExtensionPluginInfo.class, selector = "globalvars") +public class GlobalVarsScriptingExtensionPluginData implements ScriptingExtensionPluginInfo> { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java index 8116d85ca..4490db297 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.extensions.histologger; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class, selector = "histologger") -public class HdrHistoLogPluginData implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class, selector = "histologger") +public class HdrHistoLogPluginData implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histostatslogger/HistoStatsPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histostatslogger/HistoStatsPluginData.java index 7e5fafd69..358343716 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histostatslogger/HistoStatsPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histostatslogger/HistoStatsPluginData.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.extensions.histostatslogger; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class, selector = "histostatslogger") -public class HistoStatsPluginData implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class, selector = "histostatslogger") +public class HistoStatsPluginData implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/http/HttpPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/http/HttpPluginData.java index 9826b6ceb..e6677207a 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/http/HttpPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/http/HttpPluginData.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.extensions.http; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class, selector = "http") -public class HttpPluginData implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class, selector = "http") +public class HttpPluginData implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPluginData.java index 010acffc7..dc33a6cf9 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPluginData.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.extensions.optimizers; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class, selector = "optimos") -public class BobyqaOptimizerPluginData implements ScriptingPluginInfo { +@Service(value = ScriptingExtensionPluginInfo.class, selector = "optimos") +public class BobyqaOptimizerPluginData implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/s3uploader/S3UploaderPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/s3uploader/S3UploaderPluginData.java index 2a7d9d65a..f17867b29 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/s3uploader/S3UploaderPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/s3uploader/S3UploaderPluginData.java @@ -18,14 +18,14 @@ package io.nosqlbench.engine.extensions.s3uploader; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import io.nosqlbench.api.metadata.ScenarioMetadata; import io.nosqlbench.api.metadata.ScenarioMetadataAware; import org.apache.logging.log4j.Logger; -@Service(value = ScriptingPluginInfo.class, selector = "s3") -public class S3UploaderPluginData implements ScriptingPluginInfo, ScenarioMetadataAware { +@Service(value = ScriptingExtensionPluginInfo.class, selector = "s3") +public class S3UploaderPluginData implements ScriptingExtensionPluginInfo, ScenarioMetadataAware { private ScenarioMetadata scenarioMetadata; @Override diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingGauge.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingGauge.java index 5ed8638ea..607d46d76 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingGauge.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingGauge.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. @@ -20,15 +20,12 @@ import com.codahale.metrics.Gauge; public class ScriptingGauge implements Gauge { private double value; - public ScriptingGauge(String name, double initialValue) { value = initialValue; } - public void update(double value) { this.value = value; } - @Override public Double getValue() { return value; diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetrics.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetrics.java index f527b651e..1926b1a3a 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetrics.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetrics.java @@ -18,7 +18,9 @@ package io.nosqlbench.engine.extensions.scriptingmetrics; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; +import io.nosqlbench.api.config.NBLabeledElement; import io.nosqlbench.api.engine.metrics.ActivityMetrics; +import io.nosqlbench.api.engine.metrics.DoubleSummaryGauge; import org.apache.logging.log4j.Logger; public class ScriptingMetrics { @@ -27,17 +29,30 @@ public class ScriptingMetrics { private final LabeledScenarioContext scriptContext; public ScriptingMetrics(final Logger logger, final MetricRegistry metricRegistry, final LabeledScenarioContext scriptContext) { - this.logger = logger; this.metricRegistry = metricRegistry; this.scriptContext = scriptContext; } - public ScriptingGauge newGauge(final String name, final double initialValue) { + public ScriptingGauge newStaticGauge(final String name, final double initialValue) { final ScriptingGauge scriptingGauge = new ScriptingGauge(name, initialValue); ActivityMetrics.gauge(this.scriptContext,name, scriptingGauge); this.logger.info(() -> "registered scripting gauge:" + name); return scriptingGauge; } + public DoubleSummaryGauge newSummaryGauge(final String name) { + final DoubleSummaryGauge summaryGauge = ActivityMetrics.summaryGauge(scriptContext,name); + this.logger.info(() -> "registered summmary gauge:" + name); + return summaryGauge; + } + + public DoubleSummaryGauge newSummaryGauge(NBLabeledElement context, final String name) { + final DoubleSummaryGauge summaryGauge = ActivityMetrics.summaryGauge(context,name); + this.logger.info(() -> "registered summmary gauge:" + name); + return summaryGauge; + } + + + } diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetricsPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetricsPluginData.java index adc7d8600..7fb050fa5 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetricsPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetricsPluginData.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.extensions.scriptingmetrics; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value= ScriptingPluginInfo.class, selector="scriptingmetrics") -public class ScriptingMetricsPluginData implements ScriptingPluginInfo { +@Service(value= ScriptingExtensionPluginInfo.class, selector="scriptingmetrics") +public class ScriptingMetricsPluginData implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPluginMetadata.java b/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPluginMetadata.java index 9d6ca92e7..29da6e174 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPluginMetadata.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPluginMetadata.java @@ -18,12 +18,12 @@ package io.nosqlbench.engine.shutdown; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingPluginInfo; +import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; -@Service(value=ScriptingPluginInfo.class,selector = "shutdown") -public class ShutdownHookPluginMetadata implements ScriptingPluginInfo { +@Service(value= ScriptingExtensionPluginInfo.class,selector = "shutdown") +public class ShutdownHookPluginMetadata implements ScriptingExtensionPluginInfo { @Override public String getDescription() { diff --git a/adapter-cqld4/src/test/java/io/nosqlbench/engine/extensions/vectormath/IntersectionsTest.java b/engine-extensions/src/test/java/io/nosqlbench/engine/extensions/computefunctions/IntersectionsTest.java similarity index 96% rename from adapter-cqld4/src/test/java/io/nosqlbench/engine/extensions/vectormath/IntersectionsTest.java rename to engine-extensions/src/test/java/io/nosqlbench/engine/extensions/computefunctions/IntersectionsTest.java index 2fc41d76b..d6545e0c4 100644 --- a/adapter-cqld4/src/test/java/io/nosqlbench/engine/extensions/vectormath/IntersectionsTest.java +++ b/engine-extensions/src/test/java/io/nosqlbench/engine/extensions/computefunctions/IntersectionsTest.java @@ -14,13 +14,15 @@ * limitations under the License. */ -package io.nosqlbench.engine.extensions.vectormath; +package io.nosqlbench.engine.extensions.computefunctions; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; + class IntersectionsTest { + @Test public void testIntegerIntersection() { int[] result = Intersections.find(new int[]{1,2,3,4,5},new int[]{4,5,6,7,8}); @@ -44,4 +46,5 @@ class IntersectionsTest { assertThat(result).isEqualTo(3); } + } diff --git a/nb-api/src/main/java/io/nosqlbench/api/extensions/SandboxExtensionFinder.java b/nb-api/src/main/java/io/nosqlbench/api/extensions/SandboxExtensionFinder.java index 913257042..8536f5978 100644 --- a/nb-api/src/main/java/io/nosqlbench/api/extensions/SandboxExtensionFinder.java +++ b/nb-api/src/main/java/io/nosqlbench/api/extensions/SandboxExtensionFinder.java @@ -23,14 +23,14 @@ import java.util.ServiceLoader; public class SandboxExtensionFinder { - private final static List> extensionDescriptors = new ArrayList<>(); + private final static List> extensionDescriptors = new ArrayList<>(); - public static List> findAll() { + public static List> findAll() { if (extensionDescriptors.isEmpty()) { synchronized (SandboxExtensionFinder.class) { if (extensionDescriptors.isEmpty()) { - ServiceLoader loader = - ServiceLoader.load(ScriptingPluginInfo.class); + ServiceLoader loader = + ServiceLoader.load(ScriptingExtensionPluginInfo.class); loader.iterator().forEachRemaining(extensionDescriptors::add); } } diff --git a/nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingPluginInfo.java b/nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingExtensionPluginInfo.java similarity index 93% rename from nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingPluginInfo.java rename to nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingExtensionPluginInfo.java index 842526576..8bfd9a11c 100644 --- a/nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingPluginInfo.java +++ b/nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingExtensionPluginInfo.java @@ -21,6 +21,8 @@ import io.nosqlbench.api.config.LabeledScenarioContext; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; +import java.util.List; + /** * Any implementation of a SandboxExtension that is found in the runtime * can be automatically loaded into the scenario scripting sandbox. @@ -30,7 +32,7 @@ import org.apache.logging.log4j.Logger; * Each scenario gets its own instance of an object from this SandboxPlugin *

*/ -public interface ScriptingPluginInfo { +public interface ScriptingExtensionPluginInfo { /** * @return a brief description of this extension. @@ -61,4 +63,8 @@ public interface ScriptingPluginInfo { default boolean isAutoLoading() { return true; } + + default List> autoImportStaticMethodClasses() { + return List.of(); + } }