Skip to content

Commit

Permalink
Don't count lone wildcards as leading wildcards (#17462)
Browse files Browse the repository at this point in the history
The addition of the optional flag to disable leading wildcards inadvertently broke exists queries, which are accomplished in kuery with the fieldName:* syntax.
  • Loading branch information
Bargs authored Mar 30, 2018
1 parent b3b2ff5 commit 9168f2e
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
16 changes: 16 additions & 0 deletions src/ui/public/kuery/node_types/__tests__/wildcard.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,22 @@ describe('kuery node types', function () {

});

describe('hasLeadingWildcard', function () {
it('should determine whether a wildcard node contains a leading wildcard', function () {
const node = wildcard.buildNode('foo*bar');
expect(wildcard.hasLeadingWildcard(node)).to.be(false);

const leadingWildcardNode = wildcard.buildNode('*foobar');
expect(wildcard.hasLeadingWildcard(leadingWildcardNode)).to.be(true);
});

// Lone wildcards become exists queries, so we aren't worried about their performance
it('should not consider a lone wildcard to be a leading wildcard', function () {
const leadingWildcardNode = wildcard.buildNode('*');
expect(wildcard.hasLeadingWildcard(leadingWildcardNode)).to.be(false);
});
});

});

});
17 changes: 14 additions & 3 deletions src/ui/public/kuery/node_types/wildcard.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ export function buildNode(value) {

export function test(node, string) {
const { value } = node;
const regex = value.split(wildcardSymbol).map(escapeRegExp).join('.*');
const regex = value
.split(wildcardSymbol)
.map(escapeRegExp)
.join('.*');
const regexp = new RegExp(`^${regex}$`);
return regexp.test(string);
}
Expand All @@ -37,10 +40,18 @@ export function toElasticsearchQuery(node) {

export function toQueryStringQuery(node) {
const { value } = node;
return value.split(wildcardSymbol).map(escapeQueryString).join('*');
return value
.split(wildcardSymbol)
.map(escapeQueryString)
.join('*');
}

export function hasLeadingWildcard(node) {
const { value } = node;
return value.startsWith(wildcardSymbol);
// A lone wildcard turns into an `exists` query, so we're only concerned with
// leading wildcards followed by additional characters.
return (
value.startsWith(wildcardSymbol) &&
value.replace(wildcardSymbol, '').length > 0
);
}

0 comments on commit 9168f2e

Please sign in to comment.