mirror of
https://github.com/nosqlbench/nosqlbench.git
synced 2025-02-25 18:55:28 -06:00
improvements to cqld4
This commit is contained in:
parent
e88197a1b8
commit
f7bf1a0276
@ -1,9 +1,8 @@
|
|||||||
package io.nosqlbench.adapter.cqld4;
|
package io.nosqlbench.adapter.cqld4;
|
||||||
|
|
||||||
import io.nosqlbench.engine.api.activityimpl.OpDispenser;
|
import io.nosqlbench.engine.api.activityimpl.OpMapper;
|
||||||
import io.nosqlbench.engine.api.activityimpl.uniform.BaseDriverAdapter;
|
import io.nosqlbench.engine.api.activityimpl.uniform.BaseDriverAdapter;
|
||||||
import io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter;
|
import io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter;
|
||||||
import io.nosqlbench.engine.api.templating.ParsedCommand;
|
|
||||||
import io.nosqlbench.nb.annotations.Service;
|
import io.nosqlbench.nb.annotations.Service;
|
||||||
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
@ -14,7 +13,7 @@ public class Cqld4DriverAdapter extends BaseDriverAdapter<Cqld4Op,Cqld4Space> {
|
|||||||
private Cqld4SpaceCache sessionCache;
|
private Cqld4SpaceCache sessionCache;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Function<ParsedCommand, OpDispenser<Cqld4Op>> getOpMapper() {
|
public OpMapper<Cqld4Op> getOpMapper() {
|
||||||
return new Cqld4OpMapper(getSpaceCache());
|
return new Cqld4OpMapper(getSpaceCache());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@ import io.nosqlbench.engine.api.activityimpl.OpDispenser;
|
|||||||
import io.nosqlbench.engine.api.activityimpl.OpMapper;
|
import io.nosqlbench.engine.api.activityimpl.OpMapper;
|
||||||
import io.nosqlbench.engine.api.activityimpl.uniform.DriverSpaceCache;
|
import io.nosqlbench.engine.api.activityimpl.uniform.DriverSpaceCache;
|
||||||
import io.nosqlbench.engine.api.templating.ParsedCommand;
|
import io.nosqlbench.engine.api.templating.ParsedCommand;
|
||||||
import io.nosqlbench.nb.api.errors.BasicError;
|
|
||||||
|
|
||||||
public class Cqld4OpMapper implements OpMapper<Cqld4Op> {
|
public class Cqld4OpMapper implements OpMapper<Cqld4Op> {
|
||||||
|
|
||||||
@ -22,18 +21,9 @@ public class Cqld4OpMapper implements OpMapper<Cqld4Op> {
|
|||||||
|
|
||||||
public OpDispenser<Cqld4Op> apply(ParsedCommand cmd) {
|
public OpDispenser<Cqld4Op> apply(ParsedCommand cmd) {
|
||||||
|
|
||||||
// if session field = static string, else ...
|
Cqld4Space cqld4Space = cache.get(cmd.getStaticConfigOr("space", "default"));
|
||||||
|
boolean prepared = cmd.getStaticConfigOr("prepared",true);
|
||||||
boolean prepared = cmd.getStaticValueOr("prepared",false);
|
boolean batch = cmd.getStaticConfigOr("boolean",false);
|
||||||
boolean batch = cmd.getStaticValueOr("boolean",false);
|
|
||||||
|
|
||||||
if (cmd.isDefinedDynamic("session")) {
|
|
||||||
throw new BasicError("This driver adapter does not support dynamic sessions.");
|
|
||||||
}
|
|
||||||
// If it did, we would use something like this instead...
|
|
||||||
// LongFunction<String> session = cmd.getAsFunctionOr("session", "default");
|
|
||||||
|
|
||||||
Cqld4Space cqld4Space = cache.get(cmd.getStaticValueOr("session", "default"));
|
|
||||||
CqlSession session = cqld4Space.getSession();
|
CqlSession session = cqld4Space.getSession();
|
||||||
|
|
||||||
if (prepared && batch) {
|
if (prepared && batch) {
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
package io.nosqlbench.driver.direct;
|
package io.nosqlbench.driver.direct;
|
||||||
|
|
||||||
import io.nosqlbench.engine.api.activityimpl.OpDispenser;
|
import io.nosqlbench.engine.api.activityimpl.OpMapper;
|
||||||
import io.nosqlbench.engine.api.activityimpl.uniform.BaseDriverAdapter;
|
import io.nosqlbench.engine.api.activityimpl.uniform.BaseDriverAdapter;
|
||||||
import io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter;
|
import io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter;
|
||||||
import io.nosqlbench.engine.api.templating.ParsedCommand;
|
|
||||||
import io.nosqlbench.nb.annotations.Service;
|
import io.nosqlbench.nb.annotations.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -29,7 +28,7 @@ public class DirectCallAdapter extends BaseDriverAdapter<DirectCall,Void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Function<ParsedCommand, OpDispenser<DirectCall>> getOpMapper() {
|
public OpMapper<DirectCall> getOpMapper() {
|
||||||
return new DirectOpMapper();
|
return new DirectOpMapper();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,21 @@
|
|||||||
package io.nosqlbench.driver.direct;
|
package io.nosqlbench.driver.direct;
|
||||||
|
|
||||||
import io.nosqlbench.engine.api.activityimpl.OpDispenser;
|
import io.nosqlbench.engine.api.activityimpl.OpDispenser;
|
||||||
|
import io.nosqlbench.engine.api.activityimpl.OpMapper;
|
||||||
import io.nosqlbench.engine.api.templating.ParsedCommand;
|
import io.nosqlbench.engine.api.templating.ParsedCommand;
|
||||||
import io.nosqlbench.nb.api.errors.OpConfigError;
|
import io.nosqlbench.nb.api.errors.OpConfigError;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
import java.util.function.Function;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.function.LongFunction;
|
import java.util.function.LongFunction;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class DirectOpMapper implements Function<ParsedCommand, OpDispenser<DirectCall>> {
|
public class DirectOpMapper implements OpMapper<DirectCall> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public OpDispenser<DirectCall> apply(ParsedCommand cmd) {
|
public OpDispenser<DirectCall> apply(ParsedCommand cmd) {
|
||||||
|
@ -2,6 +2,7 @@ package io.nosqlbench.engine.api.activityimpl.uniform;
|
|||||||
|
|
||||||
import io.nosqlbench.engine.api.activityapi.core.ActivityType;
|
import io.nosqlbench.engine.api.activityapi.core.ActivityType;
|
||||||
import io.nosqlbench.engine.api.activityimpl.OpDispenser;
|
import io.nosqlbench.engine.api.activityimpl.OpDispenser;
|
||||||
|
import io.nosqlbench.engine.api.activityimpl.OpMapper;
|
||||||
import io.nosqlbench.engine.api.templating.ParsedCommand;
|
import io.nosqlbench.engine.api.templating.ParsedCommand;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -31,15 +32,50 @@ public interface DriverAdapter<R extends Runnable, S> {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* <p>
|
||||||
|
* <H2>Op Mapping</H2>
|
||||||
* An Op Mapper is a function which can look at the parsed
|
* An Op Mapper is a function which can look at the parsed
|
||||||
* fields in a {@link ParsedCommand} and create an OpDispenser.
|
* fields in a {@link ParsedCommand} and create an OpDispenser.
|
||||||
* An OpDispenser is a function that will produce an special
|
* An OpDispenser is a function that will produce a special
|
||||||
* type {@link R} that this DriverAdapter implements as its
|
* type {@link R} that this DriverAdapter implements as its
|
||||||
* op implementation.
|
* op implementation.</p>
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* The function that is returned is responsible for creating another function.
|
||||||
|
* This might seem counter-intuitive but it is very intentional because
|
||||||
|
* of these design constraints:
|
||||||
|
* <UL>
|
||||||
|
* <LI>Mapping op semantics to a type of operation must be very clear
|
||||||
|
* and flexible. Performance is not important at this layer because this is all done
|
||||||
|
* during initialization time for an activity.</LI>
|
||||||
|
* <LI>Synthesizing executable operations from a known type of operational template
|
||||||
|
* must be done very efficiently. This part is done during activity execution, so
|
||||||
|
* having the details of how you are going to create an op for execution already
|
||||||
|
* sorted out is important.</LI>
|
||||||
|
* </UL>
|
||||||
|
*
|
||||||
|
* To clarify the distinction between these two phases, the first is canonically
|
||||||
|
* called <em>op mapping</em> in the documentation. The second is called
|
||||||
|
* <em>op synthesis</em>.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* <H2>A note on implementation strategy</H2>
|
||||||
|
* Generally speaking, implementations of this method should interrogate the op fields
|
||||||
|
* in the ParsedCommand and return an OpDispenser that matches the user's intentions.
|
||||||
|
* This can be based on something explicit, like the value of a {@code type} field,
|
||||||
|
* or it can be based on whether certain fields are present or not. Advanced implementations
|
||||||
|
* might take into account which fields are provided as static values and which are
|
||||||
|
* specified as bindings. In any case, the op mapping phase is meant to qualify and
|
||||||
|
* pre-check that the fields provided are valid and specific for a given type of operation.
|
||||||
|
* What happens within {@link OpDispenser} implementations, however, should do
|
||||||
|
* as little qualification of field value as possible, focusing simply on constructing
|
||||||
|
* the type of operation for which they are designed.
|
||||||
|
* </p>
|
||||||
*
|
*
|
||||||
* @return a synthesizer function for {@link R} op generation
|
* @return a synthesizer function for {@link R} op generation
|
||||||
*/
|
*/
|
||||||
Function<ParsedCommand, OpDispenser<R>> getOpMapper();
|
OpMapper<R> getOpMapper();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The preprocessor function allows the driver adapter to remap
|
* The preprocessor function allows the driver adapter to remap
|
||||||
@ -47,19 +83,21 @@ public interface DriverAdapter<R extends Runnable, S> {
|
|||||||
* At this level, the transform is applied once to the input map
|
* At this level, the transform is applied once to the input map
|
||||||
* (once per op template) to yield the map that is provided to
|
* (once per op template) to yield the map that is provided to
|
||||||
* {@link io.nosqlbench.engine.api.activityimpl.OpMapper} implementations.
|
* {@link io.nosqlbench.engine.api.activityimpl.OpMapper} implementations.
|
||||||
|
*
|
||||||
* @return A function to pre-process the op template fields.
|
* @return A function to pre-process the op template fields.
|
||||||
*/
|
*/
|
||||||
default Function<Map<String,Object>,Map<String,Object>> getPreprocessor() {
|
default Function<Map<String, Object>, Map<String, Object>> getPreprocessor() {
|
||||||
return f->f;
|
return f -> f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When a driver needs to identify an error uniquely for the purposes of
|
* When a driver needs to identify an error uniquely for the purposes of
|
||||||
* routing it to the correct error handler, or naming it in logs, or naming
|
* routing it to the correct error handler, or naming it in logs, or naming
|
||||||
* metrics, override this method in your activity.
|
* metrics, override this method in your activity.
|
||||||
|
*
|
||||||
* @return A function that can reliably and safely map an instance of Throwable to a stable name.
|
* @return A function that can reliably and safely map an instance of Throwable to a stable name.
|
||||||
*/
|
*/
|
||||||
default Function<Throwable,String> getErrorNameMapper() {
|
default Function<Throwable, String> getErrorNameMapper() {
|
||||||
return t -> t.getClass().getSimpleName();
|
return t -> t.getClass().getSimpleName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +113,7 @@ public interface DriverAdapter<R extends Runnable, S> {
|
|||||||
*
|
*
|
||||||
* @return A function which can initialize a new S
|
* @return A function which can initialize a new S
|
||||||
*/
|
*/
|
||||||
default Function<String,? extends S> getSpaceInitializer() {
|
default Function<String, ? extends S> getSpaceInitializer() {
|
||||||
return n -> null;
|
return n -> null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,6 +122,7 @@ public interface DriverAdapter<R extends Runnable, S> {
|
|||||||
* of a DriverAdapter which are not operations. These are generally
|
* of a DriverAdapter which are not operations. These are generally
|
||||||
* things needed by operations, or things needed during the
|
* things needed by operations, or things needed during the
|
||||||
* construction of operations.
|
* construction of operations.
|
||||||
|
*
|
||||||
* @return A cache of named objects
|
* @return A cache of named objects
|
||||||
*/
|
*/
|
||||||
DriverSpaceCache<? extends S> getSpaceCache();
|
DriverSpaceCache<? extends S> getSpaceCache();
|
||||||
|
@ -25,11 +25,6 @@ public class ParsedCommand implements LongFunction<Map<String, ?>> {
|
|||||||
|
|
||||||
private final static Logger logger = LogManager.getLogger(ParsedCommand.class);
|
private final static Logger logger = LogManager.getLogger(ParsedCommand.class);
|
||||||
|
|
||||||
/**
|
|
||||||
* the name of this operation
|
|
||||||
**/
|
|
||||||
private final String name;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The fields which are statically assigned
|
* The fields which are statically assigned
|
||||||
**/
|
**/
|
||||||
@ -50,6 +45,7 @@ public class ParsedCommand implements LongFunction<Map<String, ?>> {
|
|||||||
private final List<List<CapturePoint>> captures = new ArrayList<>();
|
private final List<List<CapturePoint>> captures = new ArrayList<>();
|
||||||
private final int mapsize;
|
private final int mapsize;
|
||||||
private final LinkedHashMap<String,Object> protomap = new LinkedHashMap<>();
|
private final LinkedHashMap<String,Object> protomap = new LinkedHashMap<>();
|
||||||
|
private final OpTemplate ot;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a parsed command from an Op template. The op template is simply the normalized view of
|
* Create a parsed command from an Op template. The op template is simply the normalized view of
|
||||||
@ -62,7 +58,7 @@ public class ParsedCommand implements LongFunction<Map<String, ?>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ParsedCommand(OpTemplate ot, List<Function<Map<String, Object>, Map<String, Object>>> preprocessors) {
|
public ParsedCommand(OpTemplate ot, List<Function<Map<String, Object>, Map<String, Object>>> preprocessors) {
|
||||||
this.name = ot.getName();
|
this.ot = ot;
|
||||||
|
|
||||||
Map<String, Object> map = ot.getOp().orElseThrow();
|
Map<String, Object> map = ot.getOp().orElseThrow();
|
||||||
for (Function<Map<String, Object>, Map<String, Object>> preprocessor : preprocessors) {
|
for (Function<Map<String, Object>, Map<String, Object>> preprocessor : preprocessors) {
|
||||||
@ -104,7 +100,7 @@ public class ParsedCommand implements LongFunction<Map<String, ?>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return ot.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Object> getStaticMap() {
|
public Map<String, Object> getStaticMap() {
|
||||||
@ -199,6 +195,20 @@ public class ParsedCommand implements LongFunction<Map<String, ?>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <T> T getStaticConfigOr(String name, T defaultValue) {
|
||||||
|
|
||||||
|
if (statics.containsKey(name)) {
|
||||||
|
return (T) statics.get(name);
|
||||||
|
} else if (ot.getParams().containsKey(name)) {
|
||||||
|
return (T) ot.getParams().get(name);
|
||||||
|
} else if (dynamics.containsKey(name)) {
|
||||||
|
throw new BasicError("static config field '" + name + "' was defined dynamically. This may be supportable if the driver developer" +
|
||||||
|
"updates the op mapper to support this field as a dynamic field, but it is not yet supported.");
|
||||||
|
} else {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return an optional value for the named field. This is an {@link Optional} form of {@link #getStaticValue}.
|
* Return an optional value for the named field. This is an {@link Optional} form of {@link #getStaticValue}.
|
||||||
|
Loading…
Reference in New Issue
Block a user