Skip to content

Commit

Permalink
Merge branch 'main' into hide-hie-tab-when-no-access
Browse files Browse the repository at this point in the history
  • Loading branch information
szwarckonrad authored Sep 11, 2024
2 parents 56d0482 + 4f6f88a commit 03e6fab
Show file tree
Hide file tree
Showing 33 changed files with 5,413 additions and 30,921 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,15 @@ const aliasTable: Record<string, string[]> = {
};
const aliases = new Set(Object.values(aliasTable).flat());

const evalSupportedCommandsAndOptions = {
const scalarSupportedCommandsAndOptions = {
supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'],
supportedOptions: ['by'],
};

const aggregationSupportedCommandsAndOptions = {
supportedCommands: ['stats', 'inlinestats', 'metrics'],
};

// coalesce can be removed when a test is added for version type
// (https://github.com/elastic/elasticsearch/pull/109032#issuecomment-2150033350)
const excludedFunctions = new Set(['bucket', 'case']);
Expand All @@ -40,7 +44,7 @@ const extraFunctions: FunctionDefinition[] = [
name: 'case',
description:
'Accepts pairs of conditions and values. The function returns the value that belongs to the first condition that evaluates to `true`. If the number of arguments is odd, the last argument is the default value which is returned when no condition matches.',
...evalSupportedCommandsAndOptions,
...scalarSupportedCommandsAndOptions,
signatures: [
{
params: [
Expand Down Expand Up @@ -215,9 +219,22 @@ const functionEnrichments: Record<string, RecursivePartial<FunctionDefinition>>
},
mv_sort: {
signatures: new Array(9).fill({
params: [{}, { literalOptions: ['asc', 'desc'] }],
params: [{}, { acceptedValues: ['asc', 'desc'] }],
}),
},
percentile: {
signatures: new Array(9).fill({
params: [{}, { constantOnly: true }],
}),
},
top: {
signatures: new Array(6).fill({
params: [{}, { constantOnly: true }, { constantOnly: true, acceptedValues: ['asc', 'desc'] }],
}),
},
count: {
signatures: [{ params: [{ supportsWildcard: true }] }],
},
};

const convertDateTime = (s: string) => (s === 'datetime' ? 'date' : s);
Expand All @@ -233,8 +250,8 @@ function getFunctionDefinition(ESFunctionDefinition: Record<string, any>): Funct
type: ESFunctionDefinition.type,
name: ESFunctionDefinition.name,
...(ESFunctionDefinition.type === 'eval'
? evalSupportedCommandsAndOptions
: { supportedCommands: ['stats'] }),
? scalarSupportedCommandsAndOptions
: aggregationSupportedCommandsAndOptions),
description: ESFunctionDefinition.description,
alias: aliasTable[ESFunctionDefinition.name],
signatures: _.uniqBy(
Expand Down Expand Up @@ -263,7 +280,10 @@ function getFunctionDefinition(ESFunctionDefinition: Record<string, any>): Funct
return ret as FunctionDefinition;
}

function printGeneratedFunctionsFile(functionDefinitions: FunctionDefinition[]) {
function printGeneratedFunctionsFile(
functionDefinitions: FunctionDefinition[],
functionsType: 'aggregation' | 'scalar'
) {
/**
* Deals with asciidoc internal cross-references in the function descriptions
*
Expand Down Expand Up @@ -341,10 +361,14 @@ function printGeneratedFunctionsFile(functionDefinitions: FunctionDefinition[])
*
*/
import type { ESQLFunction } from '@kbn/esql-ast';
import { i18n } from '@kbn/i18n';
import { isLiteralItem } from '../shared/helpers';
import type { FunctionDefinition } from './types';
import type { FunctionDefinition } from '../types';
${
functionsType === 'scalar'
? `import type { ESQLFunction } from '@kbn/esql-ast';
import { isLiteralItem } from '../../shared/helpers';`
: ''
}
`;
Expand All @@ -359,7 +383,7 @@ import type { FunctionDefinition } from './types';
.join('\n\n');

const fileContents = `${fileHeader}${functionDefinitionsString}
export const evalFunctionDefinitions = [${functionDefinitions
export const ${functionsType}FunctionDefinitions = [${functionDefinitions
.map(({ name }) => getDefinitionName(name))
.join(',\n')}];`;

Expand All @@ -379,25 +403,30 @@ import type { FunctionDefinition } from './types';
JSON.parse(readFileSync(`${ESFunctionDefinitionsDirectory}/${file}`, 'utf-8'))
);

const evalFunctionDefinitions: FunctionDefinition[] = [];
const scalarFunctionDefinitions: FunctionDefinition[] = [];
const aggFunctionDefinitions: FunctionDefinition[] = [];
for (const ESDefinition of ESFunctionDefinitions) {
if (
aliases.has(ESDefinition.name) ||
excludedFunctions.has(ESDefinition.name) ||
ESDefinition.type !== 'eval'
) {
if (aliases.has(ESDefinition.name) || excludedFunctions.has(ESDefinition.name)) {
continue;
}

const functionDefinition = getFunctionDefinition(ESDefinition);

evalFunctionDefinitions.push(functionDefinition);
if (functionDefinition.type === 'eval') {
scalarFunctionDefinitions.push(functionDefinition);
} else if (functionDefinition.type === 'agg') {
aggFunctionDefinitions.push(functionDefinition);
}
}

evalFunctionDefinitions.push(...extraFunctions);
scalarFunctionDefinitions.push(...extraFunctions);

await writeFile(
join(__dirname, '../src/definitions/functions.ts'),
printGeneratedFunctionsFile(evalFunctionDefinitions)
join(__dirname, '../src/definitions/generated/scalar_functions.ts'),
printGeneratedFunctionsFile(scalarFunctionDefinitions, 'scalar')
);
await writeFile(
join(__dirname, '../src/definitions/generated/aggregation_functions.ts'),
printGeneratedFunctionsFile(aggFunctionDefinitions, 'aggregation')
);
})();
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import { FieldType, FunctionReturnType } from '../../definitions/types';
import { ESQL_COMMON_NUMERIC_TYPES, ESQL_NUMBER_TYPES } from '../../shared/esql_types';
import { allStarConstant } from '../complete_items';
import { getAddDateHistogramSnippet } from '../factories';
import { roundParameterTypes } from './constants';
import { setup, getFunctionSignaturesByReturnType, getFieldNamesByType } from './helpers';
Expand Down Expand Up @@ -39,6 +41,9 @@ const allGroupingFunctions = getFunctionSignaturesByReturnType(
'by'
);

// types accepted by the AVG function
const avgTypes: Array<FieldType & FunctionReturnType> = ['double', 'integer', 'long'];

describe('autocomplete.suggest', () => {
describe('STATS <aggregates> [ BY <grouping> ]', () => {
describe('STATS ...', () => {});
Expand Down Expand Up @@ -121,18 +126,16 @@ describe('autocomplete.suggest', () => {
),
]);
await assertSuggestions('from a | stats avg(/', [
...getFieldNamesByType(ESQL_NUMBER_TYPES),
...getFunctionSignaturesByReturnType('eval', ESQL_NUMBER_TYPES, { scalar: true }),
...getFieldNamesByType(avgTypes),
...getFunctionSignaturesByReturnType('eval', avgTypes, {
scalar: true,
}),
]);
await assertSuggestions('from a | stats round(avg(/', [
...getFieldNamesByType(ESQL_NUMBER_TYPES),
...getFunctionSignaturesByReturnType(
'eval',
ESQL_NUMBER_TYPES,
{ scalar: true },
undefined,
['round']
),
...getFieldNamesByType(avgTypes),
...getFunctionSignaturesByReturnType('eval', avgTypes, { scalar: true }, undefined, [
'round',
]),
]);
});

Expand All @@ -150,16 +153,7 @@ describe('autocomplete.suggest', () => {
]),
...getFunctionSignaturesByReturnType(
'stats',
[
...ESQL_COMMON_NUMERIC_TYPES,
'date',
'date_period',
'boolean',
'ip',
'version',
'text',
'keyword',
],
[...ESQL_COMMON_NUMERIC_TYPES, 'date', 'boolean', 'ip', 'version', 'text', 'keyword'],
{
scalar: true,
}
Expand All @@ -175,14 +169,10 @@ describe('autocomplete.suggest', () => {
const { assertSuggestions } = await setup();

await assertSuggestions('from a | stats avg(b/) by stringField', [
...getFieldNamesByType(ESQL_NUMBER_TYPES),
...getFunctionSignaturesByReturnType(
'eval',
['double', 'integer', 'long', 'unsigned_long'],
{
scalar: true,
}
),
...getFieldNamesByType(avgTypes),
...getFunctionSignaturesByReturnType('eval', avgTypes, {
scalar: true,
}),
]);
});

Expand Down Expand Up @@ -297,15 +287,9 @@ describe('autocomplete.suggest', () => {
});

test('count(/) to suggest * for all', async () => {
const { assertSuggestions } = await setup();

const expected = [
'*',
...getFieldNamesByType(['any']).map((field) => `${field}`),
...allEvaFunctions,
];
await assertSuggestions('from a | stats count(/)', expected);
await assertSuggestions('from a | stats var0 = count(/)', expected);
const { suggest } = await setup();
const suggestions = await suggest('from a | stats count(/)');
expect(suggestions).toContain(allStarConstant);
});
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import {
getDateLiteralsByFieldType,
} from './helpers';
import { ESQL_COMMON_NUMERIC_TYPES } from '../../shared/esql_types';
import { evalFunctionDefinitions } from '../../definitions/functions';
import { scalarFunctionDefinitions } from '../../definitions/generated/scalar_functions';
import { timeUnitsToSuggest } from '../../definitions/literals';
import {
getCompatibleTypesToSuggestNext,
Expand Down Expand Up @@ -361,7 +361,7 @@ describe('autocomplete.suggest', () => {

describe('eval functions', () => {
// // Test suggestions for each possible param, within each signature variation, for each function
for (const fn of evalFunctionDefinitions) {
for (const fn of scalarFunctionDefinitions) {
// skip this fn for the moment as it's quite hard to test
// if (!['bucket', 'date_extract', 'date_diff', 'case'].includes(fn.name)) {
if (!['bucket', 'date_extract', 'date_diff', 'case'].includes(fn.name)) {
Expand Down Expand Up @@ -541,7 +541,12 @@ describe('autocomplete.suggest', () => {
);
await assertSuggestions(
'from a | eval var0=date_trunc(/)',
getLiteralsByType('time_literal').map((t) => `${t}, `),
[
...getLiteralsByType('time_literal').map((t) => `${t}, `),
...getFunctionSignaturesByReturnType('eval', 'time_duration', { scalar: true }).map(
(t) => `${t.text},`
),
],
{ triggerCharacter: '(' }
);
await assertSuggestions(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@

import { camelCase } from 'lodash';
import { getAstAndSyntaxErrors } from '@kbn/esql-ast';
import { evalFunctionDefinitions } from '../../definitions/functions';
import { scalarFunctionDefinitions } from '../../definitions/generated/scalar_functions';
import { builtinFunctions } from '../../definitions/builtin';
import { statsAggregationFunctionDefinitions } from '../../definitions/aggs';
import { aggregationFunctionDefinitions } from '../../definitions/generated/aggregation_functions';
import { timeUnitsToSuggest } from '../../definitions/literals';
import { groupingFunctionDefinitions } from '../../definitions/grouping';
import * as autocomplete from '../autocomplete';
Expand Down Expand Up @@ -149,7 +149,7 @@ export function getFunctionSignaturesByReturnType(

const list = [];
if (agg) {
list.push(...statsAggregationFunctionDefinitions);
list.push(...aggregationFunctionDefinitions);
// right now all grouping functions are agg functions too
list.push(...groupingFunctionDefinitions);
}
Expand All @@ -158,7 +158,7 @@ export function getFunctionSignaturesByReturnType(
}
// eval functions (eval is a special keyword in JS)
if (scalar) {
list.push(...evalFunctionDefinitions);
list.push(...scalarFunctionDefinitions);
}
if (builtin) {
list.push(...builtinFunctions.filter(({ name }) => (skipAssign ? name !== '=' : true)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
*/

import { suggest } from './autocomplete';
import { evalFunctionDefinitions } from '../definitions/functions';
import { scalarFunctionDefinitions } from '../definitions/generated/scalar_functions';
import { timeUnitsToSuggest } from '../definitions/literals';
import { commandDefinitions as unmodifiedCommandDefinitions } from '../definitions/commands';
import {
Expand Down Expand Up @@ -747,8 +747,8 @@ describe('autocomplete', () => {
describe('function arguments', () => {
// literalSuggestions parameter
const dateDiffFirstParamSuggestions =
evalFunctionDefinitions.find(({ name }) => name === 'date_diff')?.signatures[0].params?.[0]
.literalSuggestions ?? [];
scalarFunctionDefinitions.find(({ name }) => name === 'date_diff')?.signatures[0]
.params?.[0].literalSuggestions ?? [];
testSuggestions(
'FROM a | EVAL DATE_DIFF(/)',
dateDiffFirstParamSuggestions.map((s) => `"${s}", `).map(attachTriggerCommand)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
import { i18n } from '@kbn/i18n';
import { SuggestionRawDefinition } from './types';
import { groupingFunctionDefinitions } from '../definitions/grouping';
import { statsAggregationFunctionDefinitions } from '../definitions/aggs';
import { evalFunctionDefinitions } from '../definitions/functions';
import { aggregationFunctionDefinitions } from '../definitions/generated/aggregation_functions';
import { scalarFunctionDefinitions } from '../definitions/generated/scalar_functions';
import { getFunctionSignatures, getCommandSignature } from '../definitions/helpers';
import { timeUnitsToSuggest } from '../definitions/literals';
import {
Expand All @@ -26,8 +26,8 @@ import { DOUBLE_BACKTICK, SINGLE_TICK_REGEX } from '../shared/constants';
import { ESQLRealField } from '../validation/types';
import { isNumericType } from '../shared/esql_types';

const allFunctions = statsAggregationFunctionDefinitions
.concat(evalFunctionDefinitions)
const allFunctions = aggregationFunctionDefinitions
.concat(scalarFunctionDefinitions)
.concat(groupingFunctionDefinitions);

export const TIME_SYSTEM_PARAMS = ['?t_start', '?t_end'];
Expand Down
Loading

0 comments on commit 03e6fab

Please sign in to comment.