private String getRegex(String glob) { GlobPattern pattern = new GlobPattern(glob); return pattern.compiled().toString(); }
private String getQueryDslString(String tenantId, List<String> queries){ List<String> mustStrings = new ArrayList<>(); String tenantIdQString = getTermQueryString(ESFieldLabel.tenantId.toString(), tenantId); mustStrings.add(tenantIdQString); String mustValueString = getMustValueString(mustStrings); List<String> shouldStrings = new ArrayList<>(); for(String query : queries) { String metricNameQString; GlobPattern pattern = new GlobPattern(query); if (pattern.hasWildcard()) { String compiledString = pattern.compiled().toString(); // replace one '\' char with two '\\' compiledString = compiledString.replaceAll("\\\\", "\\\\\\\\"); metricNameQString = getRegexpQueryString(ESFieldLabel.metric_name.toString(), compiledString); } else { metricNameQString = getTermQueryString(ESFieldLabel.metric_name.toString(), query); } shouldStrings.add(metricNameQString); } String shouldValueString = getShouldValueString(shouldStrings); String dslString = getBoolQueryString(mustValueString, shouldValueString); return dslString; }
@Test public void testRegexLevel3() { List<String> terms = Arrays.asList("foo", "bar", "baz", "foo.bar", "foo.bar.baz", "foo.bar.baz.qux", "foo.bar.baz.qux.quux"); List<String> matchingTerms = new ArrayList<>(); Pattern patternToGet2Levels = Pattern.compile(elasticTokensIO.getRegexToHandleTokens(new GlobPattern("foo.bar.baz.*"))); for (String term: terms) { Matcher matcher = patternToGet2Levels.matcher(term); if (matcher.matches()) { matchingTerms.add(term); } } assertEquals(1, matchingTerms.size()); assertEquals("foo.bar.baz.qux", matchingTerms.get(0)); } }
private String getParentString(String[] queryTokens) { if (queryTokens.length == 1) return getTermQueryString(ESFieldLabel.parent.name(), ""); String parent = Arrays.stream(queryTokens) .limit(queryTokens.length - 1) .collect(joining(Locator.METRIC_TOKEN_SEPARATOR)); GlobPattern parentGlob = new GlobPattern(parent); String parentQueryString; if (parentGlob.hasWildcard()) { parentQueryString = getRegexpQueryString(ESFieldLabel.parent.name(), getRegexToHandleTokens(parentGlob)); } else { parentQueryString = getTermQueryString(ESFieldLabel.parent.name(), parent); } return parentQueryString; }
/** * For a given glob, gives regex for {@code Locator.METRIC_TOKEN_SEPARATOR} separated tokens * * For example: * globPattern of foo.*.* would produce a regex foo\.[^.]+\.[^.]+ * globPattern of foo.b*.* would produce a regex foo\.b[^.]*\.[^.]+ * * @param globPattern * @return */ protected String getRegexToHandleTokens(GlobPattern globPattern) { String[] queryRegexParts = globPattern.compiled().toString().split("\\\\."); return Arrays.stream(queryRegexParts) .map(this::convertRegexToCaptureUptoNextToken) .collect(joining(Locator.METRIC_TOKEN_SEPARATOR_REGEX)); }
GlobPattern pattern = new GlobPattern(lastToken); if (pattern.hasWildcard()) { String compiledString = pattern.compiled().toString(); tokenQString = getRegexpQueryString(ESFieldLabel.token.name(), compiledString); } else {
@Test public void testRegexLevel2() { List<String> terms = Arrays.asList("foo", "bar", "baz", "foo.bar", "foo.bar.baz", "foo.bar.baz.qux", "foo.bar.baz.qux.quux"); List<String> matchingTerms = new ArrayList<>(); Pattern patternToGet2Levels = Pattern.compile(elasticTokensIO.getRegexToHandleTokens(new GlobPattern("foo.bar.*"))); for (String term: terms) { Matcher matcher = patternToGet2Levels.matcher(term); if (matcher.matches()) { matchingTerms.add(term); } } assertEquals(1, matchingTerms.size()); assertEquals("foo.bar.baz", matchingTerms.get(0)); }
/** * For a given glob, gives regex for {@code Locator.METRIC_TOKEN_SEPARATOR} separated tokens * * For example: * globPattern of foo.*.* would produce a regex foo\.[^.]+\.[^.]+ * globPattern of foo.b*.* would produce a regex foo\.b[^.]*\.[^.]+ * * @param globPattern * @return */ protected String getRegexToHandleTokens(GlobPattern globPattern) { String[] queryRegexParts = globPattern.compiled().toString().split("\\\\."); return Arrays.stream(queryRegexParts) .map(this::convertRegexToCaptureUptoNextToken) .collect(joining(Locator.METRIC_TOKEN_SEPARATOR_REGEX)); }
@Test public void testRegexLevel1WildCard() { List<String> terms = Arrays.asList("foo", "bar", "baz", "foo.bar", "foo.b", "foo.xxx", "foo.bar.baz", "foo.bar.baz.aux"); List<String> matchingTerms = new ArrayList<>(); Pattern patternToGet2Levels = Pattern.compile(elasticTokensIO.getRegexToHandleTokens(new GlobPattern("foo.b*"))); for (String term: terms) { Matcher matcher = patternToGet2Levels.matcher(term); if (matcher.matches()) { matchingTerms.add(term); } } assertEquals(2, matchingTerms.size()); assertEquals("foo.bar", matchingTerms.get(0)); assertEquals("foo.b", matchingTerms.get(1)); }
@Test public void testRegexLevel0() { List<String> terms = Arrays.asList("", "foo", "bar", "b", "foo.bar", "foo.bar.baz", "foo.bar.baz.aux"); List<String> matchingTerms = new ArrayList<>(); Pattern patternToGet2Levels = Pattern.compile(elasticTokensIO.getRegexToHandleTokens(new GlobPattern("*"))); for (String term: terms) { Matcher matcher = patternToGet2Levels.matcher(term); if (matcher.matches()) { matchingTerms.add(term); } } assertEquals(3, matchingTerms.size()); assertEquals("foo", matchingTerms.get(0)); assertEquals("bar", matchingTerms.get(1)); assertEquals("b", matchingTerms.get(2)); }
@Test public void testRegexLevel0WildCard() { List<String> terms = Arrays.asList("", "foo", "bar", "baz", "b", "foo.bar", "foo.bar.baz", "foo.bar.baz.aux"); List<String> matchingTerms = new ArrayList<>(); Pattern patternToGet2Levels = Pattern.compile(elasticTokensIO.getRegexToHandleTokens(new GlobPattern("b*"))); for (String term: terms) { Matcher matcher = patternToGet2Levels.matcher(term); if (matcher.matches()) { matchingTerms.add(term); } } assertEquals(3, matchingTerms.size()); assertEquals("bar", matchingTerms.get(0)); assertEquals("baz", matchingTerms.get(1)); assertEquals("b", matchingTerms.get(2)); }
@Test public void testRegexLevel1() { List<String> terms = Arrays.asList("foo", "bar", "baz", "foo.bar", "foo.b", "foo.xxx", "foo.bar.baz", "foo.bar.baz.aux"); List<String> matchingTerms = new ArrayList<>(); Pattern patternToGet2Levels = Pattern.compile(elasticTokensIO.getRegexToHandleTokens(new GlobPattern("foo.*"))); for (String term: terms) { Matcher matcher = patternToGet2Levels.matcher(term); if (matcher.matches()) { matchingTerms.add(term); } } assertEquals(3, matchingTerms.size()); assertEquals("foo.bar", matchingTerms.get(0)); assertEquals("foo.b", matchingTerms.get(1)); assertEquals("foo.xxx", matchingTerms.get(2)); }