Skip to content

Commit

Permalink
use negative lookbehind pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
wecharyu committed Sep 14, 2024
1 parent 14e9f76 commit 2aa6179
Show file tree
Hide file tree
Showing 9 changed files with 17 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public int execute() throws HiveException {
List<String> databases = context.getDb().getAllDatabases();
if (desc.getPattern() != null) {
LOG.debug("pattern: {}", desc.getPattern());
Pattern pattern = Pattern.compile(UDFLike.likePatternToRegExp(desc.getPattern(), true), Pattern.CASE_INSENSITIVE);
Pattern pattern = Pattern.compile(UDFLike.likePatternToRegExp(desc.getPattern()), Pattern.CASE_INSENSITIVE);
databases = databases.stream().filter(name -> pattern.matcher(name).matches()).collect(Collectors.toList());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public int execute() throws HiveException {
List<String> connectors = context.getDb().getAllDataConnectorNames();
if (desc.getPattern() != null) {
LOG.debug("pattern: {}", desc.getPattern());
Pattern pattern = Pattern.compile(UDFLike.likePatternToRegExp(desc.getPattern(), true), Pattern.CASE_INSENSITIVE);
Pattern pattern = Pattern.compile(UDFLike.likePatternToRegExp(desc.getPattern()), Pattern.CASE_INSENSITIVE);
connectors = connectors.stream().filter(name -> pattern.matcher(name).matches()).collect(Collectors.toList());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public int execute() throws HiveException {
LOG.debug("pattern: {}", desc.getPattern());
List<String> tableNames = context.getDb().getTablesForDb(desc.getDbName(), null);
if (desc.getPattern() != null) {
Pattern pattern = Pattern.compile(UDFLike.likePatternToRegExp(desc.getPattern(), true), Pattern.CASE_INSENSITIVE);
Pattern pattern = Pattern.compile(UDFLike.likePatternToRegExp(desc.getPattern()), Pattern.CASE_INSENSITIVE);
tableNames = tableNames.stream()
.filter(name -> pattern.matcher(name).matches())
.collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public int execute() throws HiveException {
List<Table> viewObjects = new ArrayList<>(
context.getDb().getMaterializedViewObjectsByPattern(desc.getDbName(), null));
if (desc.getPattern() != null) {
Pattern pattern = Pattern.compile(UDFLike.likePatternToRegExp(desc.getPattern(), true), Pattern.CASE_INSENSITIVE);
Pattern pattern = Pattern.compile(UDFLike.likePatternToRegExp(desc.getPattern()), Pattern.CASE_INSENSITIVE);
viewObjects = viewObjects.stream()
.filter(object -> pattern.matcher(object.getTableName()).matches())
.collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -858,7 +858,7 @@ public static Set<String> getFunctionNamesByLikePattern(String funcPatternStr) {
Set<String> allFuncs = getFunctionNames();
String[] subpatterns = funcPatternStr.trim().split("\\|");
for (String subpattern : subpatterns) {
subpattern = "(?i)" + UDFLike.likePatternToRegExp(subpattern, true);
subpattern = "(?i)" + UDFLike.likePatternToRegExp(subpattern);
try {
Pattern patternObj = Pattern.compile(subpattern);
for (String funcName : allFuncs) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ String format(String pattern) {
COMPLEX(ComplexChecker.class) {
@Override
String format(String pattern) {
return "^" + UDFLike.likePatternToRegExp(pattern, true) + "$";
return "^" + UDFLike.likePatternToRegExp(pattern) + "$";
}
},
// Accepts chained LIKE patterns without escaping like "abc%def%ghi%" and
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ public List<String> getTables(String dbName, String tablePattern) throws MetaExc
if (tables == null || tables.size() == 0) {
return tableNames;
}
tablePattern = tablePattern.replaceAll("\\.\\*", "\\*").replaceAll("\\*", ".*");
tablePattern = tablePattern.replaceAll("(?<!\\.)\\*", ".*");
Pattern pattern = Pattern.compile(tablePattern);
Matcher matcher = pattern.matcher("");
Set<String> combinedTableNames = new HashSet<String>();
Expand Down Expand Up @@ -351,7 +351,7 @@ public List<String> getTables(String dbname, String tablePattern, TableType tabl
if (tables == null || tables.size() == 0) {
return tableNames;
}
tablePattern = tablePattern.replaceAll("\\.\\*", "\\*").replaceAll("\\*", ".*");
tablePattern = tablePattern.replaceAll("(?<!\\.)\\*", ".*");
Pattern pattern = Pattern.compile(tablePattern);
Matcher matcher = pattern.matcher("");
Set<String> combinedTableNames = new HashSet<String>();
Expand Down
12 changes: 8 additions & 4 deletions ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLike.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,11 @@ private enum PatternType {
public UDFLike() {
}

public static String likePatternToRegExp(String likePattern, boolean quote) {
public static String likePatternToRegExp(String likePattern) {
return likePatternToRegExp(likePattern, true);
}

public static String likePatternToRegExp(String likePattern, boolean literalize) {
if (likePattern == null) {
return null;
}
Expand All @@ -80,9 +84,9 @@ public static String likePatternToRegExp(String likePattern, boolean quote) {
if (n == '_') {
sb.append(".");
} else if (n == '%') {
sb.append(".*");
sb.append(".*?");
} else {
sb.append(quote ? Pattern.quote(Character.toString(n)) : n);
sb.append(literalize ? Pattern.quote(Character.toString(n)) : n);
}
}
return sb.toString();
Expand Down Expand Up @@ -187,7 +191,7 @@ public BooleanWritable evaluate(Text s, Text likePattern) {

parseSimplePattern(strLikePattern);
if (type == PatternType.COMPLEX) {
p = Pattern.compile(likePatternToRegExp(strLikePattern, true), Pattern.DOTALL);
p = Pattern.compile(likePatternToRegExp(strLikePattern), Pattern.DOTALL);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2929,7 +2929,7 @@ public List<String> getTables(String catName, String dbName, String tablePattern
// We need unify the pattern definition, see HIVE-28297 for details.
String[] patterns = tablePattern.split("\\|");
for (String pattern : patterns) {
pattern = "(?i)" + pattern.replaceAll("\\.\\*", "\\*").replaceAll("\\*", ".*");
pattern = "(?i)" + pattern.replaceAll("(?<!\\.)\\*", ".*");
String filter = String.format("%s like \"%s\"", hive_metastoreConstants.HIVE_FILTER_FIELD_TABLE_NAME, pattern);
tables.addAll(listTableNamesByFilter(catName, dbName, filter, (short) -1));
}
Expand Down

0 comments on commit 2aa6179

Please sign in to comment.