From 915861beab676d0c2755b28abf9e5af6d1b30a9f Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Fri, 9 Mar 2018 12:48:17 -0700 Subject: [PATCH] Simplify wildcard handling --- src/ui/public/kuery/ast/ast.js | 11 ++++- src/ui/public/kuery/ast/index.js | 2 +- src/ui/public/kuery/ast/kuery.peg | 52 +++++++++------------- src/ui/public/kuery/node_types/wildcard.js | 8 +--- 4 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/ui/public/kuery/ast/ast.js b/src/ui/public/kuery/ast/ast.js index c553bfe93045..19001873ab9d 100644 --- a/src/ui/public/kuery/ast/ast.js +++ b/src/ui/public/kuery/ast/ast.js @@ -6,7 +6,7 @@ import { nodeTypes } from '../node_types/index'; const legacyKueryParser = PEG.buildParser(legacyKueryGrammar); const kueryParser = PEG.buildParser(kueryGrammar, { - allowedStartRules: ['start', 'Literal'], + allowedStartRules: ['start', 'Literal', 'WildcardString'], }); export function fromLiteralExpression(expression, parseOptions) { @@ -18,6 +18,15 @@ export function fromLiteralExpression(expression, parseOptions) { return fromExpression(expression, parseOptions, kueryParser); } +export function fromWildcardExpression(expression, parseOptions) { + parseOptions = { + ...parseOptions, + startRule: 'WildcardString', + }; + + return fromExpression(expression, parseOptions, kueryParser); +} + export function fromLegacyKueryExpression(expression, parseOptions) { return fromExpression(expression, parseOptions, legacyKueryParser); } diff --git a/src/ui/public/kuery/ast/index.js b/src/ui/public/kuery/ast/index.js index 441c20ee0f5d..019647c7c86e 100644 --- a/src/ui/public/kuery/ast/index.js +++ b/src/ui/public/kuery/ast/index.js @@ -1 +1 @@ -export { fromLegacyKueryExpression, fromKueryExpression, fromLiteralExpression, toElasticsearchQuery } from './ast'; +export * from './ast'; diff --git a/src/ui/public/kuery/ast/kuery.peg b/src/ui/public/kuery/ast/kuery.peg index 669a18431a0a..157475143d54 100644 --- a/src/ui/public/kuery/ast/kuery.peg +++ b/src/ui/public/kuery/ast/kuery.peg @@ -5,14 +5,6 @@ const buildLiteralNode = nodeTypes.literal.buildNode; const buildWildcardNode = nodeTypes.wildcard.buildNode; const buildNamedArgNode = nodeTypes.namedArg.buildNode; - - function trimLeft(string) { - return string.replace(/^[\s\uFEFF\xA0]+/g, ''); - } - - function trimRight(string) { - return string.replace(/[\s\uFEFF\xA0]+$/g, ''); - } } start @@ -161,10 +153,6 @@ Value const isPhrase = buildLiteralNode(true); return (field) => buildFunctionNode('is', [field, value, isPhrase]); } - / value:WildcardString { - const isPhrase = buildLiteralNode(false); - return (field) => buildFunctionNode('is', [field, value, isPhrase]); - } / value:UnquotedLiteral { if (value.type === 'cursor') return value; const isPhrase = buildLiteralNode(false); @@ -181,7 +169,7 @@ Not = 'not'i Space+ Literal - = QuotedString / WildcardString / UnquotedLiteral + = QuotedString / UnquotedLiteral QuotedString = '"' prefix:QuotedCharacter* cursor:Cursor suffix:QuotedCharacter* '"' { @@ -203,25 +191,19 @@ QuotedCharacter WildcardString = sequences:WildcardSequence+ { - const compactedSequences = sequences.reduce((acc, arr, i) => { - const compacted = arr.filter(value => value !== ''); - return [...acc, ...compacted]; - }, []); - if (typeof compactedSequences[0] === 'string') { - compactedSequences[0] = trimLeft(compactedSequences[0]); - } - const lastIndex = compactedSequences.length - 1; - if (typeof compactedSequences[lastIndex] === 'string') { - compactedSequences[lastIndex] = trimRight(compactedSequences[lastIndex]); - } - return buildWildcardNode(compactedSequences); + return sequences.reduce((acc, arr) => [...acc, ...arr]); } WildcardSequence - = left:UnquotedCharacter* '*' right:UnquotedCharacter* { - return [left.join(''), nodeTypes.wildcard.wildcardSymbol, right.join('')]; + = left:WildcardCharacter* '*' right:WildcardCharacter* { + const sequences = [left.join(''), nodeTypes.wildcard.wildcardSymbol, right.join('')]; + return sequences.filter(value => value !== ''); } +WildcardCharacter + = EscapedWildcard + / !'*' char:UnquotedCharacter { return char; } + UnquotedLiteral = prefix:UnquotedCharacter* cursor:Cursor suffix:UnquotedCharacter* { const { start, end } = location(); @@ -238,13 +220,18 @@ UnquotedLiteral if (sequence === 'null') return buildLiteralNode(null); if (sequence === 'true') return buildLiteralNode(true); if (sequence === 'false') return buildLiteralNode(false); - const number = Number(sequence); - const value = isNaN(number) ? sequence : number; - return buildLiteralNode(value); + try { + return buildWildcardNode(sequence); + } catch (e) { + const number = Number(sequence); + const value = isNaN(number) ? sequence : number; + return buildLiteralNode(value); + } } UnquotedCharacter = EscapedSpecialCharacter + / EscapedWildcard / !Cursor !Separator char:. { return char; } OptionalSpace @@ -263,6 +250,9 @@ OptionalSpace EscapedSpecialCharacter = '\\' char:SpecialCharacter { return char; } +EscapedWildcard + = '\\' char:'*' { return char; } + EscapedDoubleQuote = '\\' char:'"' { return char; } @@ -273,7 +263,7 @@ Keyword = Or / And / Not SpecialCharacter - = [\\():<>"*] + = [\\():<>"] RangeOperator = '<=' { return 'lte'; } diff --git a/src/ui/public/kuery/node_types/wildcard.js b/src/ui/public/kuery/node_types/wildcard.js index dcacb3e69426..ada9deaf563c 100644 --- a/src/ui/public/kuery/node_types/wildcard.js +++ b/src/ui/public/kuery/node_types/wildcard.js @@ -1,4 +1,4 @@ -import { fromLiteralExpression } from '../ast/ast'; +import { fromWildcardExpression } from '../ast/ast'; export const wildcardSymbol = Symbol('*'); @@ -13,13 +13,9 @@ function escapeQueryString(string) { } export function buildNode(value) { - if (typeof value === 'string') { - return fromLiteralExpression(value); - } - return { type: 'wildcard', - value, + value: fromWildcardExpression(value) }; }