diff --git a/nb-apis/nb-api/src/main/java/io/nosqlbench/nb/api/advisor/NBAdvisorOutput.java b/nb-apis/nb-api/src/main/java/io/nosqlbench/nb/api/advisor/NBAdvisorOutput.java index c0f42f525..47facb137 100644 --- a/nb-apis/nb-api/src/main/java/io/nosqlbench/nb/api/advisor/NBAdvisorOutput.java +++ b/nb-apis/nb-api/src/main/java/io/nosqlbench/nb/api/advisor/NBAdvisorOutput.java @@ -31,20 +31,21 @@ public class NBAdvisorOutput { } public static void test(String message) { - output(Level.WARN, message); if (NBAdvisorLevel.get() == NBAdvisorLevel.enforce) { - throw new NBAdvisorException(message, 2); + output(Level.ERROR, message); + throw new NBAdvisorException(message, 2); } + output(Level.WARN, message); } public static void output(Level level,String message) { - if (level == Level.INFO) { - logger.info(message); - } else if (level == Level.WARN) { - logger.warn(message); - } else if (level == Level.ERROR) { - logger.error(message); -} + if (level == Level.INFO) { + NBAdvisorOutput.logger.info(message); + } else if (level == Level.WARN) { + NBAdvisorOutput.logger.warn(message); + } else if (level == Level.ERROR) { + NBAdvisorOutput.logger.error(message); + } } } diff --git a/nb-apis/nb-api/src/main/java/io/nosqlbench/nb/api/tagging/TagFilter.java b/nb-apis/nb-api/src/main/java/io/nosqlbench/nb/api/tagging/TagFilter.java index 4de51c322..b4d4fbcb2 100644 --- a/nb-apis/nb-api/src/main/java/io/nosqlbench/nb/api/tagging/TagFilter.java +++ b/nb-apis/nb-api/src/main/java/io/nosqlbench/nb/api/tagging/TagFilter.java @@ -19,6 +19,9 @@ package io.nosqlbench.nb.api.tagging; import io.nosqlbench.nb.api.engine.util.Tagged; import io.nosqlbench.nb.api.labels.NBLabeledElement; import io.nosqlbench.nb.api.components.core.NBComponent; +import io.nosqlbench.nb.api.advisor.NBAdvisorOutput; + +import org.apache.logging.log4j.Level; import java.util.*; import java.util.function.BiFunction; @@ -198,8 +201,18 @@ public class TagFilter { boolean matchedKey = true; String filterval = filter.get(filterkey); String itemval = tags.get(filterkey); - - + if ( itemval == null ) { + // tag category not found, if ends in an 's' then try singular + if (filterkey.endsWith("s")) { + String filterkey2 = filterkey.substring(0, filterkey.length() - 1); + itemval = tags.get(filterkey2); + String message = "'" + filterkey + "' tags do not exist: try '" + filterkey2 + "'"; + NBAdvisorOutput.test(message); + log.add("(☐, ) " + message); + filterkey = filterkey2; + } + } + String detail = "filter(" + filterkey + ((filterval != null) ? ":" + filterval : "") + ") " + "tag(" + ((tags.containsKey(filterkey) ? filterkey : "") + diff --git a/nb-apis/nb-api/src/test/java/io/nosqlbench/nb/api/tagging/TagFilterTest.java b/nb-apis/nb-api/src/test/java/io/nosqlbench/nb/api/tagging/TagFilterTest.java index 678e3f266..bb6ce899b 100644 --- a/nb-apis/nb-api/src/test/java/io/nosqlbench/nb/api/tagging/TagFilterTest.java +++ b/nb-apis/nb-api/src/test/java/io/nosqlbench/nb/api/tagging/TagFilterTest.java @@ -77,6 +77,21 @@ public class TagFilterTest { assertThat(tf.matches(itemtags2).matched()).isTrue(); } + @Test + public void testMatchingTagKeysValueDoesMatch() { + Map itemtags = new HashMap<>() {{ + put("one", "two"); + }}; + TagFilter tf = new TagFilter("ones"); + TagFilter.Result result = tf.matches(itemtags); + assertThat(result.matched()).isTrue(); + + Map itemtags2 = new HashMap<>() {{ + put("one", null); + }}; + assertThat(tf.matches(itemtags2).matched()).isTrue(); + } + @Test public void testMatchingKeyMismatchingValueDoesNotMatch() { Map itemtags = new HashMap<>() {{ diff --git a/nb-engine/nb-engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java b/nb-engine/nb-engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java index 83d664e78..85ceab804 100644 --- a/nb-engine/nb-engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java +++ b/nb-engine/nb-engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java @@ -416,7 +416,7 @@ public class NBCLI implements Function, NBLabeledElement { "progress", options.getProgressSpec(), "prompush_cache", "prompush_cache.txt", "heartbeat", String.valueOf(options.wantsHeartbeatIntervalMs()), - "advisor", String.valueOf(options.getAdvisor()) + "advisor", String.valueOf(options.getAdvisor()) ); try (