From 57762f35885d3ba56db47aee5e47b26cb1ced39a Mon Sep 17 00:00:00 2001 From: Jonathan Shook Date: Thu, 30 Apr 2020 17:33:07 -0500 Subject: [PATCH] trim spaces in tag specs, disallows spaces as delimiter between --- .../nosqlbench/engine/api/util/TagFilter.java | 20 +++++++---- .../engine/api/util/TagFilterTest.java | 33 ++++++++++++------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/util/TagFilter.java b/engine-api/src/main/java/io/nosqlbench/engine/api/util/TagFilter.java index cf21e3edf..708046719 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/util/TagFilter.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/util/TagFilter.java @@ -88,23 +88,31 @@ public class TagFilter { */ public TagFilter(String filterSpec) { if ((filterSpec != null) && (!filterSpec.isEmpty())) { - String[] keyvalues = filterSpec.split("[, ] *"); + filterSpec=unquote(filterSpec); + + String[] keyvalues = filterSpec.split("[,] *"); for (String assignment : keyvalues) { String[] keyvalue = assignment.split("[:=]", 2); String key = keyvalue[0]; String value = keyvalue.length > 1 ? keyvalue[1] : null; if (value != null) { - if ((value.indexOf("\'") == 0) && ((value.indexOf("\'", 1) == (value.length() - 1)))) { - value = value.substring(1, value.length() - 1); - } else { - value = value.trim(); - } + value = unquote(value); + value = value.trim(); } filter.put(key, value); } } } + private static String unquote(String filterSpec) { + for (String s : new String[]{"'","\""}) { + if (filterSpec.indexOf(s)==0 && filterSpec.indexOf(s,1)==filterSpec.length()-1) { + filterSpec=filterSpec.substring(1,filterSpec.length()-1); + } + } + return filterSpec; + } + /** * Although this method could early-exit for certain conditions, the full tag matching logic * is allowed to complete in order to present more complete diagnostic information back diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/util/TagFilterTest.java b/engine-api/src/test/java/io/nosqlbench/engine/api/util/TagFilterTest.java index 0e4fc748a..367aa8002 100644 --- a/engine-api/src/test/java/io/nosqlbench/engine/api/util/TagFilterTest.java +++ b/engine-api/src/test/java/io/nosqlbench/engine/api/util/TagFilterTest.java @@ -36,7 +36,7 @@ public class TagFilterTest { @Test public void testEmptyTagFilterDoesMatch() { - Map itemtags = new HashMap() {{ + Map itemtags = new HashMap<>() {{ put("a","tag"); }}; TagFilter tf = new TagFilter(""); @@ -45,7 +45,7 @@ public class TagFilterTest { @Test public void testSomeFilterTagsNoItemTagsDoesNotMatch() { - Map itemtags = new HashMap() {{ + Map itemtags = new HashMap<>() {{ }}; TagFilter tf = new TagFilter("tag=foo"); assertThat(tf.matches(itemtags).matched()).isFalse(); @@ -54,7 +54,7 @@ public class TagFilterTest { @Test public void testEmptyTagFilterValueDoesMatch() { - Map itemtags = new HashMap() {{ + Map itemtags = new HashMap<>() {{ put("one","two"); }}; TagFilter tf = new TagFilter(""); @@ -64,14 +64,14 @@ public class TagFilterTest { @Test public void testMatchingTagKeyValueDoesMatch() { - Map itemtags = new HashMap() {{ + Map itemtags = new HashMap<>() {{ put("one","two"); }}; TagFilter tf = new TagFilter("one"); TagFilter.Result result = tf.matches(itemtags); assertThat(result.matched()).isTrue(); - Map itemtags2 = new HashMap() {{ + Map itemtags2 = new HashMap<>() {{ put("one",null); }}; assertThat(tf.matches(itemtags2).matched()).isTrue(); @@ -80,7 +80,7 @@ public class TagFilterTest { @Test public void testMatchingKeyMismatchingValueDoesNotMatch() { - Map itemtags = new HashMap() {{ + Map itemtags = new HashMap<>() {{ put("one","four"); }}; TagFilter tf = new TagFilter("one:two"); @@ -90,7 +90,7 @@ public class TagFilterTest { @Test public void testMatchingKeyAndValueDoesMatch() { - Map itemtags = new HashMap() {{ + Map itemtags = new HashMap<>() {{ put("one","four"); }}; TagFilter tf = new TagFilter("one:four"); @@ -99,7 +99,7 @@ public class TagFilterTest { @Test public void testMatchingKeyAndValueRegexDoesMatch() { - Map itemtags = new HashMap() {{ + Map itemtags = new HashMap<>() {{ put("one","four-five-six"); }}; TagFilter tfLeft = new TagFilter("one:'four-.*'"); @@ -114,7 +114,7 @@ public class TagFilterTest { Tagged tagged = new Tagged() { @Override public Map getTags() { - return new HashMap() {{ + return new HashMap<>() {{ put("one","four-five-six"); put("two","three-seven-nine"); put("five",null); @@ -136,7 +136,7 @@ public class TagFilterTest { @Test public void testRawSubstringDoesNotMatchRegex() { - Map itemtags = new HashMap() {{ + Map itemtags = new HashMap<>() {{ put("one","four-five-six"); }}; TagFilter tf = new TagFilter("one:'five'"); @@ -145,11 +145,22 @@ public class TagFilterTest { @Test public void testAlternation() { - Map itemtags = new HashMap() {{ + Map itemtags = new HashMap<>() {{ put("one","four-five-six"); }}; TagFilter tf = new TagFilter("one:'four.*|seven'"); assertThat(tf.matches(itemtags).matched()).isTrue(); } + @Test + public void testLeadingSpaceTrimmedInQuotedTag() { + + Map itemtags = new HashMap<>() {{ + put("phase","main"); + }}; + + TagFilter tf = new TagFilter("\"phase: main\""); + assertThat(tf.matches(itemtags).matched()).isTrue(); + } + }