From befa76f55a609ad15f70cadf2692baaa04e49af6 Mon Sep 17 00:00:00 2001 From: scotthunt Date: Mon, 21 Dec 2020 01:39:13 -0700 Subject: [PATCH] HBASE-25084 Add "regexstringnocase" to ParseFilter for case-insensitivity (#2784) Signed-off-by: stack Signed-off-by: Wellington Chevreuil --- .../hadoop/hbase/filter/ParseConstants.java | 7 +++++++ .../apache/hadoop/hbase/filter/ParseFilter.java | 4 ++++ .../hadoop/hbase/filter/TestParseFilter.java | 15 +++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseConstants.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseConstants.java index 9f52783dbb0..b9132a3ba29 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseConstants.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseConstants.java @@ -244,6 +244,13 @@ public final class ParseConstants { public static final byte [] regexStringType = new byte [] {'r','e','g','e', 'x', 's','t','r','i','n','g'}; + /** + * RegexStringNoCaseType byte array + */ + public static final byte [] regexStringNoCaseType = new byte [] {'r','e','g','e','x', + 's','t','r','i','n','g', + 'n','o','c','a','s','e'}; + /** * SubstringType byte array */ diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseFilter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseFilter.java index 716322cff9c..91e578ace97 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseFilter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseFilter.java @@ -28,6 +28,7 @@ import java.util.Collections; import java.util.EmptyStackException; import java.util.HashMap; import java.util.Map; +import java.util.regex.Pattern; import java.util.Set; import java.util.Stack; @@ -839,6 +840,9 @@ public class ParseFilter { return new BinaryPrefixComparator(comparatorValue); else if (Bytes.equals(comparatorType, ParseConstants.regexStringType)) return new RegexStringComparator(new String(comparatorValue, StandardCharsets.UTF_8)); + else if (Bytes.equals(comparatorType, ParseConstants.regexStringNoCaseType)) + return new RegexStringComparator(new String(comparatorValue, StandardCharsets.UTF_8), + Pattern.CASE_INSENSITIVE | Pattern.DOTALL); else if (Bytes.equals(comparatorType, ParseConstants.substringType)) return new SubstringComparator(new String(comparatorValue, StandardCharsets.UTF_8)); else diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestParseFilter.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestParseFilter.java index 8dd15be6fc6..fbedc1c0e68 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestParseFilter.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestParseFilter.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; import org.apache.hadoop.hbase.CompareOperator; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.testclassification.MediumTests; @@ -279,6 +280,20 @@ public class TestParseFilter { assertEquals("pre*", new String(regexStringComparator.getValue(), StandardCharsets.UTF_8)); } + @Test + public void testQualifierFilterNoCase() throws IOException { + String filterString = "QualifierFilter(=, 'regexstringnocase:pre*')"; + QualifierFilter qualifierFilter = + doTestFilter(filterString, QualifierFilter.class); + assertEquals(CompareOperator.EQUAL, qualifierFilter.getCompareOperator()); + assertTrue(qualifierFilter.getComparator() instanceof RegexStringComparator); + RegexStringComparator regexStringComparator = + (RegexStringComparator) qualifierFilter.getComparator(); + assertEquals("pre*", new String(regexStringComparator.getValue(), StandardCharsets.UTF_8)); + int regexComparatorFlags = regexStringComparator.getEngine().getFlags(); + assertEquals(Pattern.CASE_INSENSITIVE | Pattern.DOTALL, regexComparatorFlags); + } + @Test public void testValueFilter() throws IOException { String filterString = "ValueFilter(!=, 'substring:pre')";