From c4cee0fc2418182cb55045e89a17d18154427c69 Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Thu, 5 Sep 2024 16:18:28 -0600 Subject: [PATCH] Fix grok and dissect behavior --- .../src/autocomplete/autocomplete.test.ts | 41 ++++++++++++++++--- .../src/autocomplete/autocomplete.ts | 5 +++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index e0678aab0d9db..f80207f4677d1 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -270,10 +270,23 @@ describe('autocomplete', () => { `dissect keywordField ${constantPattern} |`, ]; for (const subExpression of subExpressions) { - testSuggestions(`from a | ${subExpression} grok /`, getFieldNamesByType(ESQL_STRING_TYPES)); + testSuggestions( + `from a | ${subExpression} grok /`, + getFieldNamesByType(ESQL_STRING_TYPES).map((name) => `${name} `) + ); testSuggestions(`from a | ${subExpression} grok keywordField /`, [constantPattern], ' '); testSuggestions(`from a | ${subExpression} grok keywordField ${constantPattern} /`, ['| ']); } + + testSuggestions( + 'from a | grok /', + getFieldNamesByType(ESQL_STRING_TYPES).map((name) => `${name} `) + ); + testSuggestions( + 'from a | grok key/', + getFieldNamesByType(ESQL_STRING_TYPES).map((name) => `${name} `) + ); + testSuggestions('from a | grok keywordField/', []); }); describe('dissect', () => { @@ -285,10 +298,9 @@ describe('autocomplete', () => { `dissect keywordField ${constantPattern} append_separator = ":" |`, ]; for (const subExpression of subExpressions) { - // Unskip once https://github.com/elastic/kibana/issues/190070 is fixed - testSuggestions.skip( + testSuggestions( `from a | ${subExpression} dissect /`, - getFieldNamesByType(ESQL_STRING_TYPES) + getFieldNamesByType(ESQL_STRING_TYPES).map((name) => `${name} `) ); testSuggestions(`from a | ${subExpression} dissect keywordField /`, [constantPattern], ' '); testSuggestions( @@ -305,6 +317,16 @@ describe('autocomplete', () => { ['| '] ); } + + testSuggestions( + 'from a | dissect /', + getFieldNamesByType(ESQL_STRING_TYPES).map((name) => `${name} `) + ); + testSuggestions( + 'from a | dissect key/', + getFieldNamesByType(ESQL_STRING_TYPES).map((name) => `${name} `) + ); + testSuggestions('from a | dissect keywordField/', []); }); describe('sort', () => { @@ -567,7 +589,10 @@ describe('autocomplete', () => { ]); // DISSECT field - testSuggestions('FROM index1 | DISSECT b/', getFieldNamesByType(ESQL_STRING_TYPES)); + testSuggestions( + 'FROM index1 | DISSECT b/', + getFieldNamesByType(ESQL_STRING_TYPES).map((name) => `${name} `) + ); // DROP (first field) testSuggestions('FROM index1 | DROP f/', getFieldNamesByType('any')); @@ -599,7 +624,11 @@ describe('autocomplete', () => { ]); // GROK field - testSuggestions('FROM index1 | GROK f/', getFieldNamesByType(ESQL_STRING_TYPES), undefined); + testSuggestions( + 'FROM index1 | GROK f/', + getFieldNamesByType(ESQL_STRING_TYPES).map((field) => `${field} `), + undefined + ); // KEEP (first field) testSuggestions('FROM index1 | KEEP f/', getFieldNamesByType('any')); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index 74a44e3f4aa3d..b9db5e4cafd04 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -715,6 +715,9 @@ async function getExpressionSuggestionsByType( // check if lastWord is an existing field const column = getColumnByName(lastWord, references); if (column) { + if (['grok', 'dissect'].includes(command.name)) { + return []; + } // now we know that the user has already entered a column, // so suggest comma and pipe // const NON_ALPHANUMERIC_REGEXP = /[^a-zA-Z\d]/g; @@ -734,6 +737,7 @@ async function getExpressionSuggestionsByType( suggestions.push( ...fieldSuggestions.map((suggestion) => ({ ...suggestion, + text: suggestion.text + (['grok', 'dissect'].includes(command.name) ? ' ' : ''), command: TRIGGER_SUGGESTION_COMMAND, rangeToReplace, })) @@ -744,6 +748,7 @@ async function getExpressionSuggestionsByType( suggestions.push( ...fieldSuggestions.map((suggestion) => ({ ...suggestion, + text: suggestion.text + (['grok', 'dissect'].includes(command.name) ? ' ' : ''), command: TRIGGER_SUGGESTION_COMMAND, })) );