From 9168f2e1c86f4a804d62bd57af5ad099c7e27cc1 Mon Sep 17 00:00:00 2001 From: Matt Bargar Date: Fri, 30 Mar 2018 14:14:46 -0400 Subject: [PATCH] Don't count lone wildcards as leading wildcards (#17462) The addition of the optional flag to disable leading wildcards inadvertently broke exists queries, which are accomplished in kuery with the fieldName:* syntax. --- .../kuery/node_types/__tests__/wildcard.js | 16 ++++++++++++++++ src/ui/public/kuery/node_types/wildcard.js | 17 ++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/ui/public/kuery/node_types/__tests__/wildcard.js b/src/ui/public/kuery/node_types/__tests__/wildcard.js index aed0b795e67c1..66cb919488789 100644 --- a/src/ui/public/kuery/node_types/__tests__/wildcard.js +++ b/src/ui/public/kuery/node_types/__tests__/wildcard.js @@ -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); + }); + }); + }); }); diff --git a/src/ui/public/kuery/node_types/wildcard.js b/src/ui/public/kuery/node_types/wildcard.js index 0cd52b802695d..870546e59c276 100644 --- a/src/ui/public/kuery/node_types/wildcard.js +++ b/src/ui/public/kuery/node_types/wildcard.js @@ -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 + ); }