Don't count lone wildcards as leading wildcards (#17462) (#17477)

The addition of the optional flag to disable leading wildcards inadvertently broke exists queries, which are accomplished in kuery with the fieldName:* syntax.
This commit is contained in:
Matt Bargar 2018-03-30 16:41:22 -04:00 committed by GitHub
parent af49683bed
commit 372412361d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 3 deletions

View file

@ -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);
});
});
});
});

View file

@ -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);
}
@ -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
);
}