HBASE-25084 Add "regexstringnocase" to ParseFilter for case-insensitivity (#2784)

Signed-off-by: stack <stack@apache.org>
Signed-off-by: Wellington Chevreuil <wchevreuil@apache.org>
This commit is contained in:
scotthunt 2020-12-21 01:39:13 -07:00 committed by Wellington Chevreuil
parent d13010fa26
commit 904b555edc
3 changed files with 26 additions and 0 deletions

View File

@ -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
*/

View File

@ -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;
@ -812,6 +813,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

View File

@ -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')";