diff --git a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/ParsedOp.java b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/ParsedOp.java index 1d7f43595..3c27192b3 100644 --- a/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/ParsedOp.java +++ b/nb-apis/adapters-api/src/main/java/io/nosqlbench/adapters/api/templating/ParsedOp.java @@ -43,6 +43,7 @@ import java.util.*; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.LongFunction; +import java.util.function.LongToIntFunction; /** *

ParsedOp API

@@ -662,6 +663,9 @@ public class ParsedOp extends NBBaseComponent implements LongFunction LongFunction getAsFunctionOr(String name, V defaultValue) { return tmap.getAsFunctionOr(name, defaultValue); } + public LongToIntFunction getAsFunctionOrInt(String name, int defaultValue) { + return tmap.getAsFunctionOrInt(name, defaultValue); + } /** * Get a LongFunction that first creates a LongFunction of String as in diff --git a/nb-virtdata/virtdata-api/src/main/java/io/nosqlbench/engine/api/templating/ParsedTemplateMap.java b/nb-virtdata/virtdata-api/src/main/java/io/nosqlbench/engine/api/templating/ParsedTemplateMap.java index 91958258a..68c097240 100644 --- a/nb-virtdata/virtdata-api/src/main/java/io/nosqlbench/engine/api/templating/ParsedTemplateMap.java +++ b/nb-virtdata/virtdata-api/src/main/java/io/nosqlbench/engine/api/templating/ParsedTemplateMap.java @@ -38,6 +38,7 @@ import org.apache.logging.log4j.Logger; import java.util.*; import java.util.function.Function; import java.util.function.LongFunction; +import java.util.function.LongToIntFunction; /** * A parsed map template, which allows construction of extracted or projected functions related @@ -151,7 +152,7 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi } }); Map submap = (Map) v; - ParsedTemplateMap subtpl = new ParsedTemplateMap(getName(),submap, bindings, cfgsources); + ParsedTemplateMap subtpl = new ParsedTemplateMap(getName(), submap, bindings, cfgsources); this.captures.addAll(subtpl.getCaptures()); if (subtpl.isStatic()) { statics.put(k, submap); @@ -168,8 +169,8 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi statics.put(k, sublist); protomap.put(k, sublist); } else { - dynamics.put(k,subtpl); - protomap.put(k,null); + dynamics.put(k, subtpl); + protomap.put(k, null); } } else { // Eventually, nested and mixed static dynamic structure could be supported, but @@ -215,11 +216,11 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi } public Map getConfigPrototype() { - Map cfgs = new LinkedHashMap<>(); + Map cfgs = new LinkedHashMap<>(); for (Map cfgsource : cfgsources) { for (String key : cfgsource.keySet()) { if (!cfgs.containsKey(key)) { - cfgs.put(key,cfgsource.get(key)); + cfgs.put(key, cfgsource.get(key)); } else { logger.warn("config sources contain overlapping keys for '" + key + "', precedence is undefined"); } @@ -244,7 +245,7 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi public Map applyFull(long value) { Map newmap = apply(value); - for (int i = cfgsources.size()-1; i>0 ; i--) { + for (int i = cfgsources.size() - 1; i > 0; i--) { newmap.putAll(cfgsources.get(i)); } return newmap; @@ -279,7 +280,7 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi @Override public boolean isDefined(String... fields) { for (String field : fields) { - if (!isStatic(field)&&!isDynamic(field)&&!isConfig(field)) { + if (!isStatic(field) && !isDynamic(field) && !isConfig(field)) { return false; } } @@ -312,7 +313,7 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi return (T) cfgsource.get(field); } } - throw new OpConfigError("config value for '" +field +"' was not found in " + cfgsources); + throw new OpConfigError("config value for '" + field + "' was not found in " + cfgsources); } public T takeStaticValue(String field, Class classOfT) { @@ -395,11 +396,11 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi public T getStaticConfig(String name, Class clazz) { if (statics.containsKey(name)) { - return NBTypeConverter.convert(statics.get(name),clazz); + return NBTypeConverter.convert(statics.get(name), clazz); } for (Map cfgsource : cfgsources) { if (cfgsource.containsKey(name)) { - return NBTypeConverter.convert(cfgsource.get(name),clazz); + return NBTypeConverter.convert(cfgsource.get(name), clazz); } } if (dynamics.containsKey(name)) { @@ -575,7 +576,7 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi Object cfgval = getConfig(name); if (type.isAssignableFrom(cfgval.getClass())) { return Optional.of(l -> type.cast(cfgval)); - } else if (NBTypeConverter.canConvert(cfgval,type)) { + } else if (NBTypeConverter.canConvert(cfgval, type)) { return Optional.of(l -> NBTypeConverter.convert(cfgval, type)); } else { throw new OpConfigError( @@ -618,6 +619,25 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi } } + public LongToIntFunction getAsFunctionOrInt(String name, int defaultValue) { + if (isDynamic(name)) { + LongFunction f = dynamics.get(name); + Object testValue = f.apply(0); + if (!testValue.getClass().isPrimitive()) { + throw new OpConfigError(STR."getAsFunctionOrInt returned non primitive type: \{testValue.getClass().getCanonicalName()}"); + } + if (!testValue.getClass().equals(int.class)) { + throw new OpConfigError(STR."getAsFunctionOrInt returned non-int type: \{testValue.getClass().getCanonicalName()}"); + } + return (long i) -> (int) f.apply(i); + } else if (isStatic(name) || isConfig(name)) { + int v = (int) getStaticValue(name); + return l -> v; + } else { + return l -> defaultValue; + } + } + /** * Get a LongFunction that first creates a LongFunction of String as in {@link #getAsFunctionOr(String, Object)} )}, but then * applies the result and cached it for subsequent access. This relies on {@link ObjectCache} internally. @@ -765,15 +785,15 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi * @param fieldname the field to take the templates from * @return A map of templates, or an empty map if the field is not defined or is empty. */ - public Map takeAsNamedTemplates(String fieldname) { + public Map takeAsNamedTemplates(String fieldname) { Object entry = originalTemplateObject.get(fieldname); - if (entry !=null) { + if (entry != null) { dynamics.remove(fieldname); statics.remove(fieldname); protomap.remove(fieldname); } - if (entry==null) { + if (entry == null) { for (Map cfgsource : cfgsources) { if (cfgsource.containsKey(fieldname)) { entry = cfgsource.get(fieldname); @@ -782,27 +802,27 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi } } - if (entry==null) { + if (entry == null) { return Map.of(); } - Map elements = new LinkedHashMap<>(); + Map elements = new LinkedHashMap<>(); if (entry instanceof CharSequence chars) { - elements.put(this.getName()+"-verifier-0",chars.toString()); + elements.put(this.getName() + "-verifier-0", chars.toString()); } else if (entry instanceof List list) { for (int i = 0; i < list.size(); i++) { - elements.put(this.getName()+"-verifier-"+i,list.get(0)); + elements.put(this.getName() + "-verifier-" + i, list.get(0)); } } else if (entry instanceof Map map) { - map.forEach((k,v) -> { - elements.put(this.getName()+"-verifier-"+k,v); + map.forEach((k, v) -> { + elements.put(this.getName() + "-verifier-" + k, v); }); } - Map parsedStringTemplates + Map parsedStringTemplates = new LinkedHashMap<>(); - elements.forEach((k,v) -> { + elements.forEach((k, v) -> { if (v instanceof CharSequence chars) { - parsedStringTemplates.put(k,new ParsedTemplateString(chars.toString(), this.bindings)); + parsedStringTemplates.put(k, new ParsedTemplateString(chars.toString(), this.bindings)); } }); return parsedStringTemplates; @@ -903,7 +923,7 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi public Class getValueType(String fieldname) { if (isDynamic(fieldname)) { - return get(fieldname,1).getClass(); + return get(fieldname, 1).getClass(); } if (isStatic(fieldname)) { return getStaticValue(fieldname).getClass(); @@ -1095,12 +1115,12 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi public Map parseStaticCmdMap(String taskname, String mainField) { Object mapsrc = getStaticValue(taskname); - return new LinkedHashMap(ParamsParser.parseToMap(mapsrc,mainField)); + return new LinkedHashMap(ParamsParser.parseToMap(mapsrc, mainField)); } public List> parseStaticCmdMaps(String key, String mainField) { Object mapsSrc = getStaticValue(key); - List> maps = new ArrayList<>(); + List> maps = new ArrayList<>(); for (String spec : mapsSrc.toString().split("; +")) { LinkedHashMap map = new LinkedHashMap<>(ParamsParser.parseToMap(spec, mainField)); maps.add(map); @@ -1118,7 +1138,7 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi .append(k) .append("->") .append( - v ==null? originalTemplateObject.get(k) : v.toString() + v == null ? originalTemplateObject.get(k) : v.toString() ).append("\n"); } @@ -1135,11 +1155,12 @@ public class ParsedTemplateMap implements LongFunction>, StaticFi } - public Map getCombinedPrototype() { - Map prototype = new LinkedHashMap<>(); + public Map getCombinedPrototype() { + Map prototype = new LinkedHashMap<>(); prototype.putAll(getDynamicPrototype()); prototype.putAll(getStaticPrototype()); prototype.putAll(getConfigPrototype()); return prototype; } + }