From 7c5f64a130123f624c6ec1979297361ddffb6126 Mon Sep 17 00:00:00 2001 From: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:16:26 +0200 Subject: [PATCH 1/8] [Lens] Make Lens visualizations (metric and gauge) out of experimental (#192359) ## Summary Removes Gauge and metric experimental badge. --- .../plugins/lens/public/visualizations/gauge/visualization.tsx | 1 - .../plugins/lens/public/visualizations/metric/visualization.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx index cffa80bcc0773..e1ef2b03e4264 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx @@ -172,7 +172,6 @@ export const getGaugeVisualization = ({ label: i18n.translate('xpack.lens.gauge.label', { defaultMessage: 'Gauge', }), - showExperimentalBadge: true, sortPriority: 7, description: i18n.translate('xpack.lens.gauge.visualizationDescription', { defaultMessage: 'Show progress to a goal in linear or arced style.', diff --git a/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx b/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx index 966c3383c3820..6d3bd42f26cfa 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx @@ -309,7 +309,6 @@ export const getMetricVisualization = ({ id: LENS_METRIC_ID, icon: IconChartMetric, label: metricLabel, - showExperimentalBadge: true, sortPriority: 4, description: i18n.translate('xpack.lens.metric.visualizationDescription', { defaultMessage: 'Present individual key metrics or KPIs.', From 68234cc6efb7f230bc890f26fb63cb92c1f55030 Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Tue, 10 Sep 2024 07:57:20 -0600 Subject: [PATCH 2/8] [ES|QL] Simplify function validation tests (#192415) ## Summary This PR changes our approach to testing function validation. Key changes - We no longer test the definitions from Elasticsearch. Instead, we use function definition mocks to check the functionality of the validator. - We no longer run the test scenarios against Elasticsearch to make sure we are in-sync. Hopefully this will make the validation tests clearer, remove a point of friction from the function sync job, and improve our DX. We can consider any cross-validation we need to do with Elasticsearch as a separate issue. ### Checklist - [x] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../steps/esql_generate_function_metadata.sh | 4 - .../README.md | 14 - .../package.json | 2 - .../scripts/generate_function_definitions.ts | 4 +- .../generate_function_validation_tests.ts | 1457 -- .../autocomplete.suggest.eval.test.ts | 4 +- .../src/autocomplete/autocomplete.ts | 2 +- .../src/definitions/aggs.ts | 2 +- .../src/definitions/functions.ts | 22 +- .../src/definitions/types.ts | 2 +- .../src/shared/helpers.ts | 11 +- .../src/shared/test_functions.ts | 25 + .../validation/__tests__/functions.test.ts | 659 + .../function_describe_block_name.ts | 10 - .../src/validation/validation.test.ts | 14524 +--------------- .../src/validation/validation.ts | 4 +- 16 files changed, 747 insertions(+), 15999 deletions(-) delete mode 100644 packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts create mode 100644 packages/kbn-esql-validation-autocomplete/src/shared/test_functions.ts create mode 100644 packages/kbn-esql-validation-autocomplete/src/validation/__tests__/functions.test.ts delete mode 100644 packages/kbn-esql-validation-autocomplete/src/validation/function_describe_block_name.ts diff --git a/.buildkite/scripts/steps/esql_generate_function_metadata.sh b/.buildkite/scripts/steps/esql_generate_function_metadata.sh index 30e0fef47c100..837a962b3c42b 100755 --- a/.buildkite/scripts/steps/esql_generate_function_metadata.sh +++ b/.buildkite/scripts/steps/esql_generate_function_metadata.sh @@ -29,10 +29,6 @@ main () { yarn make:defs $PARENT_DIR/elasticsearch - report_main_step "Generate function validation tests" - - yarn make:tests - report_main_step "Generate inline function docs" cd "$KIBANA_DIR/$EDITOR_PACKAGE_DIR" diff --git a/packages/kbn-esql-validation-autocomplete/README.md b/packages/kbn-esql-validation-autocomplete/README.md index f964033090c2d..977b568e93a3f 100644 --- a/packages/kbn-esql-validation-autocomplete/README.md +++ b/packages/kbn-esql-validation-autocomplete/README.md @@ -284,20 +284,6 @@ It accepts 2. a list of expected errors (can be empty) 3. a list of expected warnings (can be empty or omitted) -The bulk of the validation tests are auto-generated from function definitions. All the generated function tests are found within the following describe block - -```ts -describe(FUNCTION_DESCRIBE_BLOCK_NAME, () => { - ... -}); -``` - -They are currently generated in CI when a new function definition is added. The generator script is at `packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts`. - -The generator can be run locally using the `cd packages/kbn-esql-validation-autocomplete && yarn make:tests`. - -It is not perfect and occasionally creates a test case that is invalid for a particular function. So, humans are allowed to edit the expected assertions for any test case—those edits will not be overwritten by the generator script. However, if a human deletes a test case, it will be added back next time the generator runs. So, we should edit the test cases to make them valid, not delete them. - Running the tests in `validation.test.ts` populates `packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json` which is then used in `test/api_integration/apis/esql/errors.ts` to make sure our validator isn't giving users false positives. Therefore, the validation test suite should always be run after any changes have been made to it so that the JSON file stays in sync. #### Autocomplete diff --git a/packages/kbn-esql-validation-autocomplete/package.json b/packages/kbn-esql-validation-autocomplete/package.json index 1c3567fd52042..3cd5ec84f5d7a 100644 --- a/packages/kbn-esql-validation-autocomplete/package.json +++ b/packages/kbn-esql-validation-autocomplete/package.json @@ -5,8 +5,6 @@ "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0", "sideEffects": false, "scripts": { - "make:tests": "ts-node --transpileOnly ./scripts/generate_function_validation_tests.ts", - "postmake:tests": "yarn run lint:fix", "make:defs": "ts-node --transpileOnly ./scripts/generate_function_definitions.ts", "postmake:defs": "yarn run lint:fix", "lint:fix": "cd ../.. && node ./scripts/eslint --fix ./packages/kbn-esql-validation-autocomplete/src/**/*.ts", diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts index 4ab631154ddc6..8515a249f7686 100644 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts +++ b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts @@ -194,14 +194,14 @@ const functionEnrichments: Record> date_diff: { signatures: [ { - params: [{ literalOptions: dateDiffOptions, literalSuggestions: dateDiffSuggestions }], + params: [{ acceptedValues: dateDiffOptions, literalSuggestions: dateDiffSuggestions }], }, ], }, date_extract: { signatures: [ { - params: [{ literalOptions: dateExtractOptions }], + params: [{ acceptedValues: dateExtractOptions }], }, ], }, diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts deleted file mode 100644 index 98ca28ba5e9bd..0000000000000 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts +++ /dev/null @@ -1,1457 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { readFileSync, writeFileSync } from 'fs'; -import { join } from 'path'; -import * as recast from 'recast'; -import { camelCase } from 'lodash'; -import { getParamAtPosition } from '../src/autocomplete/helper'; -import { statsAggregationFunctionDefinitions } from '../src/definitions/aggs'; -import { evalFunctionDefinitions } from '../src/definitions/functions'; -import { groupingFunctionDefinitions } from '../src/definitions/grouping'; -import { getFunctionSignatures } from '../src/definitions/helpers'; -import { timeUnits } from '../src/definitions/literals'; -import { nonNullable } from '../src/shared/helpers'; -import { - SupportedDataType, - FunctionDefinition, - dataTypes, - fieldTypes, - isFieldType, - FunctionParameter, -} from '../src/definitions/types'; -import { FUNCTION_DESCRIBE_BLOCK_NAME } from '../src/validation/function_describe_block_name'; -import { getMaxMinNumberOfParams } from '../src/validation/helpers'; -import { ESQL_NUMBER_TYPES, isNumericType, isStringType } from '../src/shared/esql_types'; - -export const fieldNameFromType = (type: SupportedDataType) => `${camelCase(type)}Field`; - -function main() { - const testCasesByFunction: Map> = new Map(); - - for (const definition of evalFunctionDefinitions) { - testCasesByFunction.set(definition.name, generateTestsForEvalFunction(definition)); - } - - for (const definition of statsAggregationFunctionDefinitions) { - testCasesByFunction.set(definition.name, generateTestsForAggFunction(definition)); - } - - for (const definition of groupingFunctionDefinitions) { - testCasesByFunction.set(definition.name, generateTestsForGroupingFunction(definition)); - } - - writeTestsToFile(testCasesByFunction); -} - -function generateTestsForEvalFunction(definition: FunctionDefinition) { - const testCases: Map = new Map(); - generateRowCommandTestsForEvalFunction(definition, testCases); - generateWhereCommandTestsForEvalFunction(definition, testCases); - generateEvalCommandTestsForEvalFunction(definition, testCases); - generateSortCommandTestsForEvalFunction(definition, testCases); - generateNullAcceptanceTestsForFunction(definition, testCases); - generateImplicitDateCastingTestsForFunction(definition, testCases); - return testCases; -} - -function generateTestsForAggFunction(definition: FunctionDefinition) { - const testCases: Map = new Map(); - generateStatsCommandTestsForAggFunction(definition, testCases); - generateSortCommandTestsForAggFunction(definition, testCases); - generateWhereCommandTestsForAggFunction(definition, testCases); - generateEvalCommandTestsForAggFunction(definition, testCases); - generateNullAcceptanceTestsForFunction(definition, testCases); - generateImplicitDateCastingTestsForFunction(definition, testCases); - return testCases; -} - -function generateTestsForGroupingFunction(definition: FunctionDefinition) { - const testCases: Map = new Map(); - generateStatsCommandTestsForGroupingFunction(definition, testCases); - generateSortCommandTestsForGroupingFunction(definition, testCases); - generateNullAcceptanceTestsForFunction(definition, testCases); - generateImplicitDateCastingTestsForFunction(definition, testCases); - return testCases; -} - -function generateNullAcceptanceTestsForFunction( - definition: FunctionDefinition, - testCases: Map -) { - const { max, min } = getMaxMinNumberOfParams(definition); - const numberOfArgsToTest = max === Infinity ? min : max; - const signatureWithGreatestNumberOfParams = definition.signatures.find( - (signature) => signature.params.length === numberOfArgsToTest - )!; - - const commandToTestWith = definition.supportedCommands.includes('eval') ? 'eval' : 'stats'; - - // test that the function accepts nulls - testCases.set( - `from a_index | ${commandToTestWith} ${ - getFunctionSignatures( - { - ...definition, - signatures: [ - { - ...signatureWithGreatestNumberOfParams, - params: new Array(numberOfArgsToTest).fill({ name: 'null' }), - }, - ], - }, - { withTypes: false } - )[0].declaration - }`, - [] - ); - - testCases.set( - `row nullVar = null | ${commandToTestWith} ${ - getFunctionSignatures( - { - ...definition, - signatures: [ - { - ...signatureWithGreatestNumberOfParams, - params: new Array(numberOfArgsToTest).fill({ name: 'nullVar' }), - }, - ], - }, - { withTypes: false } - )[0].declaration - }`, - [] - ); -} - -/** - * Tests for strings being casted to dates - * - * @param definition - * @param testCases - * @returns - */ -function generateImplicitDateCastingTestsForFunction( - definition: FunctionDefinition, - testCases: Map -) { - const allSignaturesWithDateParams = definition.signatures.filter((signature) => - signature.params.some( - (param, i) => - (param.type === 'date' || param.type === 'date_period') && - !definition.signatures.some((def) => isStringType(getParamAtPosition(def, i)?.type)) // don't count parameters that already accept a string - ) - ); - - if (!allSignaturesWithDateParams.length) { - // no signatures contain date params - return; - } - - const commandToTestWith = definition.supportedCommands.includes('eval') ? 'eval' : 'stats'; - - for (const signature of allSignaturesWithDateParams) { - const mappedParams = getFieldMapping(signature.params); - - testCases.set( - `from a_index | ${commandToTestWith} ${ - getFunctionSignatures( - { - ...definition, - signatures: [ - { - ...signature, - params: mappedParams.map((param) => - // overwrite dates with a string - param.type === 'date' ? { ...param, name: '"2022"' } : param - ), - }, - ], - }, - { withTypes: false } - )[0].declaration - }`, - [] - ); - - testCases.set( - `from a_index | ${commandToTestWith} ${ - getFunctionSignatures( - { - ...definition, - signatures: [ - { - ...signature, - params: mappedParams.map((param) => - // overwrite dates with a string - param.type === 'date' ? { ...param, name: 'concat("20", "22")' } : param - ), - }, - ], - }, - { withTypes: false } - )[0].declaration - }`, - [] - ); - } -} - -function generateRowCommandTestsForEvalFunction( - { name, alias, signatures, ...defRest }: FunctionDefinition, - testCases: Map -) { - if (name === 'date_diff') return; - for (const { params, ...signRest } of signatures) { - // ROW command stuff - const fieldMapping = getFieldMapping(params); - const signatureStringCorrect = tweakSignatureForRowCommand( - getFunctionSignatures( - { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration - ); - - testCases.set(`row var = ${signatureStringCorrect}`, []); - testCases.set(`row ${signatureStringCorrect}`, []); - - if (alias) { - for (const otherName of alias) { - const signatureStringWithAlias = tweakSignatureForRowCommand( - getFunctionSignatures( - { - name: otherName, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - ); - - testCases.set(`row var = ${signatureStringWithAlias}`, []); - } - } - - // Skip functions that have only arguments of type "any", as it is not possible to pass "the wrong type". - // to_version functions are a bit harder to test exactly a combination of argument and predict the - // the right error message - if ( - params.every(({ type }) => type !== 'any') && - ![ - 'to_version', - 'mv_sort', - // skip the date functions because the row tests always throw in - // a string literal and expect it to be invalid for the date functions - // but it's always valid because ES will parse it as a date - 'date_diff', - 'date_extract', - 'date_format', - 'date_trunc', - ].includes(name) - ) { - // now test nested functions - const fieldMappingWithNestedFunctions = getFieldMapping(params, { - useNestedFunction: true, - useLiterals: true, - }); - const signatureString = tweakSignatureForRowCommand( - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithNestedFunctions, ...signRest }], - }, - { withTypes: false } - )[0].declaration - ); - - testCases.set(`row var = ${signatureString}`, []); - } - } - - // Test the parameter type checking - const signatureWithMostParams = signatures.reduce((acc, curr) => - acc.params.length > curr.params.length ? acc : curr - ); - - const { wrongFieldMapping, expectedErrors } = generateIncorrectlyTypedParameters( - name, - signatures, - signatureWithMostParams.params, - supportedTypesAndConstants - ); - const wrongSignatureString = tweakSignatureForRowCommand( - getFunctionSignatures( - { name, ...defRest, signatures: [{ ...signatureWithMostParams, params: wrongFieldMapping }] }, - { withTypes: false } - )[0].declaration - ); - testCases.set(`row var = ${wrongSignatureString}`, expectedErrors); -} - -function generateWhereCommandTestsForEvalFunction( - { name, signatures, ...rest }: FunctionDefinition, - testCases: Map -) { - // Test that all functions work in where - // TODO: not sure why there's this constraint... - const supportedFunction = signatures.some( - ({ returnType, params }) => - [...ESQL_NUMBER_TYPES, 'string'].includes(returnType as string) && - params.every(({ type }) => [...ESQL_NUMBER_TYPES, 'string'].includes(type as string)) - ); - - if (!supportedFunction) { - return; - } - - const supportedSignatures = signatures.filter(({ returnType }) => - // TODO — not sure why the tests have this limitation... seems like any type - // that can be part of a boolean expression should be allowed in a where clause - [...ESQL_NUMBER_TYPES, 'string'].includes(returnType as string) - ); - for (const { params, returnType, ...restSign } of supportedSignatures) { - const correctMapping = getFieldMapping(params); - testCases.set( - `from a_index | where ${!isNumericType(returnType) ? 'length(' : ''}${ - // hijacking a bit this function to produce a function call - getFunctionSignatures( - { - name, - ...rest, - signatures: [{ params: correctMapping, returnType, ...restSign }], - }, - { withTypes: false } - )[0].declaration - }${!isNumericType(returnType) ? ')' : ''} > 0`, - [] - ); - - const { wrongFieldMapping, expectedErrors } = generateIncorrectlyTypedParameters( - name, - signatures, - params, - supportedTypesAndFieldNames - ); - testCases.set( - `from a_index | where ${!isNumericType(returnType) ? 'length(' : ''}${ - // hijacking a bit this function to produce a function call - getFunctionSignatures( - { - name, - ...rest, - signatures: [{ params: wrongFieldMapping, returnType, ...restSign }], - }, - { withTypes: false } - )[0].declaration - }${!isNumericType(returnType) ? ')' : ''} > 0`, - expectedErrors - ); - } -} - -function generateWhereCommandTestsForAggFunction( - { name, alias, signatures, ...defRest }: FunctionDefinition, - testCases: Map -) { - // statsSignatures.some(({ returnType, params }) => [...ESQL_NUMBER_TYPES].includes(returnType)) - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - - testCases.set( - `from a_index | where ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [`WHERE does not support function ${name}`] - ); - - testCases.set( - `from a_index | where ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - } > 0`, - [`WHERE does not support function ${name}`] - ); - } -} - -function generateEvalCommandTestsForEvalFunction( - definition: FunctionDefinition, - testCases: Map -) { - const { name, signatures, alias, ...defRest } = definition; - - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - testCases.set( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [] - ); - testCases.set( - `from a_index | eval ${ - getFunctionSignatures( - { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration - }`, - [] - ); - if (params.some(({ constantOnly }) => constantOnly)) { - const fieldReplacedType = params - .filter(({ constantOnly }) => constantOnly) - .map(({ type }) => type); - // create the mapping without the literal flag - // this will make the signature wrong on purpose where in place on constants - // the arg will be a column of the same type - const fieldMappingWithoutLiterals = getFieldMapping( - params.map(({ constantOnly, ...rest }) => rest) - ); - testCases.set( - `from a_index | eval ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithoutLiterals, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - fieldReplacedType.map( - (type) => `Argument of [${name}] must be a constant, received [${type}Field]` - ) - ); - } - - if (alias) { - for (const otherName of alias) { - const signatureStringWithAlias = getFunctionSignatures( - { - name: otherName, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration; - - testCases.set(`from a_index | eval var = ${signatureStringWithAlias}`, []); - } - } - - // Skip functions that have only arguments of type "any", as it is not possible to pass "the wrong type". - // to_version functions are a bit harder to test exactly a combination of argument and predict the - // the right error message - if (params.every(({ type }) => type !== 'any') && !['to_version', 'mv_sort'].includes(name)) { - // now test nested functions - const fieldMappingWithNestedFunctions = getFieldMapping(params, { - useNestedFunction: true, - useLiterals: true, - }); - testCases.set( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithNestedFunctions, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [] - ); - - const { wrongFieldMapping, expectedErrors } = generateIncorrectlyTypedParameters( - name, - signatures, - params, - supportedTypesAndFieldNames - ); - testCases.set( - `from a_index | eval ${ - getFunctionSignatures( - { name, ...defRest, signatures: [{ params: wrongFieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration - }`, - expectedErrors - ); - } - - // test that wildcard won't work as arg - if (fieldMapping.length === 1 && !signRest.minParams) { - const fieldMappingWithWildcard = [...fieldMapping]; - fieldMappingWithWildcard[0].name = '*'; - - testCases.set( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithWildcard, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [`Using wildcards (*) in ${name} is not allowed`] - ); - } - } - - // test that the function can have too many args - if (signatures.some(({ minParams }) => minParams)) { - // at least one signature is variadic, so no way - // to have too many arguments - return; - } - - // test that additional args are spotted - - const { max: maxNumberOfArgs, min: minNumberOfArgs } = getMaxMinNumberOfParams(definition); - const signatureWithGreatestNumberOfParams = signatures.find( - (signature) => signature.params.length === maxNumberOfArgs - )!; - - const fieldMappingWithOneExtraArg = getFieldMapping( - signatureWithGreatestNumberOfParams.params - ).concat({ - name: 'extraArg', - type: 'integer', - }); - - // get the expected args from the first signature in case of errors - const hasOptionalArgs = minNumberOfArgs < maxNumberOfArgs; - const hasTooManyArgs = fieldMappingWithOneExtraArg.length > maxNumberOfArgs; - - // the validation engine tries to be smart about signatures with optional args - let messageQuantifier = 'exactly '; - if (hasOptionalArgs && hasTooManyArgs) { - messageQuantifier = 'no more than '; - } - if (!hasOptionalArgs && !hasTooManyArgs) { - messageQuantifier = 'at least '; - } - testCases.set( - `from a_index | eval ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [ - { ...signatureWithGreatestNumberOfParams, params: fieldMappingWithOneExtraArg }, - ], - }, - { withTypes: false } - )[0].declaration - }`, - [ - `Error: [${name}] function expects ${messageQuantifier}${ - maxNumberOfArgs === 1 - ? 'one argument' - : maxNumberOfArgs === 0 - ? '0 arguments' - : `${maxNumberOfArgs} arguments` - }, got ${fieldMappingWithOneExtraArg.length}.`, - ] - ); -} - -function generateEvalCommandTestsForAggFunction( - { name, signatures, alias, ...defRest }: FunctionDefinition, - testCases: Map -) { - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - testCases.set( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [`EVAL does not support function ${name}`] - ); - - testCases.set( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - } > 0`, - [`EVAL does not support function ${name}`] - ); - - testCases.set( - `from a_index | eval ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [`EVAL does not support function ${name}`] - ); - - testCases.set( - `from a_index | eval ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - } > 0`, - [`EVAL does not support function ${name}`] - ); - } -} - -function generateStatsCommandTestsForAggFunction( - { name, signatures, alias, ...defRest }: FunctionDefinition, - testCases: Map -) { - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - - const correctSignature = getFunctionSignatures( - { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration; - testCases.set(`from a_index | stats var = ${correctSignature}`, []); - testCases.set(`from a_index | stats ${correctSignature}`, []); - - if (isNumericType(signRest.returnType)) { - testCases.set(`from a_index | stats var = round(${correctSignature})`, []); - testCases.set(`from a_index | stats round(${correctSignature})`, []); - testCases.set( - `from a_index | stats var = round(${correctSignature}) + ${correctSignature}`, - [] - ); - testCases.set(`from a_index | stats round(${correctSignature}) + ${correctSignature}`, []); - } - - if (params.some(({ constantOnly }) => constantOnly)) { - const fieldReplacedType = params - .filter(({ constantOnly }) => constantOnly) - .map(({ type }) => type); - // create the mapping without the literal flag - // this will make the signature wrong on purpose where in place on constants - // the arg will be a column of the same type - const fieldMappingWithoutLiterals = getFieldMapping( - params.map(({ constantOnly, ...rest }) => rest) - ); - testCases.set( - `from a_index | stats ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithoutLiterals, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - fieldReplacedType.map( - (type) => `Argument of [${name}] must be a constant, received [${type}Field]` - ) - ); - } - - if (alias) { - for (const otherName of alias) { - const signatureStringWithAlias = getFunctionSignatures( - { - name: otherName, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration; - - testCases.set(`from a_index | stats var = ${signatureStringWithAlias}`, []); - } - } - - // test only numeric functions for now - if (isNumericType(params[0].type)) { - const nestedBuiltin = 'doubleField / 2'; - const fieldMappingWithNestedBuiltinFunctions = getFieldMapping(params); - fieldMappingWithNestedBuiltinFunctions[0].name = nestedBuiltin; - - const fnSignatureWithBuiltinString = getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithNestedBuiltinFunctions, ...signRest }], - }, - { withTypes: false } - )[0].declaration; - // from a_index | STATS aggFn( doubleField / 2 ) - testCases.set(`from a_index | stats ${fnSignatureWithBuiltinString}`, []); - testCases.set(`from a_index | stats var0 = ${fnSignatureWithBuiltinString}`, []); - testCases.set(`from a_index | stats avg(doubleField), ${fnSignatureWithBuiltinString}`, []); - testCases.set( - `from a_index | stats avg(doubleField), var0 = ${fnSignatureWithBuiltinString}`, - [] - ); - - const nestedEvalAndBuiltin = 'round(doubleField / 2)'; - const fieldMappingWithNestedEvalAndBuiltinFunctions = getFieldMapping(params); - fieldMappingWithNestedBuiltinFunctions[0].name = nestedEvalAndBuiltin; - - const fnSignatureWithEvalAndBuiltinString = getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithNestedEvalAndBuiltinFunctions, ...signRest }], - }, - { withTypes: false } - )[0].declaration; - // from a_index | STATS aggFn( round(doubleField / 2) ) - testCases.set(`from a_index | stats ${fnSignatureWithEvalAndBuiltinString}`, []); - testCases.set(`from a_index | stats var0 = ${fnSignatureWithEvalAndBuiltinString}`, []); - testCases.set( - `from a_index | stats avg(doubleField), ${fnSignatureWithEvalAndBuiltinString}`, - [] - ); - testCases.set( - `from a_index | stats avg(doubleField), var0 = ${fnSignatureWithEvalAndBuiltinString}`, - [] - ); - // from a_index | STATS aggFn(round(doubleField / 2) ) BY round(doubleField / 2) - testCases.set( - `from a_index | stats ${fnSignatureWithEvalAndBuiltinString} by ${nestedEvalAndBuiltin}`, - [] - ); - testCases.set( - `from a_index | stats var0 = ${fnSignatureWithEvalAndBuiltinString} by var1 = ${nestedEvalAndBuiltin}`, - [] - ); - testCases.set( - `from a_index | stats avg(doubleField), ${fnSignatureWithEvalAndBuiltinString} by ${nestedEvalAndBuiltin}, ipField`, - [] - ); - testCases.set( - `from a_index | stats avg(doubleField), var0 = ${fnSignatureWithEvalAndBuiltinString} by var1 = ${nestedEvalAndBuiltin}, ipField`, - [] - ); - testCases.set( - `from a_index | stats avg(doubleField), ${fnSignatureWithEvalAndBuiltinString} by ${nestedEvalAndBuiltin}, ${nestedBuiltin}`, - [] - ); - testCases.set( - `from a_index | stats avg(doubleField), var0 = ${fnSignatureWithEvalAndBuiltinString} by var1 = ${nestedEvalAndBuiltin}, ${nestedBuiltin}`, - [] - ); - } - - // Skip functions that have only arguments of type "any", as it is not possible to pass "the wrong type". - // to_version is a bit harder to test exactly a combination of argument and predict the - // the right error message - if (params.every(({ type }) => type !== 'any') && !['to_version', 'mv_sort'].includes(name)) { - // now test nested functions - const fieldMappingWithNestedAggsFunctions = getFieldMapping(params, { - useNestedFunction: true, - useLiterals: false, - }); - const nestedAggsExpectedErrors = params - .filter(({ constantOnly }) => !constantOnly) - .map( - (_) => - `Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(doubleField)] of type [double]` - ); - testCases.set( - `from a_index | stats var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithNestedAggsFunctions, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - nestedAggsExpectedErrors - ); - testCases.set( - `from a_index | stats ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithNestedAggsFunctions, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - nestedAggsExpectedErrors - ); - const { wrongFieldMapping, expectedErrors } = generateIncorrectlyTypedParameters( - name, - signatures, - params, - supportedTypesAndFieldNames - ); - // and the message is case of wrong argument type is passed - testCases.set( - `from a_index | stats ${ - getFunctionSignatures( - { name, ...defRest, signatures: [{ params: wrongFieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration - }`, - expectedErrors - ); - - // test that only count() accepts wildcard as arg - // just check that the function accepts only 1 arg as the parser cannot handle multiple args with * as start arg - if (fieldMapping.length === 1) { - const fieldMappingWithWildcard = [...fieldMapping]; - fieldMappingWithWildcard[0].name = '*'; - - testCases.set( - `from a_index | stats var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithWildcard, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - name === 'count' ? [] : [`Using wildcards (*) in ${name} is not allowed`] - ); - } - } - } -} - -function generateStatsCommandTestsForGroupingFunction( - { name, signatures, alias, ...defRest }: FunctionDefinition, - testCases: Map -) { - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - - const correctSignature = getFunctionSignatures( - { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration; - testCases.set(`from a_index | stats by ${correctSignature}`, []); - - if (params.some(({ constantOnly }) => constantOnly)) { - const fieldReplacedType = params - .filter(({ constantOnly }) => constantOnly) - .map(({ type }) => type); - // create the mapping without the literal flag - // this will make the signature wrong on purpose where in place on constants - // the arg will be a column of the same type - const fieldMappingWithoutLiterals = getFieldMapping( - params.map(({ constantOnly, ...rest }) => rest) - ); - testCases.set( - `from a_index | stats by ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithoutLiterals, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - fieldReplacedType - // if a param of type time_literal or chrono_literal it will always be a literal - // so no way to test the constantOnly thing - .filter((type) => !['time_literal'].includes(type as string)) - .map((type) => `Argument of [${name}] must be a constant, received [${type}Field]`) - ); - } - - if (alias) { - for (const otherName of alias) { - const signatureStringWithAlias = getFunctionSignatures( - { - name: otherName, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration; - - testCases.set(`from a_index | stats by ${signatureStringWithAlias}`, []); - } - } - } -} - -function generateSortCommandTestsForEvalFunction( - definition: FunctionDefinition, - testCases: Map -) { - // should accept eval functions - const { - signatures: [firstSignature], - } = definition; - const fieldMapping = getFieldMapping(firstSignature.params); - const printedInvocation = getFunctionSignatures( - { ...definition, signatures: [{ ...firstSignature, params: fieldMapping }] }, - { withTypes: false } - )[0].declaration; - - testCases.set(`from a_index | sort ${printedInvocation}`, []); -} - -function generateSortCommandTestsForAggFunction( - definition: FunctionDefinition, - testCases: Map -) { - const { - name, - signatures: [firstSignature], - } = definition; - const fieldMapping = getFieldMapping(firstSignature.params); - const printedInvocation = getFunctionSignatures( - { ...definition, signatures: [{ ...firstSignature, params: fieldMapping }] }, - { withTypes: false } - )[0].declaration; - - testCases.set(`from a_index | sort ${printedInvocation}`, [ - `SORT does not support function ${name}`, - ]); -} - -const generateSortCommandTestsForGroupingFunction = generateSortCommandTestsForAggFunction; - -const fieldTypesToConstants: Record = { - text: '"a"', - keyword: '"a"', - double: '5.5', - integer: '5', - long: '5', - unsigned_long: '5', - counter_integer: '5', - counter_long: '5', - counter_double: '5.5', - date: 'to_datetime("2021-01-01T00:00:00Z")', - date_period: 'to_date_period("2021-01-01/2021-01-02")', - boolean: 'true', - version: 'to_version("1.0.0")', - ip: 'to_ip("127.0.0.1")', - geo_point: 'to_geopoint("POINT (30 10)")', - geo_shape: 'to_geoshape("POINT (30 10)")', - cartesian_point: 'to_cartesianpoint("POINT (30 10)")', - cartesian_shape: 'to_cartesianshape("POINT (30 10)")', - null: 'NULL', - time_duration: '1 day', - // the following are never supplied - // by the ES function definitions. Just making types happy - time_literal: '1 day', - unsupported: '', - date_nanos: '1420070400000', -}; - -const supportedTypesAndFieldNames = fieldTypes.map((type) => ({ - name: fieldNameFromType(type), - type, -})); - -const supportedTypesAndConstants = dataTypes.map((type) => ({ - name: fieldTypesToConstants[type], - type, -})); - -function prepareNestedFunction(fnSignature: FunctionDefinition): string { - return getFunctionSignatures( - { - ...fnSignature, - signatures: [ - { - ...fnSignature?.signatures[0]!, - params: getFieldMapping(fnSignature?.signatures[0]!.params), - }, - ], - }, - { withTypes: false } - )[0].declaration; -} - -const toAvgSignature = statsAggregationFunctionDefinitions.find(({ name }) => name === 'avg')!; -const toInteger = evalFunctionDefinitions.find(({ name }) => name === 'to_integer')!; -const toDoubleSignature = evalFunctionDefinitions.find(({ name }) => name === 'to_double')!; -const toStringSignature = evalFunctionDefinitions.find(({ name }) => name === 'to_string')!; -const toDateSignature = evalFunctionDefinitions.find(({ name }) => name === 'to_datetime')!; -const toBooleanSignature = evalFunctionDefinitions.find(({ name }) => name === 'to_boolean')!; -const toIpSignature = evalFunctionDefinitions.find(({ name }) => name === 'to_ip')!; -const toGeoPointSignature = evalFunctionDefinitions.find(({ name }) => name === 'to_geopoint')!; -const toGeoShapeSignature = evalFunctionDefinitions.find(({ name }) => name === 'to_geoshape')!; -const toCartesianPointSignature = evalFunctionDefinitions.find( - ({ name }) => name === 'to_cartesianpoint' -)!; -const toCartesianShapeSignature = evalFunctionDefinitions.find( - ({ name }) => name === 'to_cartesianshape' -)!; -const toVersionSignature = evalFunctionDefinitions.find(({ name }) => name === 'to_version')!; - -// We don't have full list for long, unsigned_long, etc. -const nestedFunctions: Record = { - double: prepareNestedFunction(toDoubleSignature), - integer: prepareNestedFunction(toInteger), - text: prepareNestedFunction(toStringSignature), - keyword: prepareNestedFunction(toStringSignature), - boolean: prepareNestedFunction(toBooleanSignature), - ip: prepareNestedFunction(toIpSignature), - version: prepareNestedFunction(toVersionSignature), - geo_point: prepareNestedFunction(toGeoPointSignature), - geo_shape: prepareNestedFunction(toGeoShapeSignature), - cartesian_point: prepareNestedFunction(toCartesianPointSignature), - cartesian_shape: prepareNestedFunction(toCartesianShapeSignature), - // @ts-expect-error - datetime: prepareNestedFunction(toDateSignature), -}; - -function getFieldName( - typeString: SupportedDataType, - { useNestedFunction, isStats }: { useNestedFunction: boolean; isStats: boolean } -) { - if (useNestedFunction && isStats) { - return prepareNestedFunction(toAvgSignature); - } - return useNestedFunction && typeString in nestedFunctions - ? nestedFunctions[typeString as keyof typeof nestedFunctions] - : fieldNameFromType(typeString); -} - -const literals = { - time_literal: timeUnits[0], -}; - -function getLiteralType(typeString: 'time_literal') { - return `1 ${literals[typeString]}`; -} - -function getMultiValue(type: string) { - if (/string|any/.test(type)) { - return `["a", "b", "c"]`; - } - if (/number/.test(type)) { - return `[1, 2, 3]`; - } - return `[true, false]`; -} - -function tweakSignatureForRowCommand(signature: string): string { - /** - * row has no access to any field, so replace it with literal - * or functions (for dates) - */ - let ret = signature; - for (const [type, value] of Object.entries(fieldTypesToConstants)) { - ret = ret.replace(new RegExp(fieldNameFromType(type as SupportedDataType), 'g'), value); - } - return ret; -} - -function getFieldMapping( - params: FunctionDefinition['signatures'][number]['params'], - { useNestedFunction, useLiterals }: { useNestedFunction: boolean; useLiterals: boolean } = { - useNestedFunction: false, - useLiterals: true, - } -) { - const literalValues = { - string: `"a"`, - number: '5', - date: 'now()', - }; - - return params.map(({ name: _name, type, constantOnly, literalOptions, ...rest }) => { - const typeString: string = type as string; - if (isFieldType(typeString)) { - if (useLiterals && literalOptions) { - return { - name: `"${literalOptions[0]}"`, - type, - ...rest, - }; - } - - const fieldName = - constantOnly && typeString in literalValues - ? literalValues[typeString as keyof typeof literalValues]! - : getFieldName(typeString, { - useNestedFunction, - isStats: !useLiterals, - }); - return { - name: fieldName, - type, - ...rest, - }; - } - if (/literal$/.test(typeString) && useLiterals) { - return { - name: getLiteralType(typeString as 'time_literal'), - type, - ...rest, - }; - } - if (/\[\]$/.test(typeString)) { - return { - name: getMultiValue(typeString), - type, - ...rest, - }; - } - return { name: 'textField', type, ...rest }; - }); -} - -function generateIncorrectlyTypedParameters( - name: string, - signatures: FunctionDefinition['signatures'], - currentParams: FunctionDefinition['signatures'][number]['params'], - availableFields: Array<{ name: string; type: SupportedDataType }> -): { wrongFieldMapping: FunctionParameter[]; expectedErrors: string[] } { - const literalValues = { - string: `"a"`, - number: '5', - }; - const wrongFieldMapping = currentParams.map( - ({ name: paramName, constantOnly, literalOptions, type, ...rest }, i) => { - // this thing is complex enough, let's not make it harder for constants - if (constantOnly) { - return { - name: literalValues[type as keyof typeof literalValues], - type, - actualType: type, - wrong: false, - ...rest, - }; - } - - if (type !== 'any') { - // try to find an unacceptable field - const unacceptableField: { name: string; type: SupportedDataType } | undefined = - availableFields - // sort to make the test deterministic - .sort((a, b) => a.type.localeCompare(b.type)) - .find(({ type: fieldType }) => - signatures.every((signature) => getParamAtPosition(signature, i)?.type !== fieldType) - ); - - if (unacceptableField) { - return { - name: unacceptableField.name, - type, - actualType: unacceptableField.type, - wrong: true, - ...rest, - }; - } - } - - // failed to find a bad field... they must all be acceptable - const acceptableField: { name: string; type: SupportedDataType } | undefined = - type === 'any' - ? availableFields[0] - : availableFields.find(({ type: fieldType }) => fieldType === type); - - if (!acceptableField) { - throw new Error( - `Unable to find an acceptable field for type ${type}... this should never happen` - ); - } - - return { - name: acceptableField.name, - type: acceptableField.type, - actualType: acceptableField.type, - wrong: false, - ...rest, - }; - } - ); - - // Try to predict which signature will be used to generate the errors - // in the validation engine. The validator currently uses the signature - // which generates the fewest errors. - // - // Approximate this by finding the signature that best matches the INCORRECT field mapping - // - // This is not future-proof... - const misMatchesBySignature = signatures.map(({ params: fnParams }) => { - if (fnParams.length !== wrongFieldMapping.length) { - return Infinity; - } - const typeMatches = fnParams.map(({ type }, i) => { - if (wrongFieldMapping[i].wrong) { - const typeFromIncorrectMapping = wrongFieldMapping[i].actualType; - return type === typeFromIncorrectMapping; - } - return type === wrongFieldMapping[i].actualType; - }); - return typeMatches.filter((t) => !t).length; - })!; - const signatureToUse = - signatures[misMatchesBySignature.indexOf(Math.min(...misMatchesBySignature))]!; - - const expectedErrors = signatureToUse.params - .filter(({ constantOnly }) => !constantOnly) - .map(({ type }, i) => { - if (!wrongFieldMapping[i].wrong) { - return; - } - const fieldName = wrongFieldMapping[i].name; - if ( - fieldName === 'doubleField' && - signatures.every( - (signature) => - getParamAtPosition(signature, i)?.type !== 'keyword' || - getParamAtPosition(signature, i)?.type !== 'text' - ) - ) { - return; - } - return `Argument of [${name}] must be [${type}], found value [${fieldName}] type [${wrongFieldMapping[i].actualType}]`; - }) - .filter(nonNullable); - - return { wrongFieldMapping: wrongFieldMapping as FunctionParameter[], expectedErrors }; -} - -/** - * This writes the test cases to the validation.test.ts file - * - * It will never overwrite existing test cases, only add new ones - * - * @param testCasesByFunction - */ -function writeTestsToFile(testCasesByFunction: Map>) { - const b = recast.types.builders; - const n = recast.types.namedTypes; - - const buildTestCase = (testQuery: string, expectedErrors: string[]) => { - return b.expressionStatement( - b.callExpression(b.identifier('testErrorsAndWarnings'), [ - b.stringLiteral(testQuery), - b.arrayExpression(expectedErrors.map((error) => b.stringLiteral(error))), - ]) - ); - }; - - const buildDescribeBlockForFunction = ( - _functionName: string, - testCases: Map - ) => { - const testCasesInCode = Array.from(testCases.entries()).map(([testQuery, expectedErrors]) => { - return buildTestCase(testQuery, expectedErrors); - }); - - return b.expressionStatement( - b.callExpression(b.identifier('describe'), [ - b.stringLiteral(_functionName), - b.arrowFunctionExpression([], b.blockStatement(testCasesInCode)), - ]) - ); - }; - - /** - * Returns the string contents of a node whether or not it's a StringLiteral or a TemplateLiteral - * @param node - * @returns - */ - function getValueFromStringOrTemplateLiteral(node: any): string { - if (n.StringLiteral.check(node)) { - return node.value; - } - - if (n.TemplateLiteral.check(node)) { - return node.quasis[0].value.raw; - } - - return ''; - } - - /** - * This function searches the AST for the describe block containing per-function tests - * @param ast - * @returns - */ - function findFunctionsDescribeBlock(ast: any): recast.types.namedTypes.BlockStatement { - let foundBlock: recast.types.namedTypes.CallExpression | null = null; - - const describeBlockIdentifierName = Object.keys({ FUNCTION_DESCRIBE_BLOCK_NAME })[0]; - - recast.visit(ast, { - visitCallExpression(path) { - const node = path.node; - if ( - n.Identifier.check(node.callee) && - node.callee.name === 'describe' && - n.Identifier.check(node.arguments[0]) && - node.arguments[0].name === describeBlockIdentifierName - ) { - foundBlock = node; - this.abort(); - } - this.traverse(path); - }, - }); - - if (!foundBlock) { - throw Error('couldn\'t find the "functions" describe block in the test file'); - } - - const functionsDescribeCallExpression = foundBlock as recast.types.namedTypes.CallExpression; - - if (!n.ArrowFunctionExpression.check(functionsDescribeCallExpression.arguments[1])) { - throw Error('Expected an arrow function expression'); - } - - if (!n.BlockStatement.check(functionsDescribeCallExpression.arguments[1].body)) { - throw Error('Expected a block statement'); - } - - return functionsDescribeCallExpression.arguments[1].body; - } - - const testFilePath = join(__dirname, '../src/validation/validation.test.ts'); - - const ast = recast.parse(readFileSync(testFilePath).toString(), { - parser: require('recast/parsers/typescript'), - }); - - const functionsDescribeBlock = findFunctionsDescribeBlock(ast); - - // check for existing describe blocks for functions and add any new - // test cases to them - for (const node of functionsDescribeBlock.body) { - if (!n.ExpressionStatement.check(node)) { - continue; - } - - if (!n.CallExpression.check(node.expression)) { - continue; - } - - if (!n.StringLiteral.check(node.expression.arguments[0])) { - continue; - } - - const functionName = node.expression.arguments[0].value; - - if (!testCasesByFunction.has(functionName)) { - // this will be a new describe block for a function that doesn't have any tests yet - continue; - } - - const generatedTestCasesForFunction = testCasesByFunction.get(functionName) as Map< - string, - string[] - >; - - if (!n.ArrowFunctionExpression.check(node.expression.arguments[1])) { - continue; - } - - if (!n.BlockStatement.check(node.expression.arguments[1].body)) { - continue; - } - - for (const existingTestCaseAST of node.expression.arguments[1].body.body) { - if (!n.ExpressionStatement.check(existingTestCaseAST)) { - continue; - } - - if (!n.CallExpression.check(existingTestCaseAST.expression)) { - continue; - } - - if (!n.Identifier.check(existingTestCaseAST.expression.callee)) { - continue; - } - - if (existingTestCaseAST.expression.callee.name !== 'testErrorsAndWarnings') { - continue; - } - - const testQuery = getValueFromStringOrTemplateLiteral( - existingTestCaseAST.expression.arguments[0] - ); - - if (!testQuery) { - continue; - } - - if (generatedTestCasesForFunction.has(testQuery)) { - // Remove the test case from the generated test cases to respect - // what is already there in the test file... we don't want to overwrite - // what already exists - generatedTestCasesForFunction.delete(testQuery); - } - } - - // add new testCases - for (const [testQuery, expectedErrors] of generatedTestCasesForFunction.entries()) { - node.expression.arguments[1].body.body.push(buildTestCase(testQuery, expectedErrors)); - } - - // remove the function from the map so we don't add a duplicate describe block - testCasesByFunction.delete(functionName); - } - - // Add new describe blocks for functions that don't have any tests yet - for (const [functionName, testCases] of testCasesByFunction) { - functionsDescribeBlock.body.push(buildDescribeBlockForFunction(functionName, testCases)); - } - - writeFileSync(testFilePath, recast.print(ast).code, 'utf-8'); -} - -main(); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts index 2349ef13deb31..356761966994a 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts @@ -432,7 +432,7 @@ describe('autocomplete.suggest', () => { const suggestedConstants = uniq( typesToSuggestNext - .map((d) => d.literalSuggestions || d.literalOptions) + .map((d) => d.literalSuggestions || d.acceptedValues) .filter((d) => d) .flat() ); @@ -487,7 +487,7 @@ describe('autocomplete.suggest', () => { test(`${fn.name}`, async () => { const { assertSuggestions } = await setup(); const firstParam = fn.signatures[0].params[0]; - const suggestedConstants = firstParam?.literalSuggestions || firstParam?.literalOptions; + const suggestedConstants = firstParam?.literalSuggestions || firstParam?.acceptedValues; const requiresMoreArgs = true; await assertSuggestions( diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index 1aa6263e06059..89e1a71c8e36e 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -1351,7 +1351,7 @@ async function getFunctionArgsSuggestions( const suggestedConstants = uniq( typesToSuggestNext - .map((d) => d.literalSuggestions || d.literalOptions) + .map((d) => d.literalSuggestions || d.acceptedValues) .filter((d) => d) .flat() ) as string[]; diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts index 163cf31d61cf4..912dbd401fe71 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts @@ -342,7 +342,7 @@ export const statsAggregationFunctionDefinitions: FunctionDefinition[] = [ noNestingFunctions: true, optional: false, constantOnly: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'any', diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts index fd6cf69354ff8..9cf2245fc2fad 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts @@ -1155,7 +1155,7 @@ const dateDiffDefinition: FunctionDefinition = { name: 'unit', type: 'keyword', optional: false, - literalOptions: [ + acceptedValues: [ 'year', 'years', 'yy', @@ -1274,7 +1274,7 @@ const dateExtractDefinition: FunctionDefinition = { name: 'datePart', type: 'keyword', optional: false, - literalOptions: [ + acceptedValues: [ 'ALIGNED_DAY_OF_WEEK_IN_MONTH', 'ALIGNED_DAY_OF_WEEK_IN_YEAR', 'ALIGNED_WEEK_OF_MONTH', @@ -4637,7 +4637,7 @@ const mvSortDefinition: FunctionDefinition = { name: 'order', type: 'keyword', optional: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'boolean', @@ -4653,7 +4653,7 @@ const mvSortDefinition: FunctionDefinition = { name: 'order', type: 'keyword', optional: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'date', @@ -4669,7 +4669,7 @@ const mvSortDefinition: FunctionDefinition = { name: 'order', type: 'keyword', optional: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'double', @@ -4685,7 +4685,7 @@ const mvSortDefinition: FunctionDefinition = { name: 'order', type: 'keyword', optional: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'integer', @@ -4701,7 +4701,7 @@ const mvSortDefinition: FunctionDefinition = { name: 'order', type: 'keyword', optional: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'ip', @@ -4717,7 +4717,7 @@ const mvSortDefinition: FunctionDefinition = { name: 'order', type: 'keyword', optional: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'keyword', @@ -4733,7 +4733,7 @@ const mvSortDefinition: FunctionDefinition = { name: 'order', type: 'keyword', optional: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'long', @@ -4749,7 +4749,7 @@ const mvSortDefinition: FunctionDefinition = { name: 'order', type: 'keyword', optional: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'text', @@ -4765,7 +4765,7 @@ const mvSortDefinition: FunctionDefinition = { name: 'order', type: 'keyword', optional: true, - literalOptions: ['asc', 'desc'], + acceptedValues: ['asc', 'desc'], }, ], returnType: 'version', diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts index f86c9b428e8dc..0ac850ef4862f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts @@ -137,7 +137,7 @@ export interface FunctionDefinition { * we can't check the return value of a function to see if it * matches one of the options prior to runtime. */ - literalOptions?: string[]; + acceptedValues?: string[]; /** * Must only be included _in addition to_ literalOptions. * diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index a58701cc4406b..052ceb6f18fe0 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -24,6 +24,7 @@ import { builtinFunctions } from '../definitions/builtin'; import { commandDefinitions } from '../definitions/commands'; import { evalFunctionDefinitions } from '../definitions/functions'; import { groupingFunctionDefinitions } from '../definitions/grouping'; +import { getTestFunctions } from './test_functions'; import { getFunctionSignatures } from '../definitions/helpers'; import { timeUnits } from '../definitions/literals'; import { @@ -136,12 +137,14 @@ let fnLookups: Map | undefined; let commandLookups: Map | undefined; function buildFunctionLookup() { - if (!fnLookups) { + // we always refresh if we have test functions + if (!fnLookups || getTestFunctions().length) { fnLookups = builtinFunctions .concat( evalFunctionDefinitions, statsAggregationFunctionDefinitions, - groupingFunctionDefinitions + groupingFunctionDefinitions, + getTestFunctions() ) .reduce((memo, def) => { memo.set(def.name, def); @@ -418,8 +421,8 @@ export function inKnownTimeInterval(item: ESQLTimeInterval): boolean { export function isValidLiteralOption(arg: ESQLLiteral, argDef: FunctionParameter) { return ( arg.literalType === 'string' && - argDef.literalOptions && - !argDef.literalOptions + argDef.acceptedValues && + !argDef.acceptedValues .map((option) => option.toLowerCase()) .includes(unwrapStringLiteralQuotes(arg.value).toLowerCase()) ); diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/test_functions.ts b/packages/kbn-esql-validation-autocomplete/src/shared/test_functions.ts new file mode 100644 index 0000000000000..c203692f9df4e --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/shared/test_functions.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +/** + * This file contains a mechanism for injecting test functions into the + * validation tests. This allows us to use our own fixtures without relying + * on the generated definitions provided by Elasticsearch. + */ + +import { FunctionDefinition } from '../definitions/types'; +let testFunctions: FunctionDefinition[] = []; + +export const setTestFunctions = (functions: FunctionDefinition[]) => { + testFunctions = functions; +}; + +export const getTestFunctions = () => { + return testFunctions; +}; diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/functions.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/functions.test.ts new file mode 100644 index 0000000000000..61a4d66a3a65f --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/functions.test.ts @@ -0,0 +1,659 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { FunctionDefinition } from '../../definitions/types'; +import { setTestFunctions } from '../../shared/test_functions'; +import { setup } from './helpers'; + +describe('function validation', () => { + afterEach(() => { + setTestFunctions([]); + }); + + describe('parameter validation', () => { + describe('type validation', () => { + describe('basic checks', () => { + beforeEach(() => { + const definitions: FunctionDefinition[] = [ + { + name: 'test', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'integer' }], + returnType: 'integer', + }, + { + params: [{ name: 'arg1', type: 'date' }], + returnType: 'date', + }, + ], + }, + { + name: 'returns_integer', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [], + returnType: 'integer', + }, + ], + }, + { + name: 'returns_double', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [], + returnType: 'double', + }, + ], + }, + ]; + + setTestFunctions(definitions); + }); + + it('accepts arguments of the correct type', async () => { + const { expectErrors } = await setup(); + + // straight call + await expectErrors('FROM a_index | EVAL TEST(1)', []); + await expectErrors('FROM a_index | EVAL TEST(NOW())', []); + + // assignment + await expectErrors('FROM a_index | EVAL var = TEST(1)', []); + await expectErrors('FROM a_index | EVAL var = TEST(NOW())', []); + + // nested function + await expectErrors('FROM a_index | EVAL TEST(RETURNS_INTEGER())', []); + + // inline cast + await expectErrors('FROM a_index | EVAL TEST(1.::INT)', []); + + // field + await expectErrors('FROM a_index | EVAL TEST(integerField)', []); + await expectErrors('FROM a_index | EVAL TEST(dateField)', []); + + // variables + await expectErrors('FROM a_index | EVAL var1 = 1 | EVAL TEST(var1)', []); + await expectErrors('FROM a_index | EVAL var1 = NOW() | EVAL TEST(var1)', []); + + // multiple instances + await expectErrors('FROM a_index | EVAL TEST(1) | EVAL TEST(1)', []); + }); + + it('rejects arguments of an incorrect type', async () => { + const { expectErrors } = await setup(); + + // straight call + await expectErrors('FROM a_index | EVAL TEST(1.1)', [ + 'Argument of [test] must be [integer], found value [1.1] type [decimal]', + ]); + + // assignment + await expectErrors('FROM a_index | EVAL var = TEST(1.1)', [ + 'Argument of [test] must be [integer], found value [1.1] type [decimal]', + ]); + + // nested function + await expectErrors('FROM a_index | EVAL TEST(RETURNS_DOUBLE())', [ + 'Argument of [test] must be [integer], found value [RETURNS_DOUBLE()] type [double]', + ]); + + // inline cast + await expectErrors('FROM a_index | EVAL TEST(1::DOUBLE)', [ + 'Argument of [test] must be [integer], found value [1::DOUBLE] type [DOUBLE]', + ]); + + // field + await expectErrors('FROM a_index | EVAL TEST(doubleField)', [ + 'Argument of [test] must be [integer], found value [doubleField] type [double]', + ]); + + // variables + await expectErrors('FROM a_index | EVAL var1 = 1. | EVAL TEST(var1)', [ + 'Argument of [test] must be [integer], found value [var1] type [decimal]', + ]); + + // multiple instances + await expectErrors('FROM a_index | EVAL TEST(1.1) | EVAL TEST(1.1)', [ + 'Argument of [test] must be [integer], found value [1.1] type [decimal]', + 'Argument of [test] must be [integer], found value [1.1] type [decimal]', + ]); + }); + + it('accepts nulls by default', async () => { + const { expectErrors } = await setup(); + expectErrors('FROM a_index | EVAL TEST(NULL)', []); + }); + }); + + it('checks types by signature', async () => { + const testFn: FunctionDefinition = { + name: 'test', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [ + { name: 'arg1', type: 'double' }, + { name: 'arg2', type: 'double' }, + { name: 'arg3', type: 'double' }, + ], + returnType: 'double', + }, + { + params: [ + { name: 'arg1', type: 'keyword' }, + { name: 'arg2', type: 'keyword' }, + ], + returnType: 'keyword', + }, + { + params: [ + { name: 'arg1', type: 'integer' }, + { name: 'arg2', type: 'integer' }, + ], + returnType: 'integer', + }, + { + params: [{ name: 'arg1', type: 'date' }], + returnType: 'date', + }, + ], + }; + + setTestFunctions([testFn]); + + const { expectErrors } = await setup(); + + // double, double, double + await expectErrors('FROM a_index | EVAL TEST(1., 1., 1.)', []); + await expectErrors('FROM a_index | EVAL TEST("", "", "")', [ + 'Argument of [test] must be [double], found value [""] type [string]', + 'Argument of [test] must be [double], found value [""] type [string]', + 'Argument of [test] must be [double], found value [""] type [string]', + ]); + + // int, int + await expectErrors('FROM a_index | EVAL TEST(1, 1)', []); + await expectErrors('FROM a_index | EVAL TEST(1, "")', [ + // @TODO this message should respect the type of the first argument + // see https://github.com/elastic/kibana/issues/180518 + 'Argument of [test] must be [keyword], found value [1] type [integer]', + ]); + + // keyword, keyword + await expectErrors('FROM a_index | EVAL TEST("", "")', []); + await expectErrors('FROM a_index | EVAL TEST("", 1)', [ + 'Argument of [test] must be [keyword], found value [1] type [integer]', + ]); + + // date + await expectErrors('FROM a_index | EVAL TEST(NOW())', []); + await expectErrors('FROM a_index | EVAL TEST(1.)', [ + 'Argument of [test] must be [date], found value [1] type [decimal]', + ]); + }); + }); + + it('validates argument count (arity)', async () => { + const testFns: FunctionDefinition[] = [ + { + name: 'test', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'keyword' }], + returnType: 'keyword', + }, + { + params: [ + { name: 'arg1', type: 'integer' }, + { name: 'arg2', type: 'integer' }, + ], + returnType: 'integer', + }, + ], + }, + { + name: 'variadic_fn', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'integer' }], + minParams: 2, + returnType: 'integer', + }, + ], + }, + ]; + + setTestFunctions(testFns); + + const { expectErrors } = await setup(); + + await expectErrors('FROM a_index | EVAL TEST()', [ + 'Error: [test] function expects at least one argument, got 0.', + ]); + await expectErrors('FROM a_index | EVAL TEST(1, 1, 1)', [ + 'Error: [test] function expects no more than 2 arguments, got 3.', + ]); + + // variadic + await expectErrors(`FROM a_index | EVAL VARIADIC_FN(1)`, [ + // @TODO this is an incorrect error message + 'Error: [variadic_fn] function expects one argument, got 1.', + ]); + await expectErrors( + `FROM a_index | EVAL VARIADIC_FN(${new Array(100).fill(1).join(', ')})`, + [] + ); + }); + + it('allows for optional arguments', async () => { + const testFns: FunctionDefinition[] = [ + { + name: 'test', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [ + { name: 'arg1', type: 'keyword' }, + { name: 'arg2', type: 'keyword', optional: true }, + ], + returnType: 'keyword', + }, + ], + }, + ]; + + setTestFunctions(testFns); + + const { expectErrors } = await setup(); + + await expectErrors('FROM a_index | EVAL TEST("")', []); + await expectErrors('FROM a_index | EVAL TEST("", "")', []); + }); + + it('validates "all" parameter (wildcard)', async () => { + setTestFunctions([ + { + name: 'supports_all', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'keyword', supportsWildcard: true }], + returnType: 'keyword', + }, + ], + }, + { + name: 'does_not_support_all', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'keyword', supportsWildcard: false }], + returnType: 'keyword', + }, + ], + }, + ]); + + const { expectErrors } = await setup(); + + await expectErrors('FROM a_index | EVAL SUPPORTS_ALL(*)', []); + await expectErrors('FROM a_index | EVAL SUPPORTS_ALL(*, "")', [ + // It may seem strange that these are syntax errors, but the grammar actually doesn't allow + // for a function to support the asterisk and have additional arguments. Testing it here so we'll + // be notified if that changes. + `SyntaxError: extraneous input ')' expecting `, + `SyntaxError: no viable alternative at input 'SUPPORTS_ALL(*,'`, + ]); + await expectErrors('FROM a_index | EVAL DOES_NOT_SUPPORT_ALL(*)', [ + 'Using wildcards (*) in does_not_support_all is not allowed', + ]); + }); + + it('casts string arguments to dates', async () => { + setTestFunctions([ + { + name: 'test', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [ + { name: 'arg1', type: 'date' }, + { name: 'arg2', type: 'date' }, + ], + returnType: 'date', + }, + { + params: [ + { name: 'arg1', type: 'integer' }, + { name: 'arg2', type: 'integer' }, + ], + returnType: 'date', + }, + ], + }, + ]); + + const { expectErrors } = await setup(); + + await expectErrors('FROM a_index | EVAL TEST("2024-09-09", "2024-09-09")', []); + }); + + it('enforces constant-only parameters', async () => { + setTestFunctions([ + { + name: 'test', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'integer', constantOnly: true }], + returnType: 'integer', + }, + ], + }, + { + name: 'test2', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [ + { name: 'arg1', type: 'integer' }, + { name: 'arg2', type: 'date', constantOnly: true }, + ], + returnType: 'integer', + }, + ], + }, + ]); + + const { expectErrors } = await setup(); + await expectErrors('FROM a_index | EVAL TEST(1)', []); + // operators, functions are ok + await expectErrors('FROM a_index | EVAL TEST(1 + 1)', []); + await expectErrors('FROM a_index | EVAL TEST(integerField)', [ + 'Argument of [test] must be a constant, received [integerField]', + ]); + await expectErrors('FROM a_index | EVAL var = 10 | EVAL TEST(var)', [ + 'Argument of [test] must be a constant, received [var]', + ]); + + await expectErrors('FROM a_index | EVAL TEST2(integerField, NOW())', []); + await expectErrors('FROM a_index | EVAL TEST2(integerField, dateField)', [ + 'Argument of [test2] must be a constant, received [dateField]', + ]); + }); + + it('validates accepted values', async () => { + setTestFunctions([ + { + name: 'test', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'keyword', acceptedValues: ['ASC', 'DESC'] }], + returnType: 'keyword', + }, + ], + }, + ]); + + const { expectErrors } = await setup(); + await expectErrors('FROM a_index | EVAL TEST("ASC")', [], []); + await expectErrors('FROM a_index | EVAL TEST("DESC")', [], []); + + // case-insensitive + await expectErrors('FROM a_index | EVAL TEST("aSc")', [], []); + await expectErrors('FROM a_index | EVAL TEST("DesC")', [], []); + + // not constantOnly, so field is accepted + await expectErrors('FROM a_index | EVAL TEST(keywordField)', [], []); + + await expectErrors( + 'FROM a_index | EVAL TEST("foo")', + [], + ['Invalid option ["foo"] for test. Supported options: ["ASC", "DESC"].'] + ); + }); + }); + + describe('command/option support', () => { + it('validates command support', async () => { + setTestFunctions([ + { + name: 'eval_fn', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'stats_fn', + type: 'agg', + description: '', + supportedCommands: ['stats'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'row_fn', + type: 'eval', + description: '', + supportedCommands: ['row'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'where_fn', + type: 'eval', + description: '', + supportedCommands: ['where'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'sort_fn', + type: 'eval', + description: '', + supportedCommands: ['sort'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + ]); + + const { expectErrors } = await setup(); + + await expectErrors('FROM a_index | EVAL EVAL_FN()', []); + await expectErrors('FROM a_index | SORT SORT_FN()', []); + await expectErrors('FROM a_index | STATS STATS_FN()', []); + await expectErrors('ROW ROW_FN()', []); + await expectErrors('FROM a_index | WHERE WHERE_FN()', []); + + await expectErrors('FROM a_index | EVAL SORT_FN()', [ + 'EVAL does not support function sort_fn', + ]); + await expectErrors('FROM a_index | SORT STATS_FN()', [ + 'SORT does not support function stats_fn', + ]); + await expectErrors('FROM a_index | STATS ROW_FN()', [ + 'At least one aggregation function required in [STATS], found [ROW_FN()]', + 'STATS does not support function row_fn', + ]); + await expectErrors('ROW WHERE_FN()', ['ROW does not support function where_fn']); + await expectErrors('FROM a_index | WHERE EVAL_FN()', [ + 'WHERE does not support function eval_fn', + ]); + }); + + it('validates option support', async () => { + setTestFunctions([ + { + name: 'supports_by_option', + type: 'eval', + description: '', + supportedCommands: ['eval'], + supportedOptions: ['by'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'does_not_support_by_option', + type: 'eval', + description: '', + supportedCommands: ['eval'], + supportedOptions: [], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + + { + name: 'agg_fn', + type: 'agg', + description: '', + supportedCommands: ['stats'], + supportedOptions: [], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + ]); + + const { expectErrors } = await setup(); + + await expectErrors('FROM a_index | STATS AGG_FN() BY SUPPORTS_BY_OPTION()', []); + await expectErrors('FROM a_index | STATS AGG_FN() BY DOES_NOT_SUPPORT_BY_OPTION()', [ + 'STATS BY does not support function does_not_support_by_option', + ]); + }); + }); + + describe('nested functions', () => { + it('supports deep nesting', async () => { + setTestFunctions([ + { + name: 'test', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'integer' }], + returnType: 'integer', + }, + ], + }, + ]); + + const { expectErrors } = await setup(); + + await expectErrors('FROM a_index | EVAL TEST(TEST(TEST(1)))', []); + }); + + it("doesn't allow nested aggregation functions", async () => { + setTestFunctions([ + { + name: 'agg_fn', + type: 'agg', + description: '', + supportedCommands: ['stats'], + signatures: [ + { + params: [{ name: 'arg1', type: 'keyword', noNestingFunctions: true }], + returnType: 'keyword', + }, + ], + }, + { + name: 'scalar_fn', + type: 'eval', + description: '', + supportedCommands: ['stats'], + signatures: [ + { + params: [{ name: 'arg1', type: 'keyword' }], + returnType: 'keyword', + }, + ], + }, + ]); + + const { expectErrors } = await setup(); + + await expectErrors('FROM a_index | STATS AGG_FN(AGG_FN(""))', [ + 'Aggregate function\'s parameters must be an attribute, literal or a non-aggregation function; found [AGG_FN("")] of type [keyword]', + ]); + // @TODO — enable this test when we have fixed this bug + // await expectErrors('FROM a_index | STATS AGG_FN(SCALAR_FN(AGG_FN("")))', [ + // 'No nested aggregation functions.', + // ]); + }); + }); +}); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/function_describe_block_name.ts b/packages/kbn-esql-validation-autocomplete/src/validation/function_describe_block_name.ts deleted file mode 100644 index 9b590e20524ce..0000000000000 --- a/packages/kbn-esql-validation-autocomplete/src/validation/function_describe_block_name.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -export const FUNCTION_DESCRIBE_BLOCK_NAME = 'functions'; diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 0e6dcdffb06ce..8fb4b8b90d6eb 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -25,7 +25,6 @@ import capitalize from 'lodash/capitalize'; import { camelCase } from 'lodash'; import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; import { nonNullable } from '../shared/helpers'; -import { FUNCTION_DESCRIBE_BLOCK_NAME } from './function_describe_block_name'; import { fields, enrichFields, @@ -135,46 +134,48 @@ function getFieldMapping( number: '5', date: 'now()', }; - return params.map(({ name: _name, type, constantOnly, literalOptions, ...rest }) => { - const typeString: string = type as string; - if (dataTypes.includes(typeString as SupportedDataType)) { - if (useLiterals && literalOptions) { + return params.map( + ({ name: _name, type, constantOnly, acceptedValues: literalOptions, ...rest }) => { + const typeString: string = type as string; + if (dataTypes.includes(typeString as SupportedDataType)) { + if (useLiterals && literalOptions) { + return { + name: `"${literalOptions[0]}"`, + type, + ...rest, + }; + } + + const fieldName = + constantOnly && typeString in literalValues + ? literalValues[typeString as keyof typeof literalValues]! + : getFieldName(typeString, { + useNestedFunction, + isStats: !useLiterals, + }); return { - name: `"${literalOptions[0]}"`, + name: fieldName, type, ...rest, }; } - - const fieldName = - constantOnly && typeString in literalValues - ? literalValues[typeString as keyof typeof literalValues]! - : getFieldName(typeString, { - useNestedFunction, - isStats: !useLiterals, - }); - return { - name: fieldName, - type, - ...rest, - }; - } - if (/literal$/.test(typeString) && useLiterals) { - return { - name: getLiteralType(typeString as 'time_literal'), - type, - ...rest, - }; - } - if (/\[\]$/.test(typeString)) { - return { - name: getMultiValue(typeString), - type, - ...rest, - }; + if (/literal$/.test(typeString) && useLiterals) { + return { + name: getLiteralType(typeString as 'time_literal'), + type, + ...rest, + }; + } + if (/\[\]$/.test(typeString)) { + return { + name: getMultiValue(typeString), + type, + ...rest, + }; + } + return { name: 'textField', type, ...rest }; } - return { name: 'textField', type, ...rest }; - }); + ); } describe('validation logic', () => { @@ -1685,14459 +1686,6 @@ describe('validation logic', () => { ['Argument of [trim] must be [keyword], found value [doubleField] type [double]'] ); }); - - describe(FUNCTION_DESCRIBE_BLOCK_NAME, () => { - describe('abs', () => { - testErrorsAndWarnings('row var = abs(5.5)', []); - testErrorsAndWarnings('row abs(5.5)', []); - testErrorsAndWarnings('row var = abs(to_double(true))', []); - testErrorsAndWarnings('row var = abs(5)', []); - testErrorsAndWarnings('row abs(5)', []); - testErrorsAndWarnings('row var = abs(to_integer(true))', []); - - testErrorsAndWarnings('row var = abs(true)', [ - 'Argument of [abs] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where abs(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where abs(booleanField) > 0', [ - 'Argument of [abs] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where abs(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where abs(longField) > 0', []); - testErrorsAndWarnings('from a_index | where abs(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = abs(doubleField)', []); - testErrorsAndWarnings('from a_index | eval abs(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = abs(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval abs(booleanField)', [ - 'Argument of [abs] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = abs(*)', [ - 'Using wildcards (*) in abs is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = abs(integerField)', []); - testErrorsAndWarnings('from a_index | eval abs(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = abs(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = abs(longField)', []); - testErrorsAndWarnings('from a_index | eval abs(longField)', []); - testErrorsAndWarnings('from a_index | eval var = abs(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval abs(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval abs(doubleField, extraArg)', [ - 'Error: [abs] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort abs(doubleField)', []); - testErrorsAndWarnings('from a_index | eval abs(null)', []); - testErrorsAndWarnings('row nullVar = null | eval abs(nullVar)', []); - }); - - describe('acos', () => { - testErrorsAndWarnings('row var = acos(5.5)', []); - testErrorsAndWarnings('row acos(5.5)', []); - testErrorsAndWarnings('row var = acos(to_double(true))', []); - testErrorsAndWarnings('row var = acos(5)', []); - testErrorsAndWarnings('row acos(5)', []); - testErrorsAndWarnings('row var = acos(to_integer(true))', []); - - testErrorsAndWarnings('row var = acos(true)', [ - 'Argument of [acos] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where acos(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where acos(booleanField) > 0', [ - 'Argument of [acos] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where acos(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where acos(longField) > 0', []); - testErrorsAndWarnings('from a_index | where acos(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = acos(doubleField)', []); - testErrorsAndWarnings('from a_index | eval acos(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = acos(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval acos(booleanField)', [ - 'Argument of [acos] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = acos(*)', [ - 'Using wildcards (*) in acos is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = acos(integerField)', []); - testErrorsAndWarnings('from a_index | eval acos(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = acos(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = acos(longField)', []); - testErrorsAndWarnings('from a_index | eval acos(longField)', []); - testErrorsAndWarnings('from a_index | eval var = acos(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval acos(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval acos(doubleField, extraArg)', [ - 'Error: [acos] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort acos(doubleField)', []); - testErrorsAndWarnings('from a_index | eval acos(null)', []); - testErrorsAndWarnings('row nullVar = null | eval acos(nullVar)', []); - }); - - describe('asin', () => { - testErrorsAndWarnings('row var = asin(5.5)', []); - testErrorsAndWarnings('row asin(5.5)', []); - testErrorsAndWarnings('row var = asin(to_double(true))', []); - testErrorsAndWarnings('row var = asin(5)', []); - testErrorsAndWarnings('row asin(5)', []); - testErrorsAndWarnings('row var = asin(to_integer(true))', []); - - testErrorsAndWarnings('row var = asin(true)', [ - 'Argument of [asin] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where asin(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where asin(booleanField) > 0', [ - 'Argument of [asin] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where asin(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where asin(longField) > 0', []); - testErrorsAndWarnings('from a_index | where asin(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = asin(doubleField)', []); - testErrorsAndWarnings('from a_index | eval asin(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = asin(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval asin(booleanField)', [ - 'Argument of [asin] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = asin(*)', [ - 'Using wildcards (*) in asin is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = asin(integerField)', []); - testErrorsAndWarnings('from a_index | eval asin(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = asin(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = asin(longField)', []); - testErrorsAndWarnings('from a_index | eval asin(longField)', []); - testErrorsAndWarnings('from a_index | eval var = asin(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval asin(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval asin(doubleField, extraArg)', [ - 'Error: [asin] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort asin(doubleField)', []); - testErrorsAndWarnings('from a_index | eval asin(null)', []); - testErrorsAndWarnings('row nullVar = null | eval asin(nullVar)', []); - }); - - describe('atan', () => { - testErrorsAndWarnings('row var = atan(5.5)', []); - testErrorsAndWarnings('row atan(5.5)', []); - testErrorsAndWarnings('row var = atan(to_double(true))', []); - testErrorsAndWarnings('row var = atan(5)', []); - testErrorsAndWarnings('row atan(5)', []); - testErrorsAndWarnings('row var = atan(to_integer(true))', []); - - testErrorsAndWarnings('row var = atan(true)', [ - 'Argument of [atan] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where atan(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where atan(booleanField) > 0', [ - 'Argument of [atan] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where atan(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where atan(longField) > 0', []); - testErrorsAndWarnings('from a_index | where atan(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = atan(doubleField)', []); - testErrorsAndWarnings('from a_index | eval atan(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = atan(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval atan(booleanField)', [ - 'Argument of [atan] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = atan(*)', [ - 'Using wildcards (*) in atan is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = atan(integerField)', []); - testErrorsAndWarnings('from a_index | eval atan(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = atan(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = atan(longField)', []); - testErrorsAndWarnings('from a_index | eval atan(longField)', []); - testErrorsAndWarnings('from a_index | eval var = atan(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval atan(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval atan(doubleField, extraArg)', [ - 'Error: [atan] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort atan(doubleField)', []); - testErrorsAndWarnings('from a_index | eval atan(null)', []); - testErrorsAndWarnings('row nullVar = null | eval atan(nullVar)', []); - }); - - describe('atan2', () => { - testErrorsAndWarnings('row var = atan2(5.5, 5.5)', []); - testErrorsAndWarnings('row atan2(5.5, 5.5)', []); - testErrorsAndWarnings('row var = atan2(to_double(true), to_double(true))', []); - testErrorsAndWarnings('row var = atan2(5.5, 5)', []); - testErrorsAndWarnings('row atan2(5.5, 5)', []); - testErrorsAndWarnings('row var = atan2(to_double(true), to_integer(true))', []); - testErrorsAndWarnings('row var = atan2(to_double(true), 5)', []); - testErrorsAndWarnings('row var = atan2(5, 5.5)', []); - testErrorsAndWarnings('row atan2(5, 5.5)', []); - testErrorsAndWarnings('row var = atan2(to_integer(true), to_double(true))', []); - testErrorsAndWarnings('row var = atan2(5, 5)', []); - testErrorsAndWarnings('row atan2(5, 5)', []); - testErrorsAndWarnings('row var = atan2(to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = atan2(to_integer(true), 5)', []); - testErrorsAndWarnings('row var = atan2(5, to_double(true))', []); - testErrorsAndWarnings('row var = atan2(5, to_integer(true))', []); - - testErrorsAndWarnings('row var = atan2(true, true)', [ - 'Argument of [atan2] must be [double], found value [true] type [boolean]', - 'Argument of [atan2] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where atan2(doubleField, doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where atan2(booleanField, booleanField) > 0', [ - 'Argument of [atan2] must be [double], found value [booleanField] type [boolean]', - 'Argument of [atan2] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where atan2(doubleField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where atan2(doubleField, longField) > 0', []); - testErrorsAndWarnings('from a_index | where atan2(doubleField, unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where atan2(integerField, doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where atan2(integerField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where atan2(integerField, longField) > 0', []); - testErrorsAndWarnings( - 'from a_index | where atan2(integerField, unsignedLongField) > 0', - [] - ); - testErrorsAndWarnings('from a_index | where atan2(longField, doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where atan2(longField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where atan2(longField, longField) > 0', []); - testErrorsAndWarnings('from a_index | where atan2(longField, unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where atan2(unsignedLongField, doubleField) > 0', []); - testErrorsAndWarnings( - 'from a_index | where atan2(unsignedLongField, integerField) > 0', - [] - ); - testErrorsAndWarnings('from a_index | where atan2(unsignedLongField, longField) > 0', []); - testErrorsAndWarnings( - 'from a_index | where atan2(unsignedLongField, unsignedLongField) > 0', - [] - ); - testErrorsAndWarnings('from a_index | eval var = atan2(doubleField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval atan2(doubleField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(to_double(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval atan2(booleanField, booleanField)', [ - 'Argument of [atan2] must be [double], found value [booleanField] type [boolean]', - 'Argument of [atan2] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = atan2(doubleField, integerField)', []); - testErrorsAndWarnings('from a_index | eval atan2(doubleField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(to_double(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = atan2(doubleField, longField)', []); - testErrorsAndWarnings('from a_index | eval atan2(doubleField, longField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = atan2(to_double(booleanField), longField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | eval var = atan2(doubleField, unsignedLongField)', - [] - ); - testErrorsAndWarnings('from a_index | eval atan2(doubleField, unsignedLongField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(to_double(booleanField), unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = atan2(integerField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval atan2(integerField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(to_integer(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = atan2(integerField, integerField)', []); - testErrorsAndWarnings('from a_index | eval atan2(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = atan2(integerField, longField)', []); - testErrorsAndWarnings('from a_index | eval atan2(integerField, longField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = atan2(to_integer(booleanField), longField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | eval var = atan2(integerField, unsignedLongField)', - [] - ); - testErrorsAndWarnings('from a_index | eval atan2(integerField, unsignedLongField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(to_integer(booleanField), unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = atan2(longField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval atan2(longField, doubleField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = atan2(longField, to_double(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = atan2(longField, integerField)', []); - testErrorsAndWarnings('from a_index | eval atan2(longField, integerField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = atan2(longField, to_integer(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = atan2(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval atan2(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval var = atan2(longField, unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval atan2(longField, unsignedLongField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = atan2(unsignedLongField, doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | eval atan2(unsignedLongField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(unsignedLongField, to_double(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(unsignedLongField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | eval atan2(unsignedLongField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(unsignedLongField, to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = atan2(unsignedLongField, longField)', []); - testErrorsAndWarnings('from a_index | eval atan2(unsignedLongField, longField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = atan2(unsignedLongField, unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval atan2(unsignedLongField, unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval atan2(doubleField, doubleField, extraArg)', [ - 'Error: [atan2] function expects exactly 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort atan2(doubleField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval atan2(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval atan2(nullVar, nullVar)', []); - }); - - describe('cbrt', () => { - testErrorsAndWarnings('row var = cbrt(5.5)', []); - testErrorsAndWarnings('row cbrt(5.5)', []); - testErrorsAndWarnings('row var = cbrt(to_double(true))', []); - testErrorsAndWarnings('row var = cbrt(5)', []); - testErrorsAndWarnings('row cbrt(5)', []); - testErrorsAndWarnings('row var = cbrt(to_integer(true))', []); - - testErrorsAndWarnings('row var = cbrt(true)', [ - 'Argument of [cbrt] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where cbrt(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where cbrt(booleanField) > 0', [ - 'Argument of [cbrt] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where cbrt(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where cbrt(longField) > 0', []); - testErrorsAndWarnings('from a_index | where cbrt(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = cbrt(doubleField)', []); - testErrorsAndWarnings('from a_index | eval cbrt(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = cbrt(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval cbrt(booleanField)', [ - 'Argument of [cbrt] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = cbrt(*)', [ - 'Using wildcards (*) in cbrt is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = cbrt(integerField)', []); - testErrorsAndWarnings('from a_index | eval cbrt(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = cbrt(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = cbrt(longField)', []); - testErrorsAndWarnings('from a_index | eval cbrt(longField)', []); - testErrorsAndWarnings('from a_index | eval var = cbrt(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval cbrt(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval cbrt(doubleField, extraArg)', [ - 'Error: [cbrt] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort cbrt(doubleField)', []); - testErrorsAndWarnings('from a_index | eval cbrt(null)', []); - testErrorsAndWarnings('row nullVar = null | eval cbrt(nullVar)', []); - }); - - describe('ceil', () => { - testErrorsAndWarnings('row var = ceil(5.5)', []); - testErrorsAndWarnings('row ceil(5.5)', []); - testErrorsAndWarnings('row var = ceil(to_double(true))', []); - testErrorsAndWarnings('row var = ceil(5)', []); - testErrorsAndWarnings('row ceil(5)', []); - testErrorsAndWarnings('row var = ceil(to_integer(true))', []); - - testErrorsAndWarnings('row var = ceil(true)', [ - 'Argument of [ceil] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where ceil(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where ceil(booleanField) > 0', [ - 'Argument of [ceil] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where ceil(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where ceil(longField) > 0', []); - testErrorsAndWarnings('from a_index | where ceil(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = ceil(doubleField)', []); - testErrorsAndWarnings('from a_index | eval ceil(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = ceil(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval ceil(booleanField)', [ - 'Argument of [ceil] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = ceil(*)', [ - 'Using wildcards (*) in ceil is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = ceil(integerField)', []); - testErrorsAndWarnings('from a_index | eval ceil(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = ceil(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = ceil(longField)', []); - testErrorsAndWarnings('from a_index | eval ceil(longField)', []); - testErrorsAndWarnings('from a_index | eval var = ceil(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval ceil(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval ceil(doubleField, extraArg)', [ - 'Error: [ceil] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort ceil(doubleField)', []); - testErrorsAndWarnings('from a_index | eval ceil(null)', []); - testErrorsAndWarnings('row nullVar = null | eval ceil(nullVar)', []); - }); - - describe('cidr_match', () => { - testErrorsAndWarnings('row var = cidr_match(to_ip("127.0.0.1"), "a")', []); - testErrorsAndWarnings('row cidr_match(to_ip("127.0.0.1"), "a")', []); - testErrorsAndWarnings( - 'row var = cidr_match(to_ip(to_ip("127.0.0.1")), to_string(true))', - [] - ); - - testErrorsAndWarnings('row var = cidr_match(true, true)', [ - 'Argument of [cidr_match] must be [ip], found value [true] type [boolean]', - 'Argument of [cidr_match] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = cidr_match(ipField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval cidr_match(ipField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = cidr_match(to_ip(ipField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval cidr_match(booleanField, booleanField)', [ - 'Argument of [cidr_match] must be [ip], found value [booleanField] type [boolean]', - 'Argument of [cidr_match] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = cidr_match(ipField, textField)', []); - testErrorsAndWarnings('from a_index | eval cidr_match(ipField, textField)', []); - testErrorsAndWarnings('from a_index | sort cidr_match(ipField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval cidr_match(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval cidr_match(nullVar, nullVar)', []); - }); - - describe('coalesce', () => { - testErrorsAndWarnings('row var = coalesce(true)', []); - testErrorsAndWarnings('row coalesce(true)', []); - testErrorsAndWarnings('row var = coalesce(to_boolean(true))', []); - testErrorsAndWarnings('row var = coalesce(true, true)', []); - testErrorsAndWarnings('row coalesce(true, true)', []); - testErrorsAndWarnings('row var = coalesce(to_boolean(true), to_boolean(true))', []); - testErrorsAndWarnings('row var = coalesce(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row coalesce(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - - testErrorsAndWarnings( - 'row var = coalesce(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row coalesce(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_datetime("2021-01-01T00:00:00Z"), to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - - testErrorsAndWarnings( - 'row coalesce(to_datetime("2021-01-01T00:00:00Z"), to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_datetime(to_datetime("2021-01-01T00:00:00Z")), to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = coalesce(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row coalesce(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = coalesce(to_geopoint(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row coalesce(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_geoshape(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row var = coalesce(5)', []); - testErrorsAndWarnings('row coalesce(5)', []); - testErrorsAndWarnings('row var = coalesce(to_integer(true))', []); - testErrorsAndWarnings('row var = coalesce(5, 5)', []); - testErrorsAndWarnings('row coalesce(5, 5)', []); - testErrorsAndWarnings('row var = coalesce(to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = coalesce(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row coalesce(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); - - testErrorsAndWarnings( - 'row var = coalesce(to_ip(to_ip("127.0.0.1")), to_ip(to_ip("127.0.0.1")))', - [] - ); - - testErrorsAndWarnings('row var = coalesce("a")', []); - testErrorsAndWarnings('row coalesce("a")', []); - testErrorsAndWarnings('row var = coalesce(to_string(true))', []); - testErrorsAndWarnings('row var = coalesce("a", "a")', []); - testErrorsAndWarnings('row coalesce("a", "a")', []); - testErrorsAndWarnings('row var = coalesce(to_string(true), to_string(true))', []); - testErrorsAndWarnings('row var = coalesce(to_version("1.0.0"), to_version("1.0.0"))', []); - testErrorsAndWarnings('row coalesce(to_version("1.0.0"), to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = coalesce(to_version("a"), to_version("a"))', []); - - testErrorsAndWarnings('row var = coalesce(5.5, 5.5)', []); - - testErrorsAndWarnings('from a_index | where coalesce(integerField) > 0', []); - - testErrorsAndWarnings('from a_index | where coalesce(counterDoubleField) > 0', [ - 'Argument of [coalesce] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | where coalesce(integerField, integerField) > 0', []); - - testErrorsAndWarnings( - 'from a_index | where coalesce(counterDoubleField, counterDoubleField) > 0', - [ - 'Argument of [coalesce] must be [boolean], found value [counterDoubleField] type [counter_double]', - 'Argument of [coalesce] must be [boolean], found value [counterDoubleField] type [counter_double]', - ] - ); - - testErrorsAndWarnings('from a_index | where coalesce(longField) > 0', []); - testErrorsAndWarnings('from a_index | where coalesce(longField, longField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval coalesce(counterDoubleField)', [ - 'Argument of [coalesce] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | eval var = coalesce(booleanField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(booleanField, booleanField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_boolean(booleanField), to_boolean(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval coalesce(counterDoubleField, counterDoubleField)', - [ - 'Argument of [coalesce] must be [boolean], found value [counterDoubleField] type [counter_double]', - 'Argument of [coalesce] must be [boolean], found value [counterDoubleField] type [counter_double]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval coalesce(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval coalesce(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = coalesce(dateField, dateField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(dateField, dateField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_datetime(dateField), to_datetime(dateField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(geoPointField, geoPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval coalesce(geoPointField, geoPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_geopoint(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(geoShapeField, geoShapeField)', - [] - ); - testErrorsAndWarnings('from a_index | eval coalesce(geoShapeField, geoShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_geoshape(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = coalesce(integerField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(integerField, integerField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = coalesce(ipField, ipField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(ipField, ipField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_ip(ipField), to_ip(ipField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = coalesce(keywordField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = coalesce(longField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(longField)', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(textField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(textField)', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(versionField, versionField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(versionField, versionField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_version(keywordField), to_version(keywordField))', - [] - ); - - testErrorsAndWarnings('from a_index | sort coalesce(booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(null)', []); - testErrorsAndWarnings('row nullVar = null | eval coalesce(nullVar)', []); - testErrorsAndWarnings('from a_index | eval coalesce("2022", "2022")', []); - - testErrorsAndWarnings( - 'from a_index | eval coalesce(concat("20", "22"), concat("20", "22"))', - [] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row coalesce(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row coalesce(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_geopoint(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = coalesce(to_geoshape(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - }); - - describe('concat', () => { - testErrorsAndWarnings('row var = concat("a", "a")', []); - testErrorsAndWarnings('row concat("a", "a")', []); - testErrorsAndWarnings('row var = concat(to_string(true), to_string(true))', []); - - testErrorsAndWarnings('row var = concat(true, true)', [ - 'Argument of [concat] must be [keyword], found value [true] type [boolean]', - 'Argument of [concat] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = concat(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval concat(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = concat(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval concat(booleanField, booleanField)', [ - 'Argument of [concat] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [concat] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = concat(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval concat(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = concat(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval concat(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = concat(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval concat(textField, textField)', []); - testErrorsAndWarnings('from a_index | sort concat(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval concat(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval concat(nullVar, nullVar)', []); - }); - - describe('cos', () => { - testErrorsAndWarnings('row var = cos(5.5)', []); - testErrorsAndWarnings('row cos(5.5)', []); - testErrorsAndWarnings('row var = cos(to_double(true))', []); - testErrorsAndWarnings('row var = cos(5)', []); - testErrorsAndWarnings('row cos(5)', []); - testErrorsAndWarnings('row var = cos(to_integer(true))', []); - - testErrorsAndWarnings('row var = cos(true)', [ - 'Argument of [cos] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where cos(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where cos(booleanField) > 0', [ - 'Argument of [cos] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where cos(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where cos(longField) > 0', []); - testErrorsAndWarnings('from a_index | where cos(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = cos(doubleField)', []); - testErrorsAndWarnings('from a_index | eval cos(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = cos(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval cos(booleanField)', [ - 'Argument of [cos] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = cos(*)', [ - 'Using wildcards (*) in cos is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = cos(integerField)', []); - testErrorsAndWarnings('from a_index | eval cos(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = cos(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = cos(longField)', []); - testErrorsAndWarnings('from a_index | eval cos(longField)', []); - testErrorsAndWarnings('from a_index | eval var = cos(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval cos(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval cos(doubleField, extraArg)', [ - 'Error: [cos] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort cos(doubleField)', []); - testErrorsAndWarnings('from a_index | eval cos(null)', []); - testErrorsAndWarnings('row nullVar = null | eval cos(nullVar)', []); - }); - - describe('cosh', () => { - testErrorsAndWarnings('row var = cosh(5.5)', []); - testErrorsAndWarnings('row cosh(5.5)', []); - testErrorsAndWarnings('row var = cosh(to_double(true))', []); - testErrorsAndWarnings('row var = cosh(5)', []); - testErrorsAndWarnings('row cosh(5)', []); - testErrorsAndWarnings('row var = cosh(to_integer(true))', []); - - testErrorsAndWarnings('row var = cosh(true)', [ - 'Argument of [cosh] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where cosh(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where cosh(booleanField) > 0', [ - 'Argument of [cosh] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where cosh(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where cosh(longField) > 0', []); - testErrorsAndWarnings('from a_index | where cosh(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = cosh(doubleField)', []); - testErrorsAndWarnings('from a_index | eval cosh(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = cosh(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval cosh(booleanField)', [ - 'Argument of [cosh] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = cosh(*)', [ - 'Using wildcards (*) in cosh is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = cosh(integerField)', []); - testErrorsAndWarnings('from a_index | eval cosh(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = cosh(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = cosh(longField)', []); - testErrorsAndWarnings('from a_index | eval cosh(longField)', []); - testErrorsAndWarnings('from a_index | eval var = cosh(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval cosh(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval cosh(doubleField, extraArg)', [ - 'Error: [cosh] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort cosh(doubleField)', []); - testErrorsAndWarnings('from a_index | eval cosh(null)', []); - testErrorsAndWarnings('row nullVar = null | eval cosh(nullVar)', []); - }); - - describe('date_diff', () => { - testErrorsAndWarnings( - 'from a_index | eval var = date_diff("year", dateField, dateField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval date_diff("year", dateField, dateField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = date_diff("year", to_datetime(dateField), to_datetime(dateField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval date_diff(booleanField, booleanField, booleanField)', - [ - 'Argument of [date_diff] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [date_diff] must be [date], found value [booleanField] type [boolean]', - 'Argument of [date_diff] must be [date], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = date_diff(textField, dateField, dateField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval date_diff(textField, dateField, dateField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = date_diff(to_string(booleanField), to_datetime(dateField), to_datetime(dateField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval date_diff("year", dateField, dateField, extraArg)', - ['Error: [date_diff] function expects exactly 3 arguments, got 4.'] - ); - - testErrorsAndWarnings('from a_index | sort date_diff("year", dateField, dateField)', []); - - testErrorsAndWarnings('from a_index | eval date_diff(null, null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval date_diff(nullVar, nullVar, nullVar)', []); - testErrorsAndWarnings('from a_index | eval date_diff("year", "2022", "2022")', []); - - testErrorsAndWarnings( - 'from a_index | eval date_diff("year", concat("20", "22"), concat("20", "22"))', - [ - 'Argument of [date_diff] must be [date], found value [concat("20","22")] type [keyword]', - 'Argument of [date_diff] must be [date], found value [concat("20","22")] type [keyword]', - ] - ); - - testErrorsAndWarnings('from a_index | eval date_diff(textField, "2022", "2022")', []); - - testErrorsAndWarnings( - 'from a_index | eval date_diff(textField, concat("20", "22"), concat("20", "22"))', - [ - 'Argument of [date_diff] must be [date], found value [concat("20","22")] type [keyword]', - 'Argument of [date_diff] must be [date], found value [concat("20","22")] type [keyword]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = date_diff(to_string(booleanField), dateField, dateField)', - [] - ); - }); - - describe('date_extract', () => { - testErrorsAndWarnings( - 'row var = date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - - testErrorsAndWarnings( - 'row date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - - testErrorsAndWarnings( - 'row var = date_extract("a", to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - testErrorsAndWarnings('row date_extract("a", to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings('row var = date_extract(true, true)', [ - 'Argument of [date_extract] must be [keyword], found value [true] type [boolean]', - 'Argument of [date_extract] must be [date], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", dateField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", dateField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", to_datetime(dateField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval date_extract(booleanField, booleanField)', [ - 'Argument of [date_extract] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [date_extract] must be [date], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = date_extract(textField, dateField)', []); - testErrorsAndWarnings('from a_index | eval date_extract(textField, dateField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = date_extract(to_string(booleanField), to_datetime(dateField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", dateField, extraArg)', - ['Error: [date_extract] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", dateField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval date_extract(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval date_extract(nullVar, nullVar)', []); - - testErrorsAndWarnings( - 'from a_index | eval date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", "2022")', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", concat("20", "22"))', - [ - 'Argument of [date_extract] must be [date], found value [concat("20","22")] type [keyword]', - ] - ); - - testErrorsAndWarnings('from a_index | eval date_extract(textField, "2022")', []); - testErrorsAndWarnings('from a_index | eval date_extract(textField, concat("20", "22"))', [ - 'Argument of [date_extract] must be [date], found value [concat("20","22")] type [keyword]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = date_extract(to_string(booleanField), dateField)', - [] - ); - }); - - describe('date_format', () => { - testErrorsAndWarnings( - 'row var = date_format("a", to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - testErrorsAndWarnings('row date_format("a", to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings('row var = date_format(true, true)', [ - 'Argument of [date_format] must be [keyword], found value [true] type [boolean]', - 'Argument of [date_format] must be [date], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = date_format(keywordField, dateField)', []); - testErrorsAndWarnings('from a_index | eval date_format(keywordField, dateField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = date_format(to_string(booleanField), to_datetime(dateField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval date_format(booleanField, booleanField)', [ - 'Argument of [date_format] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [date_format] must be [date], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = date_format(textField, dateField)', []); - testErrorsAndWarnings('from a_index | eval date_format(textField, dateField)', []); - - testErrorsAndWarnings( - 'from a_index | eval date_format(keywordField, dateField, extraArg)', - ['Error: [date_format] function expects no more than 2 arguments, got 3.'] - ); - - testErrorsAndWarnings('from a_index | sort date_format(keywordField, dateField)', []); - testErrorsAndWarnings('from a_index | eval date_format(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval date_format(nullVar, nullVar)', []); - testErrorsAndWarnings('from a_index | eval date_format(keywordField, "2022")', []); - - testErrorsAndWarnings('from a_index | eval date_format(keywordField, concat("20", "22"))', [ - 'Argument of [date_format] must be [date], found value [concat("20","22")] type [keyword]', - ]); - - testErrorsAndWarnings('from a_index | eval date_format(textField, "2022")', []); - testErrorsAndWarnings('from a_index | eval date_format(textField, concat("20", "22"))', [ - 'Argument of [date_format] must be [date], found value [concat("20","22")] type [keyword]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = date_format(to_string(booleanField), dateField)', - [] - ); - }); - - describe('date_parse', () => { - testErrorsAndWarnings('row var = date_parse("a", "a")', []); - testErrorsAndWarnings('row date_parse("a", "a")', []); - testErrorsAndWarnings('row var = date_parse(to_string(true), to_string(true))', []); - - testErrorsAndWarnings('row var = date_parse(true, true)', [ - 'Argument of [date_parse] must be [keyword], found value [true] type [boolean]', - 'Argument of [date_parse] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = date_parse(keywordField, keywordField)', - [] - ); - testErrorsAndWarnings('from a_index | eval date_parse(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = date_parse(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval date_parse(booleanField, booleanField)', [ - 'Argument of [date_parse] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [date_parse] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = date_parse(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval date_parse(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = date_parse(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval date_parse(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = date_parse(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval date_parse(textField, textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval date_parse(keywordField, keywordField, extraArg)', - ['Error: [date_parse] function expects no more than 2 arguments, got 3.'] - ); - - testErrorsAndWarnings('from a_index | sort date_parse(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval date_parse(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval date_parse(nullVar, nullVar)', []); - }); - - describe('date_trunc', () => { - testErrorsAndWarnings( - 'row var = date_trunc(1 year, to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - testErrorsAndWarnings('row date_trunc(1 year, to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row var = date_trunc("a", to_datetime("2021-01-01T00:00:00Z"))', [ - 'Argument of [date_trunc] must be [time_literal], found value ["a"] type [string]', - ]); - testErrorsAndWarnings('row date_trunc("a", to_datetime("2021-01-01T00:00:00Z"))', [ - 'Argument of [date_trunc] must be [time_literal], found value ["a"] type [string]', - ]); - - testErrorsAndWarnings('row var = date_trunc(true, true)', [ - 'Argument of [date_trunc] must be [time_literal], found value [true] type [boolean]', - 'Argument of [date_trunc] must be [date], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = date_trunc(1 year, dateField)', []); - testErrorsAndWarnings('from a_index | eval date_trunc(1 year, dateField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = date_trunc(1 year, to_datetime(dateField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval date_trunc(booleanField, booleanField)', [ - 'Argument of [date_trunc] must be [time_literal], found value [booleanField] type [boolean]', - 'Argument of [date_trunc] must be [date], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = date_trunc(textField, dateField)', [ - 'Argument of [date_trunc] must be [time_literal], found value [textField] type [text]', - ]); - testErrorsAndWarnings('from a_index | eval date_trunc(textField, dateField)', [ - 'Argument of [date_trunc] must be [time_literal], found value [textField] type [text]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = date_trunc(textField, to_datetime(dateField))', - ['Argument of [date_trunc] must be [time_literal], found value [textField] type [text]'] - ); - - testErrorsAndWarnings('from a_index | eval date_trunc(1 year, dateField, extraArg)', [ - 'Error: [date_trunc] function expects exactly 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort date_trunc(1 year, dateField)', []); - testErrorsAndWarnings('from a_index | eval date_trunc(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval date_trunc(nullVar, nullVar)', []); - testErrorsAndWarnings('from a_index | eval date_trunc(1 year, "2022")', []); - testErrorsAndWarnings('from a_index | eval date_trunc(1 year, concat("20", "22"))', [ - 'Argument of [date_trunc] must be [date], found value [concat("20","22")] type [keyword]', - ]); - testErrorsAndWarnings('from a_index | eval date_trunc(textField, "2022")', [ - 'Argument of [date_trunc] must be [time_literal], found value [textField] type [text]', - ]); - testErrorsAndWarnings('from a_index | eval date_trunc(textField, concat("20", "22"))', [ - 'Argument of [date_trunc] must be [time_literal], found value [textField] type [text]', - 'Argument of [date_trunc] must be [date], found value [concat("20","22")] type [keyword]', - ]); - testErrorsAndWarnings( - 'row var = date_trunc(1 day, to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - testErrorsAndWarnings('row date_trunc(1 day, to_datetime("2021-01-01T00:00:00Z"))', []); - }); - - describe('e', () => { - testErrorsAndWarnings('row var = e()', []); - testErrorsAndWarnings('row e()', []); - testErrorsAndWarnings('from a_index | where e() > 0', []); - testErrorsAndWarnings('from a_index | eval var = e()', []); - testErrorsAndWarnings('from a_index | eval e()', []); - - testErrorsAndWarnings('from a_index | eval e(extraArg)', [ - 'Error: [e] function expects exactly 0 arguments, got 1.', - ]); - - testErrorsAndWarnings('from a_index | sort e()', []); - testErrorsAndWarnings('row nullVar = null | eval e()', []); - }); - - describe('ends_with', () => { - testErrorsAndWarnings('row var = ends_with("a", "a")', []); - testErrorsAndWarnings('row ends_with("a", "a")', []); - testErrorsAndWarnings('row var = ends_with(to_string(true), to_string(true))', []); - - testErrorsAndWarnings('row var = ends_with(true, true)', [ - 'Argument of [ends_with] must be [keyword], found value [true] type [boolean]', - 'Argument of [ends_with] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = ends_with(keywordField, keywordField)', - [] - ); - testErrorsAndWarnings('from a_index | eval ends_with(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = ends_with(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval ends_with(booleanField, booleanField)', [ - 'Argument of [ends_with] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [ends_with] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = ends_with(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval ends_with(textField, textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval ends_with(keywordField, keywordField, extraArg)', - ['Error: [ends_with] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings('from a_index | sort ends_with(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval ends_with(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval ends_with(nullVar, nullVar)', []); - testErrorsAndWarnings('from a_index | eval var = ends_with(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval ends_with(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = ends_with(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval ends_with(textField, keywordField)', []); - }); - - describe('exp', () => { - testErrorsAndWarnings('row var = exp(5.5)', []); - testErrorsAndWarnings('row exp(5.5)', []); - testErrorsAndWarnings('row var = exp(to_double(true))', []); - testErrorsAndWarnings('row var = exp(5)', []); - testErrorsAndWarnings('row exp(5)', []); - testErrorsAndWarnings('row var = exp(to_integer(true))', []); - - testErrorsAndWarnings('row var = exp(true)', [ - 'Argument of [exp] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where exp(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where exp(booleanField) > 0', [ - 'Argument of [exp] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where exp(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where exp(longField) > 0', []); - testErrorsAndWarnings('from a_index | where exp(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = exp(doubleField)', []); - testErrorsAndWarnings('from a_index | eval exp(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = exp(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval exp(booleanField)', [ - 'Argument of [exp] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = exp(*)', [ - 'Using wildcards (*) in exp is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = exp(integerField)', []); - testErrorsAndWarnings('from a_index | eval exp(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = exp(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = exp(longField)', []); - testErrorsAndWarnings('from a_index | eval exp(longField)', []); - testErrorsAndWarnings('from a_index | eval var = exp(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval exp(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval exp(doubleField, extraArg)', [ - 'Error: [exp] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort exp(doubleField)', []); - testErrorsAndWarnings('from a_index | eval exp(null)', []); - testErrorsAndWarnings('row nullVar = null | eval exp(nullVar)', []); - }); - - describe('floor', () => { - testErrorsAndWarnings('row var = floor(5.5)', []); - testErrorsAndWarnings('row floor(5.5)', []); - testErrorsAndWarnings('row var = floor(to_double(true))', []); - testErrorsAndWarnings('row var = floor(5)', []); - testErrorsAndWarnings('row floor(5)', []); - testErrorsAndWarnings('row var = floor(to_integer(true))', []); - - testErrorsAndWarnings('row var = floor(true)', [ - 'Argument of [floor] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where floor(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where floor(booleanField) > 0', [ - 'Argument of [floor] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where floor(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where floor(longField) > 0', []); - testErrorsAndWarnings('from a_index | where floor(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = floor(doubleField)', []); - testErrorsAndWarnings('from a_index | eval floor(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = floor(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval floor(booleanField)', [ - 'Argument of [floor] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = floor(*)', [ - 'Using wildcards (*) in floor is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = floor(integerField)', []); - testErrorsAndWarnings('from a_index | eval floor(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = floor(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = floor(longField)', []); - testErrorsAndWarnings('from a_index | eval floor(longField)', []); - testErrorsAndWarnings('from a_index | eval var = floor(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval floor(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval floor(doubleField, extraArg)', [ - 'Error: [floor] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort floor(doubleField)', []); - testErrorsAndWarnings('from a_index | eval floor(null)', []); - testErrorsAndWarnings('row nullVar = null | eval floor(nullVar)', []); - }); - - describe('from_base64', () => { - testErrorsAndWarnings('row var = from_base64("a")', []); - testErrorsAndWarnings('row from_base64("a")', []); - testErrorsAndWarnings('row var = from_base64(to_string(true))', []); - - testErrorsAndWarnings('row var = from_base64(true)', [ - 'Argument of [from_base64] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = from_base64(keywordField)', []); - testErrorsAndWarnings('from a_index | eval from_base64(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = from_base64(to_string(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval from_base64(booleanField)', [ - 'Argument of [from_base64] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = from_base64(*)', [ - 'Using wildcards (*) in from_base64 is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = from_base64(textField)', []); - testErrorsAndWarnings('from a_index | eval from_base64(textField)', []); - - testErrorsAndWarnings('from a_index | eval from_base64(keywordField, extraArg)', [ - 'Error: [from_base64] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort from_base64(keywordField)', []); - testErrorsAndWarnings('from a_index | eval from_base64(null)', []); - testErrorsAndWarnings('row nullVar = null | eval from_base64(nullVar)', []); - }); - - describe('greatest', () => { - testErrorsAndWarnings('row var = greatest(true)', []); - testErrorsAndWarnings('row greatest(true)', []); - testErrorsAndWarnings('row var = greatest(to_boolean(true))', []); - testErrorsAndWarnings('row var = greatest(true, true)', []); - testErrorsAndWarnings('row greatest(true, true)', []); - testErrorsAndWarnings('row var = greatest(to_boolean(true), to_boolean(true))', []); - testErrorsAndWarnings('row var = greatest(5.5, 5.5)', []); - testErrorsAndWarnings('row greatest(5.5, 5.5)', []); - testErrorsAndWarnings('row var = greatest(to_double(true), to_double(true))', []); - testErrorsAndWarnings('row var = greatest(5)', []); - testErrorsAndWarnings('row greatest(5)', []); - testErrorsAndWarnings('row var = greatest(to_integer(true))', []); - testErrorsAndWarnings('row var = greatest(5, 5)', []); - testErrorsAndWarnings('row greatest(5, 5)', []); - testErrorsAndWarnings('row var = greatest(to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = greatest(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row greatest(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); - - testErrorsAndWarnings( - 'row var = greatest(to_ip(to_ip("127.0.0.1")), to_ip(to_ip("127.0.0.1")))', - [] - ); - - testErrorsAndWarnings('row var = greatest("a")', []); - testErrorsAndWarnings('row greatest("a")', []); - testErrorsAndWarnings('row var = greatest(to_string(true))', []); - testErrorsAndWarnings('row var = greatest("a", "a")', []); - testErrorsAndWarnings('row greatest("a", "a")', []); - testErrorsAndWarnings('row var = greatest(to_string(true), to_string(true))', []); - testErrorsAndWarnings('row var = greatest(to_version("1.0.0"), to_version("1.0.0"))', []); - testErrorsAndWarnings('row greatest(to_version("1.0.0"), to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = greatest(to_version("a"), to_version("a"))', []); - - testErrorsAndWarnings( - 'row var = greatest(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [ - 'Argument of [greatest] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - 'Argument of [greatest] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ] - ); - - testErrorsAndWarnings('from a_index | where greatest(doubleField, doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where greatest(integerField) > 0', []); - - testErrorsAndWarnings('from a_index | where greatest(cartesianPointField) > 0', [ - 'Argument of [greatest] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where greatest(integerField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where greatest(longField) > 0', []); - testErrorsAndWarnings('from a_index | where greatest(longField, longField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = greatest(booleanField)', []); - testErrorsAndWarnings('from a_index | eval greatest(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = greatest(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval greatest(cartesianPointField)', [ - 'Argument of [greatest] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = greatest(booleanField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval greatest(booleanField, booleanField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = greatest(to_boolean(booleanField), to_boolean(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval greatest(cartesianPointField, cartesianPointField)', - [ - 'Argument of [greatest] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - 'Argument of [greatest] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ] - ); - - testErrorsAndWarnings('from a_index | eval var = greatest(doubleField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval greatest(doubleField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = greatest(to_double(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = greatest(integerField)', []); - testErrorsAndWarnings('from a_index | eval greatest(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = greatest(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = greatest(integerField, integerField)', []); - testErrorsAndWarnings('from a_index | eval greatest(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = greatest(to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = greatest(ipField, ipField)', []); - testErrorsAndWarnings('from a_index | eval greatest(ipField, ipField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = greatest(to_ip(ipField), to_ip(ipField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = greatest(keywordField)', []); - testErrorsAndWarnings('from a_index | eval greatest(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = greatest(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = greatest(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval greatest(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = greatest(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = greatest(longField)', []); - testErrorsAndWarnings('from a_index | eval greatest(longField)', []); - testErrorsAndWarnings('from a_index | eval var = greatest(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval greatest(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval var = greatest(textField)', []); - testErrorsAndWarnings('from a_index | eval greatest(textField)', []); - testErrorsAndWarnings('from a_index | eval var = greatest(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval greatest(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = greatest(versionField, versionField)', []); - testErrorsAndWarnings('from a_index | eval greatest(versionField, versionField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = greatest(to_version(keywordField), to_version(keywordField))', - [] - ); - - testErrorsAndWarnings('from a_index | sort greatest(booleanField)', []); - testErrorsAndWarnings('from a_index | eval greatest(null)', []); - testErrorsAndWarnings('row nullVar = null | eval greatest(nullVar)', []); - - testErrorsAndWarnings( - 'from a_index | where greatest(cartesianPointField, cartesianPointField) > 0', - [ - 'Argument of [greatest] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - 'Argument of [greatest] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ] - ); - }); - - describe('ip_prefix', () => { - testErrorsAndWarnings('row var = ip_prefix(to_ip("127.0.0.1"), 5, 5)', []); - testErrorsAndWarnings('row ip_prefix(to_ip("127.0.0.1"), 5, 5)', []); - - testErrorsAndWarnings( - 'row var = ip_prefix(to_ip(to_ip("127.0.0.1")), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = ip_prefix(true, true, true)', [ - 'Argument of [ip_prefix] must be [ip], found value [true] type [boolean]', - 'Argument of [ip_prefix] must be [integer], found value [true] type [boolean]', - 'Argument of [ip_prefix] must be [integer], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = ip_prefix(ipField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval ip_prefix(ipField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = ip_prefix(to_ip(ipField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval ip_prefix(booleanField, booleanField, booleanField)', - [ - 'Argument of [ip_prefix] must be [ip], found value [booleanField] type [boolean]', - 'Argument of [ip_prefix] must be [integer], found value [booleanField] type [boolean]', - 'Argument of [ip_prefix] must be [integer], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval ip_prefix(ipField, integerField, integerField, extraArg)', - ['Error: [ip_prefix] function expects exactly 3 arguments, got 4.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort ip_prefix(ipField, integerField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | eval ip_prefix(null, null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval ip_prefix(nullVar, nullVar, nullVar)', []); - }); - - describe('least', () => { - testErrorsAndWarnings('row var = least(true)', []); - testErrorsAndWarnings('row least(true)', []); - testErrorsAndWarnings('row var = least(to_boolean(true))', []); - testErrorsAndWarnings('row var = least(true, true)', []); - testErrorsAndWarnings('row least(true, true)', []); - testErrorsAndWarnings('row var = least(to_boolean(true), to_boolean(true))', []); - testErrorsAndWarnings('row var = least(5.5, 5.5)', []); - testErrorsAndWarnings('row least(5.5, 5.5)', []); - testErrorsAndWarnings('row var = least(to_double(true), to_double(true))', []); - testErrorsAndWarnings('row var = least(5)', []); - testErrorsAndWarnings('row least(5)', []); - testErrorsAndWarnings('row var = least(to_integer(true))', []); - testErrorsAndWarnings('row var = least(5, 5)', []); - testErrorsAndWarnings('row least(5, 5)', []); - testErrorsAndWarnings('row var = least(to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = least(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row least(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); - - testErrorsAndWarnings( - 'row var = least(to_ip(to_ip("127.0.0.1")), to_ip(to_ip("127.0.0.1")))', - [] - ); - - testErrorsAndWarnings('row var = least("a")', []); - testErrorsAndWarnings('row least("a")', []); - testErrorsAndWarnings('row var = least(to_string(true))', []); - testErrorsAndWarnings('row var = least("a", "a")', []); - testErrorsAndWarnings('row least("a", "a")', []); - testErrorsAndWarnings('row var = least(to_string(true), to_string(true))', []); - testErrorsAndWarnings('row var = least(to_version("1.0.0"), to_version("1.0.0"))', []); - testErrorsAndWarnings('row least(to_version("1.0.0"), to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = least(to_version("a"), to_version("a"))', []); - - testErrorsAndWarnings( - 'row var = least(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [ - 'Argument of [least] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - 'Argument of [least] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ] - ); - - testErrorsAndWarnings('from a_index | where least(doubleField, doubleField) > 0', []); - - testErrorsAndWarnings( - 'from a_index | where least(cartesianPointField, cartesianPointField) > 0', - [ - 'Argument of [least] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - 'Argument of [least] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ] - ); - - testErrorsAndWarnings('from a_index | where least(integerField) > 0', []); - - testErrorsAndWarnings('from a_index | where least(cartesianPointField) > 0', [ - 'Argument of [least] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where least(integerField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where least(longField) > 0', []); - testErrorsAndWarnings('from a_index | where least(longField, longField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = least(booleanField)', []); - testErrorsAndWarnings('from a_index | eval least(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = least(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval least(cartesianPointField)', [ - 'Argument of [least] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = least(booleanField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval least(booleanField, booleanField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = least(to_boolean(booleanField), to_boolean(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval least(cartesianPointField, cartesianPointField)', - [ - 'Argument of [least] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - 'Argument of [least] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ] - ); - - testErrorsAndWarnings('from a_index | eval var = least(doubleField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval least(doubleField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = least(to_double(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = least(integerField)', []); - testErrorsAndWarnings('from a_index | eval least(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = least(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = least(integerField, integerField)', []); - testErrorsAndWarnings('from a_index | eval least(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = least(to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = least(ipField, ipField)', []); - testErrorsAndWarnings('from a_index | eval least(ipField, ipField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = least(to_ip(ipField), to_ip(ipField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = least(keywordField)', []); - testErrorsAndWarnings('from a_index | eval least(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = least(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = least(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval least(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = least(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = least(longField)', []); - testErrorsAndWarnings('from a_index | eval least(longField)', []); - testErrorsAndWarnings('from a_index | eval var = least(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval least(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval var = least(textField)', []); - testErrorsAndWarnings('from a_index | eval least(textField)', []); - testErrorsAndWarnings('from a_index | eval var = least(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval least(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = least(versionField, versionField)', []); - testErrorsAndWarnings('from a_index | eval least(versionField, versionField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = least(to_version(keywordField), to_version(keywordField))', - [] - ); - - testErrorsAndWarnings('from a_index | sort least(booleanField)', []); - testErrorsAndWarnings('from a_index | eval least(null)', []); - testErrorsAndWarnings('row nullVar = null | eval least(nullVar)', []); - }); - - describe('left', () => { - testErrorsAndWarnings('row var = left("a", 5)', []); - testErrorsAndWarnings('row left("a", 5)', []); - testErrorsAndWarnings('row var = left(to_string(true), to_integer(true))', []); - - testErrorsAndWarnings('row var = left(true, true)', [ - 'Argument of [left] must be [keyword], found value [true] type [boolean]', - 'Argument of [left] must be [integer], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = left(keywordField, integerField)', []); - testErrorsAndWarnings('from a_index | eval left(keywordField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = left(to_string(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval left(booleanField, booleanField)', [ - 'Argument of [left] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [left] must be [integer], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = left(textField, integerField)', []); - testErrorsAndWarnings('from a_index | eval left(textField, integerField)', []); - - testErrorsAndWarnings('from a_index | eval left(keywordField, integerField, extraArg)', [ - 'Error: [left] function expects exactly 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort left(keywordField, integerField)', []); - testErrorsAndWarnings('from a_index | eval left(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval left(nullVar, nullVar)', []); - }); - - describe('length', () => { - testErrorsAndWarnings('row var = length("a")', []); - testErrorsAndWarnings('row length("a")', []); - testErrorsAndWarnings('row var = length(to_string(true))', []); - - testErrorsAndWarnings('row var = length(true)', [ - 'Argument of [length] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = length(keywordField)', []); - testErrorsAndWarnings('from a_index | eval length(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = length(to_string(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval length(booleanField)', [ - 'Argument of [length] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = length(*)', [ - 'Using wildcards (*) in length is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = length(textField)', []); - testErrorsAndWarnings('from a_index | eval length(textField)', []); - - testErrorsAndWarnings('from a_index | eval length(keywordField, extraArg)', [ - 'Error: [length] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort length(keywordField)', []); - testErrorsAndWarnings('from a_index | eval length(null)', []); - testErrorsAndWarnings('row nullVar = null | eval length(nullVar)', []); - }); - - describe('locate', () => { - testErrorsAndWarnings('row var = locate("a", "a")', []); - testErrorsAndWarnings('row locate("a", "a")', []); - testErrorsAndWarnings('row var = locate(to_string(true), to_string(true))', []); - testErrorsAndWarnings('row var = locate("a", "a", 5)', []); - testErrorsAndWarnings('row locate("a", "a", 5)', []); - testErrorsAndWarnings( - 'row var = locate(to_string(true), to_string(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = locate(true, true, true)', [ - 'Argument of [locate] must be [keyword], found value [true] type [boolean]', - 'Argument of [locate] must be [keyword], found value [true] type [boolean]', - 'Argument of [locate] must be [integer], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = locate(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval locate(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = locate(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval locate(booleanField, booleanField)', [ - 'Argument of [locate] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [locate] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = locate(keywordField, keywordField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval locate(keywordField, keywordField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = locate(to_string(booleanField), to_string(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval locate(booleanField, booleanField, booleanField)', - [ - 'Argument of [locate] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [locate] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [locate] must be [integer], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings('from a_index | eval var = locate(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval locate(keywordField, textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = locate(keywordField, textField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval locate(keywordField, textField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | eval var = locate(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval locate(textField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = locate(textField, keywordField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval locate(textField, keywordField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | eval var = locate(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval locate(textField, textField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = locate(textField, textField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | eval locate(textField, textField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval locate(keywordField, keywordField, integerField, extraArg)', - ['Error: [locate] function expects no more than 3 arguments, got 4.'] - ); - - testErrorsAndWarnings('from a_index | sort locate(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval locate(null, null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval locate(nullVar, nullVar, nullVar)', []); - }); - - describe('log', () => { - testErrorsAndWarnings('row var = log(5.5)', []); - testErrorsAndWarnings('row log(5.5)', []); - testErrorsAndWarnings('row var = log(to_double(true))', []); - testErrorsAndWarnings('row var = log(5.5, 5.5)', []); - testErrorsAndWarnings('row log(5.5, 5.5)', []); - testErrorsAndWarnings('row var = log(to_double(true), to_double(true))', []); - testErrorsAndWarnings('row var = log(5.5, 5)', []); - testErrorsAndWarnings('row log(5.5, 5)', []); - testErrorsAndWarnings('row var = log(to_double(true), to_integer(true))', []); - testErrorsAndWarnings('row var = log(to_double(true), 5)', []); - testErrorsAndWarnings('row var = log(5)', []); - testErrorsAndWarnings('row log(5)', []); - testErrorsAndWarnings('row var = log(to_integer(true))', []); - testErrorsAndWarnings('row var = log(5, 5.5)', []); - testErrorsAndWarnings('row log(5, 5.5)', []); - testErrorsAndWarnings('row var = log(to_integer(true), to_double(true))', []); - testErrorsAndWarnings('row var = log(5, 5)', []); - testErrorsAndWarnings('row log(5, 5)', []); - testErrorsAndWarnings('row var = log(to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = log(to_integer(true), 5)', []); - testErrorsAndWarnings('row var = log(5, to_double(true))', []); - testErrorsAndWarnings('row var = log(5, to_integer(true))', []); - - testErrorsAndWarnings('row var = log(true, true)', [ - 'Argument of [log] must be [double], found value [true] type [boolean]', - 'Argument of [log] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where log(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where log(booleanField) > 0', [ - 'Argument of [log] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where log(doubleField, doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where log(booleanField, booleanField) > 0', [ - 'Argument of [log] must be [double], found value [booleanField] type [boolean]', - 'Argument of [log] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where log(doubleField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where log(doubleField, longField) > 0', []); - testErrorsAndWarnings('from a_index | where log(doubleField, unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where log(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where log(integerField, doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where log(integerField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where log(integerField, longField) > 0', []); - testErrorsAndWarnings('from a_index | where log(integerField, unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where log(longField) > 0', []); - testErrorsAndWarnings('from a_index | where log(longField, doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where log(longField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where log(longField, longField) > 0', []); - testErrorsAndWarnings('from a_index | where log(longField, unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where log(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where log(unsignedLongField, doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where log(unsignedLongField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where log(unsignedLongField, longField) > 0', []); - testErrorsAndWarnings( - 'from a_index | where log(unsignedLongField, unsignedLongField) > 0', - [] - ); - testErrorsAndWarnings('from a_index | eval var = log(doubleField)', []); - testErrorsAndWarnings('from a_index | eval log(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = log(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval log(booleanField)', [ - 'Argument of [log] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = log(*)', [ - 'Using wildcards (*) in log is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = log(doubleField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval log(doubleField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = log(to_double(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval log(booleanField, booleanField)', [ - 'Argument of [log] must be [double], found value [booleanField] type [boolean]', - 'Argument of [log] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = log(doubleField, integerField)', []); - testErrorsAndWarnings('from a_index | eval log(doubleField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = log(to_double(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = log(doubleField, longField)', []); - testErrorsAndWarnings('from a_index | eval log(doubleField, longField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = log(to_double(booleanField), longField)', - [] - ); - testErrorsAndWarnings('from a_index | eval var = log(doubleField, unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval log(doubleField, unsignedLongField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = log(to_double(booleanField), unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = log(integerField)', []); - testErrorsAndWarnings('from a_index | eval log(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = log(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = log(integerField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval log(integerField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = log(to_integer(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = log(integerField, integerField)', []); - testErrorsAndWarnings('from a_index | eval log(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = log(to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = log(integerField, longField)', []); - testErrorsAndWarnings('from a_index | eval log(integerField, longField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = log(to_integer(booleanField), longField)', - [] - ); - testErrorsAndWarnings('from a_index | eval var = log(integerField, unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval log(integerField, unsignedLongField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = log(to_integer(booleanField), unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = log(longField)', []); - testErrorsAndWarnings('from a_index | eval log(longField)', []); - testErrorsAndWarnings('from a_index | eval var = log(longField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval log(longField, doubleField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = log(longField, to_double(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = log(longField, integerField)', []); - testErrorsAndWarnings('from a_index | eval log(longField, integerField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = log(longField, to_integer(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = log(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval log(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval var = log(longField, unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval log(longField, unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = log(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval log(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = log(unsignedLongField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval log(unsignedLongField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = log(unsignedLongField, to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = log(unsignedLongField, integerField)', []); - testErrorsAndWarnings('from a_index | eval log(unsignedLongField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = log(unsignedLongField, to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = log(unsignedLongField, longField)', []); - testErrorsAndWarnings('from a_index | eval log(unsignedLongField, longField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = log(unsignedLongField, unsignedLongField)', - [] - ); - testErrorsAndWarnings('from a_index | eval log(unsignedLongField, unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval log(doubleField, doubleField, extraArg)', [ - 'Error: [log] function expects no more than 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort log(doubleField)', []); - testErrorsAndWarnings('from a_index | eval log(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval log(nullVar, nullVar)', []); - }); - - describe('log10', () => { - testErrorsAndWarnings('row var = log10(5.5)', []); - testErrorsAndWarnings('row log10(5.5)', []); - testErrorsAndWarnings('row var = log10(to_double(true))', []); - testErrorsAndWarnings('row var = log10(5)', []); - testErrorsAndWarnings('row log10(5)', []); - testErrorsAndWarnings('row var = log10(to_integer(true))', []); - - testErrorsAndWarnings('row var = log10(true)', [ - 'Argument of [log10] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where log10(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where log10(booleanField) > 0', [ - 'Argument of [log10] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where log10(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where log10(longField) > 0', []); - testErrorsAndWarnings('from a_index | where log10(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = log10(doubleField)', []); - testErrorsAndWarnings('from a_index | eval log10(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = log10(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval log10(booleanField)', [ - 'Argument of [log10] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = log10(*)', [ - 'Using wildcards (*) in log10 is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = log10(integerField)', []); - testErrorsAndWarnings('from a_index | eval log10(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = log10(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = log10(longField)', []); - testErrorsAndWarnings('from a_index | eval log10(longField)', []); - testErrorsAndWarnings('from a_index | eval var = log10(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval log10(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval log10(doubleField, extraArg)', [ - 'Error: [log10] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort log10(doubleField)', []); - testErrorsAndWarnings('from a_index | eval log10(null)', []); - testErrorsAndWarnings('row nullVar = null | eval log10(nullVar)', []); - }); - - describe('ltrim', () => { - testErrorsAndWarnings('row var = ltrim("a")', []); - testErrorsAndWarnings('row ltrim("a")', []); - testErrorsAndWarnings('row var = ltrim(to_string(true))', []); - - testErrorsAndWarnings('row var = ltrim(true)', [ - 'Argument of [ltrim] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = ltrim(keywordField)', []); - testErrorsAndWarnings('from a_index | eval ltrim(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = ltrim(to_string(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval ltrim(booleanField)', [ - 'Argument of [ltrim] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = ltrim(*)', [ - 'Using wildcards (*) in ltrim is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = ltrim(textField)', []); - testErrorsAndWarnings('from a_index | eval ltrim(textField)', []); - - testErrorsAndWarnings('from a_index | eval ltrim(keywordField, extraArg)', [ - 'Error: [ltrim] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort ltrim(keywordField)', []); - testErrorsAndWarnings('from a_index | eval ltrim(null)', []); - testErrorsAndWarnings('row nullVar = null | eval ltrim(nullVar)', []); - }); - - describe('mv_append', () => { - testErrorsAndWarnings('row var = mv_append(true, true)', []); - testErrorsAndWarnings('row mv_append(true, true)', []); - testErrorsAndWarnings('row var = mv_append(to_boolean(true), to_boolean(true))', []); - testErrorsAndWarnings('row var = mv_append(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row mv_append(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - - testErrorsAndWarnings( - 'row var = mv_append(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row mv_append(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_datetime("2021-01-01T00:00:00Z"), to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - - testErrorsAndWarnings( - 'row mv_append(to_datetime("2021-01-01T00:00:00Z"), to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_datetime(to_datetime("2021-01-01T00:00:00Z")), to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = mv_append(5.5, 5.5)', []); - - testErrorsAndWarnings('row mv_append(5.5, 5.5)', []); - testErrorsAndWarnings('row var = mv_append(to_double(true), to_double(true))', []); - testErrorsAndWarnings('row var = mv_append(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row mv_append(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = mv_append(to_geopoint(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row mv_append(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_geoshape(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row var = mv_append(5, 5)', []); - testErrorsAndWarnings('row mv_append(5, 5)', []); - testErrorsAndWarnings('row var = mv_append(to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = mv_append(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row mv_append(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); - - testErrorsAndWarnings( - 'row var = mv_append(to_ip(to_ip("127.0.0.1")), to_ip(to_ip("127.0.0.1")))', - [] - ); - - testErrorsAndWarnings('row var = mv_append("a", "a")', []); - testErrorsAndWarnings('row mv_append("a", "a")', []); - testErrorsAndWarnings('row var = mv_append(to_string(true), to_string(true))', []); - testErrorsAndWarnings('row var = mv_append(to_version("1.0.0"), to_version("1.0.0"))', []); - testErrorsAndWarnings('row mv_append(to_version("1.0.0"), to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = mv_append(to_version("a"), to_version("a"))', []); - testErrorsAndWarnings('from a_index | where mv_append(doubleField, doubleField) > 0', []); - - testErrorsAndWarnings( - 'from a_index | where mv_append(counterDoubleField, counterDoubleField) > 0', - [ - 'Argument of [mv_append] must be [boolean], found value [counterDoubleField] type [counter_double]', - 'Argument of [mv_append] must be [boolean], found value [counterDoubleField] type [counter_double]', - ] - ); - - testErrorsAndWarnings('from a_index | where mv_append(integerField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_append(longField, longField) > 0', []); - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(booleanField, booleanField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_append(booleanField, booleanField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_boolean(booleanField), to_boolean(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_append(counterDoubleField, counterDoubleField)', - [ - 'Argument of [mv_append] must be [boolean], found value [counterDoubleField] type [counter_double]', - 'Argument of [mv_append] must be [boolean], found value [counterDoubleField] type [counter_double]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_append(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_append(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_append(dateField, dateField)', []); - testErrorsAndWarnings('from a_index | eval mv_append(dateField, dateField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_datetime(dateField), to_datetime(dateField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_append(doubleField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_append(doubleField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_double(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(geoPointField, geoPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_append(geoPointField, geoPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_geopoint(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(geoShapeField, geoShapeField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_append(geoShapeField, geoShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_geoshape(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(integerField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_append(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_append(ipField, ipField)', []); - testErrorsAndWarnings('from a_index | eval mv_append(ipField, ipField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_ip(ipField), to_ip(ipField))', - [] - ); - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(keywordField, keywordField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_append(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_append(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval mv_append(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_append(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval mv_append(textField, textField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(versionField, versionField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_append(versionField, versionField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_append(to_version(keywordField), to_version(keywordField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_append(booleanField, booleanField, extraArg)', - ['Error: [mv_append] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings('from a_index | sort mv_append(booleanField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_append(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_append(nullVar, nullVar)', []); - testErrorsAndWarnings('from a_index | eval mv_append("2022", "2022")', []); - - testErrorsAndWarnings( - 'from a_index | eval mv_append(concat("20", "22"), concat("20", "22"))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row mv_append(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row mv_append(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_geopoint(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_append(to_geoshape(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - }); - - describe('mv_avg', () => { - testErrorsAndWarnings('row var = mv_avg(5.5)', []); - testErrorsAndWarnings('row mv_avg(5.5)', []); - testErrorsAndWarnings('row var = mv_avg(to_double(true))', []); - testErrorsAndWarnings('row var = mv_avg(5)', []); - testErrorsAndWarnings('row mv_avg(5)', []); - testErrorsAndWarnings('row var = mv_avg(to_integer(true))', []); - - testErrorsAndWarnings('row var = mv_avg(true)', [ - 'Argument of [mv_avg] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where mv_avg(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where mv_avg(booleanField) > 0', [ - 'Argument of [mv_avg] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where mv_avg(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_avg(longField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_avg(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = mv_avg(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_avg(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_avg(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval mv_avg(booleanField)', [ - 'Argument of [mv_avg] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_avg(*)', [ - 'Using wildcards (*) in mv_avg is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_avg(integerField)', []); - testErrorsAndWarnings('from a_index | eval mv_avg(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_avg(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_avg(longField)', []); - testErrorsAndWarnings('from a_index | eval mv_avg(longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_avg(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval mv_avg(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval mv_avg(doubleField, extraArg)', [ - 'Error: [mv_avg] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_avg(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_avg(null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_avg(nullVar)', []); - }); - - describe('mv_concat', () => { - testErrorsAndWarnings('row var = mv_concat("a", "a")', []); - testErrorsAndWarnings('row mv_concat("a", "a")', []); - testErrorsAndWarnings('row var = mv_concat(to_string(true), to_string(true))', []); - - testErrorsAndWarnings('row var = mv_concat(true, true)', [ - 'Argument of [mv_concat] must be [keyword], found value [true] type [boolean]', - 'Argument of [mv_concat] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_concat(keywordField, keywordField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_concat(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_concat(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval mv_concat(booleanField, booleanField)', [ - 'Argument of [mv_concat] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [mv_concat] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_concat(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval mv_concat(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_concat(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_concat(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_concat(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval mv_concat(textField, textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval mv_concat(keywordField, keywordField, extraArg)', - ['Error: [mv_concat] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings('from a_index | sort mv_concat(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_concat(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_concat(nullVar, nullVar)', []); - }); - - describe('mv_count', () => { - testErrorsAndWarnings('row var = mv_count(true)', []); - testErrorsAndWarnings('row mv_count(true)', []); - testErrorsAndWarnings('row var = mv_count(to_boolean(true))', []); - testErrorsAndWarnings('row var = mv_count(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row mv_count(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_count(to_cartesianpoint(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_count(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_count(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_count(to_cartesianshape(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_count(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row mv_count(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = mv_count(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = mv_count(5.5)', []); - - testErrorsAndWarnings('row mv_count(5.5)', []); - testErrorsAndWarnings('row var = mv_count(to_double(true))', []); - testErrorsAndWarnings('row var = mv_count(geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row mv_count(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row var = mv_count(to_geopoint(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = mv_count(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_count(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_count(to_geoshape(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = mv_count(5)', []); - testErrorsAndWarnings('row mv_count(5)', []); - testErrorsAndWarnings('row var = mv_count(to_integer(true))', []); - testErrorsAndWarnings('row var = mv_count(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row mv_count(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = mv_count(to_ip(to_ip("127.0.0.1")))', []); - testErrorsAndWarnings('row var = mv_count("a")', []); - testErrorsAndWarnings('row mv_count("a")', []); - testErrorsAndWarnings('row var = mv_count(to_string(true))', []); - testErrorsAndWarnings('row var = mv_count(to_version("1.0.0"))', []); - testErrorsAndWarnings('row mv_count(to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = mv_count(to_version("a"))', []); - testErrorsAndWarnings('from a_index | where mv_count(booleanField) > 0', []); - - testErrorsAndWarnings('from a_index | where mv_count(counterDoubleField) > 0', [ - 'Argument of [mv_count] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | where mv_count(cartesianPointField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(cartesianShapeField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(dateField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(geoPointField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(geoShapeField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(ipField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(keywordField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(longField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(textField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_count(versionField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval mv_count(counterDoubleField)', [ - 'Argument of [mv_count] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_count(*)', [ - 'Using wildcards (*) in mv_count is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_count(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(cartesianPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_count(to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_count(cartesianShapeField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(cartesianShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_count(to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_count(dateField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(to_geopoint(geoPointField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(to_geoshape(geoPointField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(integerField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(ipField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(ipField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(to_ip(ipField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(longField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(textField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(textField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(versionField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(versionField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_count(to_version(keywordField))', []); - - testErrorsAndWarnings('from a_index | eval mv_count(booleanField, extraArg)', [ - 'Error: [mv_count] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_count(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_count(null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_count(nullVar)', []); - testErrorsAndWarnings('from a_index | eval mv_count("2022")', []); - testErrorsAndWarnings('from a_index | eval mv_count(concat("20", "22"))', []); - testErrorsAndWarnings('row var = mv_count(to_cartesianpoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_count(to_cartesianpoint("POINT (30 10)"))', []); - - testErrorsAndWarnings( - 'row var = mv_count(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_count(to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings('row var = mv_count(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_count(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_count(to_geopoint(to_geopoint("POINT (30 10)")))', []); - testErrorsAndWarnings('row var = mv_count(to_geoshape(to_geopoint("POINT (30 10)")))', []); - }); - - describe('mv_dedupe', () => { - testErrorsAndWarnings('row var = mv_dedupe(true)', []); - testErrorsAndWarnings('row mv_dedupe(true)', []); - testErrorsAndWarnings('row var = mv_dedupe(to_boolean(true))', []); - testErrorsAndWarnings('row var = mv_dedupe(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row mv_dedupe(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_dedupe(to_cartesianpoint(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_dedupe(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_dedupe(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_dedupe(to_cartesianshape(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_dedupe(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row mv_dedupe(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = mv_dedupe(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = mv_dedupe(5.5)', []); - - testErrorsAndWarnings('row mv_dedupe(5.5)', []); - testErrorsAndWarnings('row var = mv_dedupe(to_double(true))', []); - testErrorsAndWarnings('row var = mv_dedupe(geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row mv_dedupe(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row var = mv_dedupe(to_geopoint(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = mv_dedupe(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_dedupe(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_dedupe(to_geoshape(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = mv_dedupe(5)', []); - testErrorsAndWarnings('row mv_dedupe(5)', []); - testErrorsAndWarnings('row var = mv_dedupe(to_integer(true))', []); - testErrorsAndWarnings('row var = mv_dedupe(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row mv_dedupe(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = mv_dedupe(to_ip(to_ip("127.0.0.1")))', []); - testErrorsAndWarnings('row var = mv_dedupe("a")', []); - testErrorsAndWarnings('row mv_dedupe("a")', []); - testErrorsAndWarnings('row var = mv_dedupe(to_string(true))', []); - testErrorsAndWarnings('row var = mv_dedupe(to_version("1.0.0"))', []); - testErrorsAndWarnings('row mv_dedupe(to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = mv_dedupe(to_version("a"))', []); - testErrorsAndWarnings('from a_index | where mv_dedupe(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where mv_dedupe(counterDoubleField) > 0', [ - 'Argument of [mv_dedupe] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | where mv_dedupe(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_dedupe(longField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval mv_dedupe(counterDoubleField)', [ - 'Argument of [mv_dedupe] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(*)', [ - 'Using wildcards (*) in mv_dedupe is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(cartesianPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_dedupe(to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(cartesianShapeField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(cartesianShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_dedupe(to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(dateField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(geoPointField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = mv_dedupe(to_geopoint(geoPointField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(geoShapeField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = mv_dedupe(to_geoshape(geoPointField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(integerField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(ipField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(ipField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(to_ip(ipField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(longField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(textField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(textField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(versionField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(versionField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_dedupe(to_version(keywordField))', []); - - testErrorsAndWarnings('from a_index | eval mv_dedupe(booleanField, extraArg)', [ - 'Error: [mv_dedupe] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_dedupe(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_dedupe(nullVar)', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe("2022")', []); - testErrorsAndWarnings('from a_index | eval mv_dedupe(concat("20", "22"))', []); - testErrorsAndWarnings('row var = mv_dedupe(to_cartesianpoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_dedupe(to_cartesianpoint("POINT (30 10)"))', []); - - testErrorsAndWarnings( - 'row var = mv_dedupe(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_dedupe(to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings('row var = mv_dedupe(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_dedupe(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_dedupe(to_geopoint(to_geopoint("POINT (30 10)")))', []); - testErrorsAndWarnings('row var = mv_dedupe(to_geoshape(to_geopoint("POINT (30 10)")))', []); - }); - - describe('mv_first', () => { - testErrorsAndWarnings('row var = mv_first(true)', []); - testErrorsAndWarnings('row mv_first(true)', []); - testErrorsAndWarnings('row var = mv_first(to_boolean(true))', []); - testErrorsAndWarnings('row var = mv_first(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row mv_first(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_first(to_cartesianpoint(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_first(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_first(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_first(to_cartesianshape(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_first(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row mv_first(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = mv_first(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = mv_first(5.5)', []); - - testErrorsAndWarnings('row mv_first(5.5)', []); - testErrorsAndWarnings('row var = mv_first(to_double(true))', []); - testErrorsAndWarnings('row var = mv_first(geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row mv_first(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row var = mv_first(to_geopoint(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = mv_first(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_first(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_first(to_geoshape(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = mv_first(5)', []); - testErrorsAndWarnings('row mv_first(5)', []); - testErrorsAndWarnings('row var = mv_first(to_integer(true))', []); - testErrorsAndWarnings('row var = mv_first(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row mv_first(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = mv_first(to_ip(to_ip("127.0.0.1")))', []); - testErrorsAndWarnings('row var = mv_first("a")', []); - testErrorsAndWarnings('row mv_first("a")', []); - testErrorsAndWarnings('row var = mv_first(to_string(true))', []); - testErrorsAndWarnings('row var = mv_first(to_version("1.0.0"))', []); - testErrorsAndWarnings('row mv_first(to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = mv_first(to_version("a"))', []); - testErrorsAndWarnings('from a_index | where mv_first(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where mv_first(counterDoubleField) > 0', [ - 'Argument of [mv_first] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | where mv_first(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_first(longField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_first(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval mv_first(counterDoubleField)', [ - 'Argument of [mv_first] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_first(*)', [ - 'Using wildcards (*) in mv_first is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_first(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(cartesianPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_first(to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_first(cartesianShapeField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(cartesianShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_first(to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_first(dateField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(to_geopoint(geoPointField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(to_geoshape(geoPointField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(integerField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(ipField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(ipField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(to_ip(ipField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(longField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(textField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(textField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(versionField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(versionField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_first(to_version(keywordField))', []); - - testErrorsAndWarnings('from a_index | eval mv_first(booleanField, extraArg)', [ - 'Error: [mv_first] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_first(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_first(null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_first(nullVar)', []); - testErrorsAndWarnings('from a_index | eval mv_first("2022")', []); - testErrorsAndWarnings('from a_index | eval mv_first(concat("20", "22"))', []); - testErrorsAndWarnings('row var = mv_first(to_cartesianpoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_first(to_cartesianpoint("POINT (30 10)"))', []); - - testErrorsAndWarnings( - 'row var = mv_first(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_first(to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings('row var = mv_first(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_first(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_first(to_geopoint(to_geopoint("POINT (30 10)")))', []); - testErrorsAndWarnings('row var = mv_first(to_geoshape(to_geopoint("POINT (30 10)")))', []); - }); - - describe('mv_last', () => { - testErrorsAndWarnings('row var = mv_last(true)', []); - testErrorsAndWarnings('row mv_last(true)', []); - testErrorsAndWarnings('row var = mv_last(to_boolean(true))', []); - testErrorsAndWarnings('row var = mv_last(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row mv_last(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_last(to_cartesianpoint(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_last(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_last(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_last(to_cartesianshape(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = mv_last(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row mv_last(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = mv_last(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = mv_last(5.5)', []); - - testErrorsAndWarnings('row mv_last(5.5)', []); - testErrorsAndWarnings('row var = mv_last(to_double(true))', []); - testErrorsAndWarnings('row var = mv_last(geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row mv_last(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row var = mv_last(to_geopoint(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = mv_last(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_last(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_last(to_geoshape(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = mv_last(5)', []); - testErrorsAndWarnings('row mv_last(5)', []); - testErrorsAndWarnings('row var = mv_last(to_integer(true))', []); - testErrorsAndWarnings('row var = mv_last(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row mv_last(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = mv_last(to_ip(to_ip("127.0.0.1")))', []); - testErrorsAndWarnings('row var = mv_last("a")', []); - testErrorsAndWarnings('row mv_last("a")', []); - testErrorsAndWarnings('row var = mv_last(to_string(true))', []); - testErrorsAndWarnings('row var = mv_last(to_version("1.0.0"))', []); - testErrorsAndWarnings('row mv_last(to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = mv_last(to_version("a"))', []); - testErrorsAndWarnings('from a_index | where mv_last(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where mv_last(counterDoubleField) > 0', [ - 'Argument of [mv_last] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | where mv_last(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_last(longField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_last(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval mv_last(counterDoubleField)', [ - 'Argument of [mv_last] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_last(*)', [ - 'Using wildcards (*) in mv_last is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_last(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(cartesianPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_last(to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_last(cartesianShapeField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(cartesianShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_last(to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_last(dateField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(to_geopoint(geoPointField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(to_geoshape(geoPointField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(integerField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(ipField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(ipField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(to_ip(ipField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(longField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(textField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(textField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(versionField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(versionField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_last(to_version(keywordField))', []); - - testErrorsAndWarnings('from a_index | eval mv_last(booleanField, extraArg)', [ - 'Error: [mv_last] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_last(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_last(null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_last(nullVar)', []); - testErrorsAndWarnings('from a_index | eval mv_last("2022")', []); - testErrorsAndWarnings('from a_index | eval mv_last(concat("20", "22"))', []); - testErrorsAndWarnings('row var = mv_last(to_cartesianpoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_last(to_cartesianpoint("POINT (30 10)"))', []); - - testErrorsAndWarnings( - 'row var = mv_last(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_last(to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings('row var = mv_last(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row mv_last(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = mv_last(to_geopoint(to_geopoint("POINT (30 10)")))', []); - testErrorsAndWarnings('row var = mv_last(to_geoshape(to_geopoint("POINT (30 10)")))', []); - }); - - describe('mv_max', () => { - testErrorsAndWarnings('row var = mv_max(true)', []); - testErrorsAndWarnings('row mv_max(true)', []); - testErrorsAndWarnings('row var = mv_max(to_boolean(true))', []); - testErrorsAndWarnings('row var = mv_max(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row mv_max(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings( - 'row var = mv_max(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - testErrorsAndWarnings('row var = mv_max(5.5)', []); - testErrorsAndWarnings('row mv_max(5.5)', []); - testErrorsAndWarnings('row var = mv_max(to_double(true))', []); - testErrorsAndWarnings('row var = mv_max(5)', []); - testErrorsAndWarnings('row mv_max(5)', []); - testErrorsAndWarnings('row var = mv_max(to_integer(true))', []); - testErrorsAndWarnings('row var = mv_max(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row mv_max(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = mv_max(to_ip(to_ip("127.0.0.1")))', []); - testErrorsAndWarnings('row var = mv_max("a")', []); - testErrorsAndWarnings('row mv_max("a")', []); - testErrorsAndWarnings('row var = mv_max(to_string(true))', []); - testErrorsAndWarnings('row var = mv_max(to_version("1.0.0"))', []); - testErrorsAndWarnings('row mv_max(to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = mv_max(to_version("a"))', []); - - testErrorsAndWarnings('row var = mv_max(to_cartesianpoint("POINT (30 10)"))', [ - 'Argument of [mv_max] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where mv_max(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where mv_max(cartesianPointField) > 0', [ - 'Argument of [mv_max] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where mv_max(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_max(longField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_max(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval mv_max(cartesianPointField)', [ - 'Argument of [mv_max] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_max(*)', [ - 'Using wildcards (*) in mv_max is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_max(dateField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(integerField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(ipField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(ipField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(to_ip(ipField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(longField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(textField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(textField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(versionField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(versionField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_max(to_version(keywordField))', []); - - testErrorsAndWarnings('from a_index | eval mv_max(booleanField, extraArg)', [ - 'Error: [mv_max] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_max(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_max(null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_max(nullVar)', []); - testErrorsAndWarnings('from a_index | eval mv_max("2022")', []); - testErrorsAndWarnings('from a_index | eval mv_max(concat("20", "22"))', []); - }); - - describe('mv_median', () => { - testErrorsAndWarnings('row var = mv_median(5.5)', []); - testErrorsAndWarnings('row mv_median(5.5)', []); - testErrorsAndWarnings('row var = mv_median(to_double(true))', []); - testErrorsAndWarnings('row var = mv_median(5)', []); - testErrorsAndWarnings('row mv_median(5)', []); - testErrorsAndWarnings('row var = mv_median(to_integer(true))', []); - - testErrorsAndWarnings('row var = mv_median(true)', [ - 'Argument of [mv_median] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where mv_median(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where mv_median(booleanField) > 0', [ - 'Argument of [mv_median] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where mv_median(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_median(longField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_median(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = mv_median(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_median(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_median(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval mv_median(booleanField)', [ - 'Argument of [mv_median] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_median(*)', [ - 'Using wildcards (*) in mv_median is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_median(integerField)', []); - testErrorsAndWarnings('from a_index | eval mv_median(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_median(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_median(longField)', []); - testErrorsAndWarnings('from a_index | eval mv_median(longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_median(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval mv_median(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval mv_median(doubleField, extraArg)', [ - 'Error: [mv_median] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_median(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_median(null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_median(nullVar)', []); - }); - - describe('mv_min', () => { - testErrorsAndWarnings('row var = mv_min(true)', []); - testErrorsAndWarnings('row mv_min(true)', []); - testErrorsAndWarnings('row var = mv_min(to_boolean(true))', []); - testErrorsAndWarnings('row var = mv_min(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row mv_min(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings( - 'row var = mv_min(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - testErrorsAndWarnings('row var = mv_min(5.5)', []); - testErrorsAndWarnings('row mv_min(5.5)', []); - testErrorsAndWarnings('row var = mv_min(to_double(true))', []); - testErrorsAndWarnings('row var = mv_min(5)', []); - testErrorsAndWarnings('row mv_min(5)', []); - testErrorsAndWarnings('row var = mv_min(to_integer(true))', []); - testErrorsAndWarnings('row var = mv_min(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row mv_min(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = mv_min(to_ip(to_ip("127.0.0.1")))', []); - testErrorsAndWarnings('row var = mv_min("a")', []); - testErrorsAndWarnings('row mv_min("a")', []); - testErrorsAndWarnings('row var = mv_min(to_string(true))', []); - testErrorsAndWarnings('row var = mv_min(to_version("1.0.0"))', []); - testErrorsAndWarnings('row mv_min(to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = mv_min(to_version("a"))', []); - - testErrorsAndWarnings('row var = mv_min(to_cartesianpoint("POINT (30 10)"))', [ - 'Argument of [mv_min] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where mv_min(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where mv_min(cartesianPointField) > 0', [ - 'Argument of [mv_min] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where mv_min(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_min(longField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_min(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval mv_min(cartesianPointField)', [ - 'Argument of [mv_min] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_min(*)', [ - 'Using wildcards (*) in mv_min is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_min(dateField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(integerField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(ipField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(ipField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(to_ip(ipField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(longField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(textField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(textField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(versionField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(versionField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_min(to_version(keywordField))', []); - - testErrorsAndWarnings('from a_index | eval mv_min(booleanField, extraArg)', [ - 'Error: [mv_min] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_min(booleanField)', []); - testErrorsAndWarnings('from a_index | eval mv_min(null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_min(nullVar)', []); - testErrorsAndWarnings('from a_index | eval mv_min("2022")', []); - testErrorsAndWarnings('from a_index | eval mv_min(concat("20", "22"))', []); - }); - - describe('mv_slice', () => { - testErrorsAndWarnings('row var = mv_slice(true, 5, 5)', []); - testErrorsAndWarnings('row mv_slice(true, 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_boolean(true), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_slice(cartesianPointField, 5, 5)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row mv_slice(cartesianPointField, 5, 5)', [ - 'Unknown column [cartesianPointField]', - ]); - - testErrorsAndWarnings( - 'row var = mv_slice(to_cartesianpoint(cartesianPointField), to_integer(true), to_integer(true))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings('row var = mv_slice(to_cartesianshape("POINT (30 10)"), 5, 5)', []); - testErrorsAndWarnings('row mv_slice(to_cartesianshape("POINT (30 10)"), 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_cartesianshape(cartesianPointField), to_integer(true), to_integer(true))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings('row var = mv_slice(to_datetime("2021-01-01T00:00:00Z"), 5, 5)', []); - testErrorsAndWarnings('row mv_slice(to_datetime("2021-01-01T00:00:00Z"), 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_datetime(to_datetime("2021-01-01T00:00:00Z")), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_slice(5.5, 5, 5)', []); - testErrorsAndWarnings('row mv_slice(5.5, 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_double(true), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_slice(geoPointField, 5, 5)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row mv_slice(geoPointField, 5, 5)', [ - 'Unknown column [geoPointField]', - ]); - - testErrorsAndWarnings( - 'row var = mv_slice(to_geopoint(geoPointField), to_integer(true), to_integer(true))', - ['Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings('row var = mv_slice(to_geoshape("POINT (30 10)"), 5, 5)', []); - testErrorsAndWarnings('row mv_slice(to_geoshape("POINT (30 10)"), 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_geoshape(geoPointField), to_integer(true), to_integer(true))', - ['Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings('row var = mv_slice(5, 5, 5)', []); - testErrorsAndWarnings('row mv_slice(5, 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_integer(true), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_slice(to_ip("127.0.0.1"), 5, 5)', []); - testErrorsAndWarnings('row mv_slice(to_ip("127.0.0.1"), 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_ip(to_ip("127.0.0.1")), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_slice("a", 5, 5)', []); - testErrorsAndWarnings('row mv_slice("a", 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_string(true), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_slice(5, to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = mv_slice(to_version("1.0.0"), 5, 5)', []); - testErrorsAndWarnings('row mv_slice(to_version("1.0.0"), 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_version("a"), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_slice(5.5, true, true)', [ - 'Argument of [mv_slice] must be [integer], found value [true] type [boolean]', - 'Argument of [mv_slice] must be [integer], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | where mv_slice(doubleField, integerField, integerField) > 0', - [] - ); - - testErrorsAndWarnings( - 'from a_index | where mv_slice(counterDoubleField, booleanField, booleanField) > 0', - [ - 'Argument of [mv_slice] must be [boolean], found value [counterDoubleField] type [counter_double]', - 'Argument of [mv_slice] must be [integer], found value [booleanField] type [boolean]', - 'Argument of [mv_slice] must be [integer], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | where mv_slice(integerField, integerField, integerField) > 0', - [] - ); - - testErrorsAndWarnings( - 'from a_index | where mv_slice(longField, integerField, integerField) > 0', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(booleanField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(booleanField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_boolean(booleanField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(counterDoubleField, booleanField, booleanField)', - [ - 'Argument of [mv_slice] must be [boolean], found value [counterDoubleField] type [counter_double]', - 'Argument of [mv_slice] must be [integer], found value [booleanField] type [boolean]', - 'Argument of [mv_slice] must be [integer], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(cartesianPointField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(cartesianPointField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_cartesianpoint(cartesianPointField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(cartesianShapeField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(cartesianShapeField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_cartesianshape(cartesianPointField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(dateField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(dateField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_datetime(dateField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(doubleField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(doubleField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_double(booleanField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(geoPointField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(geoPointField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_geopoint(geoPointField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(geoShapeField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(geoShapeField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_geoshape(geoPointField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(integerField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(integerField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_integer(booleanField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(ipField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(ipField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_ip(ipField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(keywordField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(keywordField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_string(booleanField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(longField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(longField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(longField, to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(textField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(textField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(versionField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(versionField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(to_version(keywordField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(booleanField, integerField, integerField, extraArg)', - ['Error: [mv_slice] function expects no more than 3 arguments, got 4.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort mv_slice(booleanField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval mv_slice(null, null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_slice(nullVar, nullVar, nullVar)', []); - testErrorsAndWarnings( - 'from a_index | eval mv_slice("2022", integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_slice(concat("20", "22"), integerField, integerField)', - [] - ); - testErrorsAndWarnings('row var = mv_slice(to_cartesianpoint("POINT (30 10)"), 5, 5)', []); - testErrorsAndWarnings('row mv_slice(to_cartesianpoint("POINT (30 10)"), 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_slice(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_slice(to_datetime("2021-01-01T00:00:00Z"), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_slice(to_geopoint("POINT (30 10)"), 5, 5)', []); - testErrorsAndWarnings('row mv_slice(to_geopoint("POINT (30 10)"), 5, 5)', []); - - testErrorsAndWarnings( - 'row var = mv_slice(to_geopoint(to_geopoint("POINT (30 10)")), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings( - 'row var = mv_slice(to_geoshape(to_geopoint("POINT (30 10)")), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_slice(dateField, to_integer(booleanField), to_integer(booleanField))', - [] - ); - }); - - describe('mv_sort', () => { - testErrorsAndWarnings('row var = mv_sort(true, "asc")', []); - testErrorsAndWarnings('row mv_sort(true, "asc")', []); - testErrorsAndWarnings('row var = mv_sort(to_datetime("2021-01-01T00:00:00Z"), "asc")', []); - testErrorsAndWarnings('row mv_sort(to_datetime("2021-01-01T00:00:00Z"), "asc")', []); - testErrorsAndWarnings('row var = mv_sort(5.5, "asc")', []); - testErrorsAndWarnings('row mv_sort(5.5, "asc")', []); - testErrorsAndWarnings('row var = mv_sort(5, "asc")', []); - testErrorsAndWarnings('row mv_sort(5, "asc")', []); - testErrorsAndWarnings('row var = mv_sort(to_ip("127.0.0.1"), "asc")', []); - testErrorsAndWarnings('row mv_sort(to_ip("127.0.0.1"), "asc")', []); - testErrorsAndWarnings('row var = mv_sort("a", "asc")', []); - testErrorsAndWarnings('row mv_sort("a", "asc")', []); - testErrorsAndWarnings('row var = mv_sort(to_version("1.0.0"), "asc")', []); - testErrorsAndWarnings('row mv_sort(to_version("1.0.0"), "asc")', []); - - testErrorsAndWarnings('row var = mv_sort(to_cartesianpoint("POINT (30 10)"), true)', [ - 'Argument of [mv_sort] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - 'Argument of [mv_sort] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_sort(booleanField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(booleanField, "asc")', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(dateField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(dateField, "asc")', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(doubleField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(doubleField, "asc")', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(integerField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(integerField, "asc")', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(ipField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(ipField, "asc")', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(keywordField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(keywordField, "asc")', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(longField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(longField, "asc")', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(textField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(textField, "asc")', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(versionField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(versionField, "asc")', []); - - testErrorsAndWarnings('from a_index | eval mv_sort(booleanField, "asc", extraArg)', [ - 'Error: [mv_sort] function expects no more than 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_sort(booleanField, "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_sort(nullVar, nullVar)', []); - testErrorsAndWarnings('from a_index | eval mv_sort("2022", "asc")', []); - testErrorsAndWarnings('from a_index | eval mv_sort(concat("20", "22"), "asc")', []); - testErrorsAndWarnings( - 'row var = mv_sort(5, "a")', - [], - ['Invalid option ["a"] for mv_sort. Supported options: ["asc", "desc"].'] - ); - testErrorsAndWarnings( - 'row mv_sort(5, "a")', - [], - ['Invalid option ["a"] for mv_sort. Supported options: ["asc", "desc"].'] - ); - testErrorsAndWarnings( - 'row var = mv_sort("a", "a")', - [], - ['Invalid option ["a"] for mv_sort. Supported options: ["asc", "desc"].'] - ); - testErrorsAndWarnings( - 'row mv_sort("a", "a")', - [], - ['Invalid option ["a"] for mv_sort. Supported options: ["asc", "desc"].'] - ); - testErrorsAndWarnings( - 'row var = mv_sort(to_version("1.0.0"), "a")', - [], - ['Invalid option ["a"] for mv_sort. Supported options: ["asc", "desc"].'] - ); - testErrorsAndWarnings( - 'row mv_sort(to_version("1.0.0"), "a")', - [], - ['Invalid option ["a"] for mv_sort. Supported options: ["asc", "desc"].'] - ); - testErrorsAndWarnings('from a_index | eval var = mv_sort(longField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_sort(longField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_sort(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_sort(versionField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_sort(versionField, keywordField)', []); - }); - - describe('mv_sum', () => { - testErrorsAndWarnings('row var = mv_sum(5.5)', []); - testErrorsAndWarnings('row mv_sum(5.5)', []); - testErrorsAndWarnings('row var = mv_sum(to_double(true))', []); - testErrorsAndWarnings('row var = mv_sum(5)', []); - testErrorsAndWarnings('row mv_sum(5)', []); - testErrorsAndWarnings('row var = mv_sum(to_integer(true))', []); - - testErrorsAndWarnings('row var = mv_sum(true)', [ - 'Argument of [mv_sum] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where mv_sum(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where mv_sum(booleanField) > 0', [ - 'Argument of [mv_sum] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where mv_sum(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_sum(longField) > 0', []); - testErrorsAndWarnings('from a_index | where mv_sum(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = mv_sum(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_sum(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_sum(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval mv_sum(booleanField)', [ - 'Argument of [mv_sum] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_sum(*)', [ - 'Using wildcards (*) in mv_sum is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_sum(integerField)', []); - testErrorsAndWarnings('from a_index | eval mv_sum(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_sum(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = mv_sum(longField)', []); - testErrorsAndWarnings('from a_index | eval mv_sum(longField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_sum(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval mv_sum(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval mv_sum(doubleField, extraArg)', [ - 'Error: [mv_sum] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort mv_sum(doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_sum(null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_sum(nullVar)', []); - }); - - describe('mv_zip', () => { - testErrorsAndWarnings('row var = mv_zip("a", "a")', []); - testErrorsAndWarnings('row mv_zip("a", "a")', []); - testErrorsAndWarnings('row var = mv_zip(to_string(true), to_string(true))', []); - testErrorsAndWarnings('row var = mv_zip("a", "a", "a")', []); - testErrorsAndWarnings('row mv_zip("a", "a", "a")', []); - testErrorsAndWarnings( - 'row var = mv_zip(to_string(true), to_string(true), to_string(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_zip(true, true, true)', [ - 'Argument of [mv_zip] must be [keyword], found value [true] type [boolean]', - 'Argument of [mv_zip] must be [keyword], found value [true] type [boolean]', - 'Argument of [mv_zip] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = mv_zip(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_zip(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval mv_zip(booleanField, booleanField)', [ - 'Argument of [mv_zip] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [mv_zip] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(keywordField, keywordField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_zip(keywordField, keywordField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(to_string(booleanField), to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_zip(booleanField, booleanField, booleanField)', - [ - 'Argument of [mv_zip] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [mv_zip] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [mv_zip] must be [keyword], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(keywordField, keywordField, textField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_zip(keywordField, keywordField, textField)', - [] - ); - testErrorsAndWarnings('from a_index | eval var = mv_zip(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval mv_zip(keywordField, textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(keywordField, textField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_zip(keywordField, textField, keywordField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(keywordField, textField, textField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_zip(keywordField, textField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_zip(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_zip(textField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(textField, keywordField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_zip(textField, keywordField, keywordField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(textField, keywordField, textField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_zip(textField, keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = mv_zip(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval mv_zip(textField, textField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(textField, textField, keywordField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_zip(textField, textField, keywordField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = mv_zip(textField, textField, textField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_zip(textField, textField, textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval mv_zip(keywordField, keywordField, keywordField, extraArg)', - ['Error: [mv_zip] function expects no more than 3 arguments, got 4.'] - ); - - testErrorsAndWarnings('from a_index | sort mv_zip(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval mv_zip(null, null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_zip(nullVar, nullVar, nullVar)', []); - }); - - describe('now', () => { - testErrorsAndWarnings('row var = now()', []); - testErrorsAndWarnings('row now()', []); - testErrorsAndWarnings('from a_index | eval var = now()', []); - testErrorsAndWarnings('from a_index | eval now()', []); - - testErrorsAndWarnings('from a_index | eval now(extraArg)', [ - 'Error: [now] function expects exactly 0 arguments, got 1.', - ]); - - testErrorsAndWarnings('from a_index | sort now()', []); - testErrorsAndWarnings('row nullVar = null | eval now()', []); - }); - - describe('pi', () => { - testErrorsAndWarnings('row var = pi()', []); - testErrorsAndWarnings('row pi()', []); - testErrorsAndWarnings('from a_index | where pi() > 0', []); - testErrorsAndWarnings('from a_index | eval var = pi()', []); - testErrorsAndWarnings('from a_index | eval pi()', []); - - testErrorsAndWarnings('from a_index | eval pi(extraArg)', [ - 'Error: [pi] function expects exactly 0 arguments, got 1.', - ]); - - testErrorsAndWarnings('from a_index | sort pi()', []); - testErrorsAndWarnings('row nullVar = null | eval pi()', []); - }); - - describe('pow', () => { - testErrorsAndWarnings('row var = pow(5.5, 5.5)', []); - testErrorsAndWarnings('row pow(5.5, 5.5)', []); - testErrorsAndWarnings('row var = pow(to_double(true), to_double(true))', []); - testErrorsAndWarnings('row var = pow(5.5, 5)', []); - testErrorsAndWarnings('row pow(5.5, 5)', []); - testErrorsAndWarnings('row var = pow(to_double(true), to_integer(true))', []); - testErrorsAndWarnings('row var = pow(to_double(true), 5)', []); - testErrorsAndWarnings('row var = pow(5, 5.5)', []); - testErrorsAndWarnings('row pow(5, 5.5)', []); - testErrorsAndWarnings('row var = pow(to_integer(true), to_double(true))', []); - testErrorsAndWarnings('row var = pow(5, 5)', []); - testErrorsAndWarnings('row pow(5, 5)', []); - testErrorsAndWarnings('row var = pow(to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = pow(to_integer(true), 5)', []); - testErrorsAndWarnings('row var = pow(5, to_double(true))', []); - testErrorsAndWarnings('row var = pow(5, to_integer(true))', []); - - testErrorsAndWarnings('row var = pow(true, true)', [ - 'Argument of [pow] must be [double], found value [true] type [boolean]', - 'Argument of [pow] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where pow(doubleField, doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where pow(booleanField, booleanField) > 0', [ - 'Argument of [pow] must be [double], found value [booleanField] type [boolean]', - 'Argument of [pow] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where pow(doubleField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(doubleField, longField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(doubleField, unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(integerField, doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(integerField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(integerField, longField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(integerField, unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(longField, doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(longField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(longField, longField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(longField, unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(unsignedLongField, doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(unsignedLongField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where pow(unsignedLongField, longField) > 0', []); - testErrorsAndWarnings( - 'from a_index | where pow(unsignedLongField, unsignedLongField) > 0', - [] - ); - testErrorsAndWarnings('from a_index | eval var = pow(doubleField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval pow(doubleField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = pow(to_double(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval pow(booleanField, booleanField)', [ - 'Argument of [pow] must be [double], found value [booleanField] type [boolean]', - 'Argument of [pow] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = pow(doubleField, integerField)', []); - testErrorsAndWarnings('from a_index | eval pow(doubleField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = pow(to_double(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = pow(doubleField, longField)', []); - testErrorsAndWarnings('from a_index | eval pow(doubleField, longField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = pow(to_double(booleanField), longField)', - [] - ); - testErrorsAndWarnings('from a_index | eval var = pow(doubleField, unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval pow(doubleField, unsignedLongField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = pow(to_double(booleanField), unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = pow(integerField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval pow(integerField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = pow(to_integer(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = pow(integerField, integerField)', []); - testErrorsAndWarnings('from a_index | eval pow(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = pow(to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = pow(integerField, longField)', []); - testErrorsAndWarnings('from a_index | eval pow(integerField, longField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = pow(to_integer(booleanField), longField)', - [] - ); - testErrorsAndWarnings('from a_index | eval var = pow(integerField, unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval pow(integerField, unsignedLongField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = pow(to_integer(booleanField), unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = pow(longField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval pow(longField, doubleField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = pow(longField, to_double(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = pow(longField, integerField)', []); - testErrorsAndWarnings('from a_index | eval pow(longField, integerField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = pow(longField, to_integer(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = pow(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval pow(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval var = pow(longField, unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval pow(longField, unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = pow(unsignedLongField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval pow(unsignedLongField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = pow(unsignedLongField, to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = pow(unsignedLongField, integerField)', []); - testErrorsAndWarnings('from a_index | eval pow(unsignedLongField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = pow(unsignedLongField, to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = pow(unsignedLongField, longField)', []); - testErrorsAndWarnings('from a_index | eval pow(unsignedLongField, longField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = pow(unsignedLongField, unsignedLongField)', - [] - ); - testErrorsAndWarnings('from a_index | eval pow(unsignedLongField, unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval pow(doubleField, doubleField, extraArg)', [ - 'Error: [pow] function expects exactly 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort pow(doubleField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval pow(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval pow(nullVar, nullVar)', []); - }); - - describe('repeat', () => { - testErrorsAndWarnings('row var = repeat("a", 5)', []); - testErrorsAndWarnings('row repeat("a", 5)', []); - testErrorsAndWarnings('row var = repeat(to_string(true), to_integer(true))', []); - - testErrorsAndWarnings('row var = repeat(true, true)', [ - 'Argument of [repeat] must be [keyword], found value [true] type [boolean]', - 'Argument of [repeat] must be [integer], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = repeat(keywordField, integerField)', []); - testErrorsAndWarnings('from a_index | eval repeat(keywordField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = repeat(to_string(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval repeat(booleanField, booleanField)', [ - 'Argument of [repeat] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [repeat] must be [integer], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = repeat(textField, integerField)', []); - testErrorsAndWarnings('from a_index | eval repeat(textField, integerField)', []); - - testErrorsAndWarnings('from a_index | eval repeat(keywordField, integerField, extraArg)', [ - 'Error: [repeat] function expects exactly 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort repeat(keywordField, integerField)', []); - testErrorsAndWarnings('from a_index | eval repeat(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval repeat(nullVar, nullVar)', []); - }); - - describe('replace', () => { - testErrorsAndWarnings('row var = replace("a", "a", "a")', []); - testErrorsAndWarnings('row replace("a", "a", "a")', []); - testErrorsAndWarnings( - 'row var = replace(to_string(true), to_string(true), to_string(true))', - [] - ); - - testErrorsAndWarnings('row var = replace(true, true, true)', [ - 'Argument of [replace] must be [keyword], found value [true] type [boolean]', - 'Argument of [replace] must be [keyword], found value [true] type [boolean]', - 'Argument of [replace] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = replace(keywordField, keywordField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval replace(keywordField, keywordField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = replace(to_string(booleanField), to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval replace(booleanField, booleanField, booleanField)', - [ - 'Argument of [replace] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [replace] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [replace] must be [keyword], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = replace(keywordField, keywordField, textField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval replace(keywordField, keywordField, textField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = replace(keywordField, textField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval replace(keywordField, textField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = replace(keywordField, textField, textField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval replace(keywordField, textField, textField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = replace(textField, keywordField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval replace(textField, keywordField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = replace(textField, keywordField, textField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval replace(textField, keywordField, textField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = replace(textField, textField, keywordField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval replace(textField, textField, keywordField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | eval var = replace(textField, textField, textField)', - [] - ); - testErrorsAndWarnings('from a_index | eval replace(textField, textField, textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval replace(keywordField, keywordField, keywordField, extraArg)', - ['Error: [replace] function expects exactly 3 arguments, got 4.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort replace(keywordField, keywordField, keywordField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval replace(null, null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval replace(nullVar, nullVar, nullVar)', []); - }); - - describe('right', () => { - testErrorsAndWarnings('row var = right("a", 5)', []); - testErrorsAndWarnings('row right("a", 5)', []); - testErrorsAndWarnings('row var = right(to_string(true), to_integer(true))', []); - - testErrorsAndWarnings('row var = right(true, true)', [ - 'Argument of [right] must be [keyword], found value [true] type [boolean]', - 'Argument of [right] must be [integer], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = right(keywordField, integerField)', []); - testErrorsAndWarnings('from a_index | eval right(keywordField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = right(to_string(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval right(booleanField, booleanField)', [ - 'Argument of [right] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [right] must be [integer], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = right(textField, integerField)', []); - testErrorsAndWarnings('from a_index | eval right(textField, integerField)', []); - - testErrorsAndWarnings('from a_index | eval right(keywordField, integerField, extraArg)', [ - 'Error: [right] function expects exactly 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort right(keywordField, integerField)', []); - testErrorsAndWarnings('from a_index | eval right(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval right(nullVar, nullVar)', []); - }); - - describe('round', () => { - testErrorsAndWarnings('row var = round(5.5)', []); - testErrorsAndWarnings('row round(5.5)', []); - testErrorsAndWarnings('row var = round(to_double(true))', []); - testErrorsAndWarnings('row var = round(5.5, 5)', []); - testErrorsAndWarnings('row round(5.5, 5)', []); - testErrorsAndWarnings('row var = round(to_double(true), to_integer(true))', []); - testErrorsAndWarnings('row var = round(5)', []); - testErrorsAndWarnings('row round(5)', []); - testErrorsAndWarnings('row var = round(to_integer(true))', []); - testErrorsAndWarnings('row var = round(5, 5)', []); - testErrorsAndWarnings('row round(5, 5)', []); - testErrorsAndWarnings('row var = round(to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = round(5, to_integer(true))', []); - - testErrorsAndWarnings('row var = round(true, true)', [ - 'Argument of [round] must be [double], found value [true] type [boolean]', - 'Argument of [round] must be [integer], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where round(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where round(booleanField) > 0', [ - 'Argument of [round] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where round(doubleField, integerField) > 0', []); - - testErrorsAndWarnings('from a_index | where round(booleanField, booleanField) > 0', [ - 'Argument of [round] must be [double], found value [booleanField] type [boolean]', - 'Argument of [round] must be [integer], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where round(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where round(integerField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where round(longField) > 0', []); - testErrorsAndWarnings('from a_index | where round(longField, integerField) > 0', []); - testErrorsAndWarnings('from a_index | where round(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = round(doubleField)', []); - testErrorsAndWarnings('from a_index | eval round(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = round(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval round(booleanField)', [ - 'Argument of [round] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = round(*)', [ - 'Using wildcards (*) in round is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = round(doubleField, integerField)', []); - testErrorsAndWarnings('from a_index | eval round(doubleField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = round(to_double(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval round(booleanField, booleanField)', [ - 'Argument of [round] must be [double], found value [booleanField] type [boolean]', - 'Argument of [round] must be [integer], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = round(integerField)', []); - testErrorsAndWarnings('from a_index | eval round(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = round(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = round(integerField, integerField)', []); - testErrorsAndWarnings('from a_index | eval round(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = round(to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = round(longField)', []); - testErrorsAndWarnings('from a_index | eval round(longField)', []); - testErrorsAndWarnings('from a_index | eval var = round(longField, integerField)', []); - testErrorsAndWarnings('from a_index | eval round(longField, integerField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = round(longField, to_integer(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = round(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval round(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval round(doubleField, integerField, extraArg)', [ - 'Error: [round] function expects no more than 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort round(doubleField)', []); - testErrorsAndWarnings('from a_index | eval round(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval round(nullVar, nullVar)', []); - }); - - describe('rtrim', () => { - testErrorsAndWarnings('row var = rtrim("a")', []); - testErrorsAndWarnings('row rtrim("a")', []); - testErrorsAndWarnings('row var = rtrim(to_string(true))', []); - - testErrorsAndWarnings('row var = rtrim(true)', [ - 'Argument of [rtrim] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = rtrim(keywordField)', []); - testErrorsAndWarnings('from a_index | eval rtrim(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = rtrim(to_string(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval rtrim(booleanField)', [ - 'Argument of [rtrim] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = rtrim(*)', [ - 'Using wildcards (*) in rtrim is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = rtrim(textField)', []); - testErrorsAndWarnings('from a_index | eval rtrim(textField)', []); - - testErrorsAndWarnings('from a_index | eval rtrim(keywordField, extraArg)', [ - 'Error: [rtrim] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort rtrim(keywordField)', []); - testErrorsAndWarnings('from a_index | eval rtrim(null)', []); - testErrorsAndWarnings('row nullVar = null | eval rtrim(nullVar)', []); - }); - - describe('signum', () => { - testErrorsAndWarnings('row var = signum(5.5)', []); - testErrorsAndWarnings('row signum(5.5)', []); - testErrorsAndWarnings('row var = signum(to_double(true))', []); - testErrorsAndWarnings('row var = signum(5)', []); - testErrorsAndWarnings('row signum(5)', []); - testErrorsAndWarnings('row var = signum(to_integer(true))', []); - - testErrorsAndWarnings('row var = signum(true)', [ - 'Argument of [signum] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where signum(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where signum(booleanField) > 0', [ - 'Argument of [signum] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where signum(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where signum(longField) > 0', []); - testErrorsAndWarnings('from a_index | where signum(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = signum(doubleField)', []); - testErrorsAndWarnings('from a_index | eval signum(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = signum(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval signum(booleanField)', [ - 'Argument of [signum] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = signum(*)', [ - 'Using wildcards (*) in signum is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = signum(integerField)', []); - testErrorsAndWarnings('from a_index | eval signum(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = signum(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = signum(longField)', []); - testErrorsAndWarnings('from a_index | eval signum(longField)', []); - testErrorsAndWarnings('from a_index | eval var = signum(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval signum(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval signum(doubleField, extraArg)', [ - 'Error: [signum] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort signum(doubleField)', []); - testErrorsAndWarnings('from a_index | eval signum(null)', []); - testErrorsAndWarnings('row nullVar = null | eval signum(nullVar)', []); - }); - - describe('sin', () => { - testErrorsAndWarnings('row var = sin(5.5)', []); - testErrorsAndWarnings('row sin(5.5)', []); - testErrorsAndWarnings('row var = sin(to_double(true))', []); - testErrorsAndWarnings('row var = sin(5)', []); - testErrorsAndWarnings('row sin(5)', []); - testErrorsAndWarnings('row var = sin(to_integer(true))', []); - - testErrorsAndWarnings('row var = sin(true)', [ - 'Argument of [sin] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where sin(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where sin(booleanField) > 0', [ - 'Argument of [sin] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where sin(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where sin(longField) > 0', []); - testErrorsAndWarnings('from a_index | where sin(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = sin(doubleField)', []); - testErrorsAndWarnings('from a_index | eval sin(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = sin(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval sin(booleanField)', [ - 'Argument of [sin] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = sin(*)', [ - 'Using wildcards (*) in sin is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = sin(integerField)', []); - testErrorsAndWarnings('from a_index | eval sin(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = sin(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = sin(longField)', []); - testErrorsAndWarnings('from a_index | eval sin(longField)', []); - testErrorsAndWarnings('from a_index | eval var = sin(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval sin(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval sin(doubleField, extraArg)', [ - 'Error: [sin] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort sin(doubleField)', []); - testErrorsAndWarnings('from a_index | eval sin(null)', []); - testErrorsAndWarnings('row nullVar = null | eval sin(nullVar)', []); - }); - - describe('sinh', () => { - testErrorsAndWarnings('row var = sinh(5.5)', []); - testErrorsAndWarnings('row sinh(5.5)', []); - testErrorsAndWarnings('row var = sinh(to_double(true))', []); - testErrorsAndWarnings('row var = sinh(5)', []); - testErrorsAndWarnings('row sinh(5)', []); - testErrorsAndWarnings('row var = sinh(to_integer(true))', []); - - testErrorsAndWarnings('row var = sinh(true)', [ - 'Argument of [sinh] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where sinh(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where sinh(booleanField) > 0', [ - 'Argument of [sinh] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where sinh(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where sinh(longField) > 0', []); - testErrorsAndWarnings('from a_index | where sinh(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = sinh(doubleField)', []); - testErrorsAndWarnings('from a_index | eval sinh(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = sinh(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval sinh(booleanField)', [ - 'Argument of [sinh] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = sinh(*)', [ - 'Using wildcards (*) in sinh is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = sinh(integerField)', []); - testErrorsAndWarnings('from a_index | eval sinh(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = sinh(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = sinh(longField)', []); - testErrorsAndWarnings('from a_index | eval sinh(longField)', []); - testErrorsAndWarnings('from a_index | eval var = sinh(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval sinh(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval sinh(doubleField, extraArg)', [ - 'Error: [sinh] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort sinh(doubleField)', []); - testErrorsAndWarnings('from a_index | eval sinh(null)', []); - testErrorsAndWarnings('row nullVar = null | eval sinh(nullVar)', []); - }); - - describe('split', () => { - testErrorsAndWarnings('row var = split("a", "a")', []); - testErrorsAndWarnings('row split("a", "a")', []); - testErrorsAndWarnings('row var = split(to_string(true), to_string(true))', []); - - testErrorsAndWarnings('row var = split(true, true)', [ - 'Argument of [split] must be [keyword], found value [true] type [boolean]', - 'Argument of [split] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = split(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval split(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = split(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval split(booleanField, booleanField)', [ - 'Argument of [split] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [split] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = split(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval split(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = split(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval split(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = split(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval split(textField, textField)', []); - - testErrorsAndWarnings('from a_index | eval split(keywordField, keywordField, extraArg)', [ - 'Error: [split] function expects exactly 2 arguments, got 3.', - ]); - - testErrorsAndWarnings('from a_index | sort split(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval split(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval split(nullVar, nullVar)', []); - }); - - describe('sqrt', () => { - testErrorsAndWarnings('row var = sqrt(5.5)', []); - testErrorsAndWarnings('row sqrt(5.5)', []); - testErrorsAndWarnings('row var = sqrt(to_double(true))', []); - testErrorsAndWarnings('row var = sqrt(5)', []); - testErrorsAndWarnings('row sqrt(5)', []); - testErrorsAndWarnings('row var = sqrt(to_integer(true))', []); - - testErrorsAndWarnings('row var = sqrt(true)', [ - 'Argument of [sqrt] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where sqrt(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where sqrt(booleanField) > 0', [ - 'Argument of [sqrt] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where sqrt(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where sqrt(longField) > 0', []); - testErrorsAndWarnings('from a_index | where sqrt(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = sqrt(doubleField)', []); - testErrorsAndWarnings('from a_index | eval sqrt(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = sqrt(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval sqrt(booleanField)', [ - 'Argument of [sqrt] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = sqrt(*)', [ - 'Using wildcards (*) in sqrt is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = sqrt(integerField)', []); - testErrorsAndWarnings('from a_index | eval sqrt(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = sqrt(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = sqrt(longField)', []); - testErrorsAndWarnings('from a_index | eval sqrt(longField)', []); - testErrorsAndWarnings('from a_index | eval var = sqrt(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval sqrt(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval sqrt(doubleField, extraArg)', [ - 'Error: [sqrt] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort sqrt(doubleField)', []); - testErrorsAndWarnings('from a_index | eval sqrt(null)', []); - testErrorsAndWarnings('row nullVar = null | eval sqrt(nullVar)', []); - }); - - describe('st_contains', () => { - testErrorsAndWarnings('row var = st_contains(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row st_contains(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_contains(cartesianPointField, to_cartesianshape("POINT (30 10)"))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row st_contains(cartesianPointField, to_cartesianshape("POINT (30 10)"))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianpoint(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianshape("POINT (30 10)"), cartesianPointField)', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row st_contains(to_cartesianshape("POINT (30 10)"), cartesianPointField)', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianshape(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_contains(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings('row var = st_contains(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row st_contains(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_contains(to_geopoint(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings( - 'row var = st_contains(geoPointField, to_geoshape("POINT (30 10)"))', - ['Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row st_contains(geoPointField, to_geoshape("POINT (30 10)"))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_contains(to_geopoint(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings( - 'row var = st_contains(to_geoshape("POINT (30 10)"), geoPointField)', - ['Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row st_contains(to_geoshape("POINT (30 10)"), geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_contains(to_geoshape(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_contains(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_geoshape(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings('row var = st_contains(true, true)', [ - 'Argument of [st_contains] must be [cartesian_point], found value [true] type [boolean]', - 'Argument of [st_contains] must be [cartesian_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_contains(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_contains(booleanField, booleanField)', [ - 'Argument of [st_contains] must be [cartesian_point], found value [booleanField] type [boolean]', - 'Argument of [st_contains] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(cartesianPointField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_contains(cartesianPointField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(to_cartesianpoint(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(cartesianShapeField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_contains(cartesianShapeField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(to_cartesianshape(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_contains(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(geoPointField, geoPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_contains(geoPointField, geoPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(to_geopoint(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(geoPointField, geoShapeField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_contains(geoPointField, geoShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(to_geopoint(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(geoShapeField, geoPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_contains(geoShapeField, geoPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(to_geoshape(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(geoShapeField, geoShapeField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_contains(geoShapeField, geoShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_contains(to_geoshape(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_contains(cartesianPointField, cartesianPointField, extraArg)', - ['Error: [st_contains] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort st_contains(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_contains(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval st_contains(nullVar, nullVar)', []); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_contains(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianpoint("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_contains(to_cartesianpoint("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianshape("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_contains(to_cartesianshape("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_contains(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_geopoint(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_geopoint("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_contains(to_geopoint("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_geopoint(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_geoshape("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_contains(to_geoshape("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_geoshape(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_contains(to_geoshape(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - }); - - describe('st_disjoint', () => { - testErrorsAndWarnings('row var = st_disjoint(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row st_disjoint(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(cartesianPointField, to_cartesianshape("POINT (30 10)"))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row st_disjoint(cartesianPointField, to_cartesianshape("POINT (30 10)"))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianpoint(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianshape("POINT (30 10)"), cartesianPointField)', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row st_disjoint(to_cartesianshape("POINT (30 10)"), cartesianPointField)', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianshape(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_disjoint(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings('row var = st_disjoint(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row st_disjoint(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_disjoint(to_geopoint(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings( - 'row var = st_disjoint(geoPointField, to_geoshape("POINT (30 10)"))', - ['Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row st_disjoint(geoPointField, to_geoshape("POINT (30 10)"))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_disjoint(to_geopoint(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings( - 'row var = st_disjoint(to_geoshape("POINT (30 10)"), geoPointField)', - ['Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row st_disjoint(to_geoshape("POINT (30 10)"), geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_disjoint(to_geoshape(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_disjoint(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_geoshape(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings('row var = st_disjoint(true, true)', [ - 'Argument of [st_disjoint] must be [cartesian_point], found value [true] type [boolean]', - 'Argument of [st_disjoint] must be [cartesian_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_disjoint(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_disjoint(booleanField, booleanField)', [ - 'Argument of [st_disjoint] must be [cartesian_point], found value [booleanField] type [boolean]', - 'Argument of [st_disjoint] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(cartesianPointField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_disjoint(cartesianPointField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(to_cartesianpoint(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(cartesianShapeField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_disjoint(cartesianShapeField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(to_cartesianshape(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_disjoint(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(geoPointField, geoPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_disjoint(geoPointField, geoPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(to_geopoint(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(geoPointField, geoShapeField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_disjoint(geoPointField, geoShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(to_geopoint(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(geoShapeField, geoPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_disjoint(geoShapeField, geoPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(to_geoshape(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(geoShapeField, geoShapeField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_disjoint(geoShapeField, geoShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_disjoint(to_geoshape(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_disjoint(cartesianPointField, cartesianPointField, extraArg)', - ['Error: [st_disjoint] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort st_disjoint(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_disjoint(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval st_disjoint(nullVar, nullVar)', []); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_disjoint(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianpoint("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_disjoint(to_cartesianpoint("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianshape("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_disjoint(to_cartesianshape("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_disjoint(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_geopoint(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_geopoint("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_disjoint(to_geopoint("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_geopoint(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_geoshape("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_disjoint(to_geoshape("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_geoshape(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_disjoint(to_geoshape(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - }); - - describe('st_distance', () => { - testErrorsAndWarnings('row var = st_distance(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row st_distance(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - - testErrorsAndWarnings( - 'row var = st_distance(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings('row var = st_distance(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row st_distance(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_distance(to_geopoint(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings('row var = st_distance(true, true)', [ - 'Argument of [st_distance] must be [cartesian_point], found value [true] type [boolean]', - 'Argument of [st_distance] must be [cartesian_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_distance(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_distance(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_distance(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_distance(booleanField, booleanField)', [ - 'Argument of [st_distance] must be [cartesian_point], found value [booleanField] type [boolean]', - 'Argument of [st_distance] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_distance(geoPointField, geoPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_distance(geoPointField, geoPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_distance(to_geopoint(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_distance(cartesianPointField, cartesianPointField, extraArg)', - ['Error: [st_distance] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort st_distance(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_distance(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval st_distance(nullVar, nullVar)', []); - - testErrorsAndWarnings( - 'row var = st_distance(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_distance(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_distance(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_distance(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_distance(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_distance(to_geopoint(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - }); - - describe('st_intersects', () => { - testErrorsAndWarnings('row var = st_intersects(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row st_intersects(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(cartesianPointField, to_cartesianshape("POINT (30 10)"))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row st_intersects(cartesianPointField, to_cartesianshape("POINT (30 10)"))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianpoint(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianshape("POINT (30 10)"), cartesianPointField)', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row st_intersects(to_cartesianshape("POINT (30 10)"), cartesianPointField)', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianshape(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_intersects(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings('row var = st_intersects(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row st_intersects(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_intersects(to_geopoint(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings( - 'row var = st_intersects(geoPointField, to_geoshape("POINT (30 10)"))', - ['Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row st_intersects(geoPointField, to_geoshape("POINT (30 10)"))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_intersects(to_geopoint(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings( - 'row var = st_intersects(to_geoshape("POINT (30 10)"), geoPointField)', - ['Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row st_intersects(to_geoshape("POINT (30 10)"), geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_intersects(to_geoshape(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_intersects(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_geoshape(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings('row var = st_intersects(true, true)', [ - 'Argument of [st_intersects] must be [cartesian_point], found value [true] type [boolean]', - 'Argument of [st_intersects] must be [cartesian_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_intersects(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_intersects(booleanField, booleanField)', [ - 'Argument of [st_intersects] must be [cartesian_point], found value [booleanField] type [boolean]', - 'Argument of [st_intersects] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(cartesianPointField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_intersects(cartesianPointField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(to_cartesianpoint(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(cartesianShapeField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_intersects(cartesianShapeField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(to_cartesianshape(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_intersects(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(geoPointField, geoPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_intersects(geoPointField, geoPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(to_geopoint(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(geoPointField, geoShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_intersects(geoPointField, geoShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(to_geopoint(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(geoShapeField, geoPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_intersects(geoShapeField, geoPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(to_geoshape(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(geoShapeField, geoShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_intersects(geoShapeField, geoShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_intersects(to_geoshape(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_intersects(cartesianPointField, cartesianPointField, extraArg)', - ['Error: [st_intersects] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort st_intersects(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_intersects(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval st_intersects(nullVar, nullVar)', []); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_intersects(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianpoint("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_intersects(to_cartesianpoint("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianshape("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_intersects(to_cartesianshape("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_intersects(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_geopoint(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_geopoint("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_intersects(to_geopoint("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_geopoint(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_geoshape("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_intersects(to_geoshape("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_geoshape(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_intersects(to_geoshape(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - }); - - describe('st_within', () => { - testErrorsAndWarnings('row var = st_within(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row st_within(cartesianPointField, cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - 'Unknown column [cartesianPointField]', - ]); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_within(cartesianPointField, to_cartesianshape("POINT (30 10)"))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row st_within(cartesianPointField, to_cartesianshape("POINT (30 10)"))', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianpoint(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianshape("POINT (30 10)"), cartesianPointField)', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row st_within(to_cartesianshape("POINT (30 10)"), cartesianPointField)', - ['Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianshape(cartesianPointField), to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_within(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]', 'Unknown column [cartesianPointField]'] - ); - - testErrorsAndWarnings('row var = st_within(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row st_within(geoPointField, geoPointField)', [ - 'Unknown column [geoPointField]', - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_within(to_geopoint(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row var = st_within(geoPointField, to_geoshape("POINT (30 10)"))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row st_within(geoPointField, to_geoshape("POINT (30 10)"))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_within(to_geopoint(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - testErrorsAndWarnings('row var = st_within(to_geoshape("POINT (30 10)"), geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row st_within(to_geoshape("POINT (30 10)"), geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings( - 'row var = st_within(to_geoshape(geoPointField), to_geopoint(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_within(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_geoshape(geoPointField), to_geoshape(geoPointField))', - ['Unknown column [geoPointField]', 'Unknown column [geoPointField]'] - ); - - testErrorsAndWarnings('row var = st_within(true, true)', [ - 'Argument of [st_within] must be [cartesian_point], found value [true] type [boolean]', - 'Argument of [st_within] must be [cartesian_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_within(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_within(booleanField, booleanField)', [ - 'Argument of [st_within] must be [cartesian_point], found value [booleanField] type [boolean]', - 'Argument of [st_within] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(cartesianPointField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_within(cartesianPointField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(to_cartesianpoint(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(cartesianShapeField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_within(cartesianShapeField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(to_cartesianshape(cartesianPointField), to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_within(cartesianShapeField, cartesianShapeField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(geoPointField, geoPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_within(geoPointField, geoPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(to_geopoint(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(geoPointField, geoShapeField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_within(geoPointField, geoShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(to_geopoint(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(geoShapeField, geoPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_within(geoShapeField, geoPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(to_geoshape(geoPointField), to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(geoShapeField, geoShapeField)', - [] - ); - testErrorsAndWarnings('from a_index | eval st_within(geoShapeField, geoShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_within(to_geoshape(geoPointField), to_geoshape(geoPointField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval st_within(cartesianPointField, cartesianPointField, extraArg)', - ['Error: [st_within] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort st_within(cartesianPointField, cartesianPointField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_within(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval st_within(nullVar, nullVar)', []); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_within(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianpoint("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_within(to_cartesianpoint("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianshape("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_within(to_cartesianshape("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_within(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_geopoint(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_geopoint("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_within(to_geopoint("POINT (30 10)"), to_geoshape("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_geopoint(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_geoshape("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row st_within(to_geoshape("POINT (30 10)"), to_geopoint("POINT (30 10)"))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_geoshape(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = st_within(to_geoshape(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - }); - - describe('st_x', () => { - testErrorsAndWarnings('row var = st_x(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row st_x(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = st_x(to_cartesianpoint(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = st_x(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row st_x(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row var = st_x(to_geopoint(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - - testErrorsAndWarnings('row var = st_x(true)', [ - 'Argument of [st_x] must be [cartesian_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = st_x(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval st_x(cartesianPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_x(to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_x(booleanField)', [ - 'Argument of [st_x] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = st_x(*)', [ - 'Using wildcards (*) in st_x is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = st_x(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval st_x(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval var = st_x(to_geopoint(geoPointField))', []); - - testErrorsAndWarnings('from a_index | eval st_x(cartesianPointField, extraArg)', [ - 'Error: [st_x] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort st_x(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval st_x(null)', []); - testErrorsAndWarnings('row nullVar = null | eval st_x(nullVar)', []); - testErrorsAndWarnings('row var = st_x(to_cartesianpoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row st_x(to_cartesianpoint("POINT (30 10)"))', []); - - testErrorsAndWarnings( - 'row var = st_x(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings('row var = st_x(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row st_x(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = st_x(to_geopoint(to_geopoint("POINT (30 10)")))', []); - }); - - describe('st_y', () => { - testErrorsAndWarnings('row var = st_y(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row st_y(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = st_y(to_cartesianpoint(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = st_y(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row st_y(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row var = st_y(to_geopoint(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - - testErrorsAndWarnings('row var = st_y(true)', [ - 'Argument of [st_y] must be [cartesian_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = st_y(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval st_y(cartesianPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = st_y(to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval st_y(booleanField)', [ - 'Argument of [st_y] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = st_y(*)', [ - 'Using wildcards (*) in st_y is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = st_y(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval st_y(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval var = st_y(to_geopoint(geoPointField))', []); - - testErrorsAndWarnings('from a_index | eval st_y(cartesianPointField, extraArg)', [ - 'Error: [st_y] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort st_y(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval st_y(null)', []); - testErrorsAndWarnings('row nullVar = null | eval st_y(nullVar)', []); - testErrorsAndWarnings('row var = st_y(to_cartesianpoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row st_y(to_cartesianpoint("POINT (30 10)"))', []); - - testErrorsAndWarnings( - 'row var = st_y(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings('row var = st_y(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row st_y(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = st_y(to_geopoint(to_geopoint("POINT (30 10)")))', []); - }); - - describe('starts_with', () => { - testErrorsAndWarnings('row var = starts_with("a", "a")', []); - testErrorsAndWarnings('row starts_with("a", "a")', []); - testErrorsAndWarnings('row var = starts_with(to_string(true), to_string(true))', []); - - testErrorsAndWarnings('row var = starts_with(true, true)', [ - 'Argument of [starts_with] must be [keyword], found value [true] type [boolean]', - 'Argument of [starts_with] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = starts_with(keywordField, keywordField)', - [] - ); - testErrorsAndWarnings('from a_index | eval starts_with(keywordField, keywordField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = starts_with(to_string(booleanField), to_string(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval starts_with(booleanField, booleanField)', [ - 'Argument of [starts_with] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [starts_with] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = starts_with(textField, textField)', []); - testErrorsAndWarnings('from a_index | eval starts_with(textField, textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval starts_with(keywordField, keywordField, extraArg)', - ['Error: [starts_with] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings('from a_index | sort starts_with(keywordField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval starts_with(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval starts_with(nullVar, nullVar)', []); - testErrorsAndWarnings('from a_index | eval var = starts_with(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval starts_with(keywordField, textField)', []); - testErrorsAndWarnings('from a_index | eval var = starts_with(textField, keywordField)', []); - testErrorsAndWarnings('from a_index | eval starts_with(textField, keywordField)', []); - }); - - describe('substring', () => { - testErrorsAndWarnings('row var = substring("a", 5, 5)', []); - testErrorsAndWarnings('row substring("a", 5, 5)', []); - - testErrorsAndWarnings( - 'row var = substring(to_string(true), to_integer(true), to_integer(true))', - [] - ); - - testErrorsAndWarnings('row var = substring(true, true, true)', [ - 'Argument of [substring] must be [keyword], found value [true] type [boolean]', - 'Argument of [substring] must be [integer], found value [true] type [boolean]', - 'Argument of [substring] must be [integer], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = substring(keywordField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval substring(keywordField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = substring(to_string(booleanField), to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval substring(booleanField, booleanField, booleanField)', - [ - 'Argument of [substring] must be [keyword], found value [booleanField] type [boolean]', - 'Argument of [substring] must be [integer], found value [booleanField] type [boolean]', - 'Argument of [substring] must be [integer], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = substring(textField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval substring(textField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval substring(keywordField, integerField, integerField, extraArg)', - ['Error: [substring] function expects no more than 3 arguments, got 4.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort substring(keywordField, integerField, integerField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval substring(null, null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval substring(nullVar, nullVar, nullVar)', []); - }); - - describe('tan', () => { - testErrorsAndWarnings('row var = tan(5.5)', []); - testErrorsAndWarnings('row tan(5.5)', []); - testErrorsAndWarnings('row var = tan(to_double(true))', []); - testErrorsAndWarnings('row var = tan(5)', []); - testErrorsAndWarnings('row tan(5)', []); - testErrorsAndWarnings('row var = tan(to_integer(true))', []); - - testErrorsAndWarnings('row var = tan(true)', [ - 'Argument of [tan] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where tan(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where tan(booleanField) > 0', [ - 'Argument of [tan] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where tan(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where tan(longField) > 0', []); - testErrorsAndWarnings('from a_index | where tan(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = tan(doubleField)', []); - testErrorsAndWarnings('from a_index | eval tan(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = tan(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval tan(booleanField)', [ - 'Argument of [tan] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = tan(*)', [ - 'Using wildcards (*) in tan is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = tan(integerField)', []); - testErrorsAndWarnings('from a_index | eval tan(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = tan(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = tan(longField)', []); - testErrorsAndWarnings('from a_index | eval tan(longField)', []); - testErrorsAndWarnings('from a_index | eval var = tan(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval tan(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval tan(doubleField, extraArg)', [ - 'Error: [tan] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort tan(doubleField)', []); - testErrorsAndWarnings('from a_index | eval tan(null)', []); - testErrorsAndWarnings('row nullVar = null | eval tan(nullVar)', []); - }); - - describe('tanh', () => { - testErrorsAndWarnings('row var = tanh(5.5)', []); - testErrorsAndWarnings('row tanh(5.5)', []); - testErrorsAndWarnings('row var = tanh(to_double(true))', []); - testErrorsAndWarnings('row var = tanh(5)', []); - testErrorsAndWarnings('row tanh(5)', []); - testErrorsAndWarnings('row var = tanh(to_integer(true))', []); - - testErrorsAndWarnings('row var = tanh(true)', [ - 'Argument of [tanh] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where tanh(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where tanh(booleanField) > 0', [ - 'Argument of [tanh] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where tanh(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where tanh(longField) > 0', []); - testErrorsAndWarnings('from a_index | where tanh(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = tanh(doubleField)', []); - testErrorsAndWarnings('from a_index | eval tanh(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = tanh(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval tanh(booleanField)', [ - 'Argument of [tanh] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = tanh(*)', [ - 'Using wildcards (*) in tanh is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = tanh(integerField)', []); - testErrorsAndWarnings('from a_index | eval tanh(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = tanh(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = tanh(longField)', []); - testErrorsAndWarnings('from a_index | eval tanh(longField)', []); - testErrorsAndWarnings('from a_index | eval var = tanh(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval tanh(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval tanh(doubleField, extraArg)', [ - 'Error: [tanh] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort tanh(doubleField)', []); - testErrorsAndWarnings('from a_index | eval tanh(null)', []); - testErrorsAndWarnings('row nullVar = null | eval tanh(nullVar)', []); - }); - - describe('tau', () => { - testErrorsAndWarnings('row var = tau()', []); - testErrorsAndWarnings('row tau()', []); - testErrorsAndWarnings('from a_index | where tau() > 0', []); - testErrorsAndWarnings('from a_index | eval var = tau()', []); - testErrorsAndWarnings('from a_index | eval tau()', []); - - testErrorsAndWarnings('from a_index | eval tau(extraArg)', [ - 'Error: [tau] function expects exactly 0 arguments, got 1.', - ]); - - testErrorsAndWarnings('from a_index | sort tau()', []); - testErrorsAndWarnings('row nullVar = null | eval tau()', []); - }); - - describe('to_base64', () => { - testErrorsAndWarnings('row var = to_base64("a")', []); - testErrorsAndWarnings('row to_base64("a")', []); - testErrorsAndWarnings('row var = to_base64(to_string(true))', []); - - testErrorsAndWarnings('row var = to_base64(true)', [ - 'Argument of [to_base64] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_base64(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_base64(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_base64(to_string(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_base64(booleanField)', [ - 'Argument of [to_base64] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_base64(*)', [ - 'Using wildcards (*) in to_base64 is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_base64(textField)', []); - testErrorsAndWarnings('from a_index | eval to_base64(textField)', []); - - testErrorsAndWarnings('from a_index | eval to_base64(keywordField, extraArg)', [ - 'Error: [to_base64] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_base64(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_base64(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_base64(nullVar)', []); - }); - - describe('to_boolean', () => { - testErrorsAndWarnings('row var = to_boolean(true)', []); - testErrorsAndWarnings('row to_boolean(true)', []); - testErrorsAndWarnings('row var = to_bool(true)', []); - testErrorsAndWarnings('row var = to_boolean(to_boolean(true))', []); - testErrorsAndWarnings('row var = to_boolean(5.5)', []); - testErrorsAndWarnings('row to_boolean(5.5)', []); - testErrorsAndWarnings('row var = to_bool(5.5)', []); - testErrorsAndWarnings('row var = to_boolean(to_double(true))', []); - testErrorsAndWarnings('row var = to_boolean(5)', []); - testErrorsAndWarnings('row to_boolean(5)', []); - testErrorsAndWarnings('row var = to_bool(5)', []); - testErrorsAndWarnings('row var = to_boolean(to_integer(true))', []); - testErrorsAndWarnings('row var = to_boolean("a")', []); - testErrorsAndWarnings('row to_boolean("a")', []); - testErrorsAndWarnings('row var = to_bool("a")', []); - testErrorsAndWarnings('row var = to_boolean(to_string(true))', []); - - testErrorsAndWarnings('row var = to_boolean(to_cartesianpoint("POINT (30 10)"))', [ - 'Argument of [to_boolean] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_boolean(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_boolean(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_bool(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_boolean(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_boolean(cartesianPointField)', [ - 'Argument of [to_boolean] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_boolean(*)', [ - 'Using wildcards (*) in to_boolean is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_boolean(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_boolean(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_bool(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_boolean(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_boolean(integerField)', []); - testErrorsAndWarnings('from a_index | eval to_boolean(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_bool(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_boolean(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_boolean(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_boolean(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_bool(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_boolean(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_boolean(longField)', []); - testErrorsAndWarnings('from a_index | eval to_boolean(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_bool(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_boolean(textField)', []); - testErrorsAndWarnings('from a_index | eval to_boolean(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_bool(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_boolean(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval to_boolean(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_bool(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval to_boolean(booleanField, extraArg)', [ - 'Error: [to_boolean] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_boolean(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_boolean(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_boolean(nullVar)', []); - }); - - describe('to_cartesianpoint', () => { - testErrorsAndWarnings('row var = to_cartesianpoint(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row to_cartesianpoint(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings( - 'row var = to_cartesianpoint(to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]'] - ); - testErrorsAndWarnings('row var = to_cartesianpoint("a")', []); - testErrorsAndWarnings('row to_cartesianpoint("a")', []); - testErrorsAndWarnings('row var = to_cartesianpoint(to_string(true))', []); - - testErrorsAndWarnings('row var = to_cartesianpoint(true)', [ - 'Argument of [to_cartesianpoint] must be [cartesian_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = to_cartesianpoint(cartesianPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval to_cartesianpoint(cartesianPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = to_cartesianpoint(to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval to_cartesianpoint(booleanField)', [ - 'Argument of [to_cartesianpoint] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_cartesianpoint(*)', [ - 'Using wildcards (*) in to_cartesianpoint is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_cartesianpoint(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_cartesianpoint(keywordField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_cartesianpoint(to_string(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = to_cartesianpoint(textField)', []); - testErrorsAndWarnings('from a_index | eval to_cartesianpoint(textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval to_cartesianpoint(cartesianPointField, extraArg)', - ['Error: [to_cartesianpoint] function expects exactly one argument, got 2.'] - ); - - testErrorsAndWarnings('from a_index | sort to_cartesianpoint(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval to_cartesianpoint(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_cartesianpoint(nullVar)', []); - testErrorsAndWarnings( - 'row var = to_cartesianpoint(to_cartesianpoint("POINT (30 10)"))', - [] - ); - testErrorsAndWarnings('row to_cartesianpoint(to_cartesianpoint("POINT (30 10)"))', []); - - testErrorsAndWarnings( - 'row var = to_cartesianpoint(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - }); - - describe('to_cartesianshape', () => { - testErrorsAndWarnings('row var = to_cartesianshape(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row to_cartesianshape(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings( - 'row var = to_cartesianshape(to_cartesianpoint(cartesianPointField))', - ['Unknown column [cartesianPointField]'] - ); - testErrorsAndWarnings( - 'row var = to_cartesianshape(to_cartesianshape("POINT (30 10)"))', - [] - ); - testErrorsAndWarnings('row to_cartesianshape(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings( - 'row var = to_cartesianshape(to_cartesianshape(cartesianPointField))', - ['Unknown column [cartesianPointField]'] - ); - testErrorsAndWarnings('row var = to_cartesianshape("a")', []); - testErrorsAndWarnings('row to_cartesianshape("a")', []); - testErrorsAndWarnings('row var = to_cartesianshape(to_string(true))', []); - - testErrorsAndWarnings('row var = to_cartesianshape(true)', [ - 'Argument of [to_cartesianshape] must be [cartesian_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = to_cartesianshape(cartesianPointField)', - [] - ); - testErrorsAndWarnings('from a_index | eval to_cartesianshape(cartesianPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = to_cartesianshape(to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval to_cartesianshape(booleanField)', [ - 'Argument of [to_cartesianshape] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_cartesianshape(*)', [ - 'Using wildcards (*) in to_cartesianshape is not allowed', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = to_cartesianshape(cartesianShapeField)', - [] - ); - testErrorsAndWarnings('from a_index | eval to_cartesianshape(cartesianShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = to_cartesianshape(to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = to_cartesianshape(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_cartesianshape(keywordField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_cartesianshape(to_string(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = to_cartesianshape(textField)', []); - testErrorsAndWarnings('from a_index | eval to_cartesianshape(textField)', []); - - testErrorsAndWarnings( - 'from a_index | eval to_cartesianshape(cartesianPointField, extraArg)', - ['Error: [to_cartesianshape] function expects exactly one argument, got 2.'] - ); - - testErrorsAndWarnings('from a_index | sort to_cartesianshape(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval to_cartesianshape(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_cartesianshape(nullVar)', []); - testErrorsAndWarnings( - 'row var = to_cartesianshape(to_cartesianpoint("POINT (30 10)"))', - [] - ); - testErrorsAndWarnings('row to_cartesianshape(to_cartesianpoint("POINT (30 10)"))', []); - - testErrorsAndWarnings( - 'row var = to_cartesianshape(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = to_cartesianshape(to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - }); - - describe('to_datetime', () => { - testErrorsAndWarnings('row var = to_datetime(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row to_datetime(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row var = to_dt(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = to_datetime(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = to_datetime(5.5)', []); - testErrorsAndWarnings('row to_datetime(5.5)', []); - testErrorsAndWarnings('row var = to_dt(5.5)', []); - testErrorsAndWarnings('row var = to_datetime(to_double(true))', []); - testErrorsAndWarnings('row var = to_datetime(5)', []); - testErrorsAndWarnings('row to_datetime(5)', []); - testErrorsAndWarnings('row var = to_dt(5)', []); - testErrorsAndWarnings('row var = to_datetime(to_integer(true))', []); - testErrorsAndWarnings('row var = to_datetime("a")', []); - testErrorsAndWarnings('row to_datetime("a")', []); - testErrorsAndWarnings('row var = to_dt("a")', []); - testErrorsAndWarnings('row var = to_datetime(to_string(true))', []); - - testErrorsAndWarnings('row var = to_datetime(true)', [ - 'Argument of [to_datetime] must be [date], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_datetime(dateField)', []); - testErrorsAndWarnings('from a_index | eval to_datetime(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dt(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_datetime(to_datetime(dateField))', []); - - testErrorsAndWarnings('from a_index | eval to_datetime(booleanField)', [ - 'Argument of [to_datetime] must be [date], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_datetime(*)', [ - 'Using wildcards (*) in to_datetime is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_datetime(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_datetime(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dt(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_datetime(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_datetime(integerField)', []); - testErrorsAndWarnings('from a_index | eval to_datetime(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dt(integerField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_datetime(to_integer(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = to_datetime(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_datetime(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dt(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_datetime(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_datetime(longField)', []); - testErrorsAndWarnings('from a_index | eval to_datetime(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dt(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_datetime(textField)', []); - testErrorsAndWarnings('from a_index | eval to_datetime(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dt(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_datetime(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval to_datetime(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dt(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval to_datetime(dateField, extraArg)', [ - 'Error: [to_datetime] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_datetime(dateField)', []); - testErrorsAndWarnings('from a_index | eval to_datetime(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_datetime(nullVar)', []); - testErrorsAndWarnings('from a_index | eval to_datetime("2022")', []); - testErrorsAndWarnings('from a_index | eval to_datetime(concat("20", "22"))', []); - }); - - describe('to_degrees', () => { - testErrorsAndWarnings('row var = to_degrees(5.5)', []); - testErrorsAndWarnings('row to_degrees(5.5)', []); - testErrorsAndWarnings('row var = to_degrees(to_double(true))', []); - testErrorsAndWarnings('row var = to_degrees(5)', []); - testErrorsAndWarnings('row to_degrees(5)', []); - testErrorsAndWarnings('row var = to_degrees(to_integer(true))', []); - - testErrorsAndWarnings('row var = to_degrees(true)', [ - 'Argument of [to_degrees] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where to_degrees(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where to_degrees(booleanField) > 0', [ - 'Argument of [to_degrees] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where to_degrees(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where to_degrees(longField) > 0', []); - testErrorsAndWarnings('from a_index | where to_degrees(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = to_degrees(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_degrees(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_degrees(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_degrees(booleanField)', [ - 'Argument of [to_degrees] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_degrees(*)', [ - 'Using wildcards (*) in to_degrees is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_degrees(integerField)', []); - testErrorsAndWarnings('from a_index | eval to_degrees(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_degrees(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_degrees(longField)', []); - testErrorsAndWarnings('from a_index | eval to_degrees(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_degrees(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval to_degrees(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval to_degrees(doubleField, extraArg)', [ - 'Error: [to_degrees] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_degrees(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_degrees(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_degrees(nullVar)', []); - }); - - describe('to_double', () => { - testErrorsAndWarnings('row var = to_double(true)', []); - testErrorsAndWarnings('row to_double(true)', []); - testErrorsAndWarnings('row var = to_dbl(true)', []); - testErrorsAndWarnings('row var = to_double(to_boolean(true))', []); - testErrorsAndWarnings('row var = to_double(5.5)', []); - testErrorsAndWarnings('row to_double(5.5)', []); - testErrorsAndWarnings('row var = to_dbl(5.5)', []); - testErrorsAndWarnings('row var = to_double(5)', []); - testErrorsAndWarnings('row to_double(5)', []); - testErrorsAndWarnings('row var = to_dbl(5)', []); - testErrorsAndWarnings('row var = to_double(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row to_double(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row var = to_dbl(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = to_double(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = to_double(to_double(true))', []); - testErrorsAndWarnings('row var = to_double(to_integer(true))', []); - testErrorsAndWarnings('row var = to_double("a")', []); - testErrorsAndWarnings('row to_double("a")', []); - testErrorsAndWarnings('row var = to_dbl("a")', []); - testErrorsAndWarnings('row var = to_double(to_string(true))', []); - - testErrorsAndWarnings('row var = to_double(to_cartesianpoint("POINT (30 10)"))', [ - 'Argument of [to_double] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where to_double(booleanField) > 0', []); - - testErrorsAndWarnings('from a_index | where to_double(cartesianPointField) > 0', [ - 'Argument of [to_double] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where to_double(counterDoubleField) > 0', []); - testErrorsAndWarnings('from a_index | where to_double(counterIntegerField) > 0', []); - testErrorsAndWarnings('from a_index | where to_double(counterLongField) > 0', []); - testErrorsAndWarnings('from a_index | where to_double(dateField) > 0', []); - testErrorsAndWarnings('from a_index | where to_double(doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where to_double(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where to_double(keywordField) > 0', []); - testErrorsAndWarnings('from a_index | where to_double(longField) > 0', []); - testErrorsAndWarnings('from a_index | where to_double(textField) > 0', []); - testErrorsAndWarnings('from a_index | where to_double(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = to_double(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_double(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_double(cartesianPointField)', [ - 'Argument of [to_double] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_double(*)', [ - 'Using wildcards (*) in to_double is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_double(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | eval to_double(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | eval to_double(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(counterLongField)', []); - testErrorsAndWarnings('from a_index | eval to_double(counterLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(counterLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(dateField)', []); - testErrorsAndWarnings('from a_index | eval to_double(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = to_double(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_double(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_double(integerField)', []); - testErrorsAndWarnings('from a_index | eval to_double(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_double(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_double(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_double(longField)', []); - testErrorsAndWarnings('from a_index | eval to_double(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(textField)', []); - testErrorsAndWarnings('from a_index | eval to_double(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_double(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval to_double(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_dbl(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval to_double(booleanField, extraArg)', [ - 'Error: [to_double] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_double(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_double(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_double(nullVar)', []); - testErrorsAndWarnings('from a_index | eval to_double("2022")', []); - testErrorsAndWarnings('from a_index | eval to_double(concat("20", "22"))', []); - }); - - describe('to_geopoint', () => { - testErrorsAndWarnings('row var = to_geopoint(geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row to_geopoint(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row var = to_geopoint(to_geopoint(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = to_geopoint("a")', []); - testErrorsAndWarnings('row to_geopoint("a")', []); - testErrorsAndWarnings('row var = to_geopoint(to_string(true))', []); - - testErrorsAndWarnings('row var = to_geopoint(true)', [ - 'Argument of [to_geopoint] must be [geo_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_geopoint(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval to_geopoint(geoPointField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_geopoint(to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval to_geopoint(booleanField)', [ - 'Argument of [to_geopoint] must be [geo_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_geopoint(*)', [ - 'Using wildcards (*) in to_geopoint is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_geopoint(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_geopoint(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_geopoint(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_geopoint(textField)', []); - testErrorsAndWarnings('from a_index | eval to_geopoint(textField)', []); - - testErrorsAndWarnings('from a_index | eval to_geopoint(geoPointField, extraArg)', [ - 'Error: [to_geopoint] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_geopoint(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval to_geopoint(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_geopoint(nullVar)', []); - testErrorsAndWarnings('row var = to_geopoint(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row to_geopoint(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings( - 'row var = to_geopoint(to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - }); - - describe('to_geoshape', () => { - testErrorsAndWarnings('row var = to_geoshape(geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row to_geoshape(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row var = to_geoshape(to_geopoint(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = to_geoshape(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row to_geoshape(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = to_geoshape(to_geoshape(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = to_geoshape("a")', []); - testErrorsAndWarnings('row to_geoshape("a")', []); - testErrorsAndWarnings('row var = to_geoshape(to_string(true))', []); - - testErrorsAndWarnings('row var = to_geoshape(true)', [ - 'Argument of [to_geoshape] must be [geo_point], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_geoshape(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval to_geoshape(geoPointField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_geoshape(to_geopoint(geoPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval to_geoshape(booleanField)', [ - 'Argument of [to_geoshape] must be [geo_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_geoshape(*)', [ - 'Using wildcards (*) in to_geoshape is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_geoshape(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval to_geoshape(geoShapeField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_geoshape(to_geoshape(geoPointField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = to_geoshape(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_geoshape(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_geoshape(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_geoshape(textField)', []); - testErrorsAndWarnings('from a_index | eval to_geoshape(textField)', []); - - testErrorsAndWarnings('from a_index | eval to_geoshape(geoPointField, extraArg)', [ - 'Error: [to_geoshape] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_geoshape(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval to_geoshape(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_geoshape(nullVar)', []); - testErrorsAndWarnings('row var = to_geoshape(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row to_geoshape(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings( - 'row var = to_geoshape(to_geopoint(to_geopoint("POINT (30 10)")))', - [] - ); - testErrorsAndWarnings( - 'row var = to_geoshape(to_geoshape(to_geopoint("POINT (30 10)")))', - [] - ); - }); - - describe('to_integer', () => { - testErrorsAndWarnings('row var = to_integer(true)', []); - testErrorsAndWarnings('row to_integer(true)', []); - testErrorsAndWarnings('row var = to_int(true)', []); - testErrorsAndWarnings('row var = to_integer(to_boolean(true))', []); - testErrorsAndWarnings('row var = to_integer(5)', []); - testErrorsAndWarnings('row to_integer(5)', []); - testErrorsAndWarnings('row var = to_int(5)', []); - testErrorsAndWarnings('row var = to_integer(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row to_integer(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row var = to_int(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = to_integer(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = to_integer(5.5)', []); - testErrorsAndWarnings('row to_integer(5.5)', []); - testErrorsAndWarnings('row var = to_int(5.5)', []); - testErrorsAndWarnings('row var = to_integer(to_double(true))', []); - testErrorsAndWarnings('row var = to_integer(to_integer(true))', []); - testErrorsAndWarnings('row var = to_integer("a")', []); - testErrorsAndWarnings('row to_integer("a")', []); - testErrorsAndWarnings('row var = to_int("a")', []); - testErrorsAndWarnings('row var = to_integer(to_string(true))', []); - - testErrorsAndWarnings('row var = to_integer(to_cartesianpoint("POINT (30 10)"))', [ - 'Argument of [to_integer] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where to_integer(booleanField) > 0', []); - - testErrorsAndWarnings('from a_index | where to_integer(cartesianPointField) > 0', [ - 'Argument of [to_integer] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where to_integer(counterIntegerField) > 0', []); - testErrorsAndWarnings('from a_index | where to_integer(dateField) > 0', []); - testErrorsAndWarnings('from a_index | where to_integer(doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where to_integer(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where to_integer(keywordField) > 0', []); - testErrorsAndWarnings('from a_index | where to_integer(longField) > 0', []); - testErrorsAndWarnings('from a_index | where to_integer(textField) > 0', []); - testErrorsAndWarnings('from a_index | where to_integer(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_int(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_integer(cartesianPointField)', [ - 'Argument of [to_integer] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_integer(*)', [ - 'Using wildcards (*) in to_integer is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_integer(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_int(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(dateField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_int(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_int(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(integerField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_int(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_int(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(longField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_int(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(textField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_int(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_integer(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_int(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval to_integer(booleanField, extraArg)', [ - 'Error: [to_integer] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_integer(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_integer(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_integer(nullVar)', []); - testErrorsAndWarnings('from a_index | eval to_integer("2022")', []); - testErrorsAndWarnings('from a_index | eval to_integer(concat("20", "22"))', []); - }); - - describe('to_ip', () => { - testErrorsAndWarnings('row var = to_ip(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row to_ip(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = to_ip(to_ip(to_ip("127.0.0.1")))', []); - testErrorsAndWarnings('row var = to_ip("a")', []); - testErrorsAndWarnings('row to_ip("a")', []); - testErrorsAndWarnings('row var = to_ip(to_string(true))', []); - - testErrorsAndWarnings('row var = to_ip(true)', [ - 'Argument of [to_ip] must be [ip], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_ip(ipField)', []); - testErrorsAndWarnings('from a_index | eval to_ip(ipField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ip(to_ip(ipField))', []); - - testErrorsAndWarnings('from a_index | eval to_ip(booleanField)', [ - 'Argument of [to_ip] must be [ip], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_ip(*)', [ - 'Using wildcards (*) in to_ip is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_ip(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_ip(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ip(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_ip(textField)', []); - testErrorsAndWarnings('from a_index | eval to_ip(textField)', []); - - testErrorsAndWarnings('from a_index | eval to_ip(ipField, extraArg)', [ - 'Error: [to_ip] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_ip(ipField)', []); - testErrorsAndWarnings('from a_index | eval to_ip(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_ip(nullVar)', []); - }); - - describe('to_long', () => { - testErrorsAndWarnings('row var = to_long(true)', []); - testErrorsAndWarnings('row to_long(true)', []); - testErrorsAndWarnings('row var = to_long(to_boolean(true))', []); - testErrorsAndWarnings('row var = to_long(5)', []); - testErrorsAndWarnings('row to_long(5)', []); - testErrorsAndWarnings('row var = to_long(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row to_long(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = to_long(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = to_long(5.5)', []); - testErrorsAndWarnings('row to_long(5.5)', []); - testErrorsAndWarnings('row var = to_long(to_double(true))', []); - testErrorsAndWarnings('row var = to_long(to_integer(true))', []); - testErrorsAndWarnings('row var = to_long("a")', []); - testErrorsAndWarnings('row to_long("a")', []); - testErrorsAndWarnings('row var = to_long(to_string(true))', []); - - testErrorsAndWarnings('row var = to_long(to_cartesianpoint("POINT (30 10)"))', [ - 'Argument of [to_long] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where to_long(booleanField) > 0', []); - - testErrorsAndWarnings('from a_index | where to_long(cartesianPointField) > 0', [ - 'Argument of [to_long] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where to_long(counterIntegerField) > 0', []); - testErrorsAndWarnings('from a_index | where to_long(counterLongField) > 0', []); - testErrorsAndWarnings('from a_index | where to_long(dateField) > 0', []); - testErrorsAndWarnings('from a_index | where to_long(doubleField) > 0', []); - testErrorsAndWarnings('from a_index | where to_long(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where to_long(keywordField) > 0', []); - testErrorsAndWarnings('from a_index | where to_long(longField) > 0', []); - testErrorsAndWarnings('from a_index | where to_long(textField) > 0', []); - testErrorsAndWarnings('from a_index | where to_long(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = to_long(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_long(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_long(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_long(cartesianPointField)', [ - 'Argument of [to_long] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_long(*)', [ - 'Using wildcards (*) in to_long is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_long(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | eval to_long(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_long(counterLongField)', []); - testErrorsAndWarnings('from a_index | eval to_long(counterLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_long(dateField)', []); - testErrorsAndWarnings('from a_index | eval to_long(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_long(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = to_long(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_long(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_long(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_long(integerField)', []); - testErrorsAndWarnings('from a_index | eval to_long(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_long(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_long(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_long(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_long(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_long(longField)', []); - testErrorsAndWarnings('from a_index | eval to_long(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_long(textField)', []); - testErrorsAndWarnings('from a_index | eval to_long(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_long(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval to_long(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval to_long(booleanField, extraArg)', [ - 'Error: [to_long] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_long(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_long(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_long(nullVar)', []); - testErrorsAndWarnings('from a_index | eval to_long("2022")', []); - testErrorsAndWarnings('from a_index | eval to_long(concat("20", "22"))', []); - }); - - describe('to_lower', () => { - testErrorsAndWarnings('row var = to_lower("a")', []); - testErrorsAndWarnings('row to_lower("a")', []); - testErrorsAndWarnings('row var = to_lower(to_string(true))', []); - - testErrorsAndWarnings('row var = to_lower(true)', [ - 'Argument of [to_lower] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_lower(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_lower(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_lower(to_string(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_lower(booleanField)', [ - 'Argument of [to_lower] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_lower(*)', [ - 'Using wildcards (*) in to_lower is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_lower(textField)', []); - testErrorsAndWarnings('from a_index | eval to_lower(textField)', []); - - testErrorsAndWarnings('from a_index | eval to_lower(keywordField, extraArg)', [ - 'Error: [to_lower] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_lower(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_lower(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_lower(nullVar)', []); - }); - - describe('to_radians', () => { - testErrorsAndWarnings('row var = to_radians(5.5)', []); - testErrorsAndWarnings('row to_radians(5.5)', []); - testErrorsAndWarnings('row var = to_radians(to_double(true))', []); - testErrorsAndWarnings('row var = to_radians(5)', []); - testErrorsAndWarnings('row to_radians(5)', []); - testErrorsAndWarnings('row var = to_radians(to_integer(true))', []); - - testErrorsAndWarnings('row var = to_radians(true)', [ - 'Argument of [to_radians] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where to_radians(doubleField) > 0', []); - - testErrorsAndWarnings('from a_index | where to_radians(booleanField) > 0', [ - 'Argument of [to_radians] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | where to_radians(integerField) > 0', []); - testErrorsAndWarnings('from a_index | where to_radians(longField) > 0', []); - testErrorsAndWarnings('from a_index | where to_radians(unsignedLongField) > 0', []); - testErrorsAndWarnings('from a_index | eval var = to_radians(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_radians(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_radians(to_double(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_radians(booleanField)', [ - 'Argument of [to_radians] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_radians(*)', [ - 'Using wildcards (*) in to_radians is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_radians(integerField)', []); - testErrorsAndWarnings('from a_index | eval to_radians(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_radians(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_radians(longField)', []); - testErrorsAndWarnings('from a_index | eval to_radians(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_radians(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval to_radians(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval to_radians(doubleField, extraArg)', [ - 'Error: [to_radians] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_radians(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_radians(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_radians(nullVar)', []); - }); - - describe('to_unsigned_long', () => { - testErrorsAndWarnings('row var = to_unsigned_long(true)', []); - testErrorsAndWarnings('row to_unsigned_long(true)', []); - testErrorsAndWarnings('row var = to_ul(true)', []); - testErrorsAndWarnings('row var = to_ulong(true)', []); - testErrorsAndWarnings('row var = to_unsigned_long(to_boolean(true))', []); - testErrorsAndWarnings( - 'row var = to_unsigned_long(to_datetime("2021-01-01T00:00:00Z"))', - [] - ); - testErrorsAndWarnings('row to_unsigned_long(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row var = to_ul(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row var = to_ulong(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = to_unsigned_long(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = to_unsigned_long(5.5)', []); - testErrorsAndWarnings('row to_unsigned_long(5.5)', []); - testErrorsAndWarnings('row var = to_ul(5.5)', []); - testErrorsAndWarnings('row var = to_ulong(5.5)', []); - testErrorsAndWarnings('row var = to_unsigned_long(to_double(true))', []); - testErrorsAndWarnings('row var = to_unsigned_long(5)', []); - testErrorsAndWarnings('row to_unsigned_long(5)', []); - testErrorsAndWarnings('row var = to_ul(5)', []); - testErrorsAndWarnings('row var = to_ulong(5)', []); - testErrorsAndWarnings('row var = to_unsigned_long(to_integer(true))', []); - testErrorsAndWarnings('row var = to_unsigned_long("a")', []); - testErrorsAndWarnings('row to_unsigned_long("a")', []); - testErrorsAndWarnings('row var = to_ul("a")', []); - testErrorsAndWarnings('row var = to_ulong("a")', []); - testErrorsAndWarnings('row var = to_unsigned_long(to_string(true))', []); - - testErrorsAndWarnings('row var = to_unsigned_long(to_cartesianpoint("POINT (30 10)"))', [ - 'Argument of [to_unsigned_long] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | where to_unsigned_long(booleanField) > 0', [ - 'Argument of [>] must be [double], found value [to_unsigned_long(booleanField)] type [unsigned_long]', - ]); - - testErrorsAndWarnings('from a_index | where to_unsigned_long(cartesianPointField) > 0', [ - 'Argument of [to_unsigned_long] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - 'Argument of [>] must be [double], found value [to_unsigned_long(cartesianPointField)] type [unsigned_long]', - ]); - - testErrorsAndWarnings('from a_index | where to_unsigned_long(dateField) > 0', [ - 'Argument of [>] must be [double], found value [to_unsigned_long(dateField)] type [unsigned_long]', - ]); - testErrorsAndWarnings('from a_index | where to_unsigned_long(doubleField) > 0', [ - 'Argument of [>] must be [double], found value [to_unsigned_long(doubleField)] type [unsigned_long]', - ]); - testErrorsAndWarnings('from a_index | where to_unsigned_long(integerField) > 0', [ - 'Argument of [>] must be [double], found value [to_unsigned_long(integerField)] type [unsigned_long]', - ]); - testErrorsAndWarnings('from a_index | where to_unsigned_long(keywordField) > 0', [ - 'Argument of [>] must be [double], found value [to_unsigned_long(keywordField)] type [unsigned_long]', - ]); - testErrorsAndWarnings('from a_index | where to_unsigned_long(longField) > 0', [ - 'Argument of [>] must be [double], found value [to_unsigned_long(longField)] type [unsigned_long]', - ]); - testErrorsAndWarnings('from a_index | where to_unsigned_long(textField) > 0', [ - 'Argument of [>] must be [double], found value [to_unsigned_long(textField)] type [unsigned_long]', - ]); - testErrorsAndWarnings('from a_index | where to_unsigned_long(unsignedLongField) > 0', [ - 'Argument of [>] must be [double], found value [to_unsigned_long(unsignedLongField)] type [unsigned_long]', - ]); - testErrorsAndWarnings('from a_index | eval var = to_unsigned_long(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ul(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ulong(booleanField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_unsigned_long(to_boolean(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval to_unsigned_long(cartesianPointField)', [ - 'Argument of [to_unsigned_long] must be [boolean], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_unsigned_long(*)', [ - 'Using wildcards (*) in to_unsigned_long is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_unsigned_long(dateField)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ul(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ulong(dateField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = to_unsigned_long(to_datetime(dateField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = to_unsigned_long(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ul(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ulong(doubleField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_unsigned_long(to_double(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = to_unsigned_long(integerField)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ul(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ulong(integerField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_unsigned_long(to_integer(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = to_unsigned_long(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ul(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ulong(keywordField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_unsigned_long(to_string(booleanField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = to_unsigned_long(longField)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ul(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ulong(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_unsigned_long(textField)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ul(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ulong(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_unsigned_long(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ul(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ulong(unsignedLongField)', []); - - testErrorsAndWarnings('from a_index | eval to_unsigned_long(booleanField, extraArg)', [ - 'Error: [to_unsigned_long] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_unsigned_long(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_unsigned_long(nullVar)', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long("2022")', []); - testErrorsAndWarnings('from a_index | eval to_unsigned_long(concat("20", "22"))', []); - }); - - describe('to_upper', () => { - testErrorsAndWarnings('row var = to_upper("a")', []); - testErrorsAndWarnings('row to_upper("a")', []); - testErrorsAndWarnings('row var = to_upper(to_string(true))', []); - - testErrorsAndWarnings('row var = to_upper(true)', [ - 'Argument of [to_upper] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_upper(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_upper(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_upper(to_string(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_upper(booleanField)', [ - 'Argument of [to_upper] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_upper(*)', [ - 'Using wildcards (*) in to_upper is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_upper(textField)', []); - testErrorsAndWarnings('from a_index | eval to_upper(textField)', []); - - testErrorsAndWarnings('from a_index | eval to_upper(keywordField, extraArg)', [ - 'Error: [to_upper] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_upper(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_upper(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_upper(nullVar)', []); - }); - - describe('to_version', () => { - testErrorsAndWarnings('row var = to_version("a")', []); - testErrorsAndWarnings('row to_version("a")', []); - testErrorsAndWarnings('row var = to_ver("a")', []); - testErrorsAndWarnings('row var = to_version(to_version("1.0.0"))', []); - testErrorsAndWarnings('row to_version(to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = to_ver(to_version("1.0.0"))', []); - - testErrorsAndWarnings('row var = to_version(true)', [ - 'Argument of [to_version] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_version(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_version(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ver(keywordField)', []); - - testErrorsAndWarnings('from a_index | eval var = to_version(*)', [ - 'Using wildcards (*) in to_version is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_version(textField)', []); - testErrorsAndWarnings('from a_index | eval to_version(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ver(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_version(versionField)', []); - testErrorsAndWarnings('from a_index | eval to_version(versionField)', []); - testErrorsAndWarnings('from a_index | eval var = to_ver(versionField)', []); - - testErrorsAndWarnings('from a_index | eval to_version(keywordField, extraArg)', [ - 'Error: [to_version] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_version(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_version(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_version(nullVar)', []); - }); - - describe('trim', () => { - testErrorsAndWarnings('row var = trim("a")', []); - testErrorsAndWarnings('row trim("a")', []); - testErrorsAndWarnings('row var = trim(to_string(true))', []); - - testErrorsAndWarnings('row var = trim(true)', [ - 'Argument of [trim] must be [keyword], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = trim(keywordField)', []); - testErrorsAndWarnings('from a_index | eval trim(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = trim(to_string(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval trim(booleanField)', [ - 'Argument of [trim] must be [keyword], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | eval var = trim(*)', [ - 'Using wildcards (*) in trim is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = trim(textField)', []); - testErrorsAndWarnings('from a_index | eval trim(textField)', []); - - testErrorsAndWarnings('from a_index | eval trim(keywordField, extraArg)', [ - 'Error: [trim] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort trim(keywordField)', []); - testErrorsAndWarnings('from a_index | eval trim(null)', []); - testErrorsAndWarnings('row nullVar = null | eval trim(nullVar)', []); - }); - - describe('case', () => { - testErrorsAndWarnings('row var = case(true, "a")', []); - testErrorsAndWarnings('row case(true, "a")', []); - - testErrorsAndWarnings('row var = case(to_cartesianpoint("POINT (30 10)"), true)', [ - 'Argument of [case] must be [boolean], found value [to_cartesianpoint("POINT (30 10)")] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | eval var = case(booleanField, textField)', []); - testErrorsAndWarnings('from a_index | eval case(booleanField, textField)', []); - testErrorsAndWarnings('from a_index | sort case(booleanField, textField)', []); - testErrorsAndWarnings('from a_index | eval case(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval case(nullVar, nullVar)', []); - }); - - describe('avg', () => { - testErrorsAndWarnings('from a_index | stats var = avg(integerField)', []); - testErrorsAndWarnings('from a_index | stats avg(integerField)', []); - testErrorsAndWarnings('from a_index | stats var = round(avg(integerField))', []); - testErrorsAndWarnings('from a_index | stats round(avg(integerField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(avg(integerField)) + avg(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(avg(integerField)) + avg(integerField)', - [] - ); - testErrorsAndWarnings('from a_index | stats avg(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats var0 = avg(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), avg(doubleField / 2)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(doubleField / 2)', - [] - ); - testErrorsAndWarnings('from a_index | stats var0 = avg(integerField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), avg(integerField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(integerField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats avg(integerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = avg(integerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(integerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(integerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(integerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(integerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = avg(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats avg(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats avg(booleanField)', [ - 'Argument of [avg] must be [integer], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | stats var = avg(*)', [ - 'Using wildcards (*) in avg is not allowed', - ]); - - testErrorsAndWarnings('from a_index | stats var = avg(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | stats avg(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | stats var = round(avg(counterIntegerField))', []); - testErrorsAndWarnings('from a_index | stats round(avg(counterIntegerField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(avg(counterIntegerField)) + avg(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(avg(counterIntegerField)) + avg(counterIntegerField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = avg(counterIntegerField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(counterIntegerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = avg(counterIntegerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(counterIntegerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(counterIntegerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(counterIntegerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(counterIntegerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = avg(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField)', []); - testErrorsAndWarnings('from a_index | stats var = round(avg(doubleField))', []); - testErrorsAndWarnings('from a_index | stats round(avg(doubleField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(avg(doubleField)) + avg(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(avg(doubleField)) + avg(doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | stats var0 = avg(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), avg(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), var0 = avg(doubleField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = avg(doubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(doubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(doubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(doubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(doubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = avg(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | stats avg(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | stats var = round(avg(unsignedLongField))', []); - testErrorsAndWarnings('from a_index | stats round(avg(unsignedLongField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(avg(unsignedLongField)) + avg(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(avg(unsignedLongField)) + avg(unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = avg(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), avg(unsignedLongField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(unsignedLongField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = avg(unsignedLongField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(unsignedLongField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(unsignedLongField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(unsignedLongField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(unsignedLongField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = avg(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(longField)', []); - testErrorsAndWarnings('from a_index | stats var = round(avg(longField))', []); - testErrorsAndWarnings('from a_index | stats round(avg(longField))', []); - testErrorsAndWarnings( - 'from a_index | stats var = round(avg(longField)) + avg(longField)', - [] - ); - testErrorsAndWarnings('from a_index | stats round(avg(longField)) + avg(longField)', []); - testErrorsAndWarnings('from a_index | stats var0 = avg(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), avg(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), var0 = avg(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(longField) by round(doubleField / 2)', []); - - testErrorsAndWarnings( - 'from a_index | stats var0 = avg(longField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(longField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(longField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(longField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(longField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = avg(counterLongField)', []); - testErrorsAndWarnings('from a_index | stats avg(counterLongField)', []); - testErrorsAndWarnings('from a_index | stats var = round(avg(counterLongField))', []); - testErrorsAndWarnings('from a_index | stats round(avg(counterLongField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(avg(counterLongField)) + avg(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(avg(counterLongField)) + avg(counterLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = avg(counterLongField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), avg(counterLongField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(counterLongField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats avg(counterLongField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = avg(counterLongField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(counterLongField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(counterLongField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(counterLongField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(counterLongField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = avg(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | stats var = round(avg(counterDoubleField))', []); - testErrorsAndWarnings('from a_index | stats round(avg(counterDoubleField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(avg(counterDoubleField)) + avg(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(avg(counterDoubleField)) + avg(counterDoubleField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = avg(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), avg(counterDoubleField)', []); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(counterDoubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = avg(counterDoubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(counterDoubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(counterDoubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), avg(counterDoubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = avg(counterDoubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | sort avg(integerField)', [ - 'SORT does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(integerField)', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(integerField) > 0', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(counterIntegerField)', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(counterIntegerField) > 0', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(doubleField)', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(doubleField) > 0', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(unsignedLongField)', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(unsignedLongField) > 0', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(longField)', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(longField) > 0', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(counterLongField)', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(counterLongField) > 0', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(counterDoubleField)', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | where avg(counterDoubleField) > 0', [ - 'WHERE does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(integerField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(integerField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(integerField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(integerField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(counterIntegerField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(counterIntegerField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(counterIntegerField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(counterIntegerField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(doubleField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(doubleField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(doubleField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(doubleField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(unsignedLongField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(unsignedLongField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(unsignedLongField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(unsignedLongField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(longField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(longField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(longField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(longField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(counterLongField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(counterLongField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(counterLongField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(counterLongField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(counterDoubleField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = avg(counterDoubleField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(counterDoubleField)', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | eval avg(counterDoubleField) > 0', [ - 'EVAL does not support function avg', - ]); - - testErrorsAndWarnings('from a_index | stats avg(null)', []); - testErrorsAndWarnings('row nullVar = null | stats avg(nullVar)', []); - }); - - describe('sum', () => { - testErrorsAndWarnings('from a_index | stats var = sum(integerField)', []); - testErrorsAndWarnings('from a_index | stats sum(integerField)', []); - testErrorsAndWarnings('from a_index | stats var = round(sum(integerField))', []); - testErrorsAndWarnings('from a_index | stats round(sum(integerField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(sum(integerField)) + sum(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(sum(integerField)) + sum(integerField)', - [] - ); - testErrorsAndWarnings('from a_index | stats sum(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats var0 = sum(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), sum(doubleField / 2)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(doubleField / 2)', - [] - ); - testErrorsAndWarnings('from a_index | stats var0 = sum(integerField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), sum(integerField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(integerField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats sum(integerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = sum(integerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(integerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(integerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(integerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(integerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = sum(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats sum(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats sum(booleanField)', [ - 'Argument of [sum] must be [integer], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | stats var = sum(*)', [ - 'Using wildcards (*) in sum is not allowed', - ]); - - testErrorsAndWarnings('from a_index | stats var = sum(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | stats sum(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | stats var = round(sum(counterIntegerField))', []); - testErrorsAndWarnings('from a_index | stats round(sum(counterIntegerField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(sum(counterIntegerField)) + sum(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(sum(counterIntegerField)) + sum(counterIntegerField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = sum(counterIntegerField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats sum(counterIntegerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = sum(counterIntegerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(counterIntegerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(counterIntegerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(counterIntegerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(counterIntegerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = sum(doubleField)', []); - testErrorsAndWarnings('from a_index | stats sum(doubleField)', []); - testErrorsAndWarnings('from a_index | stats var = round(sum(doubleField))', []); - testErrorsAndWarnings('from a_index | stats round(sum(doubleField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(sum(doubleField)) + sum(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(sum(doubleField)) + sum(doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | stats var0 = sum(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), sum(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), var0 = sum(doubleField)', []); - testErrorsAndWarnings( - 'from a_index | stats sum(doubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = sum(doubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(doubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(doubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(doubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(doubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = sum(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | stats sum(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | stats var = round(sum(unsignedLongField))', []); - testErrorsAndWarnings('from a_index | stats round(sum(unsignedLongField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(sum(unsignedLongField)) + sum(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(sum(unsignedLongField)) + sum(unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = sum(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), sum(unsignedLongField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats sum(unsignedLongField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = sum(unsignedLongField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(unsignedLongField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(unsignedLongField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(unsignedLongField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(unsignedLongField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = sum(longField)', []); - testErrorsAndWarnings('from a_index | stats sum(longField)', []); - testErrorsAndWarnings('from a_index | stats var = round(sum(longField))', []); - testErrorsAndWarnings('from a_index | stats round(sum(longField))', []); - testErrorsAndWarnings( - 'from a_index | stats var = round(sum(longField)) + sum(longField)', - [] - ); - testErrorsAndWarnings('from a_index | stats round(sum(longField)) + sum(longField)', []); - testErrorsAndWarnings('from a_index | stats var0 = sum(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), sum(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), var0 = sum(longField)', []); - testErrorsAndWarnings('from a_index | stats sum(longField) by round(doubleField / 2)', []); - - testErrorsAndWarnings( - 'from a_index | stats var0 = sum(longField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(longField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(longField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(longField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(longField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = sum(counterLongField)', []); - testErrorsAndWarnings('from a_index | stats sum(counterLongField)', []); - testErrorsAndWarnings('from a_index | stats var = round(sum(counterLongField))', []); - testErrorsAndWarnings('from a_index | stats round(sum(counterLongField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(sum(counterLongField)) + sum(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(sum(counterLongField)) + sum(counterLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = sum(counterLongField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), sum(counterLongField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(counterLongField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats sum(counterLongField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = sum(counterLongField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(counterLongField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(counterLongField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(counterLongField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(counterLongField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = sum(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | stats sum(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | stats var = round(sum(counterDoubleField))', []); - testErrorsAndWarnings('from a_index | stats round(sum(counterDoubleField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(sum(counterDoubleField)) + sum(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(sum(counterDoubleField)) + sum(counterDoubleField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = sum(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), sum(counterDoubleField)', []); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats sum(counterDoubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = sum(counterDoubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(counterDoubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(counterDoubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), sum(counterDoubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = sum(counterDoubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | sort sum(integerField)', [ - 'SORT does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(integerField)', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(integerField) > 0', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(counterIntegerField)', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(counterIntegerField) > 0', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(doubleField)', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(doubleField) > 0', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(unsignedLongField)', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(unsignedLongField) > 0', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(longField)', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(longField) > 0', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(counterLongField)', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(counterLongField) > 0', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(counterDoubleField)', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | where sum(counterDoubleField) > 0', [ - 'WHERE does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(integerField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(integerField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(integerField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(integerField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(counterIntegerField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(counterIntegerField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(counterIntegerField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(counterIntegerField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(doubleField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(doubleField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(doubleField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(doubleField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(unsignedLongField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(unsignedLongField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(unsignedLongField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(unsignedLongField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(longField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(longField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(longField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(longField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(counterLongField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(counterLongField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(counterLongField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(counterLongField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(counterDoubleField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval var = sum(counterDoubleField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(counterDoubleField)', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | eval sum(counterDoubleField) > 0', [ - 'EVAL does not support function sum', - ]); - - testErrorsAndWarnings('from a_index | stats sum(null)', []); - testErrorsAndWarnings('row nullVar = null | stats sum(nullVar)', []); - }); - - describe('median', () => { - testErrorsAndWarnings('from a_index | stats var = median(integerField)', []); - testErrorsAndWarnings('from a_index | stats median(integerField)', []); - testErrorsAndWarnings('from a_index | stats var = round(median(integerField))', []); - testErrorsAndWarnings('from a_index | stats round(median(integerField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median(integerField)) + median(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median(integerField)) + median(integerField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats median(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats var0 = median(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), median(doubleField / 2)', []); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(doubleField / 2)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = median(integerField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), median(integerField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(integerField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats median(integerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median(integerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(integerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(integerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(integerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(integerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = median(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats median(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats median(booleanField)', [ - 'Argument of [median] must be [integer], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | stats var = median(*)', [ - 'Using wildcards (*) in median is not allowed', - ]); - - testErrorsAndWarnings('from a_index | stats var = median(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | stats median(counterIntegerField)', []); - testErrorsAndWarnings('from a_index | stats var = round(median(counterIntegerField))', []); - testErrorsAndWarnings('from a_index | stats round(median(counterIntegerField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median(counterIntegerField)) + median(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median(counterIntegerField)) + median(counterIntegerField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = median(counterIntegerField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median(counterIntegerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median(counterIntegerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(counterIntegerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(counterIntegerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(counterIntegerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(counterIntegerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = median(doubleField)', []); - testErrorsAndWarnings('from a_index | stats median(doubleField)', []); - testErrorsAndWarnings('from a_index | stats var = round(median(doubleField))', []); - testErrorsAndWarnings('from a_index | stats round(median(doubleField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median(doubleField)) + median(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median(doubleField)) + median(doubleField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = median(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), median(doubleField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(doubleField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats median(doubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median(doubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(doubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(doubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(doubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(doubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = median(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | stats median(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | stats var = round(median(unsignedLongField))', []); - testErrorsAndWarnings('from a_index | stats round(median(unsignedLongField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median(unsignedLongField)) + median(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median(unsignedLongField)) + median(unsignedLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = median(unsignedLongField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median(unsignedLongField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median(unsignedLongField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(unsignedLongField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(unsignedLongField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(unsignedLongField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(unsignedLongField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = median(longField)', []); - testErrorsAndWarnings('from a_index | stats median(longField)', []); - testErrorsAndWarnings('from a_index | stats var = round(median(longField))', []); - testErrorsAndWarnings('from a_index | stats round(median(longField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median(longField)) + median(longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median(longField)) + median(longField)', - [] - ); - testErrorsAndWarnings('from a_index | stats var0 = median(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), median(longField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(longField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats median(longField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median(longField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(longField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(longField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(longField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(longField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = median(counterLongField)', []); - testErrorsAndWarnings('from a_index | stats median(counterLongField)', []); - testErrorsAndWarnings('from a_index | stats var = round(median(counterLongField))', []); - testErrorsAndWarnings('from a_index | stats round(median(counterLongField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median(counterLongField)) + median(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median(counterLongField)) + median(counterLongField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = median(counterLongField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median(counterLongField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median(counterLongField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(counterLongField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(counterLongField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(counterLongField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(counterLongField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = median(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | stats median(counterDoubleField)', []); - testErrorsAndWarnings('from a_index | stats var = round(median(counterDoubleField))', []); - testErrorsAndWarnings('from a_index | stats round(median(counterDoubleField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median(counterDoubleField)) + median(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median(counterDoubleField)) + median(counterDoubleField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = median(counterDoubleField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median(counterDoubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median(counterDoubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(counterDoubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(counterDoubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median(counterDoubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median(counterDoubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | sort median(integerField)', [ - 'SORT does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(integerField)', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(integerField) > 0', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(counterIntegerField)', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(counterIntegerField) > 0', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(doubleField)', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(doubleField) > 0', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(unsignedLongField)', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(unsignedLongField) > 0', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(longField)', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(longField) > 0', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(counterLongField)', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(counterLongField) > 0', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(counterDoubleField)', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | where median(counterDoubleField) > 0', [ - 'WHERE does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(integerField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(integerField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(integerField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(integerField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(counterIntegerField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(counterIntegerField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(counterIntegerField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(counterIntegerField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(doubleField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(doubleField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(doubleField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(doubleField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(unsignedLongField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(unsignedLongField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(unsignedLongField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(unsignedLongField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(longField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(longField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(longField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(longField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(counterLongField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(counterLongField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(counterLongField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(counterLongField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(counterDoubleField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval var = median(counterDoubleField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(counterDoubleField)', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | eval median(counterDoubleField) > 0', [ - 'EVAL does not support function median', - ]); - - testErrorsAndWarnings('from a_index | stats median(null)', []); - testErrorsAndWarnings('row nullVar = null | stats median(nullVar)', []); - }); - - describe('median_absolute_deviation', () => { - testErrorsAndWarnings( - 'from a_index | stats var = median_absolute_deviation(integerField)', - [] - ); - testErrorsAndWarnings('from a_index | stats median_absolute_deviation(integerField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(integerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(integerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(integerField)) + median_absolute_deviation(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(integerField)) + median_absolute_deviation(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(integerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(integerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(integerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(integerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(integerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(integerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = median_absolute_deviation(avg(integerField))', - [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ] - ); - - testErrorsAndWarnings('from a_index | stats median_absolute_deviation(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats median_absolute_deviation(booleanField)', [ - 'Argument of [median_absolute_deviation] must be [integer], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | stats var = median_absolute_deviation(*)', [ - 'Using wildcards (*) in median_absolute_deviation is not allowed', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = median_absolute_deviation(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(counterIntegerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(counterIntegerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(counterIntegerField)) + median_absolute_deviation(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(counterIntegerField)) + median_absolute_deviation(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(counterIntegerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(counterIntegerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(counterIntegerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(counterIntegerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(counterIntegerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(counterIntegerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(counterIntegerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = median_absolute_deviation(doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | stats median_absolute_deviation(doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(doubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(doubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(doubleField)) + median_absolute_deviation(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(doubleField)) + median_absolute_deviation(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(doubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(doubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(doubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(doubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(doubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(doubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = median_absolute_deviation(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(unsignedLongField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(unsignedLongField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(unsignedLongField)) + median_absolute_deviation(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(unsignedLongField)) + median_absolute_deviation(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(unsignedLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(unsignedLongField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(unsignedLongField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(unsignedLongField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(unsignedLongField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(unsignedLongField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(unsignedLongField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = median_absolute_deviation(longField)', - [] - ); - testErrorsAndWarnings('from a_index | stats median_absolute_deviation(longField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(longField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(longField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(longField)) + median_absolute_deviation(longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(longField)) + median_absolute_deviation(longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(longField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(longField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(longField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(longField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(longField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(longField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = median_absolute_deviation(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(counterLongField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(counterLongField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(counterLongField)) + median_absolute_deviation(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(counterLongField)) + median_absolute_deviation(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(counterLongField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(counterLongField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(counterLongField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(counterLongField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(counterLongField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(counterLongField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(counterLongField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = median_absolute_deviation(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(counterDoubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(counterDoubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(median_absolute_deviation(counterDoubleField)) + median_absolute_deviation(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(median_absolute_deviation(counterDoubleField)) + median_absolute_deviation(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats median_absolute_deviation(counterDoubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = median_absolute_deviation(counterDoubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(counterDoubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(counterDoubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), median_absolute_deviation(counterDoubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = median_absolute_deviation(counterDoubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | sort median_absolute_deviation(integerField)', [ - 'SORT does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings('from a_index | where median_absolute_deviation(integerField)', [ - 'WHERE does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings('from a_index | where median_absolute_deviation(integerField) > 0', [ - 'WHERE does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | where median_absolute_deviation(counterIntegerField)', - ['WHERE does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | where median_absolute_deviation(counterIntegerField) > 0', - ['WHERE does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | where median_absolute_deviation(doubleField)', [ - 'WHERE does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings('from a_index | where median_absolute_deviation(doubleField) > 0', [ - 'WHERE does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings('from a_index | where median_absolute_deviation(unsignedLongField)', [ - 'WHERE does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | where median_absolute_deviation(unsignedLongField) > 0', - ['WHERE does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | where median_absolute_deviation(longField)', [ - 'WHERE does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings('from a_index | where median_absolute_deviation(longField) > 0', [ - 'WHERE does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings('from a_index | where median_absolute_deviation(counterLongField)', [ - 'WHERE does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | where median_absolute_deviation(counterLongField) > 0', - ['WHERE does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | where median_absolute_deviation(counterDoubleField)', - ['WHERE does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | where median_absolute_deviation(counterDoubleField) > 0', - ['WHERE does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | eval var = median_absolute_deviation(integerField)', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(integerField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | eval median_absolute_deviation(integerField)', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings('from a_index | eval median_absolute_deviation(integerField) > 0', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(counterIntegerField)', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(counterIntegerField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | eval median_absolute_deviation(counterIntegerField)', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | eval median_absolute_deviation(counterIntegerField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | eval var = median_absolute_deviation(doubleField)', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(doubleField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | eval median_absolute_deviation(doubleField)', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings('from a_index | eval median_absolute_deviation(doubleField) > 0', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(unsignedLongField)', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(unsignedLongField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | eval median_absolute_deviation(unsignedLongField)', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | eval median_absolute_deviation(unsignedLongField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | eval var = median_absolute_deviation(longField)', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(longField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | eval median_absolute_deviation(longField)', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings('from a_index | eval median_absolute_deviation(longField) > 0', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(counterLongField)', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(counterLongField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | eval median_absolute_deviation(counterLongField)', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | eval median_absolute_deviation(counterLongField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(counterDoubleField)', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = median_absolute_deviation(counterDoubleField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | eval median_absolute_deviation(counterDoubleField)', [ - 'EVAL does not support function median_absolute_deviation', - ]); - - testErrorsAndWarnings( - 'from a_index | eval median_absolute_deviation(counterDoubleField) > 0', - ['EVAL does not support function median_absolute_deviation'] - ); - - testErrorsAndWarnings('from a_index | stats median_absolute_deviation(null)', []); - testErrorsAndWarnings('row nullVar = null | stats median_absolute_deviation(nullVar)', []); - }); - describe('max', () => { - testErrorsAndWarnings('from a_index | stats var = max(doubleField)', []); - testErrorsAndWarnings('from a_index | stats max(doubleField)', []); - testErrorsAndWarnings('from a_index | stats var = round(max(doubleField))', []); - testErrorsAndWarnings('from a_index | stats round(max(doubleField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(max(doubleField)) + max(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(max(doubleField)) + max(doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | stats max(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats var0 = max(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), max(doubleField / 2)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = max(doubleField / 2)', - [] - ); - testErrorsAndWarnings('from a_index | stats var0 = max(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), max(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), var0 = max(doubleField)', []); - testErrorsAndWarnings( - 'from a_index | stats max(doubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = max(doubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), max(doubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = max(doubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), max(doubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = max(doubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = max(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats max(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats max(cartesianPointField)', [ - 'Argument of [max] must be [double], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | stats var = max(*)', [ - 'Using wildcards (*) in max is not allowed', - ]); - - testErrorsAndWarnings('from a_index | stats var = max(longField)', []); - testErrorsAndWarnings('from a_index | stats max(longField)', []); - testErrorsAndWarnings('from a_index | stats var = round(max(longField))', []); - testErrorsAndWarnings('from a_index | stats round(max(longField))', []); - testErrorsAndWarnings( - 'from a_index | stats var = round(max(longField)) + max(longField)', - [] - ); - testErrorsAndWarnings('from a_index | stats round(max(longField)) + max(longField)', []); - testErrorsAndWarnings('from a_index | stats var0 = max(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), max(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), var0 = max(longField)', []); - testErrorsAndWarnings('from a_index | stats max(longField) by round(doubleField / 2)', []); - - testErrorsAndWarnings( - 'from a_index | stats var0 = max(longField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), max(longField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = max(longField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), max(longField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = max(longField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = max(integerField)', []); - testErrorsAndWarnings('from a_index | stats max(integerField)', []); - testErrorsAndWarnings('from a_index | stats var = round(max(integerField))', []); - testErrorsAndWarnings('from a_index | stats round(max(integerField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(max(integerField)) + max(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(max(integerField)) + max(integerField)', - [] - ); - testErrorsAndWarnings('from a_index | stats var0 = max(integerField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), max(integerField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = max(integerField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats max(integerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = max(integerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), max(integerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = max(integerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), max(integerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = max(integerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = max(dateField)', []); - testErrorsAndWarnings('from a_index | stats max(dateField)', []); - testErrorsAndWarnings('from a_index | stats var = max(booleanField)', []); - testErrorsAndWarnings('from a_index | stats max(booleanField)', []); - testErrorsAndWarnings('from a_index | stats var = max(ipField)', []); - testErrorsAndWarnings('from a_index | stats max(ipField)', []); - - testErrorsAndWarnings('from a_index | sort max(doubleField)', [ - 'SORT does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(doubleField)', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(doubleField) > 0', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(longField)', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(longField) > 0', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(integerField)', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(integerField) > 0', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(dateField)', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(dateField) > 0', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(booleanField)', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(booleanField) > 0', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(ipField)', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(ipField) > 0', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(doubleField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(doubleField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(doubleField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(doubleField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(longField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(longField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(longField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(longField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(integerField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(integerField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(integerField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(integerField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(dateField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(dateField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(dateField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(dateField) > 0', [ - 'EVAL does not support function max', - ]); - testErrorsAndWarnings('from a_index | eval var = max(booleanField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(booleanField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(booleanField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(booleanField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(ipField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(ipField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(ipField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(ipField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | stats max(null)', []); - testErrorsAndWarnings('row nullVar = null | stats max(nullVar)', []); - testErrorsAndWarnings('from a_index | stats max("2022")', []); - testErrorsAndWarnings('from a_index | stats max(concat("20", "22"))', []); - - testErrorsAndWarnings('from a_index | stats var = max(textField)', []); - - testErrorsAndWarnings('from a_index | stats max(textField)', []); - - testErrorsAndWarnings('from a_index | where max(textField)', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(textField) > 0', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(textField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(textField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(textField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(textField) > 0', [ - 'EVAL does not support function max', - ]); - testErrorsAndWarnings('from a_index | stats var = max(versionField)', []); - testErrorsAndWarnings('from a_index | stats max(versionField)', []); - testErrorsAndWarnings('from a_index | stats var = max(keywordField)', []); - testErrorsAndWarnings('from a_index | stats max(keywordField)', []); - - testErrorsAndWarnings('from a_index | where max(versionField)', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(versionField) > 0', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(keywordField)', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | where max(keywordField) > 0', [ - 'WHERE does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(versionField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(versionField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(versionField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(versionField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(keywordField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval var = max(keywordField) > 0', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(keywordField)', [ - 'EVAL does not support function max', - ]); - - testErrorsAndWarnings('from a_index | eval max(keywordField) > 0', [ - 'EVAL does not support function max', - ]); - }); - - describe('min', () => { - testErrorsAndWarnings('from a_index | stats var = min(doubleField)', []); - testErrorsAndWarnings('from a_index | stats min(doubleField)', []); - testErrorsAndWarnings('from a_index | stats var = round(min(doubleField))', []); - testErrorsAndWarnings('from a_index | stats round(min(doubleField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(min(doubleField)) + min(doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(min(doubleField)) + min(doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | stats min(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats var0 = min(doubleField / 2)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), min(doubleField / 2)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = min(doubleField / 2)', - [] - ); - testErrorsAndWarnings('from a_index | stats var0 = min(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), min(doubleField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), var0 = min(doubleField)', []); - testErrorsAndWarnings( - 'from a_index | stats min(doubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = min(doubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), min(doubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = min(doubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), min(doubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = min(doubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = min(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats min(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats min(cartesianPointField)', [ - 'Argument of [min] must be [double], found value [cartesianPointField] type [cartesian_point]', - ]); - - testErrorsAndWarnings('from a_index | stats var = min(*)', [ - 'Using wildcards (*) in min is not allowed', - ]); - - testErrorsAndWarnings('from a_index | stats var = min(longField)', []); - testErrorsAndWarnings('from a_index | stats min(longField)', []); - testErrorsAndWarnings('from a_index | stats var = round(min(longField))', []); - testErrorsAndWarnings('from a_index | stats round(min(longField))', []); - testErrorsAndWarnings( - 'from a_index | stats var = round(min(longField)) + min(longField)', - [] - ); - testErrorsAndWarnings('from a_index | stats round(min(longField)) + min(longField)', []); - testErrorsAndWarnings('from a_index | stats var0 = min(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), min(longField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), var0 = min(longField)', []); - testErrorsAndWarnings('from a_index | stats min(longField) by round(doubleField / 2)', []); - - testErrorsAndWarnings( - 'from a_index | stats var0 = min(longField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), min(longField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = min(longField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), min(longField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = min(longField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = min(integerField)', []); - testErrorsAndWarnings('from a_index | stats min(integerField)', []); - testErrorsAndWarnings('from a_index | stats var = round(min(integerField))', []); - testErrorsAndWarnings('from a_index | stats round(min(integerField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(min(integerField)) + min(integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(min(integerField)) + min(integerField)', - [] - ); - testErrorsAndWarnings('from a_index | stats var0 = min(integerField)', []); - testErrorsAndWarnings('from a_index | stats avg(doubleField), min(integerField)', []); - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = min(integerField)', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats min(integerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = min(integerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), min(integerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = min(integerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), min(integerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = min(integerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = min(dateField)', []); - testErrorsAndWarnings('from a_index | stats min(dateField)', []); - testErrorsAndWarnings('from a_index | stats var = min(booleanField)', []); - testErrorsAndWarnings('from a_index | stats min(booleanField)', []); - testErrorsAndWarnings('from a_index | stats var = min(ipField)', []); - testErrorsAndWarnings('from a_index | stats min(ipField)', []); - - testErrorsAndWarnings('from a_index | sort min(doubleField)', [ - 'SORT does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(doubleField)', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(doubleField) > 0', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(longField)', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(longField) > 0', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(integerField)', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(integerField) > 0', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(dateField)', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(dateField) > 0', [ - 'WHERE does not support function min', - ]); - testErrorsAndWarnings('from a_index | where min(booleanField)', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(booleanField) > 0', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(ipField)', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(ipField) > 0', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(doubleField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(doubleField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(doubleField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(doubleField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(longField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(longField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(longField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(longField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(integerField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(integerField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(integerField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(integerField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(dateField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(dateField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(dateField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(dateField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(booleanField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(booleanField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(booleanField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(booleanField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(ipField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(ipField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(ipField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(ipField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | stats min(null)', []); - testErrorsAndWarnings('row nullVar = null | stats min(nullVar)', []); - testErrorsAndWarnings('from a_index | stats min("2022")', []); - testErrorsAndWarnings('from a_index | stats min(concat("20", "22"))', []); - - testErrorsAndWarnings('from a_index | stats var = min(textField)', []); - - testErrorsAndWarnings('from a_index | stats min(textField)', []); - - testErrorsAndWarnings('from a_index | where min(textField)', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(textField) > 0', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(textField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(textField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(textField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(textField) > 0', [ - 'EVAL does not support function min', - ]); - testErrorsAndWarnings('from a_index | stats var = min(versionField)', []); - testErrorsAndWarnings('from a_index | stats min(versionField)', []); - testErrorsAndWarnings('from a_index | stats var = min(keywordField)', []); - testErrorsAndWarnings('from a_index | stats min(keywordField)', []); - - testErrorsAndWarnings('from a_index | where min(versionField)', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(versionField) > 0', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(keywordField)', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | where min(keywordField) > 0', [ - 'WHERE does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(versionField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(versionField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(versionField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(versionField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(keywordField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval var = min(keywordField) > 0', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(keywordField)', [ - 'EVAL does not support function min', - ]); - - testErrorsAndWarnings('from a_index | eval min(keywordField) > 0', [ - 'EVAL does not support function min', - ]); - }); - - describe('count', () => { - testErrorsAndWarnings('from a_index | stats var = count(textField)', []); - testErrorsAndWarnings('from a_index | stats count(textField)', []); - testErrorsAndWarnings('from a_index | stats var = round(count(textField))', []); - testErrorsAndWarnings('from a_index | stats round(count(textField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(count(textField)) + count(textField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(count(textField)) + count(textField)', - [] - ); - - testErrorsAndWarnings('from a_index | sort count(textField)', [ - 'SORT does not support function count', - ]); - - testErrorsAndWarnings('from a_index | where count(textField)', [ - 'WHERE does not support function count', - ]); - - testErrorsAndWarnings('from a_index | where count(textField) > 0', [ - 'WHERE does not support function count', - ]); - - testErrorsAndWarnings('from a_index | eval var = count(textField)', [ - 'EVAL does not support function count', - ]); - - testErrorsAndWarnings('from a_index | eval var = count(textField) > 0', [ - 'EVAL does not support function count', - ]); - - testErrorsAndWarnings('from a_index | eval count(textField)', [ - 'EVAL does not support function count', - ]); - - testErrorsAndWarnings('from a_index | eval count(textField) > 0', [ - 'EVAL does not support function count', - ]); - - testErrorsAndWarnings('from a_index | stats count(null)', []); - testErrorsAndWarnings('row nullVar = null | stats count(nullVar)', []); - }); - - describe('count_distinct', () => { - testErrorsAndWarnings( - 'from a_index | stats count_distinct(null, null, null, null, null, null, null, null)', - [] - ); - - testErrorsAndWarnings( - 'row nullVar = null | stats count_distinct(nullVar, nullVar, nullVar, nullVar, nullVar, nullVar, nullVar, nullVar)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)) + count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)) + count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | sort count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)', - ['SORT does not support function count_distinct'] - ); - - testErrorsAndWarnings( - 'from a_index | where count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)', - ['WHERE does not support function count_distinct'] - ); - - testErrorsAndWarnings( - 'from a_index | where count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField) > 0', - ['WHERE does not support function count_distinct'] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)', - ['EVAL does not support function count_distinct'] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField) > 0', - ['EVAL does not support function count_distinct'] - ); - - testErrorsAndWarnings( - 'from a_index | eval count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField)', - ['EVAL does not support function count_distinct'] - ); - - testErrorsAndWarnings( - 'from a_index | eval count_distinct(textField, integerField, counterIntegerField, doubleField, unsignedLongField, longField, counterLongField, counterDoubleField) > 0', - ['EVAL does not support function count_distinct'] - ); - }); - - describe('st_centroid_agg', () => { - testErrorsAndWarnings( - 'from a_index | stats var = st_centroid_agg(cartesianPointField)', - [] - ); - testErrorsAndWarnings('from a_index | stats st_centroid_agg(cartesianPointField)', []); - - testErrorsAndWarnings('from a_index | stats var = st_centroid_agg(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats st_centroid_agg(avg(integerField))', [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ]); - - testErrorsAndWarnings('from a_index | stats st_centroid_agg(booleanField)', [ - 'Argument of [st_centroid_agg] must be [cartesian_point], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | stats var = st_centroid_agg(*)', [ - 'Using wildcards (*) in st_centroid_agg is not allowed', - ]); - - testErrorsAndWarnings('from a_index | stats var = st_centroid_agg(geoPointField)', []); - testErrorsAndWarnings('from a_index | stats st_centroid_agg(geoPointField)', []); - - testErrorsAndWarnings('from a_index | sort st_centroid_agg(cartesianPointField)', [ - 'SORT does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | where st_centroid_agg(cartesianPointField)', [ - 'WHERE does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | where st_centroid_agg(cartesianPointField) > 0', [ - 'WHERE does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | where st_centroid_agg(geoPointField)', [ - 'WHERE does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | where st_centroid_agg(geoPointField) > 0', [ - 'WHERE does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | eval var = st_centroid_agg(cartesianPointField)', [ - 'EVAL does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = st_centroid_agg(cartesianPointField) > 0', - ['EVAL does not support function st_centroid_agg'] - ); - - testErrorsAndWarnings('from a_index | eval st_centroid_agg(cartesianPointField)', [ - 'EVAL does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | eval st_centroid_agg(cartesianPointField) > 0', [ - 'EVAL does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | eval var = st_centroid_agg(geoPointField)', [ - 'EVAL does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | eval var = st_centroid_agg(geoPointField) > 0', [ - 'EVAL does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | eval st_centroid_agg(geoPointField)', [ - 'EVAL does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | eval st_centroid_agg(geoPointField) > 0', [ - 'EVAL does not support function st_centroid_agg', - ]); - - testErrorsAndWarnings('from a_index | stats st_centroid_agg(null)', []); - testErrorsAndWarnings('row nullVar = null | stats st_centroid_agg(nullVar)', []); - }); - - describe('values', () => { - testErrorsAndWarnings('from a_index | stats var = values(textField)', []); - testErrorsAndWarnings('from a_index | stats values(textField)', []); - - testErrorsAndWarnings('from a_index | sort values(textField)', [ - 'SORT does not support function values', - ]); - - testErrorsAndWarnings('from a_index | where values(textField)', [ - 'WHERE does not support function values', - ]); - - testErrorsAndWarnings('from a_index | where values(textField) > 0', [ - 'WHERE does not support function values', - ]); - - testErrorsAndWarnings('from a_index | eval var = values(textField)', [ - 'EVAL does not support function values', - ]); - - testErrorsAndWarnings('from a_index | eval var = values(textField) > 0', [ - 'EVAL does not support function values', - ]); - - testErrorsAndWarnings('from a_index | eval values(textField)', [ - 'EVAL does not support function values', - ]); - - testErrorsAndWarnings('from a_index | eval values(textField) > 0', [ - 'EVAL does not support function values', - ]); - - testErrorsAndWarnings('from a_index | stats values(null)', []); - testErrorsAndWarnings('row nullVar = null | stats values(nullVar)', []); - }); - - describe('top', () => { - testErrorsAndWarnings( - 'from a_index | stats var = top(textField, integerField, textField)', - ['Argument of [=] must be a constant, received [top(textField,integerField,textField)]'] - ); - - testErrorsAndWarnings('from a_index | stats top(textField, integerField, textField)', [ - 'Argument of [top] must be a constant, received [integerField]', - 'Argument of [top] must be a constant, received [textField]', - ]); - - testErrorsAndWarnings('from a_index | sort top(textField, integerField, textField)', [ - 'SORT does not support function top', - ]); - - testErrorsAndWarnings('from a_index | where top(textField, integerField, textField)', [ - 'WHERE does not support function top', - ]); - - testErrorsAndWarnings('from a_index | where top(textField, integerField, textField) > 0', [ - 'WHERE does not support function top', - ]); - - testErrorsAndWarnings('from a_index | eval var = top(textField, integerField, textField)', [ - 'EVAL does not support function top', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = top(textField, integerField, textField) > 0', - ['EVAL does not support function top'] - ); - - testErrorsAndWarnings('from a_index | eval top(textField, integerField, textField)', [ - 'EVAL does not support function top', - ]); - - testErrorsAndWarnings('from a_index | eval top(textField, integerField, textField) > 0', [ - 'EVAL does not support function top', - ]); - - testErrorsAndWarnings('from a_index | stats top(null, null, null)', []); - testErrorsAndWarnings('row nullVar = null | stats top(nullVar, nullVar, nullVar)', [ - 'Argument of [top] must be a constant, received [nullVar]', - 'Argument of [top] must be a constant, received [nullVar]', - ]); - testErrorsAndWarnings('from a_index | stats var = top(textField, integerField, "asc")', [ - 'Argument of [=] must be a constant, received [top(textField,integerField,"asc")]', - ]); - - testErrorsAndWarnings('from a_index | stats top(textField, integerField, "asc")', [ - 'Argument of [top] must be a constant, received [integerField]', - ]); - - testErrorsAndWarnings('from a_index | sort top(textField, integerField, "asc")', [ - 'SORT does not support function top', - ]); - - testErrorsAndWarnings('from a_index | where top(textField, integerField, "asc")', [ - 'WHERE does not support function top', - ]); - - testErrorsAndWarnings('from a_index | where top(textField, integerField, "asc") > 0', [ - 'WHERE does not support function top', - ]); - - testErrorsAndWarnings('from a_index | eval var = top(textField, integerField, "asc")', [ - 'EVAL does not support function top', - ]); - - testErrorsAndWarnings('from a_index | eval var = top(textField, integerField, "asc") > 0', [ - 'EVAL does not support function top', - ]); - - testErrorsAndWarnings('from a_index | eval top(textField, integerField, "asc")', [ - 'EVAL does not support function top', - ]); - - testErrorsAndWarnings('from a_index | eval top(textField, integerField, "asc") > 0', [ - 'EVAL does not support function top', - ]); - }); - - describe('weighted_avg', () => { - testErrorsAndWarnings( - 'from a_index | stats var = weighted_avg(doubleField, doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | stats weighted_avg(doubleField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(doubleField, doubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(doubleField, doubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(doubleField, doubleField)) + weighted_avg(doubleField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(doubleField, doubleField)) + weighted_avg(doubleField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(doubleField / 2, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(doubleField / 2, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField / 2, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField / 2, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(doubleField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(doubleField, doubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(doubleField, doubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField, doubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField, doubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField, doubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField, doubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = weighted_avg(avg(integerField), avg(integerField))', - [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(avg(integerField), avg(integerField))', - [ - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ] - ); - - testErrorsAndWarnings('from a_index | stats weighted_avg(booleanField, booleanField)', [ - 'Argument of [weighted_avg] must be [double], found value [booleanField] type [boolean]', - 'Argument of [weighted_avg] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings('from a_index | sort weighted_avg(doubleField, doubleField)', [ - 'SORT does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(doubleField, doubleField)', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(doubleField, doubleField) > 0', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = weighted_avg(doubleField, doubleField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = weighted_avg(doubleField, doubleField) > 0', - ['EVAL does not support function weighted_avg'] - ); - - testErrorsAndWarnings('from a_index | eval weighted_avg(doubleField, doubleField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(doubleField, doubleField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | stats weighted_avg(null, null)', []); - testErrorsAndWarnings('row nullVar = null | stats weighted_avg(nullVar, nullVar)', []); - testErrorsAndWarnings( - 'from a_index | stats var = weighted_avg(doubleField, longField)', - [] - ); - testErrorsAndWarnings('from a_index | stats weighted_avg(doubleField, longField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(doubleField, longField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(doubleField, longField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(doubleField, longField)) + weighted_avg(doubleField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(doubleField, longField)) + weighted_avg(doubleField, longField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats weighted_avg(doubleField / 2, longField)', []); - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(doubleField / 2, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField / 2, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField / 2, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(doubleField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(doubleField, longField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(doubleField, longField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField, longField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField, longField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField, longField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField, longField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = weighted_avg(doubleField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | stats weighted_avg(doubleField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(doubleField, integerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(doubleField, integerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(doubleField, integerField)) + weighted_avg(doubleField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(doubleField, integerField)) + weighted_avg(doubleField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(doubleField / 2, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(doubleField / 2, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField / 2, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField / 2, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(doubleField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(doubleField, integerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(doubleField, integerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField, integerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField, integerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(doubleField, integerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(doubleField, integerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = weighted_avg(longField, doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | stats weighted_avg(longField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(longField, doubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(longField, doubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(longField, doubleField)) + weighted_avg(longField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(longField, doubleField)) + weighted_avg(longField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(longField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(longField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(longField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(longField, doubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(longField, doubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(longField, doubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(longField, doubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(longField, doubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(longField, doubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | stats var = weighted_avg(longField, longField)', []); - testErrorsAndWarnings('from a_index | stats weighted_avg(longField, longField)', []); - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(longField, longField))', - [] - ); - testErrorsAndWarnings('from a_index | stats round(weighted_avg(longField, longField))', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(longField, longField)) + weighted_avg(longField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(longField, longField)) + weighted_avg(longField, longField)', - [] - ); - - testErrorsAndWarnings('from a_index | stats var0 = weighted_avg(longField, longField)', []); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(longField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(longField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(longField, longField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(longField, longField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(longField, longField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(longField, longField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(longField, longField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(longField, longField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = weighted_avg(longField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | stats weighted_avg(longField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(longField, integerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(longField, integerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(longField, integerField)) + weighted_avg(longField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(longField, integerField)) + weighted_avg(longField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(longField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(longField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(longField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(longField, integerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(longField, integerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(longField, integerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(longField, integerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(longField, integerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(longField, integerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = weighted_avg(integerField, doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | stats weighted_avg(integerField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(integerField, doubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(integerField, doubleField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(integerField, doubleField)) + weighted_avg(integerField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(integerField, doubleField)) + weighted_avg(integerField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(integerField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(integerField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(integerField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(integerField, doubleField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(integerField, doubleField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(integerField, doubleField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(integerField, doubleField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(integerField, doubleField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(integerField, doubleField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = weighted_avg(integerField, longField)', - [] - ); - testErrorsAndWarnings('from a_index | stats weighted_avg(integerField, longField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(integerField, longField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(integerField, longField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(integerField, longField)) + weighted_avg(integerField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(integerField, longField)) + weighted_avg(integerField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(integerField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(integerField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(integerField, longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(integerField, longField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(integerField, longField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(integerField, longField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(integerField, longField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(integerField, longField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(integerField, longField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = weighted_avg(integerField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | stats weighted_avg(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(integerField, integerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(integerField, integerField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(weighted_avg(integerField, integerField)) + weighted_avg(integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(weighted_avg(integerField, integerField)) + weighted_avg(integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(integerField, integerField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats weighted_avg(integerField, integerField) by round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = weighted_avg(integerField, integerField) by var1 = round(doubleField / 2)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(integerField, integerField) by round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(integerField, integerField) by var1 = round(doubleField / 2), ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), weighted_avg(integerField, integerField) by round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = weighted_avg(integerField, integerField) by var1 = round(doubleField / 2), doubleField / 2', - [] - ); - - testErrorsAndWarnings('from a_index | where weighted_avg(doubleField, longField)', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(doubleField, longField) > 0', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(doubleField, integerField)', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(doubleField, integerField) > 0', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(longField, doubleField)', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(longField, doubleField) > 0', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(longField, longField)', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(longField, longField) > 0', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(longField, integerField)', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(longField, integerField) > 0', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(integerField, doubleField)', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(integerField, doubleField) > 0', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(integerField, longField)', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(integerField, longField) > 0', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(integerField, integerField)', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | where weighted_avg(integerField, integerField) > 0', [ - 'WHERE does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = weighted_avg(doubleField, longField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = weighted_avg(doubleField, longField) > 0', - ['EVAL does not support function weighted_avg'] - ); - - testErrorsAndWarnings('from a_index | eval weighted_avg(doubleField, longField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(doubleField, longField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = weighted_avg(doubleField, integerField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = weighted_avg(doubleField, integerField) > 0', - ['EVAL does not support function weighted_avg'] - ); - - testErrorsAndWarnings('from a_index | eval weighted_avg(doubleField, integerField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(doubleField, integerField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = weighted_avg(longField, doubleField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = weighted_avg(longField, doubleField) > 0', - ['EVAL does not support function weighted_avg'] - ); - - testErrorsAndWarnings('from a_index | eval weighted_avg(longField, doubleField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(longField, doubleField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = weighted_avg(longField, longField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = weighted_avg(longField, longField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(longField, longField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(longField, longField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = weighted_avg(longField, integerField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = weighted_avg(longField, integerField) > 0', - ['EVAL does not support function weighted_avg'] - ); - - testErrorsAndWarnings('from a_index | eval weighted_avg(longField, integerField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(longField, integerField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = weighted_avg(integerField, doubleField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = weighted_avg(integerField, doubleField) > 0', - ['EVAL does not support function weighted_avg'] - ); - - testErrorsAndWarnings('from a_index | eval weighted_avg(integerField, doubleField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(integerField, doubleField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval var = weighted_avg(integerField, longField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = weighted_avg(integerField, longField) > 0', - ['EVAL does not support function weighted_avg'] - ); - - testErrorsAndWarnings('from a_index | eval weighted_avg(integerField, longField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(integerField, longField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = weighted_avg(integerField, integerField)', - ['EVAL does not support function weighted_avg'] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = weighted_avg(integerField, integerField) > 0', - ['EVAL does not support function weighted_avg'] - ); - - testErrorsAndWarnings('from a_index | eval weighted_avg(integerField, integerField)', [ - 'EVAL does not support function weighted_avg', - ]); - - testErrorsAndWarnings('from a_index | eval weighted_avg(integerField, integerField) > 0', [ - 'EVAL does not support function weighted_avg', - ]); - }); - - describe('bucket', () => { - testErrorsAndWarnings('from a_index | stats by bucket(dateField, 1 year)', []); - testErrorsAndWarnings('from a_index | stats by bin(dateField, 1 year)', []); - - testErrorsAndWarnings('from a_index | stats by bucket(integerField, integerField)', [ - 'Argument of [bucket] must be a constant, received [integerField]', - ]); - - testErrorsAndWarnings('from a_index | stats by bin(integerField, integerField)', [ - 'Argument of [bin] must be a constant, received [integerField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(dateField, integerField, textField, textField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [textField]', - 'Argument of [bucket] must be a constant, received [textField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(dateField, integerField, textField, textField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [textField]', - 'Argument of [bin] must be a constant, received [textField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(dateField, integerField, dateField, dateField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [dateField]', - 'Argument of [bucket] must be a constant, received [dateField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(dateField, integerField, dateField, dateField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [dateField]', - 'Argument of [bin] must be a constant, received [dateField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(dateField, integerField, textField, dateField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [textField]', - 'Argument of [bucket] must be a constant, received [dateField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(dateField, integerField, textField, dateField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [textField]', - 'Argument of [bin] must be a constant, received [dateField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(dateField, integerField, dateField, textField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [dateField]', - 'Argument of [bucket] must be a constant, received [textField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(dateField, integerField, dateField, textField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [dateField]', - 'Argument of [bin] must be a constant, received [textField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(integerField, integerField, integerField, integerField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(integerField, integerField, integerField, integerField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings('from a_index | sort bucket(dateField, 1 year)', [ - 'SORT does not support function bucket', - ]); - - testErrorsAndWarnings('from a_index | stats bucket(null, null, null, null)', []); - - testErrorsAndWarnings( - 'row nullVar = null | stats bucket(nullVar, nullVar, nullVar, nullVar)', - [ - 'Argument of [bucket] must be a constant, received [nullVar]', - 'Argument of [bucket] must be a constant, received [nullVar]', - 'Argument of [bucket] must be a constant, received [nullVar]', - ] - ); - - testErrorsAndWarnings('from a_index | stats bucket("2022", 1 year)', []); - testErrorsAndWarnings('from a_index | stats bucket(concat("20", "22"), 1 year)', [ - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats bucket("2022", integerField, textField, textField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [textField]', - 'Argument of [bucket] must be a constant, received [textField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats bucket(concat("20", "22"), integerField, textField, textField)', - [ - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [textField]', - 'Argument of [bucket] must be a constant, received [textField]', - ] - ); - - testErrorsAndWarnings('from a_index | stats bucket("2022", integerField, "2022", "2022")', [ - 'Argument of [bucket] must be a constant, received [integerField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats bucket(concat("20", "22"), integerField, concat("20", "22"), concat("20", "22"))', - [ - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats bucket("2022", integerField, textField, "2022")', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [textField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats bucket(concat("20", "22"), integerField, textField, concat("20", "22"))', - [ - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [textField]', - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats bucket("2022", integerField, "2022", textField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [textField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats bucket(concat("20", "22"), integerField, concat("20", "22"), textField)', - [ - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - 'Argument of [bucket] must be a constant, received [textField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(dateField, integerField, now(), now())', - ['Argument of [bucket] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(dateField, integerField, now(), now())', - ['Argument of [bin] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings('from a_index | stats by bucket(doubleField, doubleField)', [ - 'Argument of [bucket] must be a constant, received [doubleField]', - ]); - - testErrorsAndWarnings('from a_index | stats by bin(doubleField, doubleField)', [ - 'Argument of [bin] must be a constant, received [doubleField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(doubleField, integerField, doubleField, doubleField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(doubleField, integerField, doubleField, doubleField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - 'Argument of [bin] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(doubleField, integerField, doubleField, integerField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - 'Argument of [bucket] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(doubleField, integerField, doubleField, integerField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - 'Argument of [bin] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(doubleField, integerField, doubleField, longField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - 'Argument of [bucket] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(doubleField, integerField, doubleField, longField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - 'Argument of [bin] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(doubleField, integerField, integerField, doubleField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(doubleField, integerField, integerField, doubleField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(doubleField, integerField, integerField, integerField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(doubleField, integerField, integerField, integerField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(doubleField, integerField, integerField, longField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(doubleField, integerField, integerField, longField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(doubleField, integerField, longField, doubleField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(doubleField, integerField, longField, doubleField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - 'Argument of [bin] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(doubleField, integerField, longField, integerField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - 'Argument of [bucket] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(doubleField, integerField, longField, integerField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - 'Argument of [bin] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(doubleField, integerField, longField, longField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - 'Argument of [bucket] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(doubleField, integerField, longField, longField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - 'Argument of [bin] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings('from a_index | stats by bucket(integerField, doubleField)', [ - 'Argument of [bucket] must be a constant, received [doubleField]', - ]); - - testErrorsAndWarnings('from a_index | stats by bin(integerField, doubleField)', [ - 'Argument of [bin] must be a constant, received [doubleField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(integerField, integerField, doubleField, doubleField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(integerField, integerField, doubleField, doubleField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - 'Argument of [bin] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(integerField, integerField, doubleField, integerField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - 'Argument of [bucket] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(integerField, integerField, doubleField, integerField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - 'Argument of [bin] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(integerField, integerField, doubleField, longField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - 'Argument of [bucket] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(integerField, integerField, doubleField, longField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - 'Argument of [bin] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(integerField, integerField, integerField, doubleField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(integerField, integerField, integerField, doubleField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(integerField, integerField, integerField, longField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(integerField, integerField, integerField, longField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(integerField, integerField, longField, doubleField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(integerField, integerField, longField, doubleField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - 'Argument of [bin] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(integerField, integerField, longField, integerField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - 'Argument of [bucket] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(integerField, integerField, longField, integerField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - 'Argument of [bin] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(integerField, integerField, longField, longField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - 'Argument of [bucket] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(integerField, integerField, longField, longField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - 'Argument of [bin] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings('from a_index | stats by bucket(longField, doubleField)', [ - 'Argument of [bucket] must be a constant, received [doubleField]', - ]); - - testErrorsAndWarnings('from a_index | stats by bin(longField, doubleField)', [ - 'Argument of [bin] must be a constant, received [doubleField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(longField, integerField, doubleField, doubleField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(longField, integerField, doubleField, doubleField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - 'Argument of [bin] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(longField, integerField, doubleField, integerField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - 'Argument of [bucket] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(longField, integerField, doubleField, integerField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - 'Argument of [bin] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(longField, integerField, doubleField, longField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - 'Argument of [bucket] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(longField, integerField, doubleField, longField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - 'Argument of [bin] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(longField, integerField, integerField, doubleField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(longField, integerField, integerField, doubleField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(longField, integerField, integerField, integerField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(longField, integerField, integerField, integerField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(longField, integerField, integerField, longField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(longField, integerField, integerField, longField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(longField, integerField, longField, doubleField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - 'Argument of [bucket] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(longField, integerField, longField, doubleField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - 'Argument of [bin] must be a constant, received [doubleField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(longField, integerField, longField, integerField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - 'Argument of [bucket] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(longField, integerField, longField, integerField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - 'Argument of [bin] must be a constant, received [integerField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bucket(longField, integerField, longField, longField)', - [ - 'Argument of [bucket] must be a constant, received [integerField]', - 'Argument of [bucket] must be a constant, received [longField]', - 'Argument of [bucket] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats by bin(longField, integerField, longField, longField)', - [ - 'Argument of [bin] must be a constant, received [integerField]', - 'Argument of [bin] must be a constant, received [longField]', - 'Argument of [bin] must be a constant, received [longField]', - ] - ); - - testErrorsAndWarnings('from a_index | stats by bucket(dateField, textField)', [ - 'Argument of [bucket] must be a constant, received [textField]', - ]); - - testErrorsAndWarnings('from a_index | stats by bin(dateField, textField)', [ - 'Argument of [bin] must be a constant, received [textField]', - ]); - - testErrorsAndWarnings('from a_index | sort bucket(dateField, textField)', [ - 'SORT does not support function bucket', - ]); - - testErrorsAndWarnings('from a_index | stats bucket("2022", textField)', [ - 'Argument of [bucket] must be a constant, received [textField]', - ]); - testErrorsAndWarnings('from a_index | stats bucket(concat("20", "22"), textField)', [ - 'Argument of [bucket] must be [date], found value [concat("20","22")] type [keyword]', - 'Argument of [bucket] must be a constant, received [textField]', - ]); - }); - - describe('percentile', () => { - testErrorsAndWarnings('from a_index | stats var = percentile(doubleField, doubleField)', [ - 'Argument of [=] must be a constant, received [percentile(doubleField,doubleField)]', - ]); - testErrorsAndWarnings('from a_index | stats percentile(doubleField, doubleField)', [ - 'Argument of [percentile] must be a constant, received [doubleField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(doubleField, doubleField))', - [ - 'Argument of [=] must be a constant, received [round(percentile(doubleField,doubleField))]', - ] - ); - - testErrorsAndWarnings('from a_index | stats round(percentile(doubleField, doubleField))', [ - 'Argument of [round] must be a constant, received [percentile(doubleField,doubleField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(doubleField, doubleField)) + percentile(doubleField, doubleField)', - [ - 'Argument of [=] must be a constant, received [round(percentile(doubleField,doubleField))+percentile(doubleField,doubleField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(doubleField, doubleField)) + percentile(doubleField, doubleField)', - [ - 'Argument of [+] must be a constant, received [round(percentile(doubleField,doubleField))]', - 'Argument of [+] must be a constant, received [percentile(doubleField,doubleField)]', - ] - ); - - testErrorsAndWarnings('from a_index | stats percentile(doubleField / 2, doubleField)', [ - 'Argument of [percentile] must be a constant, received [doubleField]', - ]); - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(doubleField / 2, doubleField)', - ['Argument of [=] must be a constant, received [percentile(doubleField/2,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField / 2, doubleField)', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField / 2, doubleField)', - ['Argument of [=] must be a constant, received [percentile(doubleField/2,doubleField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var0 = percentile(doubleField, doubleField)', [ - 'Argument of [=] must be a constant, received [percentile(doubleField,doubleField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField, doubleField)', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField, doubleField)', - ['Argument of [=] must be a constant, received [percentile(doubleField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(doubleField, doubleField) by round(doubleField / 2)', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(doubleField, doubleField) by var1 = round(doubleField / 2)', - ['Argument of [=] must be a constant, received [percentile(doubleField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField, doubleField) by round(doubleField / 2), ipField', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField, doubleField) by var1 = round(doubleField / 2), ipField', - ['Argument of [=] must be a constant, received [percentile(doubleField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField, doubleField) by round(doubleField / 2), doubleField / 2', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField, doubleField) by var1 = round(doubleField / 2), doubleField / 2', - ['Argument of [=] must be a constant, received [percentile(doubleField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = percentile(avg(integerField), avg(integerField))', - [ - 'Argument of [=] must be a constant, received [percentile(avg(integerField),avg(integerField))]', - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(avg(integerField), avg(integerField))', - [ - 'Argument of [percentile] must be a constant, received [avg(integerField)]', - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(integerField)] of type [double]", - ] - ); - - testErrorsAndWarnings('from a_index | stats percentile(booleanField, )', [ - "SyntaxError: no viable alternative at input 'percentile(booleanField, )'", - "SyntaxError: mismatched input ')' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - 'At least one aggregation or grouping expression required in [STATS]', - ]); - - testErrorsAndWarnings('from a_index | stats var = percentile(doubleField, longField)', [ - 'Argument of [=] must be a constant, received [percentile(doubleField,longField)]', - ]); - testErrorsAndWarnings('from a_index | stats percentile(doubleField, longField)', [ - 'Argument of [percentile] must be a constant, received [longField]', - ]); - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(doubleField, longField))', - [ - 'Argument of [=] must be a constant, received [round(percentile(doubleField,longField))]', - ] - ); - testErrorsAndWarnings('from a_index | stats round(percentile(doubleField, longField))', [ - 'Argument of [round] must be a constant, received [percentile(doubleField,longField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(doubleField, longField)) + percentile(doubleField, longField)', - [ - 'Argument of [=] must be a constant, received [round(percentile(doubleField,longField))+percentile(doubleField,longField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(doubleField, longField)) + percentile(doubleField, longField)', - [ - 'Argument of [+] must be a constant, received [round(percentile(doubleField,longField))]', - 'Argument of [+] must be a constant, received [percentile(doubleField,longField)]', - ] - ); - - testErrorsAndWarnings('from a_index | stats percentile(doubleField / 2, longField)', [ - 'Argument of [percentile] must be a constant, received [longField]', - ]); - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(doubleField / 2, longField)', - ['Argument of [=] must be a constant, received [percentile(doubleField/2,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField / 2, longField)', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField / 2, longField)', - ['Argument of [=] must be a constant, received [percentile(doubleField/2,longField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var0 = percentile(doubleField, longField)', [ - 'Argument of [=] must be a constant, received [percentile(doubleField,longField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField, longField)', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField, longField)', - ['Argument of [=] must be a constant, received [percentile(doubleField,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(doubleField, longField) by round(doubleField / 2)', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(doubleField, longField) by var1 = round(doubleField / 2)', - ['Argument of [=] must be a constant, received [percentile(doubleField,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField, longField) by round(doubleField / 2), ipField', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField, longField) by var1 = round(doubleField / 2), ipField', - ['Argument of [=] must be a constant, received [percentile(doubleField,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField, longField) by round(doubleField / 2), doubleField / 2', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField, longField) by var1 = round(doubleField / 2), doubleField / 2', - ['Argument of [=] must be a constant, received [percentile(doubleField,longField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var = percentile(doubleField, integerField)', [ - 'Argument of [=] must be a constant, received [percentile(doubleField,integerField)]', - ]); - testErrorsAndWarnings('from a_index | stats percentile(doubleField, integerField)', [ - 'Argument of [percentile] must be a constant, received [integerField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(doubleField, integerField))', - [ - 'Argument of [=] must be a constant, received [round(percentile(doubleField,integerField))]', - ] - ); - - testErrorsAndWarnings('from a_index | stats round(percentile(doubleField, integerField))', [ - 'Argument of [round] must be a constant, received [percentile(doubleField,integerField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(doubleField, integerField)) + percentile(doubleField, integerField)', - [ - 'Argument of [=] must be a constant, received [round(percentile(doubleField,integerField))+percentile(doubleField,integerField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(doubleField, integerField)) + percentile(doubleField, integerField)', - [ - 'Argument of [+] must be a constant, received [round(percentile(doubleField,integerField))]', - 'Argument of [+] must be a constant, received [percentile(doubleField,integerField)]', - ] - ); - - testErrorsAndWarnings('from a_index | stats percentile(doubleField / 2, integerField)', [ - 'Argument of [percentile] must be a constant, received [integerField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(doubleField / 2, integerField)', - ['Argument of [=] must be a constant, received [percentile(doubleField/2,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField / 2, integerField)', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField / 2, integerField)', - ['Argument of [=] must be a constant, received [percentile(doubleField/2,integerField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var0 = percentile(doubleField, integerField)', [ - 'Argument of [=] must be a constant, received [percentile(doubleField,integerField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField, integerField)', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField, integerField)', - ['Argument of [=] must be a constant, received [percentile(doubleField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(doubleField, integerField) by round(doubleField / 2)', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(doubleField, integerField) by var1 = round(doubleField / 2)', - ['Argument of [=] must be a constant, received [percentile(doubleField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField, integerField) by round(doubleField / 2), ipField', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField, integerField) by var1 = round(doubleField / 2), ipField', - ['Argument of [=] must be a constant, received [percentile(doubleField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(doubleField, integerField) by round(doubleField / 2), doubleField / 2', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(doubleField, integerField) by var1 = round(doubleField / 2), doubleField / 2', - ['Argument of [=] must be a constant, received [percentile(doubleField,integerField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var = percentile(longField, doubleField)', [ - 'Argument of [=] must be a constant, received [percentile(longField,doubleField)]', - ]); - testErrorsAndWarnings('from a_index | stats percentile(longField, doubleField)', [ - 'Argument of [percentile] must be a constant, received [doubleField]', - ]); - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(longField, doubleField))', - [ - 'Argument of [=] must be a constant, received [round(percentile(longField,doubleField))]', - ] - ); - testErrorsAndWarnings('from a_index | stats round(percentile(longField, doubleField))', [ - 'Argument of [round] must be a constant, received [percentile(longField,doubleField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(longField, doubleField)) + percentile(longField, doubleField)', - [ - 'Argument of [=] must be a constant, received [round(percentile(longField,doubleField))+percentile(longField,doubleField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(longField, doubleField)) + percentile(longField, doubleField)', - [ - 'Argument of [+] must be a constant, received [round(percentile(longField,doubleField))]', - 'Argument of [+] must be a constant, received [percentile(longField,doubleField)]', - ] - ); - - testErrorsAndWarnings('from a_index | stats var0 = percentile(longField, doubleField)', [ - 'Argument of [=] must be a constant, received [percentile(longField,doubleField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(longField, doubleField)', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(longField, doubleField)', - ['Argument of [=] must be a constant, received [percentile(longField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(longField, doubleField) by round(doubleField / 2)', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(longField, doubleField) by var1 = round(doubleField / 2)', - ['Argument of [=] must be a constant, received [percentile(longField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(longField, doubleField) by round(doubleField / 2), ipField', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(longField, doubleField) by var1 = round(doubleField / 2), ipField', - ['Argument of [=] must be a constant, received [percentile(longField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(longField, doubleField) by round(doubleField / 2), doubleField / 2', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(longField, doubleField) by var1 = round(doubleField / 2), doubleField / 2', - ['Argument of [=] must be a constant, received [percentile(longField,doubleField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var = percentile(longField, longField)', [ - 'Argument of [=] must be a constant, received [percentile(longField,longField)]', - ]); - testErrorsAndWarnings('from a_index | stats percentile(longField, longField)', [ - 'Argument of [percentile] must be a constant, received [longField]', - ]); - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(longField, longField))', - ['Argument of [=] must be a constant, received [round(percentile(longField,longField))]'] - ); - testErrorsAndWarnings('from a_index | stats round(percentile(longField, longField))', [ - 'Argument of [round] must be a constant, received [percentile(longField,longField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(longField, longField)) + percentile(longField, longField)', - [ - 'Argument of [=] must be a constant, received [round(percentile(longField,longField))+percentile(longField,longField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(longField, longField)) + percentile(longField, longField)', - [ - 'Argument of [+] must be a constant, received [round(percentile(longField,longField))]', - 'Argument of [+] must be a constant, received [percentile(longField,longField)]', - ] - ); - - testErrorsAndWarnings('from a_index | stats var0 = percentile(longField, longField)', [ - 'Argument of [=] must be a constant, received [percentile(longField,longField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(longField, longField)', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(longField, longField)', - ['Argument of [=] must be a constant, received [percentile(longField,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(longField, longField) by round(doubleField / 2)', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(longField, longField) by var1 = round(doubleField / 2)', - ['Argument of [=] must be a constant, received [percentile(longField,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(longField, longField) by round(doubleField / 2), ipField', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(longField, longField) by var1 = round(doubleField / 2), ipField', - ['Argument of [=] must be a constant, received [percentile(longField,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(longField, longField) by round(doubleField / 2), doubleField / 2', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(longField, longField) by var1 = round(doubleField / 2), doubleField / 2', - ['Argument of [=] must be a constant, received [percentile(longField,longField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var = percentile(longField, integerField)', [ - 'Argument of [=] must be a constant, received [percentile(longField,integerField)]', - ]); - testErrorsAndWarnings('from a_index | stats percentile(longField, integerField)', [ - 'Argument of [percentile] must be a constant, received [integerField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(longField, integerField))', - [ - 'Argument of [=] must be a constant, received [round(percentile(longField,integerField))]', - ] - ); - - testErrorsAndWarnings('from a_index | stats round(percentile(longField, integerField))', [ - 'Argument of [round] must be a constant, received [percentile(longField,integerField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(longField, integerField)) + percentile(longField, integerField)', - [ - 'Argument of [=] must be a constant, received [round(percentile(longField,integerField))+percentile(longField,integerField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(longField, integerField)) + percentile(longField, integerField)', - [ - 'Argument of [+] must be a constant, received [round(percentile(longField,integerField))]', - 'Argument of [+] must be a constant, received [percentile(longField,integerField)]', - ] - ); - - testErrorsAndWarnings('from a_index | stats var0 = percentile(longField, integerField)', [ - 'Argument of [=] must be a constant, received [percentile(longField,integerField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(longField, integerField)', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(longField, integerField)', - ['Argument of [=] must be a constant, received [percentile(longField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(longField, integerField) by round(doubleField / 2)', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(longField, integerField) by var1 = round(doubleField / 2)', - ['Argument of [=] must be a constant, received [percentile(longField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(longField, integerField) by round(doubleField / 2), ipField', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(longField, integerField) by var1 = round(doubleField / 2), ipField', - ['Argument of [=] must be a constant, received [percentile(longField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(longField, integerField) by round(doubleField / 2), doubleField / 2', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(longField, integerField) by var1 = round(doubleField / 2), doubleField / 2', - ['Argument of [=] must be a constant, received [percentile(longField,integerField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var = percentile(integerField, doubleField)', [ - 'Argument of [=] must be a constant, received [percentile(integerField,doubleField)]', - ]); - testErrorsAndWarnings('from a_index | stats percentile(integerField, doubleField)', [ - 'Argument of [percentile] must be a constant, received [doubleField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(integerField, doubleField))', - [ - 'Argument of [=] must be a constant, received [round(percentile(integerField,doubleField))]', - ] - ); - - testErrorsAndWarnings('from a_index | stats round(percentile(integerField, doubleField))', [ - 'Argument of [round] must be a constant, received [percentile(integerField,doubleField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(integerField, doubleField)) + percentile(integerField, doubleField)', - [ - 'Argument of [=] must be a constant, received [round(percentile(integerField,doubleField))+percentile(integerField,doubleField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(integerField, doubleField)) + percentile(integerField, doubleField)', - [ - 'Argument of [+] must be a constant, received [round(percentile(integerField,doubleField))]', - 'Argument of [+] must be a constant, received [percentile(integerField,doubleField)]', - ] - ); - - testErrorsAndWarnings('from a_index | stats var0 = percentile(integerField, doubleField)', [ - 'Argument of [=] must be a constant, received [percentile(integerField,doubleField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(integerField, doubleField)', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(integerField, doubleField)', - ['Argument of [=] must be a constant, received [percentile(integerField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(integerField, doubleField) by round(doubleField / 2)', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(integerField, doubleField) by var1 = round(doubleField / 2)', - ['Argument of [=] must be a constant, received [percentile(integerField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(integerField, doubleField) by round(doubleField / 2), ipField', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(integerField, doubleField) by var1 = round(doubleField / 2), ipField', - ['Argument of [=] must be a constant, received [percentile(integerField,doubleField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(integerField, doubleField) by round(doubleField / 2), doubleField / 2', - ['Argument of [percentile] must be a constant, received [doubleField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(integerField, doubleField) by var1 = round(doubleField / 2), doubleField / 2', - ['Argument of [=] must be a constant, received [percentile(integerField,doubleField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var = percentile(integerField, longField)', [ - 'Argument of [=] must be a constant, received [percentile(integerField,longField)]', - ]); - testErrorsAndWarnings('from a_index | stats percentile(integerField, longField)', [ - 'Argument of [percentile] must be a constant, received [longField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(integerField, longField))', - [ - 'Argument of [=] must be a constant, received [round(percentile(integerField,longField))]', - ] - ); - - testErrorsAndWarnings('from a_index | stats round(percentile(integerField, longField))', [ - 'Argument of [round] must be a constant, received [percentile(integerField,longField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(integerField, longField)) + percentile(integerField, longField)', - [ - 'Argument of [=] must be a constant, received [round(percentile(integerField,longField))+percentile(integerField,longField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(integerField, longField)) + percentile(integerField, longField)', - [ - 'Argument of [+] must be a constant, received [round(percentile(integerField,longField))]', - 'Argument of [+] must be a constant, received [percentile(integerField,longField)]', - ] - ); - - testErrorsAndWarnings('from a_index | stats var0 = percentile(integerField, longField)', [ - 'Argument of [=] must be a constant, received [percentile(integerField,longField)]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(integerField, longField)', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(integerField, longField)', - ['Argument of [=] must be a constant, received [percentile(integerField,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(integerField, longField) by round(doubleField / 2)', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(integerField, longField) by var1 = round(doubleField / 2)', - ['Argument of [=] must be a constant, received [percentile(integerField,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(integerField, longField) by round(doubleField / 2), ipField', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(integerField, longField) by var1 = round(doubleField / 2), ipField', - ['Argument of [=] must be a constant, received [percentile(integerField,longField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(integerField, longField) by round(doubleField / 2), doubleField / 2', - ['Argument of [percentile] must be a constant, received [longField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(integerField, longField) by var1 = round(doubleField / 2), doubleField / 2', - ['Argument of [=] must be a constant, received [percentile(integerField,longField)]'] - ); - - testErrorsAndWarnings('from a_index | stats var = percentile(integerField, integerField)', [ - 'Argument of [=] must be a constant, received [percentile(integerField,integerField)]', - ]); - testErrorsAndWarnings('from a_index | stats percentile(integerField, integerField)', [ - 'Argument of [percentile] must be a constant, received [integerField]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(integerField, integerField))', - [ - 'Argument of [=] must be a constant, received [round(percentile(integerField,integerField))]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(integerField, integerField))', - [ - 'Argument of [round] must be a constant, received [percentile(integerField,integerField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats var = round(percentile(integerField, integerField)) + percentile(integerField, integerField)', - [ - 'Argument of [=] must be a constant, received [round(percentile(integerField,integerField))+percentile(integerField,integerField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats round(percentile(integerField, integerField)) + percentile(integerField, integerField)', - [ - 'Argument of [+] must be a constant, received [round(percentile(integerField,integerField))]', - 'Argument of [+] must be a constant, received [percentile(integerField,integerField)]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(integerField, integerField)', - ['Argument of [=] must be a constant, received [percentile(integerField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(integerField, integerField)', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(integerField, integerField)', - ['Argument of [=] must be a constant, received [percentile(integerField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats percentile(integerField, integerField) by round(doubleField / 2)', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats var0 = percentile(integerField, integerField) by var1 = round(doubleField / 2)', - ['Argument of [=] must be a constant, received [percentile(integerField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(integerField, integerField) by round(doubleField / 2), ipField', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(integerField, integerField) by var1 = round(doubleField / 2), ipField', - ['Argument of [=] must be a constant, received [percentile(integerField,integerField)]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), percentile(integerField, integerField) by round(doubleField / 2), doubleField / 2', - ['Argument of [percentile] must be a constant, received [integerField]'] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(doubleField), var0 = percentile(integerField, integerField) by var1 = round(doubleField / 2), doubleField / 2', - ['Argument of [=] must be a constant, received [percentile(integerField,integerField)]'] - ); - - testErrorsAndWarnings('from a_index | sort percentile(doubleField, doubleField)', [ - 'SORT does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(doubleField, doubleField)', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(doubleField, doubleField) > 0', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(doubleField, longField)', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(doubleField, longField) > 0', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(doubleField, integerField)', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(doubleField, integerField) > 0', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(longField, doubleField)', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(longField, doubleField) > 0', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(longField, longField)', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(longField, longField) > 0', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(longField, integerField)', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(longField, integerField) > 0', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(integerField, doubleField)', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(integerField, doubleField) > 0', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(integerField, longField)', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(integerField, longField) > 0', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(integerField, integerField)', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | where percentile(integerField, integerField) > 0', [ - 'WHERE does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(doubleField, doubleField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = percentile(doubleField, doubleField) > 0', - ['EVAL does not support function percentile'] - ); - - testErrorsAndWarnings('from a_index | eval percentile(doubleField, doubleField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(doubleField, doubleField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(doubleField, longField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(doubleField, longField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(doubleField, longField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(doubleField, longField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(doubleField, integerField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = percentile(doubleField, integerField) > 0', - ['EVAL does not support function percentile'] - ); - - testErrorsAndWarnings('from a_index | eval percentile(doubleField, integerField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(doubleField, integerField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(longField, doubleField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(longField, doubleField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(longField, doubleField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(longField, doubleField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(longField, longField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(longField, longField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(longField, longField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(longField, longField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(longField, integerField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(longField, integerField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(longField, integerField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(longField, integerField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(integerField, doubleField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = percentile(integerField, doubleField) > 0', - ['EVAL does not support function percentile'] - ); - - testErrorsAndWarnings('from a_index | eval percentile(integerField, doubleField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(integerField, doubleField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(integerField, longField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(integerField, longField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(integerField, longField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(integerField, longField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval var = percentile(integerField, integerField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = percentile(integerField, integerField) > 0', - ['EVAL does not support function percentile'] - ); - - testErrorsAndWarnings('from a_index | eval percentile(integerField, integerField)', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | eval percentile(integerField, integerField) > 0', [ - 'EVAL does not support function percentile', - ]); - - testErrorsAndWarnings('from a_index | stats percentile(null, null)', []); - testErrorsAndWarnings('row nullVar = null | stats percentile(nullVar, nullVar)', [ - 'Argument of [percentile] must be a constant, received [nullVar]', - ]); - }); - - describe('to_string', () => { - testErrorsAndWarnings('row var = to_string(true)', []); - testErrorsAndWarnings('row to_string(true)', []); - testErrorsAndWarnings('row var = to_str(true)', []); - testErrorsAndWarnings('row var = to_string(to_boolean(true))', []); - testErrorsAndWarnings('row var = to_string(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row to_string(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = to_str(cartesianPointField)', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = to_string(to_cartesianpoint(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = to_string(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row to_string(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = to_str(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = to_string(to_cartesianshape(cartesianPointField))', [ - 'Unknown column [cartesianPointField]', - ]); - testErrorsAndWarnings('row var = to_string(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row to_string(to_datetime("2021-01-01T00:00:00Z"))', []); - testErrorsAndWarnings('row var = to_str(to_datetime("2021-01-01T00:00:00Z"))', []); - - testErrorsAndWarnings( - 'row var = to_string(to_datetime(to_datetime("2021-01-01T00:00:00Z")))', - [] - ); - - testErrorsAndWarnings('row var = to_string(5.5)', []); - - testErrorsAndWarnings('row to_string(5.5)', []); - testErrorsAndWarnings('row var = to_str(5.5)', []); - testErrorsAndWarnings('row var = to_string(to_double(true))', []); - testErrorsAndWarnings('row var = to_string(geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row to_string(geoPointField)', ['Unknown column [geoPointField]']); - testErrorsAndWarnings('row var = to_str(geoPointField)', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = to_string(to_geopoint(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = to_string(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row to_string(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = to_str(to_geoshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = to_string(to_geoshape(geoPointField))', [ - 'Unknown column [geoPointField]', - ]); - testErrorsAndWarnings('row var = to_string(5)', []); - testErrorsAndWarnings('row to_string(5)', []); - testErrorsAndWarnings('row var = to_str(5)', []); - testErrorsAndWarnings('row var = to_string(to_integer(true))', []); - testErrorsAndWarnings('row var = to_string(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row to_string(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = to_str(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = to_string(to_ip(to_ip("127.0.0.1")))', []); - testErrorsAndWarnings('row var = to_string("a")', []); - testErrorsAndWarnings('row to_string("a")', []); - testErrorsAndWarnings('row var = to_str("a")', []); - testErrorsAndWarnings('row var = to_string(to_string(true))', []); - testErrorsAndWarnings('row var = to_string(to_version("1.0.0"))', []); - testErrorsAndWarnings('row to_string(to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = to_str(to_version("1.0.0"))', []); - testErrorsAndWarnings('row var = to_string(to_version("a"))', []); - testErrorsAndWarnings('from a_index | eval var = to_string(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_string(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval to_string(counterDoubleField)', [ - 'Argument of [to_string] must be [boolean], found value [counterDoubleField] type [counter_double]', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_string(*)', [ - 'Using wildcards (*) in to_string is not allowed', - ]); - - testErrorsAndWarnings('from a_index | eval var = to_string(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval to_string(cartesianPointField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(cartesianPointField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = to_string(to_cartesianpoint(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = to_string(cartesianShapeField)', []); - testErrorsAndWarnings('from a_index | eval to_string(cartesianShapeField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(cartesianShapeField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = to_string(to_cartesianshape(cartesianPointField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = to_string(dateField)', []); - testErrorsAndWarnings('from a_index | eval to_string(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(dateField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = to_string(doubleField)', []); - testErrorsAndWarnings('from a_index | eval to_string(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(doubleField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(to_double(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_string(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval to_string(geoPointField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(geoPointField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_string(to_geopoint(geoPointField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = to_string(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval to_string(geoShapeField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(geoShapeField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = to_string(to_geoshape(geoPointField))', - [] - ); - testErrorsAndWarnings('from a_index | eval var = to_string(integerField)', []); - testErrorsAndWarnings('from a_index | eval to_string(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(integerField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_string(ipField)', []); - testErrorsAndWarnings('from a_index | eval to_string(ipField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(ipField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(to_ip(ipField))', []); - testErrorsAndWarnings('from a_index | eval var = to_string(keywordField)', []); - testErrorsAndWarnings('from a_index | eval to_string(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(keywordField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = to_string(longField)', []); - testErrorsAndWarnings('from a_index | eval to_string(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(longField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(textField)', []); - testErrorsAndWarnings('from a_index | eval to_string(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(textField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval to_string(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(unsignedLongField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(versionField)', []); - testErrorsAndWarnings('from a_index | eval to_string(versionField)', []); - testErrorsAndWarnings('from a_index | eval var = to_str(versionField)', []); - testErrorsAndWarnings('from a_index | eval var = to_string(to_version(keywordField))', []); - - testErrorsAndWarnings('from a_index | eval to_string(booleanField, extraArg)', [ - 'Error: [to_string] function expects exactly one argument, got 2.', - ]); - - testErrorsAndWarnings('from a_index | sort to_string(booleanField)', []); - testErrorsAndWarnings('from a_index | eval to_string(null)', []); - testErrorsAndWarnings('row nullVar = null | eval to_string(nullVar)', []); - testErrorsAndWarnings('from a_index | eval to_string("2022")', []); - testErrorsAndWarnings('from a_index | eval to_string(concat("20", "22"))', []); - testErrorsAndWarnings('row var = to_string(to_cartesianpoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row to_string(to_cartesianpoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = to_str(to_cartesianpoint("POINT (30 10)"))', []); - - testErrorsAndWarnings( - 'row var = to_string(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings( - 'row var = to_string(to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', - [] - ); - - testErrorsAndWarnings('row var = to_string(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row to_string(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = to_str(to_geopoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row var = to_string(to_geopoint(to_geopoint("POINT (30 10)")))', []); - testErrorsAndWarnings('row var = to_string(to_geoshape(to_geopoint("POINT (30 10)")))', []); - }); - - describe('mv_pseries_weighted_sum', () => { - testErrorsAndWarnings('row var = mv_pseries_weighted_sum(5.5, 5.5)', []); - testErrorsAndWarnings('row mv_pseries_weighted_sum(5.5, 5.5)', []); - testErrorsAndWarnings( - 'row var = mv_pseries_weighted_sum(to_double(true), to_double(true))', - [] - ); - - testErrorsAndWarnings('row var = mv_pseries_weighted_sum(true, true)', [ - 'Argument of [mv_pseries_weighted_sum] must be [double], found value [true] type [boolean]', - 'Argument of [mv_pseries_weighted_sum] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | where mv_pseries_weighted_sum(doubleField, doubleField) > 0', - [] - ); - - testErrorsAndWarnings( - 'from a_index | where mv_pseries_weighted_sum(booleanField, booleanField) > 0', - [ - 'Argument of [mv_pseries_weighted_sum] must be [double], found value [booleanField] type [boolean]', - 'Argument of [mv_pseries_weighted_sum] must be [double], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_pseries_weighted_sum(doubleField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_pseries_weighted_sum(doubleField, doubleField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_pseries_weighted_sum(to_double(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_pseries_weighted_sum(booleanField, booleanField)', - [ - 'Argument of [mv_pseries_weighted_sum] must be [double], found value [booleanField] type [boolean]', - 'Argument of [mv_pseries_weighted_sum] must be [double], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | eval mv_pseries_weighted_sum(doubleField, doubleField, extraArg)', - ['Error: [mv_pseries_weighted_sum] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings( - 'from a_index | sort mv_pseries_weighted_sum(doubleField, doubleField)', - [] - ); - - testErrorsAndWarnings('from a_index | eval mv_pseries_weighted_sum(null, null)', []); - testErrorsAndWarnings( - 'row nullVar = null | eval mv_pseries_weighted_sum(nullVar, nullVar)', - [] - ); - }); - - describe('mv_percentile', () => { - testErrorsAndWarnings('row var = mv_percentile(5.5, 5.5)', []); - testErrorsAndWarnings('row mv_percentile(5.5, 5.5)', []); - testErrorsAndWarnings('row var = mv_percentile(to_double(true), to_double(true))', []); - testErrorsAndWarnings('row var = mv_percentile(5.5, 5)', []); - testErrorsAndWarnings('row mv_percentile(5.5, 5)', []); - testErrorsAndWarnings('row var = mv_percentile(to_double(true), to_integer(true))', []); - testErrorsAndWarnings('row var = mv_percentile(to_double(true), 5)', []); - testErrorsAndWarnings('row var = mv_percentile(5, 5.5)', []); - testErrorsAndWarnings('row mv_percentile(5, 5.5)', []); - testErrorsAndWarnings('row var = mv_percentile(to_integer(true), to_double(true))', []); - testErrorsAndWarnings('row var = mv_percentile(5, 5)', []); - testErrorsAndWarnings('row mv_percentile(5, 5)', []); - testErrorsAndWarnings('row var = mv_percentile(to_integer(true), to_integer(true))', []); - testErrorsAndWarnings('row var = mv_percentile(to_integer(true), 5)', []); - testErrorsAndWarnings('row var = mv_percentile(5, to_double(true))', []); - testErrorsAndWarnings('row var = mv_percentile(5, to_integer(true))', []); - - testErrorsAndWarnings('row var = mv_percentile(true, true)', [ - 'Argument of [mv_percentile] must be [double], found value [true] type [boolean]', - 'Argument of [mv_percentile] must be [double], found value [true] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | where mv_percentile(doubleField, doubleField) > 0', - [] - ); - - testErrorsAndWarnings( - 'from a_index | where mv_percentile(booleanField, booleanField) > 0', - [ - 'Argument of [mv_percentile] must be [double], found value [booleanField] type [boolean]', - 'Argument of [mv_percentile] must be [double], found value [booleanField] type [boolean]', - ] - ); - - testErrorsAndWarnings( - 'from a_index | where mv_percentile(doubleField, integerField) > 0', - [] - ); - testErrorsAndWarnings('from a_index | where mv_percentile(doubleField, longField) > 0', []); - testErrorsAndWarnings( - 'from a_index | where mv_percentile(integerField, doubleField) > 0', - [] - ); - testErrorsAndWarnings( - 'from a_index | where mv_percentile(integerField, integerField) > 0', - [] - ); - testErrorsAndWarnings( - 'from a_index | where mv_percentile(integerField, longField) > 0', - [] - ); - testErrorsAndWarnings('from a_index | where mv_percentile(longField, doubleField) > 0', []); - testErrorsAndWarnings( - 'from a_index | where mv_percentile(longField, integerField) > 0', - [] - ); - testErrorsAndWarnings('from a_index | where mv_percentile(longField, longField) > 0', []); - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(doubleField, doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_percentile(doubleField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(to_double(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval mv_percentile(booleanField, booleanField)', [ - 'Argument of [mv_percentile] must be [double], found value [booleanField] type [boolean]', - 'Argument of [mv_percentile] must be [double], found value [booleanField] type [boolean]', - ]); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(doubleField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_percentile(doubleField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(to_double(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(doubleField, longField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_percentile(doubleField, longField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(to_double(booleanField), longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(integerField, doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_percentile(integerField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(to_integer(booleanField), to_double(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(integerField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_percentile(integerField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(to_integer(booleanField), to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(integerField, longField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_percentile(integerField, longField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(to_integer(booleanField), longField)', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(longField, doubleField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_percentile(longField, doubleField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(longField, to_double(booleanField))', - [] - ); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(longField, integerField)', - [] - ); - testErrorsAndWarnings('from a_index | eval mv_percentile(longField, integerField)', []); - - testErrorsAndWarnings( - 'from a_index | eval var = mv_percentile(longField, to_integer(booleanField))', - [] - ); - - testErrorsAndWarnings('from a_index | eval var = mv_percentile(longField, longField)', []); - testErrorsAndWarnings('from a_index | eval mv_percentile(longField, longField)', []); - - testErrorsAndWarnings( - 'from a_index | eval mv_percentile(doubleField, doubleField, extraArg)', - ['Error: [mv_percentile] function expects exactly 2 arguments, got 3.'] - ); - - testErrorsAndWarnings('from a_index | sort mv_percentile(doubleField, doubleField)', []); - testErrorsAndWarnings('from a_index | eval mv_percentile(null, null)', []); - testErrorsAndWarnings('row nullVar = null | eval mv_percentile(nullVar, nullVar)', []); - }); - }); }); describe('Ignoring errors based on callbacks', () => { diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts index 083a2076b8df3..3b5cc60f5b13f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts @@ -90,7 +90,7 @@ function validateFunctionLiteralArg( if (isLiteralItem(actualArg)) { if ( actualArg.literalType === 'string' && - argDef.literalOptions && + argDef.acceptedValues && isValidLiteralOption(actualArg, argDef) ) { messages.push( @@ -99,7 +99,7 @@ function validateFunctionLiteralArg( values: { name: astFunction.name, value: actualArg.value, - supportedOptions: argDef.literalOptions?.map((option) => `"${option}"`).join(', '), + supportedOptions: argDef.acceptedValues?.map((option) => `"${option}"`).join(', '), }, locations: actualArg.location, }) From 99ee0c2da237722d1bca313faa460eec63731880 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Tue, 10 Sep 2024 09:31:33 -0500 Subject: [PATCH 3/8] skip failing test suite (#192475) --- .../public/components/connectors/thehive/case_fields.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/components/connectors/thehive/case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/thehive/case_fields.test.tsx index 054e61ba84380..2b3ce432365ed 100644 --- a/x-pack/plugins/cases/public/components/connectors/thehive/case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/thehive/case_fields.test.tsx @@ -15,7 +15,8 @@ import type { AppMockRenderer } from '../../../common/mock'; import { createAppMockRenderer } from '../../../common/mock'; import { TheHiveTLP } from './types'; -describe('TheHive Cases Fields', () => { +// Failing: See https://github.com/elastic/kibana/issues/192475 +describe.skip('TheHive Cases Fields', () => { const fields = { TLP: 1, }; From 96739aad5c94e649beccf85ee219be73fb0efdd7 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 11 Sep 2024 00:38:52 +1000 Subject: [PATCH 4/8] skip failing test suite (#192458) --- .../security_and_spaces/group3/tests/alerting/bulk_disable.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_disable.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_disable.ts index a482374409832..b8c2041cb27af 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_disable.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_disable.ts @@ -57,7 +57,8 @@ export default ({ getService }: FtrProviderContext) => { const es = getService('es'); const supertestWithoutAuth = getService('supertestWithoutAuth'); - describe('bulkDisableRules', () => { + // Failing: See https://github.com/elastic/kibana/issues/192458 + describe.skip('bulkDisableRules', () => { const objectRemover = new ObjectRemover(supertest); afterEach(() => objectRemover.removeAll()); From 9dfad5b12a5333e6968fc25e700b9dfe31ded163 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 10 Sep 2024 08:50:17 -0600 Subject: [PATCH 5/8] [embeddable rebuild] integrate react control group embeddable into dashboard container - reloaded (#192221) PR replaces legacy embeddable control group implementation with react control group implementation in DashboardContainer. #### background Work originally done in https://github.com/elastic/kibana/pull/190273. https://github.com/elastic/kibana/pull/190273 was reverted by https://github.com/elastic/kibana/pull/191993 because of dashboard performance degradation. It was determined that degradation was because new react embeddable controls fixed a regression where dashboard panels are loading before control filters are created. This regression was introduced by https://github.com/elastic/kibana/pull/187509. The work around is that this PR keeps the currently broken behavior in main and loads panels before control filters are ready. The thinking is that the migration would replace like for like and not introduce any performance changes. Then, at a later time, the regression could be resolved. #### reviewing These are the same changes from https://github.com/elastic/kibana/pull/190273 minus some work to introduce a current regression in main. A full re-review is not needed. --------- Co-authored-by: Elastic Machine Co-authored-by: Hannah Mudge Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../serialized_control_group_state.ts | 4 +- .../dashboard_with_controls_example.tsx | 12 +- .../control_group_persistence.ts | 28 -- src/plugins/controls/common/index.ts | 2 - .../components/control_group.tsx | 1 + .../control_group_unsaved_changes_api.ts | 9 +- .../get_control_group_factory.tsx | 101 ++++-- .../init_controls_manager.test.ts | 192 ++++++++---- .../control_group/init_controls_manager.ts | 72 +++-- .../open_edit_control_group_flyout.tsx | 2 +- .../control_group/serialization_utils.ts | 7 +- .../react_controls/control_group/types.ts | 3 +- .../initialize_data_control.test.tsx | 3 + .../data_controls/initialize_data_control.ts | 4 +- .../get_options_list_control_factory.tsx | 6 +- .../get_range_slider_control_factory.tsx | 5 +- .../data_controls/reference_name_utils.ts | 23 ++ .../get_timeslider_control_factory.tsx | 10 +- .../controls/timeslider_control/types.ts | 6 +- .../dashboard_container_references.ts | 44 +-- .../dashboard_saved_object_references.ts | 18 -- src/plugins/dashboard/common/types.ts | 3 - .../dashboard_app/locator/locator.test.ts | 10 +- .../add_data_control_button.tsx | 9 +- .../add_time_slider_control_button.tsx | 39 ++- .../controls_toolbar_button.tsx | 12 +- .../edit_control_group_button.tsx | 9 +- .../top_nav/dashboard_editing_toolbar.tsx | 8 +- .../top_nav/share/show_share_modal.tsx | 6 +- .../top_nav/use_dashboard_menu_items.tsx | 32 +- .../component/grid/dashboard_grid.test.tsx | 13 +- .../component/viewport/dashboard_viewport.tsx | 88 ++++-- .../embeddable/api/run_save_functions.tsx | 35 +-- ...ashboard_control_group_integration.test.ts | 77 +++-- .../dashboard_control_group_integration.ts | 161 +++++----- .../create/create_dashboard.test.ts | 47 +-- .../embeddable/create/create_dashboard.ts | 162 +--------- .../data_views/sync_dashboard_data_views.ts | 26 +- .../embeddable/dashboard_container.test.tsx | 26 +- .../embeddable/dashboard_container.tsx | 138 +++++++-- .../diffing/dashboard_diffing_integration.ts | 27 +- .../public/dashboard_container/types.ts | 6 +- .../internal_dashboard_top_nav.tsx | 14 +- src/plugins/dashboard/public/mocks.tsx | 12 + .../dashboard_backup_service.ts | 2 + .../dashboard_content_management_service.ts | 9 +- .../lib/load_dashboard_state.ts | 5 +- .../lib/migrate_dashboard_input.test.ts | 25 +- .../lib/migrate_dashboard_input.ts | 22 -- .../lib/save_dashboard_state.ts | 37 +-- .../dashboard_content_management/types.ts | 17 +- .../public/lib/containers/container.ts | 3 + .../public/lib/containers/i_container.ts | 2 + .../embeddable_compatibility_utils.ts | 6 +- .../lib/embeddables/diff_embeddable_input.ts | 3 + .../common/control_group_apply_button.ts | 87 +----- .../controls/common/multiple_data_views.ts | 290 ++++++++++-------- .../controls/common/replace_controls.ts | 16 +- .../options_list/options_list_suggestions.ts | 11 +- .../options_list/options_list_validation.ts | 42 +-- .../dashboard/current/kibana.json | 105 +++++++ .../current/multi_data_view_kibana.json | 64 ++++ .../page_objects/dashboard_page_controls.ts | 10 +- .../app/metrics/static_dashboard/index.tsx | 10 +- 64 files changed, 1197 insertions(+), 1081 deletions(-) create mode 100644 src/plugins/controls/public/react_controls/controls/data_controls/reference_name_utils.ts create mode 100644 test/functional/fixtures/kbn_archiver/dashboard/current/multi_data_view_kibana.json diff --git a/examples/controls_example/public/app/react_control_example/serialized_control_group_state.ts b/examples/controls_example/public/app/react_control_example/serialized_control_group_state.ts index 3ea711fe2e3a8..e9e5b070db2bc 100644 --- a/examples/controls_example/public/app/react_control_example/serialized_control_group_state.ts +++ b/examples/controls_example/public/app/react_control_example/serialized_control_group_state.ts @@ -91,12 +91,12 @@ const initialSerializedControlGroupState = { } as object, references: [ { - name: `controlGroup_${rangeSliderControlId}:${RANGE_SLIDER_CONTROL}DataView`, + name: `controlGroup_${rangeSliderControlId}:rangeSliderDataView`, type: 'index-pattern', id: WEB_LOGS_DATA_VIEW_ID, }, { - name: `controlGroup_${optionsListId}:${OPTIONS_LIST_CONTROL}DataView`, + name: `controlGroup_${optionsListId}:optionsListDataView`, type: 'index-pattern', id: WEB_LOGS_DATA_VIEW_ID, }, diff --git a/examples/portable_dashboards_example/public/dashboard_with_controls_example.tsx b/examples/portable_dashboards_example/public/dashboard_with_controls_example.tsx index 9eb2663774f0b..205e160f2c81d 100644 --- a/examples/portable_dashboards_example/public/dashboard_with_controls_example.tsx +++ b/examples/portable_dashboards_example/public/dashboard_with_controls_example.tsx @@ -12,8 +12,7 @@ import React, { useEffect, useState } from 'react'; import { ViewMode } from '@kbn/embeddable-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; import { EuiPanel, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; -import { controlGroupInputBuilder } from '@kbn/controls-plugin/public'; -import { getDefaultControlGroupInput } from '@kbn/controls-plugin/common'; +import { controlGroupStateBuilder } from '@kbn/controls-plugin/public'; import { AwaitingDashboardAPI, DashboardRenderer, @@ -64,16 +63,15 @@ export const DashboardWithControlsExample = ({ dataView }: { dataView: DataView => { - const builder = controlGroupInputBuilder; - const controlGroupInput = getDefaultControlGroupInput(); - await builder.addDataControlFromField(controlGroupInput, { + const controlGroupState = {}; + await controlGroupStateBuilder.addDataControlFromField(controlGroupState, { dataViewId: dataView.id ?? '', title: 'Destintion country', fieldName: 'geo.dest', width: 'medium', grow: false, }); - await builder.addDataControlFromField(controlGroupInput, { + await controlGroupStateBuilder.addDataControlFromField(controlGroupState, { dataViewId: dataView.id ?? '', fieldName: 'bytes', width: 'medium', @@ -86,7 +84,7 @@ export const DashboardWithControlsExample = ({ dataView }: { dataView: DataView getInitialInput: () => ({ timeRange: { from: 'now-30d', to: 'now' }, viewMode: ViewMode.VIEW, - controlGroupInput, + controlGroupState, }), }; }} diff --git a/src/plugins/controls/common/control_group/control_group_persistence.ts b/src/plugins/controls/common/control_group/control_group_persistence.ts index e819c40de66f6..e6417dc216560 100644 --- a/src/plugins/controls/common/control_group/control_group_persistence.ts +++ b/src/plugins/controls/common/control_group/control_group_persistence.ts @@ -10,7 +10,6 @@ import deepEqual from 'fast-deep-equal'; import { SerializableRecord } from '@kbn/utility-types'; -import { v4 } from 'uuid'; import { pick, omit, xor } from 'lodash'; import { @@ -24,7 +23,6 @@ import { } from './control_group_panel_diff_system'; import { ControlGroupInput } from '..'; import { - ControlsPanels, PersistableControlGroupInput, persistableControlGroupInputKeys, RawControlGroupAttributes, @@ -104,32 +102,6 @@ const getPanelsAreEqual = ( return true; }; -export const controlGroupInputToRawControlGroupAttributes = ( - controlGroupInput: Omit -): RawControlGroupAttributes => { - return { - controlStyle: controlGroupInput.controlStyle, - chainingSystem: controlGroupInput.chainingSystem, - showApplySelections: controlGroupInput.showApplySelections, - panelsJSON: JSON.stringify(controlGroupInput.panels), - ignoreParentSettingsJSON: JSON.stringify(controlGroupInput.ignoreParentSettings), - }; -}; - -export const generateNewControlIds = (controlGroupInput?: PersistableControlGroupInput) => { - if (!controlGroupInput?.panels) return; - - const newPanelsMap: ControlsPanels = {}; - for (const panel of Object.values(controlGroupInput.panels)) { - const newId = v4(); - newPanelsMap[newId] = { - ...panel, - explicitInput: { ...panel.explicitInput, id: newId }, - }; - } - return { ...controlGroupInput, panels: newPanelsMap }; -}; - export const rawControlGroupAttributesToControlGroupInput = ( rawControlGroupAttributes: RawControlGroupAttributes ): PersistableControlGroupInput | undefined => { diff --git a/src/plugins/controls/common/index.ts b/src/plugins/controls/common/index.ts index 45412a33765c6..f685c54159775 100644 --- a/src/plugins/controls/common/index.ts +++ b/src/plugins/controls/common/index.ts @@ -23,14 +23,12 @@ export { persistableControlGroupInputKeys, } from './control_group/types'; export { - controlGroupInputToRawControlGroupAttributes, rawControlGroupAttributesToControlGroupInput, rawControlGroupAttributesToSerializable, serializableToRawControlGroupAttributes, getDefaultControlGroupPersistableInput, persistableControlGroupInputIsEqual, getDefaultControlGroupInput, - generateNewControlIds, } from './control_group/control_group_persistence'; export { diff --git a/src/plugins/controls/public/react_controls/control_group/components/control_group.tsx b/src/plugins/controls/public/react_controls/control_group/components/control_group.tsx index d088595fd2a57..a9b23316bf83f 100644 --- a/src/plugins/controls/public/react_controls/control_group/components/control_group.tsx +++ b/src/plugins/controls/public/react_controls/control_group/components/control_group.tsx @@ -122,6 +122,7 @@ export function ControlGroup({ paddingSize="none" color={draggingId ? 'success' : 'transparent'} className="controlsWrapper" + data-test-subj="controls-group-wrapper" > & { controlsInOrder: ControlsInOrder; }; @@ -39,6 +35,7 @@ export function initializeControlGroupUnsavedChanges( children$: PresentationContainer['children$'], comparators: StateComparators, snapshotControlsRuntimeState: () => ControlPanelsState, + resetControlsUnsavedChanges: () => void, parentApi: unknown, lastSavedRuntimeState: ControlGroupRuntimeState ) { @@ -48,7 +45,6 @@ export function initializeControlGroupUnsavedChanges( chainingSystem: lastSavedRuntimeState.chainingSystem, controlsInOrder: getControlsInOrder(lastSavedRuntimeState.initialChildControlState), ignoreParentSettings: lastSavedRuntimeState.ignoreParentSettings, - initialChildControlState: lastSavedRuntimeState.initialChildControlState, labelPosition: lastSavedRuntimeState.labelPosition, }, parentApi, @@ -73,6 +69,7 @@ export function initializeControlGroupUnsavedChanges( ), asyncResetUnsavedChanges: async () => { controlGroupUnsavedChanges.api.resetUnsavedChanges(); + resetControlsUnsavedChanges(); const filtersReadyPromises: Array> = []; Object.values(children$.value).forEach((controlApi) => { diff --git a/src/plugins/controls/public/react_controls/control_group/get_control_group_factory.tsx b/src/plugins/controls/public/react_controls/control_group/get_control_group_factory.tsx index d64f079829b64..52a24c830df84 100644 --- a/src/plugins/controls/public/react_controls/control_group/get_control_group_factory.tsx +++ b/src/plugins/controls/public/react_controls/control_group/get_control_group_factory.tsx @@ -35,12 +35,19 @@ import { chaining$, controlFetch$, controlGroupFetch$ } from './control_fetch'; import { initControlsManager } from './init_controls_manager'; import { openEditControlGroupFlyout } from './open_edit_control_group_flyout'; import { deserializeControlGroup } from './serialization_utils'; -import { ControlGroupApi, ControlGroupRuntimeState, ControlGroupSerializedState } from './types'; +import { + ControlGroupApi, + ControlGroupRuntimeState, + ControlGroupSerializedState, + ControlPanelsState, +} from './types'; import { ControlGroup } from './components/control_group'; import { initSelectionsManager } from './selections_manager'; import { initializeControlGroupUnsavedChanges } from './control_group_unsaved_changes_api'; import { openDataControlEditor } from '../controls/data_controls/open_data_control_editor'; +const DEFAULT_CHAINING_SYSTEM = 'HIERARCHICAL'; + export const getControlGroupEmbeddableFactory = (services: { core: CoreStart; dataViews: DataViewsPublicPluginStart; @@ -61,7 +68,6 @@ export const getControlGroupEmbeddableFactory = (services: { lastSavedRuntimeState ) => { const { - initialChildControlState, labelPosition: initialLabelPosition, chainingSystem, autoApplySelections, @@ -69,19 +75,22 @@ export const getControlGroupEmbeddableFactory = (services: { } = initialRuntimeState; const autoApplySelections$ = new BehaviorSubject(autoApplySelections); - const parentDataViewId = apiPublishesDataViews(parentApi) - ? parentApi.dataViews.value?.[0]?.id - : undefined; + const defaultDataViewId = await services.dataViews.getDefaultId(); + const lastSavedControlsState$ = new BehaviorSubject( + lastSavedRuntimeState.initialChildControlState + ); const controlsManager = initControlsManager( - initialChildControlState, - parentDataViewId ?? (await services.dataViews.getDefaultId()) + initialRuntimeState.initialChildControlState, + lastSavedControlsState$ ); const selectionsManager = initSelectionsManager({ ...controlsManager.api, autoApplySelections$, }); const dataViews = new BehaviorSubject(undefined); - const chainingSystem$ = new BehaviorSubject(chainingSystem); + const chainingSystem$ = new BehaviorSubject( + chainingSystem ?? DEFAULT_CHAINING_SYSTEM + ); const ignoreParentSettings$ = new BehaviorSubject( ignoreParentSettings ); @@ -105,6 +114,7 @@ export const getControlGroupEmbeddableFactory = (services: { chainingSystem: [ chainingSystem$, (next: ControlGroupChainingSystem) => chainingSystem$.next(next), + (a, b) => (a ?? DEFAULT_CHAINING_SYSTEM) === (b ?? DEFAULT_CHAINING_SYSTEM), ], ignoreParentSettings: [ ignoreParentSettings$, @@ -114,6 +124,7 @@ export const getControlGroupEmbeddableFactory = (services: { labelPosition: [labelPosition$, (next: ControlStyle) => labelPosition$.next(next)], }, controlsManager.snapshotControlsRuntimeState, + controlsManager.resetControlsUnsavedChanges, parentApi, lastSavedRuntimeState ); @@ -160,20 +171,28 @@ export const getControlGroupEmbeddableFactory = (services: { i18n.translate('controls.controlGroup.displayName', { defaultMessage: 'Controls', }), - openAddDataControlFlyout: (settings) => { - const { controlInputTransform } = settings ?? { - controlInputTransform: (state) => state, - }; + openAddDataControlFlyout: (options) => { + const parentDataViewId = apiPublishesDataViews(parentApi) + ? parentApi.dataViews.value?.[0]?.id + : undefined; + const newControlState = controlsManager.getNewControlState(); openDataControlEditor({ - initialState: controlsManager.getNewControlState(), + initialState: { + ...newControlState, + dataViewId: + newControlState.dataViewId ?? parentDataViewId ?? defaultDataViewId ?? undefined, + }, onSave: ({ type: controlType, state: initialState }) => { controlsManager.api.addNewPanel({ panelType: controlType, - initialState: controlInputTransform!( - initialState as Partial, - controlType - ), + initialState: options?.controlInputTransform + ? options.controlInputTransform( + initialState as Partial, + controlType + ) + : initialState, }); + options?.onSave?.(); }, controlGroupApi: api, services, @@ -208,21 +227,19 @@ export const getControlGroupEmbeddableFactory = (services: { dataViews.next(newDataViews) ); - /** Fetch the allowExpensiveQuries setting for the children to use if necessary */ - try { - const { allowExpensiveQueries } = await services.core.http.get<{ - allowExpensiveQueries: boolean; - // TODO: Rename this route as part of https://github.com/elastic/kibana/issues/174961 - }>('/internal/controls/optionsList/getExpensiveQueriesSetting', { - version: '1', - }); - if (!allowExpensiveQueries) { - // only set if this returns false, since it defaults to true - allowExpensiveQueries$.next(allowExpensiveQueries); - } - } catch { - // do nothing - default to true on error (which it was initialized to) - } + const saveNotificationSubscription = apiHasSaveNotification(parentApi) + ? parentApi.saveNotification$.subscribe(() => { + lastSavedControlsState$.next(controlsManager.snapshotControlsRuntimeState()); + + if ( + typeof autoApplySelections$.value === 'boolean' && + !autoApplySelections$.value && + selectionsManager.hasUnappliedSelections$.value + ) { + selectionsManager.applySelections(); + } + }) + : undefined; return { api, @@ -233,9 +250,29 @@ export const getControlGroupEmbeddableFactory = (services: { ); useEffect(() => { + /** Fetch the allowExpensiveQuries setting for the children to use if necessary */ + const fetchAllowExpensiveQueries = async () => { + try { + const { allowExpensiveQueries } = await services.core.http.get<{ + allowExpensiveQueries: boolean; + // TODO: Rename this route as part of https://github.com/elastic/kibana/issues/174961 + }>('/internal/controls/optionsList/getExpensiveQueriesSetting', { + version: '1', + }); + if (!allowExpensiveQueries) { + // only set if this returns false, since it defaults to true + allowExpensiveQueries$.next(allowExpensiveQueries); + } + } catch { + // do nothing - default to true on error (which it was initialized to) + } + }; + fetchAllowExpensiveQueries(); // no need to await - don't want to block anything waiting for this + return () => { selectionsManager.cleanup(); childrenDataViewsSubscription.unsubscribe(); + saveNotificationSubscription?.unsubscribe(); }; }, []); diff --git a/src/plugins/controls/public/react_controls/control_group/init_controls_manager.test.ts b/src/plugins/controls/public/react_controls/control_group/init_controls_manager.test.ts index 1ba4c6c070ae7..92ff5c7054127 100644 --- a/src/plugins/controls/public/react_controls/control_group/init_controls_manager.test.ts +++ b/src/plugins/controls/public/react_controls/control_group/init_controls_manager.test.ts @@ -7,27 +7,26 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { BehaviorSubject } from 'rxjs'; import { DefaultDataControlState } from '../controls/data_controls/types'; import { DefaultControlApi } from '../controls/types'; import { initControlsManager, getLastUsedDataViewId } from './init_controls_manager'; -import { ControlPanelState } from './types'; +import { ControlPanelState, ControlPanelsState } from './types'; jest.mock('uuid', () => ({ v4: jest.fn().mockReturnValue('delta'), })); -const DEFAULT_DATA_VIEW_ID = 'myDataView'; - describe('PresentationContainer api', () => { + const intialControlsState = { + alpha: { type: 'testControl', order: 0 }, + bravo: { type: 'testControl', order: 1 }, + charlie: { type: 'testControl', order: 2 }, + }; + const lastSavedControlsState$ = new BehaviorSubject(intialControlsState); + test('addNewPanel should add control at end of controls', async () => { - const controlsManager = initControlsManager( - { - alpha: { type: 'testControl', order: 0 }, - bravo: { type: 'testControl', order: 1 }, - charlie: { type: 'testControl', order: 2 }, - }, - DEFAULT_DATA_VIEW_ID - ); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); const addNewPanelPromise = controlsManager.api.addNewPanel({ panelType: 'testControl', initialState: {}, @@ -43,14 +42,7 @@ describe('PresentationContainer api', () => { }); test('removePanel should remove control', () => { - const controlsManager = initControlsManager( - { - alpha: { type: 'testControl', order: 0 }, - bravo: { type: 'testControl', order: 1 }, - charlie: { type: 'testControl', order: 2 }, - }, - DEFAULT_DATA_VIEW_ID - ); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); controlsManager.api.removePanel('bravo'); expect(controlsManager.controlsInOrder$.value.map((element) => element.id)).toEqual([ 'alpha', @@ -59,14 +51,7 @@ describe('PresentationContainer api', () => { }); test('replacePanel should replace control', async () => { - const controlsManager = initControlsManager( - { - alpha: { type: 'testControl', order: 0 }, - bravo: { type: 'testControl', order: 1 }, - charlie: { type: 'testControl', order: 2 }, - }, - DEFAULT_DATA_VIEW_ID - ); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); const replacePanelPromise = controlsManager.api.replacePanel('bravo', { panelType: 'testControl', initialState: {}, @@ -82,13 +67,7 @@ describe('PresentationContainer api', () => { describe('untilInitialized', () => { test('should not resolve until all controls are initialized', async () => { - const controlsManager = initControlsManager( - { - alpha: { type: 'testControl', order: 0 }, - bravo: { type: 'testControl', order: 1 }, - }, - DEFAULT_DATA_VIEW_ID - ); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); let isDone = false; controlsManager.api.untilInitialized().then(() => { isDone = true; @@ -102,19 +81,18 @@ describe('PresentationContainer api', () => { controlsManager.setControlApi('bravo', {} as unknown as DefaultControlApi); await new Promise((resolve) => setTimeout(resolve, 0)); + expect(isDone).toBe(false); + + controlsManager.setControlApi('charlie', {} as unknown as DefaultControlApi); + await new Promise((resolve) => setTimeout(resolve, 0)); expect(isDone).toBe(true); }); test('should resolve when all control already initialized ', async () => { - const controlsManager = initControlsManager( - { - alpha: { type: 'testControl', order: 0 }, - bravo: { type: 'testControl', order: 1 }, - }, - DEFAULT_DATA_VIEW_ID - ); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); controlsManager.setControlApi('alpha', {} as unknown as DefaultControlApi); controlsManager.setControlApi('bravo', {} as unknown as DefaultControlApi); + controlsManager.setControlApi('charlie', {} as unknown as DefaultControlApi); let isDone = false; controlsManager.api.untilInitialized().then(() => { @@ -128,14 +106,14 @@ describe('PresentationContainer api', () => { }); describe('snapshotControlsRuntimeState', () => { + const intialControlsState = { + alpha: { type: 'testControl', order: 1 }, + bravo: { type: 'testControl', order: 0 }, + }; + const lastSavedControlsState$ = new BehaviorSubject(intialControlsState); + test('should snapshot runtime state for all controls', async () => { - const controlsManager = initControlsManager( - { - alpha: { type: 'testControl', order: 1 }, - bravo: { type: 'testControl', order: 0 }, - }, - DEFAULT_DATA_VIEW_ID - ); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); controlsManager.setControlApi('alpha', { snapshotRuntimeState: () => { return { key1: 'alpha value' }; @@ -191,28 +169,120 @@ describe('getLastUsedDataViewId', () => { }); }); +describe('resetControlsUnsavedChanges', () => { + test(`should remove previous sessions's unsaved changes on reset`, () => { + // last session's unsaved changes added 1 control + const intialControlsState = { + alpha: { type: 'testControl', order: 0 }, + }; + // last saved state is empty control group + const lastSavedControlsState$ = new BehaviorSubject({}); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); + controlsManager.setControlApi('alpha', {} as unknown as DefaultControlApi); + + expect(controlsManager.controlsInOrder$.value).toEqual([ + { + id: 'alpha', + type: 'testControl', + }, + ]); + + controlsManager.resetControlsUnsavedChanges(); + expect(controlsManager.controlsInOrder$.value).toEqual([]); + }); + + test('should restore deleted control on reset', () => { + const intialControlsState = { + alpha: { type: 'testControl', order: 0 }, + }; + const lastSavedControlsState$ = new BehaviorSubject(intialControlsState); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); + controlsManager.setControlApi('alpha', {} as unknown as DefaultControlApi); + + // delete control + controlsManager.api.removePanel('alpha'); + + // deleted control should exist on reset + controlsManager.resetControlsUnsavedChanges(); + expect(controlsManager.controlsInOrder$.value).toEqual([ + { + id: 'alpha', + type: 'testControl', + }, + ]); + }); + + test('should restore controls to last saved state', () => { + const intialControlsState = {}; + const lastSavedControlsState$ = new BehaviorSubject(intialControlsState); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); + + // add control + controlsManager.api.addNewPanel({ panelType: 'testControl' }); + controlsManager.setControlApi('delta', { + snapshotRuntimeState: () => { + return {}; + }, + } as unknown as DefaultControlApi); + + // simulate save + lastSavedControlsState$.next(controlsManager.snapshotControlsRuntimeState()); + + // saved control should exist on reset + controlsManager.resetControlsUnsavedChanges(); + expect(controlsManager.controlsInOrder$.value).toEqual([ + { + id: 'delta', + type: 'testControl', + }, + ]); + }); + + // Test edge case where adding a panel and resetting left orphaned control in children$ + test('should remove orphaned children on reset', () => { + // baseline last saved state contains a single control + const intialControlsState = { + alpha: { type: 'testControl', order: 0 }, + }; + const lastSavedControlsState$ = new BehaviorSubject(intialControlsState); + const controlsManager = initControlsManager(intialControlsState, lastSavedControlsState$); + controlsManager.setControlApi('alpha', {} as unknown as DefaultControlApi); + + // add another control + controlsManager.api.addNewPanel({ panelType: 'testControl' }); + controlsManager.setControlApi('delta', {} as unknown as DefaultControlApi); + expect(Object.keys(controlsManager.api.children$.value).length).toBe(2); + + // reset to lastSavedControlsState + controlsManager.resetControlsUnsavedChanges(); + // children$ should no longer contain control removed by resetting back to original control baseline + expect(Object.keys(controlsManager.api.children$.value).length).toBe(1); + }); +}); + describe('getNewControlState', () => { test('should contain defaults when there are no existing controls', () => { - const controlsManager = initControlsManager({}, DEFAULT_DATA_VIEW_ID); + const controlsManager = initControlsManager({}, new BehaviorSubject({})); expect(controlsManager.getNewControlState()).toEqual({ grow: true, width: 'medium', - dataViewId: DEFAULT_DATA_VIEW_ID, + dataViewId: undefined, }); }); test('should start with defaults if there are existing controls', () => { + const intialControlsState = { + alpha: { + type: 'testControl', + order: 1, + dataViewId: 'myOtherDataViewId', + width: 'small', + grow: false, + } as ControlPanelState & Pick, + }; const controlsManager = initControlsManager( - { - alpha: { - type: 'testControl', - order: 1, - dataViewId: 'myOtherDataViewId', - width: 'small', - grow: false, - } as ControlPanelState & Pick, - }, - DEFAULT_DATA_VIEW_ID + intialControlsState, + new BehaviorSubject(intialControlsState) ); expect(controlsManager.getNewControlState()).toEqual({ grow: true, @@ -222,7 +292,7 @@ describe('getNewControlState', () => { }); test('should contain values of last added control', () => { - const controlsManager = initControlsManager({}, DEFAULT_DATA_VIEW_ID); + const controlsManager = initControlsManager({}, new BehaviorSubject({})); controlsManager.api.addNewPanel({ panelType: 'testControl', initialState: { diff --git a/src/plugins/controls/public/react_controls/control_group/init_controls_manager.ts b/src/plugins/controls/public/react_controls/control_group/init_controls_manager.ts index ab6a98db62251..e13ab09aa53c7 100644 --- a/src/plugins/controls/public/react_controls/control_group/init_controls_manager.ts +++ b/src/plugins/controls/public/react_controls/control_group/init_controls_manager.ts @@ -39,22 +39,25 @@ export function getControlsInOrder(initialControlPanelsState: ControlPanelsState } export function initControlsManager( - initialControlPanelsState: ControlPanelsState, - defaultDataViewId: string | null + /** + * Composed from last saved controls state and previous sessions's unsaved changes to controls state + */ + initialControlsState: ControlPanelsState, + /** + * Observable that publishes last saved controls state only + */ + lastSavedControlsState$: PublishingSubject ) { - const lastSavedControlsPanelState$ = new BehaviorSubject(initialControlPanelsState); - const initialControlIds = Object.keys(initialControlPanelsState); + const initialControlIds = Object.keys(initialControlsState); const children$ = new BehaviorSubject<{ [key: string]: DefaultControlApi }>({}); - let controlsPanelState: { [panelId: string]: DefaultControlState } = { - ...initialControlPanelsState, + let currentControlsState: { [panelId: string]: DefaultControlState } = { + ...initialControlsState, }; const controlsInOrder$ = new BehaviorSubject( - getControlsInOrder(initialControlPanelsState) + getControlsInOrder(initialControlsState) ); const lastUsedDataViewId$ = new BehaviorSubject( - getLastUsedDataViewId(controlsInOrder$.value, initialControlPanelsState) ?? - defaultDataViewId ?? - undefined + getLastUsedDataViewId(controlsInOrder$.value, initialControlsState) ); const lastUsedWidth$ = new BehaviorSubject(DEFAULT_CONTROL_WIDTH); const lastUsedGrow$ = new BehaviorSubject(DEFAULT_CONTROL_GROW); @@ -109,12 +112,12 @@ export function initControlsManager( type: panelType, }); controlsInOrder$.next(nextControlsInOrder); - controlsPanelState[id] = initialState ?? {}; + currentControlsState[id] = initialState ?? {}; return await untilControlLoaded(id); } function removePanel(panelId: string) { - delete controlsPanelState[panelId]; + delete currentControlsState[panelId]; controlsInOrder$.next(controlsInOrder$.value.filter(({ id }) => id !== panelId)); children$.next(omit(children$.value, panelId)); } @@ -162,7 +165,7 @@ export function initControlsManager( type: controlApi.type, width, /** Re-add the `explicitInput` layer on serialize so control group saved object retains shape */ - explicitInput: rest, + explicitInput: { id, ...rest }, }; }); @@ -185,9 +188,30 @@ export function initControlsManager( }); return controlsRuntimeState; }, + resetControlsUnsavedChanges: () => { + currentControlsState = { + ...lastSavedControlsState$.value, + }; + const nextControlsInOrder = getControlsInOrder(currentControlsState as ControlPanelsState); + controlsInOrder$.next(nextControlsInOrder); + + const nextControlIds = nextControlsInOrder.map(({ id }) => id); + const children = { ...children$.value }; + let modifiedChildren = false; + Object.keys(children).forEach((controlId) => { + if (!nextControlIds.includes(controlId)) { + // remove children that no longer exist after reset + delete children[controlId]; + modifiedChildren = true; + } + }); + if (modifiedChildren) { + children$.next(children); + } + }, api: { getSerializedStateForChild: (childId: string) => { - const controlPanelState = controlsPanelState[childId]; + const controlPanelState = currentControlsState[childId]; return controlPanelState ? { rawState: controlPanelState } : undefined; }, children$: children$ as PublishingSubject<{ @@ -231,26 +255,10 @@ export function initControlsManager( comparators: { controlsInOrder: [ controlsInOrder$, - (next: ControlsInOrder) => controlsInOrder$.next(next), + (next: ControlsInOrder) => {}, // setter does nothing, controlsInOrder$ reset by resetControlsRuntimeState fastIsEqual, ], - // Control state differences tracked by controlApi comparators - // Control ordering differences tracked by controlsInOrder comparator - // initialChildControlState comparatator exists to reset controls manager to last saved state - initialChildControlState: [ - lastSavedControlsPanelState$, - (lastSavedControlPanelsState: ControlPanelsState) => { - lastSavedControlsPanelState$.next(lastSavedControlPanelsState); - controlsPanelState = { - ...lastSavedControlPanelsState, - }; - controlsInOrder$.next(getControlsInOrder(lastSavedControlPanelsState)); - }, - () => true, - ], - } as StateComparators< - Pick - >, + } as StateComparators>, }; } diff --git a/src/plugins/controls/public/react_controls/control_group/open_edit_control_group_flyout.tsx b/src/plugins/controls/public/react_controls/control_group/open_edit_control_group_flyout.tsx index 84e41120b1bf6..5e7026282123a 100644 --- a/src/plugins/controls/public/react_controls/control_group/open_edit_control_group_flyout.tsx +++ b/src/plugins/controls/public/react_controls/control_group/open_edit_control_group_flyout.tsx @@ -73,7 +73,7 @@ export const openEditControlGroupFlyout = ( Object.keys(controlGroupApi.children$.getValue()).forEach((childId) => { controlGroupApi.removePanel(childId); }); - ref.close(); + closeOverlay(ref); }); }; diff --git a/src/plugins/controls/public/react_controls/control_group/serialization_utils.ts b/src/plugins/controls/public/react_controls/control_group/serialization_utils.ts index 019364e5779cd..96a9d6cb6c88c 100644 --- a/src/plugins/controls/public/react_controls/control_group/serialization_utils.ts +++ b/src/plugins/controls/public/react_controls/control_group/serialization_utils.ts @@ -10,6 +10,7 @@ import { SerializedPanelState } from '@kbn/presentation-containers'; import { omit } from 'lodash'; import { ControlGroupRuntimeState, ControlGroupSerializedState } from './types'; +import { parseReferenceName } from '../controls/data_controls/reference_name_utils'; export const deserializeControlGroup = ( state: SerializedPanelState @@ -21,9 +22,9 @@ export const deserializeControlGroup = ( const references = state.references ?? []; references.forEach((reference) => { const referenceName = reference.name; - const panelId = referenceName.substring('controlGroup_'.length, referenceName.lastIndexOf(':')); - if (panels[panelId]) { - panels[panelId].dataViewId = reference.id; + const { controlId } = parseReferenceName(referenceName); + if (panels[controlId]) { + panels[controlId].dataViewId = reference.id; } }); diff --git a/src/plugins/controls/public/react_controls/control_group/types.ts b/src/plugins/controls/public/react_controls/control_group/types.ts index 3ce9173c20dbd..6d9c06034a650 100644 --- a/src/plugins/controls/public/react_controls/control_group/types.ts +++ b/src/plugins/controls/public/react_controls/control_group/types.ts @@ -66,8 +66,9 @@ export type ControlGroupApi = PresentationContainer & ignoreParentSettings$: PublishingSubject; allowExpensiveQueries$: PublishingSubject; untilInitialized: () => Promise; - openAddDataControlFlyout: (settings?: { + openAddDataControlFlyout: (options?: { controlInputTransform?: ControlInputTransform; + onSave?: () => void; }) => void; labelPosition: PublishingSubject; }; diff --git a/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.test.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.test.tsx index ec25da94548e7..8ff50a2bc4ada 100644 --- a/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.test.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.test.tsx @@ -52,6 +52,7 @@ describe('initializeDataControl', () => { dataControl = initializeDataControl( 'myControlId', 'myControlType', + 'referenceNameSuffix', dataControlState, editorStateManager, controlGroupApi, @@ -83,6 +84,7 @@ describe('initializeDataControl', () => { dataControl = initializeDataControl( 'myControlId', 'myControlType', + 'referenceNameSuffix', { ...dataControlState, dataViewId: 'notGonnaFindMeDataViewId', @@ -121,6 +123,7 @@ describe('initializeDataControl', () => { dataControl = initializeDataControl( 'myControlId', 'myControlType', + 'referenceNameSuffix', { ...dataControlState, fieldName: 'notGonnaFindMeFieldName', diff --git a/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.ts b/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.ts index 02dfa5c6f9a32..b0d985892a40b 100644 --- a/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.ts @@ -27,10 +27,12 @@ import { initializeDefaultControlApi } from '../initialize_default_control_api'; import { ControlApiInitialization, ControlStateManager, DefaultControlState } from '../types'; import { openDataControlEditor } from './open_data_control_editor'; import { DataControlApi, DataControlFieldFormatter, DefaultDataControlState } from './types'; +import { getReferenceName } from './reference_name_utils'; export const initializeDataControl = ( controlId: string, controlType: string, + referenceNameSuffix: string, state: DefaultDataControlState, /** * `This state manager` should only include the state that the data control editor is @@ -243,7 +245,7 @@ export const initializeDataControl = ( }, references: [ { - name: `controlGroup_${controlId}:${controlType}DataView`, + name: getReferenceName(controlId, referenceNameSuffix), type: DATA_VIEW_SAVED_OBJECT_TYPE, id: dataViewId.getValue(), }, diff --git a/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/get_options_list_control_factory.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/get_options_list_control_factory.tsx index 8d6062ca0ef22..60aa4bb67398a 100644 --- a/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/get_options_list_control_factory.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/get_options_list_control_factory.tsx @@ -9,6 +9,7 @@ import React, { useEffect } from 'react'; import { BehaviorSubject, combineLatest, debounceTime, filter, skip } from 'rxjs'; +import fastIsEqual from 'fast-deep-equal'; import { buildExistsFilter, buildPhraseFilter, buildPhrasesFilter, Filter } from '@kbn/es-query'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; @@ -88,6 +89,7 @@ export const getOptionsListControlFactory = ( >( uuid, OPTIONS_LIST_CONTROL, + 'optionsListDataView', initialState, { searchTechnique: searchTechnique$, singleSelect: singleSelect$ }, controlGroupApi, @@ -244,7 +246,7 @@ export const getOptionsListControlFactory = ( searchTechnique: searchTechnique$.getValue(), runPastTimeout: runPastTimeout$.getValue(), singleSelect: singleSelect$.getValue(), - selections: selections.selectedOptions$.getValue(), + selectedOptions: selections.selectedOptions$.getValue(), sort: sort$.getValue(), existsSelected: selections.existsSelected$.getValue(), exclude: selections.exclude$.getValue(), @@ -278,7 +280,7 @@ export const getOptionsListControlFactory = ( sort: [ sort$, (sort) => sort$.next(sort), - (a, b) => (a ?? OPTIONS_LIST_DEFAULT_SORT) === (b ?? OPTIONS_LIST_DEFAULT_SORT), + (a, b) => fastIsEqual(a ?? OPTIONS_LIST_DEFAULT_SORT, b ?? OPTIONS_LIST_DEFAULT_SORT), ], /** This state cannot currently be changed after the control is created */ diff --git a/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/get_range_slider_control_factory.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/get_range_slider_control_factory.tsx index 7e6d747abc51f..ad0b172d7c5ce 100644 --- a/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/get_range_slider_control_factory.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/get_range_slider_control_factory.tsx @@ -64,6 +64,7 @@ export const getRangesliderControlFactory = ( const dataControl = initializeDataControl>( uuid, RANGE_SLIDER_CONTROL, + 'rangeSliderDataView', initialState, { step: step$, @@ -159,8 +160,8 @@ export const getRangesliderControlFactory = ( if (error) { dataControl.api.setBlockingError(error); } - max$.next(max); - min$.next(min); + max$.next(max !== undefined ? Math.ceil(max) : undefined); + min$.next(min !== undefined ? Math.floor(min) : undefined); } ); diff --git a/src/plugins/controls/public/react_controls/controls/data_controls/reference_name_utils.ts b/src/plugins/controls/public/react_controls/controls/data_controls/reference_name_utils.ts new file mode 100644 index 0000000000000..43dc37610f66c --- /dev/null +++ b/src/plugins/controls/public/react_controls/controls/data_controls/reference_name_utils.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +const REFERENCE_NAME_PREFIX = 'controlGroup_'; + +export function getReferenceName(controlId: string, referenceNameSuffix: string) { + return `${REFERENCE_NAME_PREFIX}${controlId}:${referenceNameSuffix}`; +} + +export function parseReferenceName(referenceName: string) { + return { + controlId: referenceName.substring( + REFERENCE_NAME_PREFIX.length, + referenceName.lastIndexOf(':') + ), + }; +} diff --git a/src/plugins/controls/public/react_controls/controls/timeslider_control/get_timeslider_control_factory.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/get_timeslider_control_factory.tsx index 59bf17e403709..f40ad3ea51824 100644 --- a/src/plugins/controls/public/react_controls/controls/timeslider_control/get_timeslider_control_factory.tsx +++ b/src/plugins/controls/public/react_controls/controls/timeslider_control/get_timeslider_control_factory.tsx @@ -36,16 +36,17 @@ import './components/index.scss'; import { TimeSliderPrepend } from './components/time_slider_prepend'; import { TIME_SLIDER_CONTROL } from '../../../../common'; +const displayName = i18n.translate('controls.timesliderControl.displayName', { + defaultMessage: 'Time slider', +}); + export const getTimesliderControlFactory = ( services: Services ): ControlFactory => { return { type: TIME_SLIDER_CONTROL, getIconType: () => 'search', - getDisplayName: () => - i18n.translate('controls.timesliderControl.displayName', { - defaultMessage: 'Time slider', - }), + getDisplayName: () => displayName, buildControl: async (initialState, buildApi, uuid, controlGroupApi) => { const { timeRangeMeta$, formatDate, cleanupTimeRangeSubscription } = initTimeRangeSubscription(controlGroupApi, services); @@ -204,6 +205,7 @@ export const getTimesliderControlFactory = ( const api = buildApi( { ...defaultControl.api, + defaultPanelTitle: new BehaviorSubject(displayName), timeslice$, serializeState: () => { const { rawState: defaultControlState } = defaultControl.serialize(); diff --git a/src/plugins/controls/public/react_controls/controls/timeslider_control/types.ts b/src/plugins/controls/public/react_controls/controls/timeslider_control/types.ts index 87eea19f9d0e0..1808cfae5b6bd 100644 --- a/src/plugins/controls/public/react_controls/controls/timeslider_control/types.ts +++ b/src/plugins/controls/public/react_controls/controls/timeslider_control/types.ts @@ -9,7 +9,7 @@ import { CoreStart } from '@kbn/core/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import type { PublishesTimeslice } from '@kbn/presentation-publishing'; +import type { PublishesPanelTitle, PublishesTimeslice } from '@kbn/presentation-publishing'; import type { DefaultControlApi, DefaultControlState } from '../types'; export type Timeslice = [number, number]; @@ -21,7 +21,9 @@ export interface TimesliderControlState extends DefaultControlState { timesliceEndAsPercentageOfTimeRange?: number; } -export type TimesliderControlApi = DefaultControlApi & PublishesTimeslice; +export type TimesliderControlApi = DefaultControlApi & + Pick & + PublishesTimeslice; export interface Services { core: CoreStart; diff --git a/src/plugins/dashboard/common/dashboard_container/persistable_state/dashboard_container_references.ts b/src/plugins/dashboard/common/dashboard_container/persistable_state/dashboard_container_references.ts index 0e46472379842..0a331c8c253fd 100644 --- a/src/plugins/dashboard/common/dashboard_container/persistable_state/dashboard_container_references.ts +++ b/src/plugins/dashboard/common/dashboard_container/persistable_state/dashboard_container_references.ts @@ -8,7 +8,6 @@ */ import type { Reference } from '@kbn/content-management-utils'; -import { CONTROL_GROUP_TYPE, PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { EmbeddableInput, EmbeddablePersistableStateService, @@ -24,6 +23,10 @@ export const getReferencesForPanelId = (id: string, references: Reference[]): Re return filteredReferences; }; +export const getReferencesForControls = (references: Reference[]): Reference[] => { + return references.filter((reference) => reference.name.startsWith(controlGroupReferencePrefix)); +}; + export const prefixReferencesFromPanel = (id: string, references: Reference[]): Reference[] => { const prefix = `${id}:`; return references @@ -35,7 +38,6 @@ export const prefixReferencesFromPanel = (id: string, references: Reference[]): }; const controlGroupReferencePrefix = 'controlGroup_'; -const controlGroupId = 'dashboard_control_group'; export const createInject = ( persistableStateService: EmbeddablePersistableStateService @@ -91,27 +93,6 @@ export const createInject = ( } } - // since the controlGroup is not part of the panels array, its references need to be injected separately - if ('controlGroupInput' in workingState && workingState.controlGroupInput) { - const controlGroupReferences = references - .filter((reference) => reference.name.indexOf(controlGroupReferencePrefix) === 0) - .map((reference) => ({ - ...reference, - name: reference.name.replace(controlGroupReferencePrefix, ''), - })); - - const { type, ...injectedControlGroupState } = persistableStateService.inject( - { - ...workingState.controlGroupInput, - type: CONTROL_GROUP_TYPE, - id: controlGroupId, - }, - controlGroupReferences - ); - workingState.controlGroupInput = - injectedControlGroupState as unknown as PersistableControlGroupInput; - } - return workingState as EmbeddableStateWithType; }; }; @@ -161,23 +142,6 @@ export const createExtract = ( } } - // since the controlGroup is not part of the panels array, its references need to be extracted separately - if ('controlGroupInput' in workingState && workingState.controlGroupInput) { - const { state: extractedControlGroupState, references: controlGroupReferences } = - persistableStateService.extract({ - ...workingState.controlGroupInput, - type: CONTROL_GROUP_TYPE, - id: controlGroupId, - }); - workingState.controlGroupInput = - extractedControlGroupState as unknown as PersistableControlGroupInput; - const prefixedControlGroupReferences = controlGroupReferences.map((reference) => ({ - ...reference, - name: `${controlGroupReferencePrefix}${reference.name}`, - })); - references.push(...prefixedControlGroupReferences); - } - return { state: workingState as EmbeddableStateWithType, references }; }; }; diff --git a/src/plugins/dashboard/common/dashboard_saved_object/persistable_state/dashboard_saved_object_references.ts b/src/plugins/dashboard/common/dashboard_saved_object/persistable_state/dashboard_saved_object_references.ts index facb4880e6ab7..80644fa94dc36 100644 --- a/src/plugins/dashboard/common/dashboard_saved_object/persistable_state/dashboard_saved_object_references.ts +++ b/src/plugins/dashboard/common/dashboard_saved_object/persistable_state/dashboard_saved_object_references.ts @@ -9,7 +9,6 @@ import type { Reference } from '@kbn/content-management-utils'; import { EmbeddablePersistableStateService } from '@kbn/embeddable-plugin/common/types'; -import { rawControlGroupAttributesToControlGroupInput } from '@kbn/controls-plugin/common'; import { convertPanelMapToSavedPanels, @@ -34,9 +33,6 @@ function parseDashboardAttributesWithType( } return { - controlGroupInput: - attributes.controlGroupInput && - rawControlGroupAttributesToControlGroupInput(attributes.controlGroupInput), type: 'dashboard', panels: convertSavedPanelsToPanelMap(parsedPanels), } as ParsedDashboardAttributesWithType; @@ -60,13 +56,6 @@ export function injectReferences( panelsJSON: JSON.stringify(injectedPanels), } as DashboardAttributes; - if (attributes.controlGroupInput && injectedState.controlGroupInput) { - newAttributes.controlGroupInput = { - ...attributes.controlGroupInput, - panelsJSON: JSON.stringify(injectedState.controlGroupInput.panels), - }; - } - return newAttributes; } @@ -97,13 +86,6 @@ export function extractReferences( panelsJSON: JSON.stringify(extractedPanels), } as DashboardAttributes; - if (attributes.controlGroupInput && extractedState.controlGroupInput) { - newAttributes.controlGroupInput = { - ...attributes.controlGroupInput, - panelsJSON: JSON.stringify(extractedState.controlGroupInput.panels), - }; - } - return { references: [...references, ...extractedReferences], attributes: newAttributes, diff --git a/src/plugins/dashboard/common/types.ts b/src/plugins/dashboard/common/types.ts index 68afeb34de78a..b3b4b1e983b29 100644 --- a/src/plugins/dashboard/common/types.ts +++ b/src/plugins/dashboard/common/types.ts @@ -9,8 +9,6 @@ import type { Reference } from '@kbn/content-management-utils'; import { EmbeddableStateWithType } from '@kbn/embeddable-plugin/common'; -import { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; - import { DashboardAttributes, SavedDashboardPanel } from './content_management'; import { DashboardContainerInput, DashboardPanelMap } from './dashboard_container/types'; @@ -41,7 +39,6 @@ export type SharedDashboardState = Partial< * A partially parsed version of the Dashboard Attributes used for inject and extract logic for both the Dashboard Container and the Dashboard Saved Object. */ export type ParsedDashboardAttributesWithType = EmbeddableStateWithType & { - controlGroupInput?: PersistableControlGroupInput; panels: DashboardPanelMap; type: 'dashboard'; }; diff --git a/src/plugins/dashboard/public/dashboard_app/locator/locator.test.ts b/src/plugins/dashboard/public/dashboard_app/locator/locator.test.ts index b4957bb5597f0..f247e1b6cabe4 100644 --- a/src/plugins/dashboard/public/dashboard_app/locator/locator.test.ts +++ b/src/plugins/dashboard/public/dashboard_app/locator/locator.test.ts @@ -10,9 +10,7 @@ import { DashboardAppLocatorDefinition } from './locator'; import { hashedItemStore } from '@kbn/kibana-utils-plugin/public'; import { mockStorage } from '@kbn/kibana-utils-plugin/public/storage/hashed_item_store/mock'; -import { mockControlGroupInput } from '@kbn/controls-plugin/common/mocks'; import { FilterStateStore } from '@kbn/es-query'; -import { SerializableControlGroupInput } from '@kbn/controls-plugin/common'; describe('dashboard locator', () => { beforeEach(() => { @@ -194,16 +192,18 @@ describe('dashboard locator', () => { useHashedUrl: false, getDashboardFilterFields: async (dashboardId: string) => [], }); - const controlGroupInput = mockControlGroupInput() as unknown as SerializableControlGroupInput; + const controlGroupState = { + autoApplySelections: false, + }; const location = await definition.getLocation({ - controlGroupInput, + controlGroupState, }); expect(location).toMatchObject({ app: 'dashboards', path: `#/create?_g=()`, state: { - controlGroupInput, + controlGroupState, }, }); }); diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/add_data_control_button.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/add_data_control_button.tsx index afd9690c06023..4c6bf79d9f651 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/add_data_control_button.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/add_data_control_button.tsx @@ -9,16 +9,16 @@ import React from 'react'; import { EuiContextMenuItem } from '@elastic/eui'; -import { ControlGroupContainer } from '@kbn/controls-plugin/public'; +import { ControlGroupApi } from '@kbn/controls-plugin/public'; import { getAddControlButtonTitle } from '../../_dashboard_app_strings'; import { useDashboardAPI } from '../../dashboard_app'; interface Props { closePopover: () => void; - controlGroup: ControlGroupContainer; + controlGroupApi?: ControlGroupApi; } -export const AddDataControlButton = ({ closePopover, controlGroup, ...rest }: Props) => { +export const AddDataControlButton = ({ closePopover, controlGroupApi, ...rest }: Props) => { const dashboard = useDashboardAPI(); const onSave = () => { dashboard.scrollToTop(); @@ -29,9 +29,10 @@ export const AddDataControlButton = ({ closePopover, controlGroup, ...rest }: Pr {...rest} icon="plusInCircle" data-test-subj="controls-create-button" + disabled={!controlGroupApi} aria-label={getAddControlButtonTitle()} onClick={() => { - controlGroup.openAddDataControlFlyout({ onSave }); + controlGroupApi?.openAddDataControlFlyout({ onSave }); closePopover(); }} > diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/add_time_slider_control_button.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/add_time_slider_control_button.tsx index 53405cf743029..2ec743b3354a0 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/add_time_slider_control_button.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/add_time_slider_control_button.tsx @@ -8,8 +8,12 @@ */ import React, { useEffect, useState } from 'react'; +import { v4 as uuidv4 } from 'uuid'; import { EuiContextMenuItem } from '@elastic/eui'; -import { ControlGroupContainer, TIME_SLIDER_CONTROL } from '@kbn/controls-plugin/public'; +import type { ControlGroupApi } from '@kbn/controls-plugin/public'; +import { TIME_SLIDER_CONTROL } from '@kbn/controls-plugin/common'; + +import { apiHasType } from '@kbn/presentation-publishing'; import { getAddTimeSliderControlButtonTitle, getOnlyOneTimeSliderControlMsg, @@ -18,40 +22,47 @@ import { useDashboardAPI } from '../../dashboard_app'; interface Props { closePopover: () => void; - controlGroup: ControlGroupContainer; + controlGroupApi?: ControlGroupApi; } -export const AddTimeSliderControlButton = ({ closePopover, controlGroup, ...rest }: Props) => { +export const AddTimeSliderControlButton = ({ closePopover, controlGroupApi, ...rest }: Props) => { const [hasTimeSliderControl, setHasTimeSliderControl] = useState(false); const dashboard = useDashboardAPI(); useEffect(() => { - const subscription = controlGroup.getInput$().subscribe(() => { - const childIds = controlGroup.getChildIds(); - const nextHasTimeSliderControl = childIds.some((id: string) => { - const child = controlGroup.getChild(id); - return child.type === TIME_SLIDER_CONTROL; + if (!controlGroupApi) { + return; + } + + const subscription = controlGroupApi.children$.subscribe((children) => { + const nextHasTimeSliderControl = Object.values(children).some((controlApi) => { + return apiHasType(controlApi) && controlApi.type === TIME_SLIDER_CONTROL; }); - if (nextHasTimeSliderControl !== hasTimeSliderControl) { - setHasTimeSliderControl(nextHasTimeSliderControl); - } + setHasTimeSliderControl(nextHasTimeSliderControl); }); return () => { subscription.unsubscribe(); }; - }, [controlGroup, hasTimeSliderControl, setHasTimeSliderControl]); + }, [controlGroupApi]); return ( { - await controlGroup.addTimeSliderControl(); + controlGroupApi?.addNewPanel({ + panelType: TIME_SLIDER_CONTROL, + initialState: { + grow: true, + width: 'large', + id: uuidv4(), + }, + }); dashboard.scrollToTop(); closePopover(); }} data-test-subj="controls-create-timeslider-button" - disabled={hasTimeSliderControl} + disabled={!controlGroupApi || hasTimeSliderControl} toolTipContent={hasTimeSliderControl ? getOnlyOneTimeSliderControlMsg() : null} > {getAddTimeSliderControlButtonTitle()} diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/controls_toolbar_button.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/controls_toolbar_button.tsx index 60878d2cb1c0d..23509f02d413b 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/controls_toolbar_button.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/controls_toolbar_button.tsx @@ -11,18 +11,18 @@ import React from 'react'; import { EuiContextMenuPanel, useEuiTheme } from '@elastic/eui'; import { ToolbarPopover } from '@kbn/shared-ux-button-toolbar'; -import type { ControlGroupContainer } from '@kbn/controls-plugin/public'; +import { ControlGroupApi } from '@kbn/controls-plugin/public'; import { getControlButtonTitle } from '../../_dashboard_app_strings'; import { AddDataControlButton } from './add_data_control_button'; import { AddTimeSliderControlButton } from './add_time_slider_control_button'; import { EditControlGroupButton } from './edit_control_group_button'; export function ControlsToolbarButton({ - controlGroup, + controlGroupApi, isDisabled, }: { - controlGroup: ControlGroupContainer; + controlGroupApi?: ControlGroupApi; isDisabled?: boolean; }) { const { euiTheme } = useEuiTheme(); @@ -44,17 +44,17 @@ export function ControlsToolbarButton({ items={[ , , , ]} diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/edit_control_group_button.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/edit_control_group_button.tsx index 73109c6a635eb..6747c902beb0c 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/edit_control_group_button.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/controls_toolbar_button/edit_control_group_button.tsx @@ -9,23 +9,24 @@ import React from 'react'; import { EuiContextMenuItem } from '@elastic/eui'; -import { ControlGroupContainer } from '@kbn/controls-plugin/public'; +import { ControlGroupApi } from '@kbn/controls-plugin/public'; import { getEditControlGroupButtonTitle } from '../../_dashboard_app_strings'; interface Props { closePopover: () => void; - controlGroup: ControlGroupContainer; + controlGroupApi?: ControlGroupApi; } -export const EditControlGroupButton = ({ closePopover, controlGroup, ...rest }: Props) => { +export const EditControlGroupButton = ({ closePopover, controlGroupApi, ...rest }: Props) => { return ( { - controlGroup.openEditControlGroupFlyout(); + controlGroupApi?.onEdit(); closePopover(); }} > diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx index 8e7eba29d6a2a..38892191cdb04 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx @@ -15,6 +15,7 @@ import { useEuiTheme } from '@elastic/eui'; import { AddFromLibraryButton, Toolbar, ToolbarButton } from '@kbn/shared-ux-button-toolbar'; import { BaseVisType, VisTypeAlias } from '@kbn/visualizations-plugin/public'; +import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; import { getCreateVisualizationButtonTitle } from '../_dashboard_app_strings'; import { EditorMenu } from './editor_menu'; import { useDashboardAPI } from '../dashboard_app'; @@ -84,6 +85,7 @@ export function DashboardEditingToolbar({ isDisabled }: { isDisabled?: boolean } * dismissNotification: Optional, if not passed a toast will appear in the dashboard */ + const controlGroupApi = useStateFromPublishingSubject(dashboard.controlGroupApi$); const extraButtons = [ , , + , ]; - if (dashboard.controlGroup) { - extraButtons.push( - - ); - } return (
void; showResetChange?: boolean; }) => { + const isMounted = useMountedState(); + const [isSaveInProgress, setIsSaveInProgress] = useState(false); /** @@ -100,6 +103,7 @@ export const useDashboardMenuItems = ({ * (1) reset the dashboard to the last saved state, and * (2) if `switchToViewMode` is `true`, set the dashboard to view mode. */ + const [isResetting, setIsResetting] = useState(false); const resetChanges = useCallback( (switchToViewMode: boolean = false) => { dashboard.clearOverlays(); @@ -114,13 +118,17 @@ export const useDashboardMenuItems = ({ return; } confirmDiscardUnsavedChanges(() => { - batch(() => { - dashboard.resetToLastSavedState(); - switchModes?.(); + batch(async () => { + setIsResetting(true); + await dashboard.asyncResetToLastSavedState(); + if (isMounted()) { + setIsResetting(false); + switchModes?.(); + } }); }, viewMode); }, - [dashboard, dashboardBackup, hasUnsavedChanges, viewMode] + [dashboard, dashboardBackup, hasUnsavedChanges, viewMode, isMounted] ); /** @@ -191,7 +199,8 @@ export const useDashboardMenuItems = ({ switchToViewMode: { ...topNavStrings.switchToViewMode, id: 'cancel', - disableButton: disableTopNav || !lastSavedId, + disableButton: disableTopNav || !lastSavedId || isResetting, + isLoading: isResetting, testId: 'dashboardViewOnlyMode', run: () => resetChanges(true), } as TopNavMenuData, @@ -227,6 +236,7 @@ export const useDashboardMenuItems = ({ dashboardBackup, quickSaveDashboard, resetChanges, + isResetting, ]); const resetChangesMenuItem = useMemo(() => { @@ -235,12 +245,22 @@ export const useDashboardMenuItems = ({ id: 'reset', testId: 'dashboardDiscardChangesMenuItem', disableButton: + isResetting || !hasUnsavedChanges || hasOverlays || (viewMode === ViewMode.EDIT && (isSaveInProgress || !lastSavedId)), + isLoading: isResetting, run: () => resetChanges(), }; - }, [hasOverlays, lastSavedId, resetChanges, viewMode, isSaveInProgress, hasUnsavedChanges]); + }, [ + hasOverlays, + lastSavedId, + resetChanges, + viewMode, + isSaveInProgress, + hasUnsavedChanges, + isResetting, + ]); /** * Build ordered menus for view and edit mode. diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx index e8e3491118e69..dc1d7f4671ce1 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx @@ -45,7 +45,7 @@ jest.mock('./dashboard_grid_item', () => { }; }); -const createAndMountDashboardGrid = () => { +const createAndMountDashboardGrid = async () => { const dashboardContainer = buildMockDashboard({ overrides: { panels: { @@ -62,6 +62,7 @@ const createAndMountDashboardGrid = () => { }, }, }); + await dashboardContainer.untilContainerInitialized(); const component = mountWithIntl( @@ -71,20 +72,20 @@ const createAndMountDashboardGrid = () => { }; test('renders DashboardGrid', async () => { - const { component } = createAndMountDashboardGrid(); + const { component } = await createAndMountDashboardGrid(); const panelElements = component.find('GridItem'); expect(panelElements.length).toBe(2); }); test('renders DashboardGrid with no visualizations', async () => { - const { dashboardContainer, component } = createAndMountDashboardGrid(); + const { dashboardContainer, component } = await createAndMountDashboardGrid(); dashboardContainer.updateInput({ panels: {} }); component.update(); expect(component.find('GridItem').length).toBe(0); }); test('DashboardGrid removes panel when removed from container', async () => { - const { dashboardContainer, component } = createAndMountDashboardGrid(); + const { dashboardContainer, component } = await createAndMountDashboardGrid(); const originalPanels = dashboardContainer.getInput().panels; const filteredPanels = { ...originalPanels }; delete filteredPanels['1']; @@ -95,7 +96,7 @@ test('DashboardGrid removes panel when removed from container', async () => { }); test('DashboardGrid renders expanded panel', async () => { - const { dashboardContainer, component } = createAndMountDashboardGrid(); + const { dashboardContainer, component } = await createAndMountDashboardGrid(); dashboardContainer.setExpandedPanelId('1'); component.update(); // Both panels should still exist in the dom, so nothing needs to be re-fetched once minimized. @@ -113,7 +114,7 @@ test('DashboardGrid renders expanded panel', async () => { }); test('DashboardGrid renders focused panel', async () => { - const { dashboardContainer, component } = createAndMountDashboardGrid(); + const { dashboardContainer, component } = await createAndMountDashboardGrid(); dashboardContainer.setFocusedPanelId('2'); component.update(); // Both panels should still exist in the dom, so nothing needs to be re-fetched once minimized. diff --git a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx index b6e6fa79524e0..488f0ba99c098 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx @@ -10,12 +10,19 @@ import { debounce } from 'lodash'; import classNames from 'classnames'; import useResizeObserver from 'use-resize-observer/polyfilled'; -import React, { useEffect, useMemo, useRef, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { EuiPortal } from '@elastic/eui'; -import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { ReactEmbeddableRenderer, ViewMode } from '@kbn/embeddable-plugin/public'; import { ExitFullScreenButton } from '@kbn/shared-ux-button-exit-full-screen'; +import { + ControlGroupApi, + ControlGroupRuntimeState, + ControlGroupSerializedState, +} from '@kbn/controls-plugin/public'; +import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; +import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; import { DashboardGrid } from '../grid'; import { useDashboardContainer } from '../../embeddable/dashboard_container'; import { DashboardEmptyScreen } from '../empty_screen/dashboard_empty_screen'; @@ -35,23 +42,11 @@ export const useDebouncedWidthObserver = (skipDebounce = false, wait = 100) => { }; export const DashboardViewportComponent = () => { - const controlsRoot = useRef(null); - const dashboard = useDashboardContainer(); - /** - * Render Control group - */ - const controlGroup = dashboard.controlGroup; - useEffect(() => { - if (controlGroup && controlsRoot.current) controlGroup.render(controlsRoot.current); - }, [controlGroup]); - + const controlGroupApi = useStateFromPublishingSubject(dashboard.controlGroupApi$); const panelCount = Object.keys(dashboard.select((state) => state.explicitInput.panels)).length; - const controlCount = Object.keys( - controlGroup?.select((state) => state.explicitInput.panels) ?? {} - ).length; - + const [hasControls, setHasControls] = useState(false); const viewMode = dashboard.select((state) => state.explicitInput.viewMode); const dashboardTitle = dashboard.select((state) => state.explicitInput.title); const useMargins = dashboard.select((state) => state.explicitInput.useMargins); @@ -66,17 +61,64 @@ export const DashboardViewportComponent = () => { 'dshDashboardViewport--panelExpanded': Boolean(expandedPanelId), }); + useEffect(() => { + if (!controlGroupApi) { + return; + } + const subscription = controlGroupApi.children$.subscribe((children) => { + setHasControls(Object.keys(children).length > 0); + }); + return () => { + subscription.unsubscribe(); + }; + }, [controlGroupApi]); + + // Bug in main where panels are loaded before control filters are ready + // Want to migrate to react embeddable controls with same behavior + // TODO - do not load panels until control filters are ready + /* + const [dashboardInitialized, setDashboardInitialized] = useState(false); + useEffect(() => { + let ignore = false; + dashboard.untilContainerInitialized().then(() => { + if (!ignore) { + setDashboardInitialized(true); + } + }); + return () => { + ignore = true; + }; + }, [dashboard]); + */ + return (
- {controlGroup && viewMode !== ViewMode.PRINT ? ( -
0 ? 'dshDashboardViewport-controls' : ''} - ref={controlsRoot} - /> + {viewMode !== ViewMode.PRINT ? ( +
+ + key={dashboard.getInput().id} + hidePanelChrome={true} + panelProps={{ hideLoader: true }} + type={CONTROL_GROUP_TYPE} + maybeId={'control_group'} + getParentApi={() => { + return { + ...dashboard, + getSerializedStateForChild: dashboard.getSerializedStateForControlGroup, + getRuntimeStateForChild: dashboard.getRuntimeStateForControlGroup, + }; + }} + onApiAvailable={(api) => dashboard.setControlGroupApi(api)} + /> +
) : null} {panelCount === 0 && }
{ data-shared-items-count={panelCount} > {/* Wait for `viewportWidth` to actually be set before rendering the dashboard grid - - otherwise, there is a race condition where the panels can end up being squashed */} + otherwise, there is a race condition where the panels can end up being squashed + TODO only render when dashboardInitialized + */} {viewportWidth !== 0 && }
diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx index a01a2e10f7d15..244638fffe90e 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx @@ -8,7 +8,6 @@ */ import type { Reference } from '@kbn/content-management-utils'; -import type { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { reportPerformanceMetricEvent } from '@kbn/ebt-tools'; import { EmbeddableInput, @@ -90,13 +89,17 @@ export async function runQuickSave(this: DashboardContainer) { const { panels: nextPanels, references } = await serializeAllPanelState(this); const dashboardStateToSave: DashboardContainerInput = { ...currentState, panels: nextPanels }; let stateToSave: SavedDashboardInput = dashboardStateToSave; - let persistableControlGroupInput: PersistableControlGroupInput | undefined; - if (this.controlGroup) { - persistableControlGroupInput = this.controlGroup.getPersistableInput(); - stateToSave = { ...stateToSave, controlGroupInput: persistableControlGroupInput }; + const controlGroupApi = this.controlGroupApi$.value; + let controlGroupReferences: Reference[] | undefined; + if (controlGroupApi) { + const { rawState: controlGroupSerializedState, references: extractedReferences } = + await controlGroupApi.serializeState(); + controlGroupReferences = extractedReferences; + stateToSave = { ...stateToSave, controlGroupInput: controlGroupSerializedState }; } const saveResult = await saveDashboardState({ + controlGroupReferences, panelReferences: references, currentState: stateToSave, saveOptions: {}, @@ -106,9 +109,6 @@ export async function runQuickSave(this: DashboardContainer) { this.savedObjectReferences = saveResult.references ?? []; this.dispatch.setLastSavedInput(dashboardStateToSave); this.saveNotification$.next(); - if (this.controlGroup && persistableControlGroupInput) { - this.controlGroup.setSavedState(persistableControlGroupInput); - } return saveResult; } @@ -181,19 +181,20 @@ export async function runInteractiveSave(this: DashboardContainer, interactionMo stateFromSaveModal.tags = newTags; } - let dashboardStateToSave: DashboardContainerInput & { - controlGroupInput?: PersistableControlGroupInput; - } = { + let dashboardStateToSave: SavedDashboardInput = { ...currentState, ...stateFromSaveModal, }; - let persistableControlGroupInput: PersistableControlGroupInput | undefined; - if (this.controlGroup) { - persistableControlGroupInput = this.controlGroup.getPersistableInput(); + const controlGroupApi = this.controlGroupApi$.value; + let controlGroupReferences: Reference[] | undefined; + if (controlGroupApi) { + const { rawState: controlGroupSerializedState, references } = + await controlGroupApi.serializeState(); + controlGroupReferences = references; dashboardStateToSave = { ...dashboardStateToSave, - controlGroupInput: persistableControlGroupInput, + controlGroupInput: controlGroupSerializedState, }; } @@ -226,6 +227,7 @@ export async function runInteractiveSave(this: DashboardContainer, interactionMo const beforeAddTime = window.performance.now(); const saveResult = await saveDashboardState({ + controlGroupReferences, panelReferences: references, saveOptions, currentState: { @@ -252,9 +254,6 @@ export async function runInteractiveSave(this: DashboardContainer, interactionMo batch(() => { this.dispatch.setStateFromSaveModal(stateFromSaveModal); this.dispatch.setLastSavedInput(dashboardStateToSave); - if (this.controlGroup && persistableControlGroupInput) { - this.controlGroup.setSavedState(persistableControlGroupInput); - } }); } diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.test.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.test.ts index a884bbc4d8d37..19094cd42ddb5 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.test.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.test.ts @@ -7,11 +7,9 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { mockControlGroupInput } from '@kbn/controls-plugin/common/mocks'; -import { ControlGroupContainer } from '@kbn/controls-plugin/public/control_group/embeddable/control_group_container'; import { Filter } from '@kbn/es-query'; -import { ReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; import { combineDashboardFiltersWithControlGroupFilters } from './dashboard_control_group_integration'; +import { BehaviorSubject } from 'rxjs'; jest.mock('@kbn/controls-plugin/public/control_group/embeddable/control_group_container'); @@ -52,46 +50,41 @@ const testFilter3: Filter = { }, }; -const mockControlGroupContainer = new ControlGroupContainer( - { getTools: () => {} } as unknown as ReduxToolsPackage, - mockControlGroupInput() -); - -describe('Test dashboard control group', () => { - describe('Combine dashboard filters with control group filters test', () => { - it('Combined filter pills do not get overwritten', async () => { - const dashboardFilterPills = [testFilter1, testFilter2]; - mockControlGroupContainer.getOutput = jest.fn().mockReturnValue({ filters: [] }); - const combinedFilters = combineDashboardFiltersWithControlGroupFilters( - dashboardFilterPills, - mockControlGroupContainer - ); - expect(combinedFilters).toEqual(dashboardFilterPills); - }); +describe('combineDashboardFiltersWithControlGroupFilters', () => { + it('Combined filter pills do not get overwritten', async () => { + const dashboardFilterPills = [testFilter1, testFilter2]; + const mockControlGroupApi = { + filters$: new BehaviorSubject([]), + }; + const combinedFilters = combineDashboardFiltersWithControlGroupFilters( + dashboardFilterPills, + mockControlGroupApi + ); + expect(combinedFilters).toEqual(dashboardFilterPills); + }); - it('Combined control filters do not get overwritten', async () => { - const controlGroupFilters = [testFilter1, testFilter2]; - mockControlGroupContainer.getOutput = jest - .fn() - .mockReturnValue({ filters: controlGroupFilters }); - const combinedFilters = combineDashboardFiltersWithControlGroupFilters( - [] as Filter[], - mockControlGroupContainer - ); - expect(combinedFilters).toEqual(controlGroupFilters); - }); + it('Combined control filters do not get overwritten', async () => { + const controlGroupFilters = [testFilter1, testFilter2]; + const mockControlGroupApi = { + filters$: new BehaviorSubject(controlGroupFilters), + }; + const combinedFilters = combineDashboardFiltersWithControlGroupFilters( + [] as Filter[], + mockControlGroupApi + ); + expect(combinedFilters).toEqual(controlGroupFilters); + }); - it('Combined dashboard filter pills and control filters do not get overwritten', async () => { - const dashboardFilterPills = [testFilter1, testFilter2]; - const controlGroupFilters = [testFilter3]; - mockControlGroupContainer.getOutput = jest - .fn() - .mockReturnValue({ filters: controlGroupFilters }); - const combinedFilters = combineDashboardFiltersWithControlGroupFilters( - dashboardFilterPills, - mockControlGroupContainer - ); - expect(combinedFilters).toEqual(dashboardFilterPills.concat(controlGroupFilters)); - }); + it('Combined dashboard filter pills and control filters do not get overwritten', async () => { + const dashboardFilterPills = [testFilter1, testFilter2]; + const controlGroupFilters = [testFilter3]; + const mockControlGroupApi = { + filters$: new BehaviorSubject(controlGroupFilters), + }; + const combinedFilters = combineDashboardFiltersWithControlGroupFilters( + dashboardFilterPills, + mockControlGroupApi + ); + expect(combinedFilters).toEqual(dashboardFilterPills.concat(controlGroupFilters)); }); }); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts index 863b86caca426..299b8111e37e5 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts @@ -7,114 +7,95 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ControlGroupInput } from '@kbn/controls-plugin/common'; -import { ControlGroupContainer } from '@kbn/controls-plugin/public'; -import { compareFilters, COMPARE_ALL_OPTIONS, type Filter } from '@kbn/es-query'; -import { combineCompatibleChildrenApis } from '@kbn/presentation-containers'; -import { apiPublishesDataLoading, PublishesDataLoading } from '@kbn/presentation-publishing'; -import deepEqual from 'fast-deep-equal'; -import { isEqual } from 'lodash'; -import { distinctUntilChanged, Observable, skip } from 'rxjs'; -import { DashboardContainerInput } from '../../../../../common'; +import { COMPARE_ALL_OPTIONS, compareFilters, type Filter } from '@kbn/es-query'; +import { + BehaviorSubject, + combineLatest, + distinctUntilChanged, + map, + of, + skip, + startWith, + switchMap, +} from 'rxjs'; +import { PublishesFilters, PublishingSubject } from '@kbn/presentation-publishing'; import { DashboardContainer } from '../../dashboard_container'; -interface DiffChecks { - [key: string]: (a?: unknown, b?: unknown) => boolean; -} - -const distinctUntilDiffCheck = (a: T, b: T, diffChecks: DiffChecks) => - !(Object.keys(diffChecks) as Array) - .map((key) => deepEqual(a[key], b[key])) - .includes(false); - -type DashboardControlGroupCommonKeys = keyof Pick< - DashboardContainerInput | ControlGroupInput, - 'filters' | 'lastReloadRequestTime' | 'timeRange' | 'query' ->; - -export function startSyncingDashboardControlGroup(this: DashboardContainer) { - if (!this.controlGroup) return; - - const compareAllFilters = (a?: Filter[], b?: Filter[]) => - compareFilters(a ?? [], b ?? [], COMPARE_ALL_OPTIONS); - - const dashboardRefetchDiff: DiffChecks = { - filters: (a, b) => compareAllFilters(a as Filter[], b as Filter[]), - timeRange: deepEqual, - query: deepEqual, - viewMode: deepEqual, - }; +export function startSyncingDashboardControlGroup(dashboard: DashboardContainer) { + const controlGroupFilters$ = dashboard.controlGroupApi$.pipe( + switchMap((controlGroupApi) => (controlGroupApi ? controlGroupApi.filters$ : of(undefined))) + ); + const controlGroupTimeslice$ = dashboard.controlGroupApi$.pipe( + switchMap((controlGroupApi) => (controlGroupApi ? controlGroupApi.timeslice$ : of(undefined))) + ); - // pass down any pieces of input needed to refetch or force refetch data for the controls - this.integrationSubscriptions.add( - (this.getInput$() as Readonly>) + // -------------------------------------------------------------------------------------- + // dashboard.unifiedSearchFilters$ + // -------------------------------------------------------------------------------------- + const unifiedSearchFilters$ = new BehaviorSubject( + dashboard.getInput().filters + ); + dashboard.unifiedSearchFilters$ = unifiedSearchFilters$ as PublishingSubject< + Filter[] | undefined + >; + dashboard.publishingSubscription.add( + dashboard + .getInput$() .pipe( - distinctUntilChanged((a, b) => - distinctUntilDiffCheck(a, b, dashboardRefetchDiff) - ) + startWith(dashboard.getInput()), + map((input) => input.filters), + distinctUntilChanged((previous, current) => { + return compareFilters(previous ?? [], current ?? [], COMPARE_ALL_OPTIONS); + }) ) - .subscribe(() => { - const newInput: { [key: string]: unknown } = {}; - (Object.keys(dashboardRefetchDiff) as DashboardControlGroupCommonKeys[]).forEach((key) => { - if ( - !dashboardRefetchDiff[key]?.(this.getInput()[key], this.controlGroup!.getInput()[key]) - ) { - newInput[key] = this.getInput()[key]; - } - }); - if (Object.keys(newInput).length > 0) { - this.controlGroup!.updateInput(newInput); - } + .subscribe((unifiedSearchFilters) => { + unifiedSearchFilters$.next(unifiedSearchFilters); }) ); - // when control group outputs filters, force a refresh! - this.integrationSubscriptions.add( - this.controlGroup - .getOutput$() - .pipe( - distinctUntilChanged(({ filters: filtersA }, { filters: filtersB }) => - compareAllFilters(filtersA, filtersB) - ), - skip(1) // skip first filter output because it will have been applied in initialize - ) - .subscribe(() => this.forceRefresh(false)) // we should not reload the control group when the control group output changes - otherwise, performance is severely impacted + // -------------------------------------------------------------------------------------- + // Set dashboard.filters$ to include unified search filters and control group filters + // -------------------------------------------------------------------------------------- + function getCombinedFilters() { + return combineDashboardFiltersWithControlGroupFilters( + dashboard.getInput().filters ?? [], + dashboard.controlGroupApi$.value + ); + } + + const filters$ = new BehaviorSubject(getCombinedFilters()); + dashboard.filters$ = filters$; + + dashboard.publishingSubscription.add( + combineLatest([dashboard.unifiedSearchFilters$, controlGroupFilters$]).subscribe(() => { + filters$.next(getCombinedFilters()); + }) ); - this.integrationSubscriptions.add( - this.controlGroup - .getOutput$() + // -------------------------------------------------------------------------------------- + // when control group outputs filters, force a refresh! + // -------------------------------------------------------------------------------------- + dashboard.publishingSubscription.add( + controlGroupFilters$ .pipe( - distinctUntilChanged(({ timeslice: timesliceA }, { timeslice: timesliceB }) => - isEqual(timesliceA, timesliceB) - ) + skip(1) // skip first filter output because it will have been applied in initialize ) - .subscribe(({ timeslice }) => { - if (!isEqual(timeslice, this.getInput().timeslice)) { - this.dispatch.setTimeslice(timeslice); - } - }) + .subscribe(() => dashboard.forceRefresh(false)) // we should not reload the control group when the control group output changes - otherwise, performance is severely impacted ); - // the Control Group needs to know when any dashboard children are loading in order to know when to move on to the next time slice when playing. - this.integrationSubscriptions.add( - combineCompatibleChildrenApis( - this, - 'dataLoading', - apiPublishesDataLoading, - false, - (childrenLoading) => childrenLoading.some(Boolean) - ) - .pipe(skip(1)) // skip the initial output of "false" - .subscribe((anyChildLoading) => - this.controlGroup?.anyControlOutputConsumerLoading$.next(anyChildLoading) - ) + // -------------------------------------------------------------------------------------- + // when control group outputs timeslice, dispatch timeslice + // -------------------------------------------------------------------------------------- + dashboard.publishingSubscription.add( + controlGroupTimeslice$.subscribe((timeslice) => { + dashboard.dispatch.setTimeslice(timeslice); + }) ); } export const combineDashboardFiltersWithControlGroupFilters = ( dashboardFilters: Filter[], - controlGroup: ControlGroupContainer + controlGroupApi?: PublishesFilters ): Filter[] => { - return [...dashboardFilters, ...(controlGroup.getOutput().filters ?? [])]; + return [...dashboardFilters, ...(controlGroupApi?.filters$.value ?? [])]; }; diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts index 0c105fbb665e3..7a02b3479a2aa 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts @@ -7,8 +7,6 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { BehaviorSubject, Observable } from 'rxjs'; - import { ContactCardEmbeddable, ContactCardEmbeddableFactory, @@ -16,11 +14,6 @@ import { ContactCardEmbeddableOutput, CONTACT_CARD_EMBEDDABLE, } from '@kbn/embeddable-plugin/public/lib/test_samples'; -import { - ControlGroupInput, - ControlGroupContainer, - ControlGroupContainerFactory, -} from '@kbn/controls-plugin/public'; import { Filter } from '@kbn/es-query'; import { EmbeddablePackageState, ViewMode } from '@kbn/embeddable-plugin/public'; import { createKbnUrlStateStorage } from '@kbn/kibana-utils-plugin/public'; @@ -30,6 +23,7 @@ import { getSampleDashboardPanel } from '../../../mocks'; import { pluginServices } from '../../../services/plugin_services'; import { DashboardCreationOptions } from '../dashboard_container_factory'; import { DEFAULT_DASHBOARD_INPUT } from '../../../dashboard_constants'; +import { mockControlGroupApi } from '../../../mocks'; test("doesn't throw error when no data views are available", async () => { pluginServices.getServices().data.dataViews.defaultDataViewExists = jest @@ -417,6 +411,7 @@ test('creates new embeddable with incoming embeddable if id does not match exist }, }), }); + dashboard?.setControlGroupApi(mockControlGroupApi); // flush promises await new Promise((r) => setTimeout(r, 1)); @@ -477,6 +472,7 @@ test('creates new embeddable with specified size if size is provided', async () }, }), }); + dashboard?.setControlGroupApi(mockControlGroupApi); // flush promises await new Promise((r) => setTimeout(r, 1)); @@ -498,42 +494,6 @@ test('creates new embeddable with specified size if size is provided', async () expect(dashboard!.getState().explicitInput.panels.new_panel.gridData.h).toBe(1); }); -test('creates a control group from the control group factory', async () => { - const mockControlGroupContainer = { - destroy: jest.fn(), - render: jest.fn(), - updateInput: jest.fn(), - getInput: jest.fn().mockReturnValue({}), - getInput$: jest.fn().mockReturnValue(new Observable()), - getOutput: jest.fn().mockReturnValue({}), - getOutput$: jest.fn().mockReturnValue(new Observable()), - onFiltersPublished$: new Observable(), - unsavedChanges: new BehaviorSubject(undefined), - } as unknown as ControlGroupContainer; - const mockControlGroupFactory = { - create: jest.fn().mockReturnValue(mockControlGroupContainer), - } as unknown as ControlGroupContainerFactory; - pluginServices.getServices().embeddable.getEmbeddableFactory = jest - .fn() - .mockReturnValue(mockControlGroupFactory); - await createDashboard({ - useControlGroupIntegration: true, - getInitialInput: () => ({ - controlGroupInput: { controlStyle: 'twoLine' } as unknown as ControlGroupInput, - }), - }); - // flush promises - await new Promise((r) => setTimeout(r, 1)); - expect(pluginServices.getServices().embeddable.getEmbeddableFactory).toHaveBeenCalledWith( - 'control_group' - ); - expect(mockControlGroupFactory.create).toHaveBeenCalledWith( - expect.objectContaining({ controlStyle: 'twoLine' }), - undefined, - { lastSavedInput: expect.objectContaining({ controlStyle: 'oneLine' }) } - ); -}); - /* * dashboard.getInput$() subscriptions are used to update: * 1) dashboard instance searchSessionId state @@ -568,6 +528,7 @@ test('searchSessionId is updated prior to child embeddable parent subscription e createSessionRestorationDataProvider: () => {}, } as unknown as DashboardCreationOptions['searchSessionSettings'], }); + dashboard?.setControlGroupApi(mockControlGroupApi); expect(dashboard).toBeDefined(); const embeddable = await dashboard!.addNewEmbeddable< ContactCardEmbeddableInput, diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts index 8939ff9c782e1..48a9a82838462 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts @@ -7,38 +7,12 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { - ControlGroupInput, - CONTROL_GROUP_TYPE, - getDefaultControlGroupInput, - getDefaultControlGroupPersistableInput, -} from '@kbn/controls-plugin/common'; -import { - ControlGroupContainerFactory, - ControlGroupOutput, - type ControlGroupContainer, -} from '@kbn/controls-plugin/public'; import { GlobalQueryStateFromUrl, syncGlobalQueryStateWithUrl } from '@kbn/data-plugin/public'; -import { EmbeddableFactory, isErrorEmbeddable, ViewMode } from '@kbn/embeddable-plugin/public'; -import { - AggregateQuery, - compareFilters, - COMPARE_ALL_OPTIONS, - Filter, - Query, - TimeRange, -} from '@kbn/es-query'; +import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { TimeRange } from '@kbn/es-query'; import { lazyLoadReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; -import deepEqual from 'fast-deep-equal'; -import { cloneDeep, identity, omit, pickBy } from 'lodash'; -import { - BehaviorSubject, - combineLatest, - distinctUntilChanged, - map, - startWith, - Subject, -} from 'rxjs'; +import { cloneDeep, omit } from 'lodash'; +import { Subject } from 'rxjs'; import { v4 } from 'uuid'; import { DashboardContainerInput, @@ -62,14 +36,11 @@ import { startDiffingDashboardState } from '../../state/diffing/dashboard_diffin import { DashboardPublicState, UnsavedPanelState } from '../../types'; import { DashboardContainer } from '../dashboard_container'; import { DashboardCreationOptions } from '../dashboard_container_factory'; -import { - combineDashboardFiltersWithControlGroupFilters, - startSyncingDashboardControlGroup, -} from './controls/dashboard_control_group_integration'; import { startSyncingDashboardDataViews } from './data_views/sync_dashboard_data_views'; import { startQueryPerformanceTracking } from './performance/query_performance_tracking'; import { startDashboardSearchSessionIntegration } from './search_sessions/start_dashboard_search_session_integration'; import { syncUnifiedSearchState } from './unified_search/sync_dashboard_unified_search_state'; +import { PANELS_CONTROL_GROUP_KEY } from '../../../services/dashboard_backup/dashboard_backup_service'; /** * Builds a new Dashboard from scratch. @@ -164,16 +135,13 @@ export const initializeDashboard = async ({ loadDashboardReturn, untilDashboardReady, creationOptions, - controlGroup, }: { loadDashboardReturn: LoadDashboardReturn; untilDashboardReady: () => Promise; creationOptions?: DashboardCreationOptions; - controlGroup?: ControlGroupContainer; }) => { const { dashboardBackup, - embeddable: { getEmbeddableFactory }, dashboardCapabilities: { showWriteControls }, embeddable: { reactEmbeddableRegistryHasKey }, data: { @@ -193,7 +161,6 @@ export const initializeDashboard = async ({ searchSessionSettings, unifiedSearchSettings, validateLoadedSavedObject, - useControlGroupIntegration, useUnifiedSearchIntegration, useSessionStorageIntegration, } = creationOptions ?? {}; @@ -293,11 +260,6 @@ export const initializeDashboard = async ({ cloneDeep(combinedOverrideInput), 'controlGroupInput' ); - const initialControlGroupInput: ControlGroupInput | {} = { - ...(loadDashboardReturn?.dashboardInput?.controlGroupInput ?? {}), - ...(sessionStorageInput?.controlGroupInput ?? {}), - ...(overrideInput?.controlGroupInput ?? {}), - }; // Back up any view mode passed in explicitly. if (overrideInput?.viewMode) { @@ -314,6 +276,7 @@ export const initializeDashboard = async ({ // -------------------------------------------------------------------------------------- untilDashboardReady().then((dashboard) => { dashboard.savedObjectReferences = loadDashboardReturn?.references; + dashboard.controlGroupInput = loadDashboardReturn?.dashboardInput?.controlGroupInput; }); // -------------------------------------------------------------------------------------- @@ -476,6 +439,13 @@ export const initializeDashboard = async ({ // Set restored runtime state for react embeddables. // -------------------------------------------------------------------------------------- untilDashboardReady().then((dashboardContainer) => { + if (overrideInput?.controlGroupState) { + dashboardContainer.setRuntimeStateForChild( + PANELS_CONTROL_GROUP_KEY, + overrideInput.controlGroupState + ); + } + for (const idWithRuntimeState of Object.keys(runtimePanelsToRestore)) { const restoredRuntimeStateForChild = runtimePanelsToRestore[idWithRuntimeState]; if (!restoredRuntimeStateForChild) continue; @@ -483,52 +453,6 @@ export const initializeDashboard = async ({ } }); - // -------------------------------------------------------------------------------------- - // Start the control group integration. - // -------------------------------------------------------------------------------------- - if (useControlGroupIntegration) { - const controlsGroupFactory = getEmbeddableFactory< - ControlGroupInput, - ControlGroupOutput, - ControlGroupContainer - >(CONTROL_GROUP_TYPE) as EmbeddableFactory< - ControlGroupInput, - ControlGroupOutput, - ControlGroupContainer - > & { - create: ControlGroupContainerFactory['create']; - }; - const { filters, query, timeRange, viewMode, id } = initialDashboardInput; - const fullControlGroupInput = { - id: `control_group_${id ?? 'new_dashboard'}`, - ...getDefaultControlGroupInput(), - ...pickBy(initialControlGroupInput, identity), // undefined keys in initialInput should not overwrite defaults - timeRange, - viewMode, - filters, - query, - }; - - if (controlGroup) { - controlGroup.updateInputAndReinitialize(fullControlGroupInput); - } else { - const newControlGroup = await controlsGroupFactory?.create(fullControlGroupInput, this, { - lastSavedInput: - loadDashboardReturn?.dashboardInput?.controlGroupInput ?? - getDefaultControlGroupPersistableInput(), - }); - if (!newControlGroup || isErrorEmbeddable(newControlGroup)) { - throw new Error('Error in control group startup'); - } - controlGroup = newControlGroup; - } - - untilDashboardReady().then((dashboardContainer) => { - dashboardContainer.controlGroup = controlGroup; - startSyncingDashboardControlGroup.bind(dashboardContainer)(); - }); - } - // -------------------------------------------------------------------------------------- // Start the data views integration. // -------------------------------------------------------------------------------------- @@ -554,63 +478,6 @@ export const initializeDashboard = async ({ setTimeout(() => dashboard.dispatch.setAnimatePanelTransforms(true), 500) ); - // -------------------------------------------------------------------------------------- - // Set parentApi.filters$ to include dashboardContainer filters and control group filters - // -------------------------------------------------------------------------------------- - untilDashboardReady().then((dashboardContainer) => { - if (!dashboardContainer.controlGroup) { - return; - } - - function getCombinedFilters() { - return combineDashboardFiltersWithControlGroupFilters( - dashboardContainer.getInput().filters ?? [], - dashboardContainer.controlGroup! - ); - } - - const filters$ = new BehaviorSubject(getCombinedFilters()); - dashboardContainer.filters$ = filters$; - - const inputFilters$ = dashboardContainer.getInput$().pipe( - startWith(dashboardContainer.getInput()), - map((input) => input.filters), - distinctUntilChanged((previous, current) => { - return compareFilters(previous ?? [], current ?? [], COMPARE_ALL_OPTIONS); - }) - ); - - // Can not use onFiltersPublished$ directly since it does not have an intial value and - // combineLatest will not emit until each observable emits at least one value - const controlGroupFilters$ = dashboardContainer.controlGroup.onFiltersPublished$.pipe( - startWith(dashboardContainer.controlGroup.getOutput().filters) - ); - - dashboardContainer.integrationSubscriptions.add( - combineLatest([inputFilters$, controlGroupFilters$]).subscribe(() => { - filters$.next(getCombinedFilters()); - }) - ); - }); - - // -------------------------------------------------------------------------------------- - // Set up parentApi.query$ - // Can not use legacyEmbeddableToApi since query$ setting is delayed - // -------------------------------------------------------------------------------------- - untilDashboardReady().then((dashboardContainer) => { - const query$ = new BehaviorSubject( - dashboardContainer.getInput().query - ); - dashboardContainer.query$ = query$; - dashboardContainer.integrationSubscriptions.add( - dashboardContainer.getInput$().subscribe((input) => { - if (!deepEqual(query$.getValue() ?? [], input.query)) { - query$.next(input.query); - } - }) - ); - }); - // -------------------------------------------------------------------------------------- // Set up search sessions integration. // -------------------------------------------------------------------------------------- @@ -631,7 +498,8 @@ export const initializeDashboard = async ({ sessionIdToRestore ?? (existingSession && incomingEmbeddable ? existingSession : session.start()); - untilDashboardReady().then((container) => { + untilDashboardReady().then(async (container) => { + await container.untilContainerInitialized(); startDashboardSearchSessionIntegration.bind(container)( creationOptions?.searchSessionSettings ); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/data_views/sync_dashboard_data_views.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/data_views/sync_dashboard_data_views.ts index df0009ab8c8c6..8954155d80939 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/data_views/sync_dashboard_data_views.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/data_views/sync_dashboard_data_views.ts @@ -11,7 +11,7 @@ import { DataView } from '@kbn/data-views-plugin/common'; import { combineCompatibleChildrenApis } from '@kbn/presentation-containers'; import { apiPublishesDataViews, PublishesDataViews } from '@kbn/presentation-publishing'; import { uniqBy } from 'lodash'; -import { combineLatest, map, Observable, of, switchMap } from 'rxjs'; +import { combineLatest, Observable, of, switchMap } from 'rxjs'; import { pluginServices } from '../../../../services/plugin_services'; import { DashboardContainer } from '../../dashboard_container'; @@ -20,19 +20,11 @@ export function startSyncingDashboardDataViews(this: DashboardContainer) { data: { dataViews }, } = pluginServices.getServices(); - const controlGroupDataViewsPipe: Observable = this.controlGroup - ? this.controlGroup.getOutput$().pipe( - map((output) => output.dataViewIds ?? []), - switchMap( - (dataViewIds) => - new Promise((resolve) => - Promise.all(dataViewIds.map((id) => dataViews.get(id))).then((nextDataViews) => - resolve(nextDataViews) - ) - ) - ) - ) - : of([]); + const controlGroupDataViewsPipe: Observable = this.controlGroupApi$.pipe( + switchMap((controlGroupApi) => { + return controlGroupApi ? controlGroupApi.dataViews : of([]); + }) + ); const childDataViewsPipe = combineCompatibleChildrenApis( this, @@ -44,7 +36,10 @@ export function startSyncingDashboardDataViews(this: DashboardContainer) { return combineLatest([controlGroupDataViewsPipe, childDataViewsPipe]) .pipe( switchMap(([controlGroupDataViews, childDataViews]) => { - const allDataViews = controlGroupDataViews.concat(childDataViews); + const allDataViews = [ + ...(controlGroupDataViews ? controlGroupDataViews : []), + ...childDataViews, + ]; if (allDataViews.length === 0) { return (async () => { const defaultDataViewId = await dataViews.getDefaultId(); @@ -55,7 +50,6 @@ export function startSyncingDashboardDataViews(this: DashboardContainer) { }) ) .subscribe((newDataViews) => { - if (newDataViews[0].id) this.controlGroup?.setRelevantDataViewId(newDataViews[0].id); this.setAllDataViews(newDataViews); }); } diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.test.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.test.tsx index 787e04cf57980..eb798049ec48a 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.test.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.test.tsx @@ -19,7 +19,12 @@ import { import type { TimeRange } from '@kbn/es-query'; import { mockedReduxEmbeddablePackage } from '@kbn/presentation-util-plugin/public/mocks'; -import { buildMockDashboard, getSampleDashboardInput, getSampleDashboardPanel } from '../../mocks'; +import { + buildMockDashboard, + getSampleDashboardInput, + getSampleDashboardPanel, + mockControlGroupApi, +} from '../../mocks'; import { pluginServices } from '../../services/plugin_services'; import { DashboardContainer } from './dashboard_container'; @@ -171,6 +176,7 @@ test('searchSessionId propagates to children', async () => { undefined, { lastSavedInput: sampleInput } ); + container?.setControlGroupApi(mockControlGroupApi); const embeddable = await container.addNewEmbeddable< ContactCardEmbeddableInput, ContactCardEmbeddableOutput, @@ -190,11 +196,10 @@ describe('getInheritedInput', () => { const dashboardTimeslice = [1688061910000, 1688062209000] as [number, number]; test('Should pass dashboard timeRange and timeslice to panel when panel does not have custom time range', async () => { - const container = buildMockDashboard({ - overrides: { - timeRange: dashboardTimeRange, - timeslice: dashboardTimeslice, - }, + const container = buildMockDashboard(); + container.updateInput({ + timeRange: dashboardTimeRange, + timeslice: dashboardTimeslice, }); const embeddable = await container.addNewEmbeddable( CONTACT_CARD_EMBEDDABLE, @@ -215,11 +220,10 @@ describe('getInheritedInput', () => { }); test('Should not pass dashboard timeRange and timeslice to panel when panel has custom time range', async () => { - const container = buildMockDashboard({ - overrides: { - timeRange: dashboardTimeRange, - timeslice: dashboardTimeslice, - }, + const container = buildMockDashboard(); + container.updateInput({ + timeRange: dashboardTimeRange, + timeslice: dashboardTimeslice, }); const embeddableTimeRange = { to: 'now', diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index 46edcfe0bc348..1c9def025fb8b 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -9,7 +9,6 @@ import { METRIC_TYPE } from '@kbn/analytics'; import type { Reference } from '@kbn/content-management-utils'; -import type { ControlGroupContainer } from '@kbn/controls-plugin/public'; import type { I18nStart, KibanaExecutionContext, OverlayRef } from '@kbn/core/public'; import { type PublishingSubject, @@ -17,6 +16,8 @@ import { apiPublishesUnsavedChanges, getPanelTitle, PublishesViewMode, + PublishesDataLoading, + apiPublishesDataLoading, } from '@kbn/presentation-publishing'; import { RefreshInterval } from '@kbn/data-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; @@ -33,7 +34,7 @@ import { type EmbeddableOutput, type IEmbeddable, } from '@kbn/embeddable-plugin/public'; -import type { Filter, Query, TimeRange } from '@kbn/es-query'; +import type { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { HasRuntimeChildState, @@ -41,6 +42,7 @@ import { HasSerializedChildState, TrackContentfulRender, TracksQueryPerformance, + combineCompatibleChildrenApis, } from '@kbn/presentation-containers'; import { PanelPackage } from '@kbn/presentation-containers'; import { ReduxEmbeddableTools, ReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; @@ -51,14 +53,18 @@ import { omit } from 'lodash'; import React, { createContext, useContext } from 'react'; import ReactDOM from 'react-dom'; import { batch } from 'react-redux'; -import { BehaviorSubject, Subject, Subscription } from 'rxjs'; +import { BehaviorSubject, Subject, Subscription, first, skipWhile, switchMap } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs'; import { v4 } from 'uuid'; import { PublishesSettings } from '@kbn/presentation-containers/interfaces/publishes_settings'; import { apiHasSerializableState } from '@kbn/presentation-containers/interfaces/serialized_state'; +import { ControlGroupApi, ControlGroupSerializedState } from '@kbn/controls-plugin/public'; import { DashboardLocatorParams, DASHBOARD_CONTAINER_TYPE } from '../..'; -import { DashboardContainerInput, DashboardPanelState } from '../../../common'; -import { getReferencesForPanelId } from '../../../common/dashboard_container/persistable_state/dashboard_container_references'; +import { DashboardAttributes, DashboardContainerInput, DashboardPanelState } from '../../../common'; +import { + getReferencesForControls, + getReferencesForPanelId, +} from '../../../common/dashboard_container/persistable_state/dashboard_container_references'; import { DASHBOARD_APP_ID, DASHBOARD_UI_METRIC_ID, @@ -85,7 +91,10 @@ import { showSettings, } from './api'; import { duplicateDashboardPanel } from './api/duplicate_dashboard_panel'; -import { combineDashboardFiltersWithControlGroupFilters } from './create/controls/dashboard_control_group_integration'; +import { + combineDashboardFiltersWithControlGroupFilters, + startSyncingDashboardControlGroup, +} from './create/controls/dashboard_control_group_integration'; import { initializeDashboard } from './create/create_dashboard'; import { DashboardCreationOptions, @@ -93,6 +102,7 @@ import { dashboardTypeDisplayName, } from './dashboard_container_factory'; import { getPanelAddedSuccessString } from '../../dashboard_app/_dashboard_app_strings'; +import { PANELS_CONTROL_GROUP_KEY } from '../../services/dashboard_backup/dashboard_backup_service'; export interface InheritedChildInput { filters: Filter[]; @@ -148,7 +158,7 @@ export class DashboardContainer public integrationSubscriptions: Subscription = new Subscription(); public publishingSubscription: Subscription = new Subscription(); public diffingSubscription: Subscription = new Subscription(); - public controlGroup?: ControlGroupContainer; + public controlGroupApi$: PublishingSubject; public settings: Record>; public searchSessionId?: string; @@ -157,6 +167,7 @@ export class DashboardContainer public reload$ = new Subject(); public timeRestore$: BehaviorSubject; public timeslice$: BehaviorSubject<[number, number] | undefined>; + public unifiedSearchFilters$?: PublishingSubject; public locator?: Pick, 'navigate' | 'getRedirectUrl'>; public readonly executionContext: KibanaExecutionContext; @@ -173,6 +184,9 @@ export class DashboardContainer private hadContentfulRender = false; private scrollPosition?: number; + // setup + public untilContainerInitialized: () => Promise; + // cleanup public stopSyncingWithUnifiedSearch?: () => void; private cleanupStateTools: () => void; @@ -198,6 +212,7 @@ export class DashboardContainer | undefined; // new embeddable framework public savedObjectReferences: Reference[] = []; + public controlGroupInput: DashboardAttributes['controlGroupInput'] | undefined; constructor( initialInput: DashboardContainerInput, @@ -208,19 +223,46 @@ export class DashboardContainer creationOptions?: DashboardCreationOptions, initialComponentState?: DashboardPublicState ) { + const controlGroupApi$ = new BehaviorSubject(undefined); + async function untilContainerInitialized(): Promise { + return new Promise((resolve) => { + controlGroupApi$ + .pipe( + skipWhile((controlGroupApi) => !controlGroupApi), + switchMap(async (controlGroupApi) => { + // Bug in main where panels are loaded before control filters are ready + // Want to migrate to react embeddable controls with same behavior + // TODO - do not load panels until control filters are ready + /* + await controlGroupApi?.untilInitialized(); + */ + }), + first() + ) + .subscribe(() => { + resolve(); + }); + }); + } + const { usageCollection, embeddable: { getEmbeddableFactory }, } = pluginServices.getServices(); + super( { ...initialInput, }, { embeddableLoaded: {} }, getEmbeddableFactory, - parent + parent, + { untilContainerInitialized } ); + this.controlGroupApi$ = controlGroupApi$; + this.untilContainerInitialized = untilContainerInitialized; + this.trackPanelAddMetric = usageCollection.reportUiCounter?.bind( usageCollection, DASHBOARD_UI_METRIC_ID @@ -312,7 +354,41 @@ export class DashboardContainer DashboardContainerInput >(this.publishingSubscription, this, 'lastReloadRequestTime'); + startSyncingDashboardControlGroup(this); + this.executionContext = initialInput.executionContext; + + this.dataLoading = new BehaviorSubject(false); + this.publishingSubscription.add( + combineCompatibleChildrenApis( + this, + 'dataLoading', + apiPublishesDataLoading, + undefined, + // flatten method + (values) => { + return values.some((isLoading) => isLoading); + } + ).subscribe((isAtLeastOneChildLoading) => { + (this.dataLoading as BehaviorSubject).next(isAtLeastOneChildLoading); + }) + ); + + this.dataViews = new BehaviorSubject(this.getAllDataViews()); + + const query$ = new BehaviorSubject(this.getInput().query); + this.query$ = query$; + this.publishingSubscription.add( + this.getInput$().subscribe((input) => { + if (!deepEqual(query$.getValue() ?? [], input.query)) { + query$.next(input.query); + } + }) + ); + } + + public setControlGroupApi(controlGroupApi: ControlGroupApi) { + (this.controlGroupApi$ as BehaviorSubject).next(controlGroupApi); } public getAppContext() { @@ -398,10 +474,10 @@ export class DashboardContainer panels, } = this.input; - let combinedFilters = filters; - if (this.controlGroup) { - combinedFilters = combineDashboardFiltersWithControlGroupFilters(filters, this.controlGroup); - } + const combinedFilters = combineDashboardFiltersWithControlGroupFilters( + filters, + this.controlGroupApi$?.value + ); const hasCustomTimeRange = Boolean( (panels[id]?.explicitInput as Partial)?.timeRange ); @@ -430,7 +506,6 @@ export class DashboardContainer public destroy() { super.destroy(); this.cleanupStateTools(); - this.controlGroup?.destroy(); this.diffingSubscription.unsubscribe(); this.publishingSubscription.unsubscribe(); this.integrationSubscriptions.unsubscribe(); @@ -616,16 +691,12 @@ export class DashboardContainer public forceRefresh(refreshControlGroup: boolean = true) { this.dispatch.setLastReloadRequestTimeToNow({}); if (refreshControlGroup) { - this.controlGroup?.reload(); - // only reload all panels if this refresh does not come from the control group. this.reload$.next(); } } - public onDataViewsUpdate$ = new Subject(); - - public resetToLastSavedState() { + public async asyncResetToLastSavedState() { this.dispatch.resetToLastSavedInput({}); const { explicitInput: { timeRange, refreshInterval }, @@ -634,8 +705,8 @@ export class DashboardContainer }, } = this.getState(); - if (this.controlGroup) { - this.controlGroup.resetToLastSavedState(); + if (this.controlGroupApi$.value) { + await this.controlGroupApi$.value.asyncResetUnsavedChanges(); } // if we are using the unified search integration, we need to force reset the time picker. @@ -680,7 +751,6 @@ export class DashboardContainer const initializeResult = await initializeDashboard({ creationOptions: this.creationOptions, - controlGroup: this.controlGroup, untilDashboardReady, loadDashboardReturn, }); @@ -695,9 +765,6 @@ export class DashboardContainer omit(loadDashboardReturn?.dashboardInput, 'controlGroupInput') ); this.dispatch.setManaged(loadDashboardReturn?.managed); - if (this.controlGroup) { - this.controlGroup.setSavedState(loadDashboardReturn.dashboardInput?.controlGroupInput); - } this.dispatch.setAnimatePanelTransforms(false); // prevents panels from animating on navigate. this.dispatch.setLastSavedId(newSavedObjectId); this.setExpandedPanelId(undefined); @@ -721,7 +788,7 @@ export class DashboardContainer */ public setAllDataViews = (newDataViews: DataView[]) => { this.allDataViews = newDataViews; - this.onDataViewsUpdate$.next(newDataViews); + (this.dataViews as BehaviorSubject).next(newDataViews); }; public getExpandedPanelId = () => { @@ -744,7 +811,6 @@ export class DashboardContainer public clearOverlays = () => { this.dispatch.setHasOverlays(false); this.dispatch.setFocusedPanelId(undefined); - this.controlGroup?.closeAllFlyouts(); this.overlayRef?.close(); }; @@ -849,6 +915,22 @@ export class DashboardContainer }; }; + public getSerializedStateForControlGroup = () => { + return { + rawState: this.controlGroupInput + ? (this.controlGroupInput as ControlGroupSerializedState) + : ({ + controlStyle: 'oneLine', + chainingSystem: 'HIERARCHICAL', + showApplySelections: false, + panelsJSON: '{}', + ignoreParentSettingsJSON: + '{"ignoreFilters":false,"ignoreQuery":false,"ignoreTimerange":false,"ignoreValidations":false}', + } as ControlGroupSerializedState), + references: getReferencesForControls(this.savedObjectReferences), + }; + }; + private restoredRuntimeState: UnsavedPanelState | undefined = undefined; public setRuntimeStateForChild = (childId: string, state: object) => { const runtimeState = this.restoredRuntimeState ?? {}; @@ -859,6 +941,10 @@ export class DashboardContainer return this.restoredRuntimeState?.[childId]; }; + public getRuntimeStateForControlGroup = () => { + return this.getRuntimeStateForChild(PANELS_CONTROL_GROUP_KEY); + }; + public removePanel(id: string) { const { embeddable: { reactEmbeddableRegistryHasKey }, diff --git a/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts b/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts index 75c5261a7dc43..b0337ccbb0d38 100644 --- a/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts +++ b/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts @@ -6,12 +6,10 @@ * your election, the "Elastic License 2.0", the "GNU Affero General Public * License v3.0 only", or the "Server Side Public License, v 1". */ - -import { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { childrenUnsavedChanges$ } from '@kbn/presentation-containers'; import { omit } from 'lodash'; import { AnyAction, Middleware } from 'redux'; -import { combineLatest, debounceTime, Observable, of, startWith, switchMap } from 'rxjs'; +import { combineLatest, debounceTime, skipWhile, startWith, switchMap } from 'rxjs'; import { DashboardContainer, DashboardCreationOptions } from '../..'; import { DashboardContainerInput } from '../../../../common'; import { CHANGE_CHECK_DEBOUNCE } from '../../../dashboard_constants'; @@ -19,6 +17,7 @@ import { pluginServices } from '../../../services/plugin_services'; import { UnsavedPanelState } from '../../types'; import { dashboardContainerReducers } from '../dashboard_container_reducers'; import { isKeyEqualAsync, unsavedChangesDiffingFunctions } from './dashboard_diffing_functions'; +import { PANELS_CONTROL_GROUP_KEY } from '../../../services/dashboard_backup/dashboard_backup_service'; /** * An array of reducers which cannot cause unsaved changes. Unsaved changes only compares the explicit input @@ -113,8 +112,12 @@ export function startDiffingDashboardState( combineLatest([ dashboardUnsavedChanges, childrenUnsavedChanges$(this.children$), - this.controlGroup?.unsavedChanges ?? - (of(undefined) as Observable), + this.controlGroupApi$.pipe( + skipWhile((controlGroupApi) => !controlGroupApi), + switchMap((controlGroupApi) => { + return controlGroupApi!.unsavedChanges; + }) + ), ]).subscribe(([dashboardChanges, unsavedPanelState, controlGroupChanges]) => { // calculate unsaved changes const hasUnsavedChanges = @@ -127,11 +130,11 @@ export function startDiffingDashboardState( // backup unsaved changes if configured to do so if (creationOptions?.useSessionStorageIntegration) { - backupUnsavedChanges.bind(this)( - dashboardChanges, - unsavedPanelState ? unsavedPanelState : {}, - controlGroupChanges - ); + const reactEmbeddableChanges = unsavedPanelState ? { ...unsavedPanelState } : {}; + if (controlGroupChanges) { + reactEmbeddableChanges[PANELS_CONTROL_GROUP_KEY] = controlGroupChanges; + } + backupUnsavedChanges.bind(this)(dashboardChanges, reactEmbeddableChanges); } }) ); @@ -183,8 +186,7 @@ export async function getDashboardUnsavedChanges( function backupUnsavedChanges( this: DashboardContainer, dashboardChanges: Partial, - reactEmbeddableChanges: UnsavedPanelState, - controlGroupChanges: PersistableControlGroupInput | undefined + reactEmbeddableChanges: UnsavedPanelState ) { const { dashboardBackup } = pluginServices.getServices(); const dashboardStateToBackup = omit(dashboardChanges, keysToOmitFromSessionStorage); @@ -194,7 +196,6 @@ function backupUnsavedChanges( { ...dashboardStateToBackup, panels: dashboardChanges.panels, - controlGroupInput: controlGroupChanges, }, reactEmbeddableChanges ); diff --git a/src/plugins/dashboard/public/dashboard_container/types.ts b/src/plugins/dashboard/public/dashboard_container/types.ts index 112f798d38d54..4119b78f05527 100644 --- a/src/plugins/dashboard/public/dashboard_container/types.ts +++ b/src/plugins/dashboard/public/dashboard_container/types.ts @@ -7,11 +7,11 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { SerializableControlGroupInput } from '@kbn/controls-plugin/common'; import type { ContainerOutput } from '@kbn/embeddable-plugin/public'; import type { ReduxEmbeddableState } from '@kbn/presentation-util-plugin/public'; import { SerializableRecord } from '@kbn/utility-types'; +import { ControlGroupRuntimeState } from '@kbn/controls-plugin/public'; import type { DashboardContainerInput, DashboardOptions } from '../../common'; import { SavedDashboardPanel } from '../../common/content_management'; @@ -126,7 +126,7 @@ export type DashboardLocatorParams = Partial< panels?: Array; // used SerializableRecord here to force the GridData type to be read as serializable /** - * Control group input + * Control group changes */ - controlGroupInput?: SerializableControlGroupInput; + controlGroupState?: Partial & SerializableRecord; // used SerializableRecord here to force the GridData type to be read as serializable }; diff --git a/src/plugins/dashboard/public/dashboard_top_nav/internal_dashboard_top_nav.tsx b/src/plugins/dashboard/public/dashboard_top_nav/internal_dashboard_top_nav.tsx index 5d4bca630fb01..4ad82045d5146 100644 --- a/src/plugins/dashboard/public/dashboard_top_nav/internal_dashboard_top_nav.tsx +++ b/src/plugins/dashboard/public/dashboard_top_nav/internal_dashboard_top_nav.tsx @@ -16,7 +16,6 @@ import { getContextProvider as getPresentationUtilContextProvider, } from '@kbn/presentation-util-plugin/public'; import { ViewMode } from '@kbn/embeddable-plugin/public'; -import type { DataView } from '@kbn/data-views-plugin/public'; import { TopNavMenuBadgeProps, TopNavMenuProps } from '@kbn/navigation-plugin/public'; import { EuiBreadcrumb, @@ -30,6 +29,7 @@ import { import { MountPoint } from '@kbn/core/public'; import { getManagedContentBadge } from '@kbn/managed-content-badge'; import { FormattedMessage } from '@kbn/i18n-react'; +import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; import { getDashboardTitle, leaveConfirmStrings, @@ -114,16 +114,8 @@ export function InternalDashboardTopNav({ const query = dashboard.select((state) => state.explicitInput.query); const title = dashboard.select((state) => state.explicitInput.title); - // store data views in state & subscribe to dashboard data view changes. - const [allDataViews, setAllDataViews] = useState([]); const [isPopoverOpen, setIsPopoverOpen] = useState(false); - useEffect(() => { - setAllDataViews(dashboard.getAllDataViews()); - const subscription = dashboard.onDataViewsUpdate$.subscribe((dataViews) => - setAllDataViews(dataViews) - ); - return () => subscription.unsubscribe(); - }, [dashboard]); + const allDataViews = useStateFromPublishingSubject(dashboard.dataViews); const dashboardTitle = useMemo(() => { return getDashboardTitle(title, viewMode, !lastSavedId); @@ -412,7 +404,7 @@ export function InternalDashboardTopNav({ screenTitle={title} useDefaultBehaviors={true} savedQueryId={savedQueryId} - indexPatterns={allDataViews} + indexPatterns={allDataViews ?? []} saveQueryMenuVisibility={allowSaveQuery ? 'allowed_by_app_privilege' : 'globally_managed'} appName={LEGACY_DASHBOARD_APP_ID} visible={viewMode !== ViewMode.PRINT} diff --git a/src/plugins/dashboard/public/mocks.tsx b/src/plugins/dashboard/public/mocks.tsx index b510755379017..172de68e3d90b 100644 --- a/src/plugins/dashboard/public/mocks.tsx +++ b/src/plugins/dashboard/public/mocks.tsx @@ -10,6 +10,8 @@ import { EmbeddableInput, ViewMode } from '@kbn/embeddable-plugin/public'; import { mockedReduxEmbeddablePackage } from '@kbn/presentation-util-plugin/public/mocks'; +import { ControlGroupApi } from '@kbn/controls-plugin/public'; +import { BehaviorSubject } from 'rxjs'; import { DashboardContainerInput, DashboardPanelState } from '../common'; import { DashboardContainer } from './dashboard_container/embeddable/dashboard_container'; import { DashboardStart } from './plugin'; @@ -73,6 +75,15 @@ export function setupIntersectionObserverMock({ }); } +export const mockControlGroupApi = { + untilInitialized: async () => {}, + filters$: new BehaviorSubject(undefined), + query$: new BehaviorSubject(undefined), + timeslice$: new BehaviorSubject(undefined), + dataViews: new BehaviorSubject(undefined), + unsavedChanges: new BehaviorSubject(undefined), +} as unknown as ControlGroupApi; + export function buildMockDashboard({ overrides, savedObjectId, @@ -90,6 +101,7 @@ export function buildMockDashboard({ undefined, { lastSavedInput: initialInput, lastSavedId: savedObjectId } ); + dashboardContainer?.setControlGroupApi(mockControlGroupApi); return dashboardContainer; } diff --git a/src/plugins/dashboard/public/services/dashboard_backup/dashboard_backup_service.ts b/src/plugins/dashboard/public/services/dashboard_backup/dashboard_backup_service.ts index 7f25504a85bbd..ea56cd8ed5d5e 100644 --- a/src/plugins/dashboard/public/services/dashboard_backup/dashboard_backup_service.ts +++ b/src/plugins/dashboard/public/services/dashboard_backup/dashboard_backup_service.ts @@ -24,6 +24,7 @@ import { backupServiceStrings } from '../../dashboard_container/_dashboard_conta import { UnsavedPanelState } from '../../dashboard_container/types'; export const DASHBOARD_PANELS_UNSAVED_ID = 'unsavedDashboard'; +export const PANELS_CONTROL_GROUP_KEY = 'controlGroup'; const DASHBOARD_PANELS_SESSION_KEY = 'dashboardPanels'; const DASHBOARD_VIEWMODE_LOCAL_KEY = 'dashboardViewMode'; @@ -113,6 +114,7 @@ class DashboardBackupService implements DashboardBackupServiceType { const panels = this.sessionStorage.get(DASHBOARD_PANELS_SESSION_KEY)?.[this.activeSpaceId]?.[ id ] as UnsavedPanelState | undefined; + return { dashboardState, panels }; } catch (e) { this.notifications.toasts.addDanger({ diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/dashboard_content_management_service.ts b/src/plugins/dashboard/public/services/dashboard_content_management/dashboard_content_management_service.ts index 6f81e3cb3565f..5ab0f97d3b147 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/dashboard_content_management_service.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/dashboard_content_management_service.ts @@ -57,8 +57,15 @@ export const dashboardContentManagementServiceFactory: DashboardContentManagemen contentManagement, savedObjectsTagging, }), - saveDashboardState: ({ currentState, saveOptions, lastSavedId, panelReferences }) => + saveDashboardState: ({ + controlGroupReferences, + currentState, + saveOptions, + lastSavedId, + panelReferences, + }) => saveDashboardState({ + controlGroupReferences, data, embeddable, saveOptions, diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/lib/load_dashboard_state.ts b/src/plugins/dashboard/public/services/dashboard_content_management/lib/load_dashboard_state.ts index dd55d245ddbc1..2f78325e083f5 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/lib/load_dashboard_state.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/lib/load_dashboard_state.ts @@ -14,7 +14,6 @@ import { Filter, Query } from '@kbn/es-query'; import { ViewMode } from '@kbn/embeddable-plugin/public'; import { SavedObjectNotFound } from '@kbn/kibana-utils-plugin/public'; import { cleanFiltersForSerialize } from '@kbn/presentation-util-plugin/public'; -import { rawControlGroupAttributesToControlGroupInput } from '@kbn/controls-plugin/common'; import { parseSearchSourceJSON, injectSearchSourceReferences } from '@kbn/data-plugin/public'; import { @@ -189,9 +188,7 @@ export const loadDashboardState = async ({ viewMode: ViewMode.VIEW, // dashboards loaded from saved object default to view mode. If it was edited recently, the view mode from session storage will override this. tags: savedObjectsTagging.getTagIdsFromReferences?.(references) ?? [], - controlGroupInput: - attributes.controlGroupInput && - rawControlGroupAttributesToControlGroupInput(attributes.controlGroupInput), + controlGroupInput: attributes.controlGroupInput, version: convertNumberToDashboardVersion(version), }, diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.test.ts b/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.test.ts index d00711302a6aa..4b84d67a4bcaf 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.test.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.test.ts @@ -7,9 +7,6 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ControlGroupInput } from '@kbn/controls-plugin/common'; -import { controlGroupInputBuilder } from '@kbn/controls-plugin/public'; - import { getSampleDashboardInput, getSampleDashboardPanel } from '../../../mocks'; import { DashboardEmbeddableService } from '../../embeddable/types'; import { SavedDashboardInput } from '../types'; @@ -33,23 +30,6 @@ describe('Migrate dashboard input', () => { panel3: getSampleDashboardPanel({ type: 'ultraDiscover', explicitInput: { id: 'panel3' } }), panel4: getSampleDashboardPanel({ type: 'ultraDiscover', explicitInput: { id: 'panel4' } }), }; - const controlGroupInput = { chainingSystem: 'NONE', panels: {} } as ControlGroupInput; - controlGroupInputBuilder.addOptionsListControl(controlGroupInput, { - dataViewId: 'positions-remain-fixed', - title: 'Results can be mixed', - fieldName: 'theres-a-stasis', - width: 'medium', - grow: false, - }); - controlGroupInputBuilder.addRangeSliderControl(controlGroupInput, { - dataViewId: 'an-object-set-in-motion', - title: 'The arbiter of time', - fieldName: 'unexpressed-emotion', - width: 'medium', - grow: false, - }); - controlGroupInputBuilder.addTimeSliderControl(controlGroupInput); - dashboardInput.controlGroupInput = controlGroupInput; const embeddableService: DashboardEmbeddableService = { getEmbeddableFactory: jest.fn(() => ({ @@ -63,11 +43,8 @@ describe('Migrate dashboard input', () => { // migration run should be true because the runEmbeddableFactoryMigrations mock above returns true. expect(result.anyMigrationRun).toBe(true); - expect(embeddableService.getEmbeddableFactory).toHaveBeenCalledTimes(7); // should be called 4 times for the panels, and 3 times for the controls + expect(embeddableService.getEmbeddableFactory).toHaveBeenCalledTimes(4); // should be called 4 times for the panels, and 3 times for the controls expect(embeddableService.getEmbeddableFactory).toHaveBeenCalledWith('superLens'); expect(embeddableService.getEmbeddableFactory).toHaveBeenCalledWith('ultraDiscover'); - expect(embeddableService.getEmbeddableFactory).toHaveBeenCalledWith('optionsListControl'); - expect(embeddableService.getEmbeddableFactory).toHaveBeenCalledWith('rangeSliderControl'); - expect(embeddableService.getEmbeddableFactory).toHaveBeenCalledWith('timeSlider'); }); }); diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts b/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts index 6dffcbce04327..cfae6b1fa809a 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts @@ -7,7 +7,6 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ControlGroupInput } from '@kbn/controls-plugin/common'; import { EmbeddableFactoryNotFoundError, runEmbeddableFactoryMigrations, @@ -32,28 +31,7 @@ export const migrateDashboardInput = ( } = pluginServices.getServices(); let anyMigrationRun = false; if (!dashboardInput) return dashboardInput; - if (dashboardInput.controlGroupInput) { - /** - * If any Control Group migrations are required, we will need to start storing a Control Group Input version - * string in Dashboard Saved Objects and then running the whole Control Group input through the embeddable - * factory migrations here. - */ - // Migrate all of the Control children as well. - const migratedControls: ControlGroupInput['panels'] = {}; - - Object.entries(dashboardInput.controlGroupInput.panels).forEach(([id, panel]) => { - const factory = embeddable.getEmbeddableFactory(panel.type); - if (!factory) throw new EmbeddableFactoryNotFoundError(panel.type); - const { input: newInput, migrationRun: controlMigrationRun } = runEmbeddableFactoryMigrations( - panel.explicitInput, - factory - ); - if (controlMigrationRun) anyMigrationRun = true; - panel.explicitInput = newInput as DashboardPanelState['explicitInput']; - migratedControls[id] = panel; - }); - } const migratedPanels: DashboardContainerInput['panels'] = {}; for (const [id, panel] of Object.entries(dashboardInput.panels)) { // if the panel type is registered in the new embeddable system, we do not need to run migrations for it. diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts b/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts index 85ebb02cf65d5..b9285b208c14d 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts @@ -10,12 +10,6 @@ import { pick } from 'lodash'; import moment, { Moment } from 'moment'; -import { - controlGroupInputToRawControlGroupAttributes, - generateNewControlIds, - getDefaultControlGroupInput, - persistableControlGroupInputIsEqual, -} from '@kbn/controls-plugin/common'; import { extractSearchSourceReferences, RefreshInterval } from '@kbn/data-plugin/public'; import { isFilterPinned } from '@kbn/es-query'; @@ -30,24 +24,10 @@ import { DashboardContentManagementRequiredServices, SaveDashboardProps, SaveDashboardReturn, - SavedDashboardInput, } from '../types'; import { convertDashboardVersionToNumber } from './dashboard_versioning'; import { generateNewPanelIds } from '../../../../common/lib/dashboard_panel_converters'; -export const serializeControlGroupInput = ( - controlGroupInput: SavedDashboardInput['controlGroupInput'] -) => { - // only save to saved object if control group is not default - if ( - !controlGroupInput || - persistableControlGroupInputIsEqual(controlGroupInput, getDefaultControlGroupInput()) - ) { - return undefined; - } - return controlGroupInputToRawControlGroupAttributes(controlGroupInput); -}; - export const convertTimeToUTCString = (time?: string | Moment): undefined | string => { if (moment(time).isValid()) { return moment(time).utc().format('YYYY-MM-DDTHH:mm:ss.SSS[Z]'); @@ -69,6 +49,7 @@ type SaveDashboardStateProps = SaveDashboardProps & { }; export const saveDashboardState = async ({ + controlGroupReferences, data, embeddable, lastSavedId, @@ -101,9 +82,10 @@ export const saveDashboardState = async ({ syncCursor, syncTooltips, hidePanelTitles, + controlGroupInput, } = currentState; - let { panels, controlGroupInput } = currentState; + let { panels } = currentState; let prefixedPanelReferences = panelReferences; if (saveOptions.saveAsCopy) { const { panels: newPanels, references: newPanelReferences } = generateNewPanelIds( @@ -112,7 +94,10 @@ export const saveDashboardState = async ({ ); panels = newPanels; prefixedPanelReferences = newPanelReferences; - controlGroupInput = generateNewControlIds(controlGroupInput); + // + // do not need to generate new ids for controls. + // ControlGroup Component is keyed on dashboard id so changing dashboard id mounts new ControlGroup Component. + // } /** @@ -160,7 +145,7 @@ export const saveDashboardState = async ({ const rawDashboardAttributes: DashboardAttributes = { version: convertDashboardVersionToNumber(LATEST_DASHBOARD_CONTAINER_VERSION), - controlGroupInput: serializeControlGroupInput(controlGroupInput), + controlGroupInput, kibanaSavedObjectMeta: { searchSourceJSON }, description: description ?? '', refreshInterval, @@ -187,7 +172,11 @@ export const saveDashboardState = async ({ ? savedObjectsTagging.updateTagsReferences(dashboardReferences, tags) : dashboardReferences; - const allReferences = [...references, ...(prefixedPanelReferences ?? [])]; + const allReferences = [ + ...references, + ...(prefixedPanelReferences ?? []), + ...(controlGroupReferences ?? []), + ]; /** * Save the saved object using the content management diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/types.ts b/src/plugins/dashboard/public/services/dashboard_content_management/types.ts index 6f15636b41332..19ddfac9e1199 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/types.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/types.ts @@ -8,11 +8,11 @@ */ import type { Reference } from '@kbn/content-management-utils'; -import { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { SavedObjectSaveOpts } from '@kbn/saved-objects-plugin/public'; +import { ControlGroupRuntimeState } from '@kbn/controls-plugin/public'; import { DashboardContainerInput } from '../../../common'; -import { DashboardCrudTypes } from '../../../common/content_management'; +import { DashboardAttributes, DashboardCrudTypes } from '../../../common/content_management'; import { DashboardStartDependencies } from '../../plugin'; import { DashboardBackupServiceType } from '../dashboard_backup/types'; import { DashboardDataService } from '../data/types'; @@ -65,7 +65,17 @@ export interface LoadDashboardFromSavedObjectProps { type DashboardResolveMeta = DashboardCrudTypes['GetOut']['meta']; export type SavedDashboardInput = DashboardContainerInput & { - controlGroupInput?: PersistableControlGroupInput; + /** + * Serialized control group state. + * Contains state loaded from dashboard saved object + */ + controlGroupInput?: DashboardAttributes['controlGroupInput'] | undefined; + /** + * Runtime control group state. + * Contains state passed from dashboard locator + * Use runtime state when building input for portable dashboards + */ + controlGroupState?: Partial; }; export interface LoadDashboardReturn { @@ -90,6 +100,7 @@ export interface LoadDashboardReturn { export type SavedDashboardSaveOpts = SavedObjectSaveOpts & { saveAsCopy?: boolean }; export interface SaveDashboardProps { + controlGroupReferences?: Reference[]; currentState: SavedDashboardInput; saveOptions: SavedDashboardSaveOpts; panelReferences?: Reference[]; diff --git a/src/plugins/embeddable/public/lib/containers/container.ts b/src/plugins/embeddable/public/lib/containers/container.ts index b2d234878e876..8e7487323cf44 100644 --- a/src/plugins/embeddable/public/lib/containers/container.ts +++ b/src/plugins/embeddable/public/lib/containers/container.ts @@ -83,6 +83,9 @@ export abstract class Container< const init$ = this.getInput$().pipe( take(1), mergeMap(async (currentInput) => { + if (settings?.untilContainerInitialized) { + await settings.untilContainerInitialized(); + } const initPromise = this.initializeChildEmbeddables(currentInput, settings); if (awaitingInitialize) await initPromise; }) diff --git a/src/plugins/embeddable/public/lib/containers/i_container.ts b/src/plugins/embeddable/public/lib/containers/i_container.ts index d15488abb4133..9ba8c41e50509 100644 --- a/src/plugins/embeddable/public/lib/containers/i_container.ts +++ b/src/plugins/embeddable/public/lib/containers/i_container.ts @@ -38,6 +38,8 @@ export interface EmbeddableContainerSettings { * Initialise children in the order specified. If an ID does not match it will be skipped and if a child is not included it will be initialized in the default order after the list of provided IDs. */ childIdInitializeOrder?: string[]; + + untilContainerInitialized?: () => Promise; } export interface IContainer< diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts index 9a8c315eafd98..84b31d5556f42 100644 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts +++ b/src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts @@ -52,7 +52,11 @@ export const embeddableInputToSubject = < subscription.add( embeddable .getInput$() - .pipe(distinctUntilKeyChanged(key)) + .pipe( + distinctUntilKeyChanged(key, (prev, current) => { + return deepEqual(prev, current); + }) + ) .subscribe(() => subject.next(embeddable.getInput()?.[key] as ValueType)) ); } diff --git a/src/plugins/embeddable/public/lib/embeddables/diff_embeddable_input.ts b/src/plugins/embeddable/public/lib/embeddables/diff_embeddable_input.ts index b1c5ab6ab1c38..ba55f098bba45 100644 --- a/src/plugins/embeddable/public/lib/embeddables/diff_embeddable_input.ts +++ b/src/plugins/embeddable/public/lib/embeddables/diff_embeddable_input.ts @@ -59,16 +59,19 @@ export const genericEmbeddableInputIsEqual = ( const { title: currentTitle, hidePanelTitles: currentHidePanelTitles, + enhancements: currentEnhancements, ...current } = pick(currentInput as GenericEmbedableInputToCompare, genericInputKeysToCompare); const { title: lastTitle, hidePanelTitles: lastHidePanelTitles, + enhancements: lastEnhancements, ...last } = pick(lastInput as GenericEmbedableInputToCompare, genericInputKeysToCompare); if (currentTitle !== lastTitle) return false; if (Boolean(currentHidePanelTitles) !== Boolean(lastHidePanelTitles)) return false; + if (!fastIsEqual(currentEnhancements ?? {}, lastEnhancements ?? {})) return false; if (!fastIsEqual(current, last)) return false; return true; }; diff --git a/test/functional/apps/dashboard_elements/controls/common/control_group_apply_button.ts b/test/functional/apps/dashboard_elements/controls/common/control_group_apply_button.ts index 7e1b464e9819f..20286c2938ada 100644 --- a/test/functional/apps/dashboard_elements/controls/common/control_group_apply_button.ts +++ b/test/functional/apps/dashboard_elements/controls/common/control_group_apply_button.ts @@ -7,7 +7,6 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { OPTIONS_LIST_CONTROL, RANGE_SLIDER_CONTROL } from '@kbn/controls-plugin/common'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../../ftr_provider_context'; @@ -15,77 +14,25 @@ import { FtrProviderContext } from '../../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const pieChart = getService('pieChart'); const elasticChart = getService('elasticChart'); - const testSubjects = getService('testSubjects'); - const dashboardAddPanel = getService('dashboardAddPanel'); - const { dashboard, header, dashboardControls, timePicker } = getPageObjects([ + const { dashboard, header, dashboardControls } = getPageObjects([ 'dashboardControls', - 'timePicker', 'dashboard', 'header', ]); describe('Dashboard control group apply button', () => { - let controlIds: string[]; + const optionsListId = '41827e70-5285-4d44-8375-4c498449b9a7'; + const rangeSliderId = '515e7b9f-4f1b-4a06-beec-763810e4951a'; before(async () => { await dashboard.navigateToApp(); - await dashboard.gotoDashboardLandingPage(); - await dashboard.clickNewDashboard(); - await timePicker.setDefaultDataRange(); - + await dashboard.loadSavedDashboard('Test Control Group Apply Button'); + await dashboard.switchToEditMode(); await elasticChart.setNewChartUiDebugFlag(); - await dashboardAddPanel.addVisualization('Rendering-Test:-animal-sounds-pie'); - - // save the dashboard before adding controls - await dashboard.saveDashboard('Test Control Group Apply Button', { - exitFromEditMode: false, - saveAsNew: true, - }); - await header.waitUntilLoadingHasFinished(); - await dashboard.waitForRenderComplete(); - await dashboard.expectMissingUnsavedChangesBadge(); - - // populate an initial set of controls and get their ids. - await dashboardControls.createControl({ - controlType: OPTIONS_LIST_CONTROL, - dataViewTitle: 'animals-*', - fieldName: 'animal.keyword', - title: 'Animal', - }); - await dashboardControls.createControl({ - controlType: RANGE_SLIDER_CONTROL, - dataViewTitle: 'animals-*', - fieldName: 'weightLbs', - title: 'Animal Name', - }); - await dashboardControls.createTimeSliderControl(); - - // wait for all controls to finish loading before saving - controlIds = await dashboardControls.getAllControlIds(); - await dashboardControls.optionsListWaitForLoading(controlIds[0]); - await dashboardControls.rangeSliderWaitForLoading(controlIds[1]); - - // re-save the dashboard - await dashboard.clickQuickSave(); - await header.waitUntilLoadingHasFinished(); - await dashboard.waitForRenderComplete(); - await dashboard.expectMissingUnsavedChangesBadge(); - }); - - it('able to set apply button setting', async () => { - await dashboardControls.updateShowApplyButtonSetting(true); - await testSubjects.existOrFail('controlGroup--applyFiltersButton'); - await dashboard.expectUnsavedChangesBadge(); - - await dashboard.clickQuickSave(); - await header.waitUntilLoadingHasFinished(); - await dashboard.expectMissingUnsavedChangesBadge(); }); it('renabling auto-apply forces filters to be published', async () => { - const optionsListId = controlIds[0]; - await dashboardControls.verifyApplyButtonEnabled(false); await dashboardControls.optionsListOpenPopover(optionsListId); await dashboardControls.optionsListPopoverSelectOption('cat'); await dashboardControls.optionsListEnsurePopoverIsClosed(optionsListId); @@ -102,14 +49,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); describe('options list selections', () => { - let optionsListId: string; - - before(async () => { - optionsListId = controlIds[0]; - }); - it('making selection enables apply button', async () => { - await dashboardControls.verifyApplyButtonEnabled(false); await dashboardControls.optionsListOpenPopover(optionsListId); await dashboardControls.optionsListPopoverSelectOption('cat'); await dashboardControls.optionsListEnsurePopoverIsClosed(optionsListId); @@ -118,7 +58,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('waits to apply filters until button is pressed', async () => { - await dashboard.expectMissingUnsavedChangesBadge(); expect(await pieChart.getPieSliceCount()).to.be(5); await dashboardControls.clickApplyButton(); @@ -140,27 +79,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await dashboard.waitForRenderComplete(); + await dashboard.expectMissingUnsavedChangesBadge(); expect(await pieChart.getPieSliceCount()).to.be(5); - await dashboardControls.verifyApplyButtonEnabled(false); expect(await dashboardControls.optionsListGetSelectionsString(optionsListId)).to.be('Any'); }); }); describe('range slider selections', () => { - let rangeSliderId: string; - - before(async () => { - rangeSliderId = controlIds[1]; - }); - it('making selection enables apply button', async () => { - await dashboardControls.verifyApplyButtonEnabled(false); await dashboardControls.rangeSliderSetUpperBound(rangeSliderId, '30'); await dashboardControls.verifyApplyButtonEnabled(); }); it('waits to apply filters until apply button is pressed', async () => { - await dashboard.expectMissingUnsavedChangesBadge(); expect(await pieChart.getPieSliceCount()).to.be(5); await dashboardControls.clickApplyButton(); @@ -181,8 +112,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await dashboard.waitForRenderComplete(); + await dashboard.expectMissingUnsavedChangesBadge(); expect(await pieChart.getPieSliceCount()).to.be(5); - await dashboardControls.verifyApplyButtonEnabled(false); expect( await dashboardControls.rangeSliderGetLowerBoundAttribute(rangeSliderId, 'value') ).to.be(''); @@ -200,7 +131,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('making selection enables apply button', async () => { - await dashboardControls.verifyApplyButtonEnabled(false); await dashboardControls.gotoNextTimeSlice(); await dashboardControls.gotoNextTimeSlice(); // go to an empty timeslice await header.waitUntilLoadingHasFinished(); @@ -208,7 +138,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('waits to apply timeslice until apply button is pressed', async () => { - await dashboard.expectMissingUnsavedChangesBadge(); expect(await pieChart.getPieSliceCount()).to.be(5); await dashboardControls.clickApplyButton(); @@ -227,8 +156,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await dashboard.waitForRenderComplete(); + await dashboard.expectMissingUnsavedChangesBadge(); expect(await pieChart.getPieSliceCount()).to.be(5); - await dashboardControls.verifyApplyButtonEnabled(false); const valueNow = await dashboardControls.getTimeSliceFromTimeSlider(); expect(valueNow).to.equal(valueBefore); }); diff --git a/test/functional/apps/dashboard_elements/controls/common/multiple_data_views.ts b/test/functional/apps/dashboard_elements/controls/common/multiple_data_views.ts index f41cb6c13c9b8..bb79a3941ac51 100644 --- a/test/functional/apps/dashboard_elements/controls/common/multiple_data_views.ts +++ b/test/functional/apps/dashboard_elements/controls/common/multiple_data_views.ts @@ -7,7 +7,6 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { OPTIONS_LIST_CONTROL, RANGE_SLIDER_CONTROL } from '@kbn/controls-plugin/common'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../../ftr_provider_context'; @@ -18,17 +17,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const filterBar = getService('filterBar'); const testSubjects = getService('testSubjects'); - const dashboardAddPanel = getService('dashboardAddPanel'); - const { common, dashboard, dashboardControls } = getPageObjects([ + const { dashboard, dashboardControls } = getPageObjects([ 'dashboardControls', 'dashboard', 'console', - 'common', 'header', ]); describe('Dashboard control group with multiple data views', () => { - let controlIds: string[]; + // Controls from flights data view + const carrierControlId = '265b6a28-9ccb-44ae-83c9-3d7a7cac1961'; + const ticketPriceControlId = 'ed2b93e2-da37-482b-ae43-586a41cc2399'; + // Controls from logstash-* data view + const osControlId = '5e1b146b-8a8b-4117-9218-c4aeaee7bc9a'; + const bytesControlId = 'c4760951-e793-45d5-a6b7-c72c145af7f9'; + + async function waitForAllConrolsLoading() { + await Promise.all([ + dashboardControls.optionsListWaitForLoading(carrierControlId), + dashboardControls.rangeSliderWaitForLoading(ticketPriceControlId), + dashboardControls.optionsListWaitForLoading(osControlId), + dashboardControls.rangeSliderWaitForLoading(bytesControlId), + ]); + } before(async () => { await security.testUser.setRoles(['kibana_admin', 'kibana_sample_admin']); @@ -40,50 +51,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await kibanaServer.importExport.load( 'test/functional/fixtures/kbn_archiver/kibana_sample_data_flights_index_pattern' ); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/dashboard/current/multi_data_view_kibana' + ); await kibanaServer.uiSettings.replace({ defaultIndex: '0bf35f60-3dc9-11e8-8660-4d65aa086b3c', - 'courier:ignoreFilterIfFieldNotInIndex': true, - }); - - await common.setTime({ - from: 'Apr 10, 2018 @ 00:00:00.000', - to: 'Nov 15, 2018 @ 00:00:00.000', - }); - - await dashboard.navigateToApp(); - await dashboard.clickNewDashboard(); - - await dashboardControls.createControl({ - controlType: OPTIONS_LIST_CONTROL, - dataViewTitle: 'kibana_sample_data_flights', - fieldName: 'Carrier', - title: 'Carrier', - }); - - await dashboardControls.createControl({ - controlType: RANGE_SLIDER_CONTROL, - dataViewTitle: 'kibana_sample_data_flights', - fieldName: 'AvgTicketPrice', - title: 'Average Ticket Price', }); - - await dashboardControls.createControl({ - controlType: OPTIONS_LIST_CONTROL, - dataViewTitle: 'logstash-*', - fieldName: 'machine.os.raw', - title: 'Operating System', - }); - - await dashboardControls.createControl({ - controlType: RANGE_SLIDER_CONTROL, - dataViewTitle: 'logstash-*', - fieldName: 'bytes', - title: 'Bytes', - }); - - await dashboardAddPanel.addSavedSearch('logstash hits'); - - controlIds = await dashboardControls.getAllControlIds(); }); after(async () => { @@ -94,96 +67,169 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await kibanaServer.importExport.unload( 'test/functional/fixtures/kbn_archiver/kibana_sample_data_flights_index_pattern' ); + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/dashboard/current/multi_data_view_kibana' + ); await security.testUser.restoreDefaults(); - await kibanaServer.uiSettings.unset('courier:ignoreFilterIfFieldNotInIndex'); await kibanaServer.uiSettings.unset('defaultIndex'); }); - it('ignores global filters on controls using a data view without the filter field', async () => { - await filterBar.addFilter({ field: 'Carrier', operation: 'exists' }); - - await dashboardControls.optionsListOpenPopover(controlIds[0]); - expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('4'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[0]); - - await dashboardControls.validateRange('placeholder', controlIds[1], '100', '1200'); - - await dashboardControls.optionsListOpenPopover(controlIds[2]); - expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('5'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[2]); - - await dashboardControls.validateRange('placeholder', controlIds[3], '0', '19979'); - }); - - it('ignores controls on other controls and panels using a data view without the control field by default', async () => { - await filterBar.removeFilter('Carrier'); - await dashboardControls.optionsListOpenPopover(controlIds[0]); - await dashboardControls.optionsListPopoverSelectOption('Kibana Airlines'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[0]); - - await dashboardControls.validateRange('placeholder', controlIds[1], '100', '1196'); - - await dashboardControls.optionsListOpenPopover(controlIds[2]); - expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('5'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[2]); + describe('courier:ignoreFilterIfFieldNotInIndex enabled', () => { + before(async () => { + await kibanaServer.uiSettings.replace({ + 'courier:ignoreFilterIfFieldNotInIndex': true, + }); - await dashboardControls.validateRange('placeholder', controlIds[3], '0', '19979'); - - const logstashSavedSearchPanel = await testSubjects.find('embeddedSavedSearchDocTable'); - expect( - await ( - await logstashSavedSearchPanel.findByCssSelector('[data-document-number]') - ).getAttribute('data-document-number') - ).to.not.be('0'); - }); - - it('applies global filters on controls using data view a without the filter field', async () => { - await kibanaServer.uiSettings.update({ 'courier:ignoreFilterIfFieldNotInIndex': false }); - await common.navigateToApp('dashboard'); - await testSubjects.click('edit-unsaved-New-Dashboard'); - await filterBar.addFilter({ field: 'Carrier', operation: 'exists' }); - - await Promise.all([ - dashboardControls.optionsListWaitForLoading(controlIds[0]), - dashboardControls.rangeSliderWaitForLoading(controlIds[1]), - dashboardControls.optionsListWaitForLoading(controlIds[2]), - dashboardControls.rangeSliderWaitForLoading(controlIds[3]), - ]); - - await dashboardControls.clearControlSelections(controlIds[0]); - await dashboardControls.optionsListOpenPopover(controlIds[0]); - expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('4'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[0]); + await dashboard.navigateToApp(); + await dashboard.loadSavedDashboard('Test Control Group With Multiple Data Views'); + }); - await dashboardControls.validateRange('placeholder', controlIds[1], '100', '1200'); + after(async () => { + await kibanaServer.uiSettings.unset('courier:ignoreFilterIfFieldNotInIndex'); + }); - await dashboardControls.optionsListOpenPopover(controlIds[2]); - expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('0'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[2]); + describe('global filters', () => { + before(async () => { + await filterBar.addFilter({ + field: 'Carrier', + operation: 'is', + value: 'Kibana Airlines', + }); + await waitForAllConrolsLoading(); + }); + + after(async () => { + await dashboard.clickDiscardChanges(); + }); + + it('applies global filters to controls with data view of filter field', async () => { + await dashboardControls.optionsListOpenPopover(carrierControlId); + expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('1'); + await dashboardControls.optionsListEnsurePopoverIsClosed(carrierControlId); + + await dashboardControls.validateRange('placeholder', ticketPriceControlId, '100', '1196'); + }); + + it('ignores global filters to controls without data view of filter field', async () => { + await dashboardControls.optionsListOpenPopover(osControlId); + expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('5'); + await dashboardControls.optionsListEnsurePopoverIsClosed(osControlId); + + await dashboardControls.validateRange('placeholder', bytesControlId, '0', '19979'); + }); + }); - await dashboardControls.validateRange('placeholder', controlIds[3], '0', '0'); + describe('control filters', () => { + before(async () => { + await dashboardControls.optionsListOpenPopover(carrierControlId); + await dashboardControls.optionsListPopoverSelectOption('Kibana Airlines'); + await dashboardControls.optionsListEnsurePopoverIsClosed(carrierControlId); + await waitForAllConrolsLoading(); + }); + + after(async () => { + await dashboard.clickDiscardChanges(); + }); + + it('applies control filters to controls with data view of control filter', async () => { + await dashboardControls.validateRange('placeholder', ticketPriceControlId, '100', '1196'); + }); + + it('ignores control filters on controls without data view of control filter', async () => { + await dashboardControls.optionsListOpenPopover(osControlId); + expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('5'); + await dashboardControls.optionsListEnsurePopoverIsClosed(osControlId); + + await dashboardControls.validateRange('placeholder', bytesControlId, '0', '19979'); + }); + + it('ignores control filters on panels without data view of control filter', async () => { + const logstashSavedSearchPanel = await testSubjects.find('embeddedSavedSearchDocTable'); + expect( + await ( + await logstashSavedSearchPanel.findByCssSelector('[data-document-number]') + ).getAttribute('data-document-number') + ).to.not.be('0'); + }); + }); }); - it('applies global filters on controls using a data view without the filter field', async () => { - await filterBar.removeFilter('Carrier'); - await dashboardControls.optionsListOpenPopover(controlIds[0]); - await dashboardControls.optionsListPopoverSelectOption('Kibana Airlines'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[0]); + describe('courier:ignoreFilterIfFieldNotInIndex disabled', () => { + before(async () => { + await kibanaServer.uiSettings.replace({ + 'courier:ignoreFilterIfFieldNotInIndex': false, + }); - await dashboardControls.validateRange('placeholder', controlIds[1], '100', '1196'); + await dashboard.navigateToApp(); + await dashboard.loadSavedDashboard('Test Control Group With Multiple Data Views'); + }); - await dashboardControls.optionsListOpenPopover(controlIds[2]); - expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('0'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[2]); + after(async () => { + await kibanaServer.uiSettings.unset('courier:ignoreFilterIfFieldNotInIndex'); + }); - await dashboardControls.validateRange('placeholder', controlIds[3], '0', '0'); + describe('global filters', () => { + before(async () => { + await filterBar.addFilter({ + field: 'Carrier', + operation: 'is', + value: 'Kibana Airlines', + }); + await waitForAllConrolsLoading(); + }); + + after(async () => { + await dashboard.clickDiscardChanges(); + }); + + it('applies global filters to controls without data view of filter field', async () => { + await dashboardControls.optionsListOpenPopover(osControlId); + expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('0'); + await dashboardControls.optionsListEnsurePopoverIsClosed(osControlId); + + await dashboardControls.validateRange( + 'placeholder', + bytesControlId, + '-Infinity', + 'Infinity' + ); + }); + }); - const logstashSavedSearchPanel = await testSubjects.find('embeddedSavedSearchDocTable'); - expect( - await ( - await logstashSavedSearchPanel.findByCssSelector('[data-document-number]') - ).getAttribute('data-document-number') - ).to.be('0'); + describe('control filters', () => { + before(async () => { + await dashboardControls.optionsListOpenPopover(carrierControlId); + await dashboardControls.optionsListPopoverSelectOption('Kibana Airlines'); + await dashboardControls.optionsListEnsurePopoverIsClosed(carrierControlId); + await waitForAllConrolsLoading(); + }); + + after(async () => { + await dashboard.clickDiscardChanges(); + }); + + it('applies control filters on controls without data view of control filter', async () => { + await dashboardControls.optionsListOpenPopover(osControlId); + expect(await dashboardControls.optionsListGetCardinalityValue()).to.be('0'); + await dashboardControls.optionsListEnsurePopoverIsClosed(osControlId); + + await dashboardControls.validateRange( + 'placeholder', + bytesControlId, + '-Infinity', + 'Infinity' + ); + }); + + it('applies control filters on panels without data view of control filter', async () => { + const logstashSavedSearchPanel = await testSubjects.find('embeddedSavedSearchDocTable'); + expect( + await ( + await logstashSavedSearchPanel.findByCssSelector('[data-document-number]') + ).getAttribute('data-document-number') + ).to.be('0'); + }); + }); }); }); } diff --git a/test/functional/apps/dashboard_elements/controls/common/replace_controls.ts b/test/functional/apps/dashboard_elements/controls/common/replace_controls.ts index 8da65d51d1f9e..1d1dea228b42c 100644 --- a/test/functional/apps/dashboard_elements/controls/common/replace_controls.ts +++ b/test/functional/apps/dashboard_elements/controls/common/replace_controls.ts @@ -36,15 +36,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const replaceWithOptionsList = async (controlId: string, field: string) => { await changeFieldType(controlId, field, OPTIONS_LIST_CONTROL); - await testSubjects.waitForEnabled(`optionsList-control-${controlId}`); - await dashboardControls.verifyControlType(controlId, 'optionsList-control'); + const newControlId: string = (await dashboardControls.getAllControlIds())[0]; + await testSubjects.waitForEnabled(`optionsList-control-${newControlId}`); + await dashboardControls.verifyControlType(newControlId, 'optionsList-control'); }; const replaceWithRangeSlider = async (controlId: string, field: string) => { await changeFieldType(controlId, field, RANGE_SLIDER_CONTROL); await retry.try(async () => { - await dashboardControls.rangeSliderWaitForLoading(controlId); - await dashboardControls.verifyControlType(controlId, 'range-slider-control'); + const newControlId: string = (await dashboardControls.getAllControlIds())[0]; + await dashboardControls.rangeSliderWaitForLoading(newControlId); + await dashboardControls.verifyControlType(newControlId, 'range-slider-control'); }); }; @@ -69,7 +71,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Replace options list', () => { beforeEach(async () => { - await dashboardControls.clearAllControls(); await dashboardControls.createControl({ controlType: OPTIONS_LIST_CONTROL, dataViewTitle: 'animals-*', @@ -79,7 +80,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); afterEach(async () => { - await dashboard.clearUnsavedChanges(); + await dashboardControls.clearAllControls(); }); it('with range slider - default title', async () => { @@ -101,7 +102,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Replace range slider', () => { beforeEach(async () => { - await dashboardControls.clearAllControls(); await dashboardControls.createControl({ controlType: RANGE_SLIDER_CONTROL, dataViewTitle: 'animals-*', @@ -112,7 +112,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); afterEach(async () => { - await dashboard.clearUnsavedChanges(); + await dashboardControls.clearAllControls(); }); it('with options list - default title', async () => { diff --git a/test/functional/apps/dashboard_elements/controls/options_list/options_list_suggestions.ts b/test/functional/apps/dashboard_elements/controls/options_list/options_list_suggestions.ts index 49e3942ab9919..2b08e2da62920 100644 --- a/test/functional/apps/dashboard_elements/controls/options_list/options_list_suggestions.ts +++ b/test/functional/apps/dashboard_elements/controls/options_list/options_list_suggestions.ts @@ -18,11 +18,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const { dashboardControls, dashboard, header } = getPageObjects([ 'dashboardControls', - 'timePicker', 'dashboard', - 'settings', - 'console', - 'common', 'header', ]); @@ -53,6 +49,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); + await dashboard.clickDiscardChanges(); }); it('sort alphabetically - descending', async () => { @@ -134,12 +131,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { for (let i = 0; i < sortedSuggestions.length - 1; i++) { expect(sortedSuggestions[i]).to.be.lessThan(sortedSuggestions[i + 1]); } - - // revert to the old field name to keep state consistent for other tests - await dashboardControls.editExistingControl(controlId); - await dashboardControls.controlsEditorSetfield('sound.keyword'); - await dashboardControls.optionsListSetAdditionalSettings({ searchTechnique: 'prefix' }); - await dashboardControls.controlEditorSave(); }); }); diff --git a/test/functional/apps/dashboard_elements/controls/options_list/options_list_validation.ts b/test/functional/apps/dashboard_elements/controls/options_list/options_list_validation.ts index 27122fca14dfb..9d9b227151d87 100644 --- a/test/functional/apps/dashboard_elements/controls/options_list/options_list_validation.ts +++ b/test/functional/apps/dashboard_elements/controls/options_list/options_list_validation.ts @@ -10,7 +10,6 @@ import { pick } from 'lodash'; import expect from '@kbn/expect'; -import { OPTIONS_LIST_CONTROL } from '@kbn/controls-plugin/common'; import { FtrProviderContext } from '../../../../ftr_provider_context'; import { OPTIONS_LIST_ANIMAL_SOUND_SUGGESTIONS } from '../../../../page_objects/dashboard_page_controls'; @@ -19,8 +18,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const queryBar = getService('queryBar'); const pieChart = getService('pieChart'); const filterBar = getService('filterBar'); - const dashboardAddPanel = getService('dashboardAddPanel'); - const dashboardPanelActions = getService('dashboardPanelActions'); const { dashboardControls, dashboard, header } = getPageObjects([ 'dashboardControls', @@ -33,41 +30,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ]); describe('Dashboard options list validation', () => { - let controlId: string; + const controlId = 'cd881630-fd28-4e9c-aec5-ae9711d48369'; before(async () => { + await dashboard.loadSavedDashboard('Test Options List Validation'); await dashboard.ensureDashboardIsInEditMode(); - await dashboardControls.createControl({ - controlType: OPTIONS_LIST_CONTROL, - dataViewTitle: 'animals-*', - fieldName: 'sound.keyword', - title: 'Animal Sounds', - }); - controlId = (await dashboardControls.getAllControlIds())[0]; - await dashboardAddPanel.addVisualization('Rendering-Test:-animal-sounds-pie'); - await dashboard.clickQuickSave(); - await header.waitUntilLoadingHasFinished(); - }); - - after(async () => { - await filterBar.removeAllFilters(); - await dashboardControls.deleteAllControls(); - await dashboardPanelActions.removePanelByTitle('Rendering Test: animal sounds pie'); - await dashboard.clickQuickSave(); }); describe('Options List dashboard validation', () => { - before(async () => { - await dashboardControls.optionsListOpenPopover(controlId); - await dashboardControls.optionsListPopoverSelectOption('meow'); - await dashboardControls.optionsListPopoverSelectOption('bark'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); - }); - after(async () => { - await dashboardControls.clearControlSelections(controlId); + // Instead of reset, filter must be manually deleted to avoid + // https://github.com/elastic/kibana/issues/191675 await filterBar.removeAllFilters(); - await queryBar.clickQuerySubmitButton(); }); it('Can mark selections invalid with Query', async () => { @@ -119,13 +93,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Options List dashboard no validation', () => { before(async () => { - await dashboardControls.optionsListOpenPopover(controlId); - await dashboardControls.optionsListPopoverSelectOption('meow'); - await dashboardControls.optionsListPopoverSelectOption('bark'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); await dashboardControls.updateValidationSetting(false); }); + after(async () => { + await dashboard.clickDiscardChanges(); + }); + it('Does not mark selections invalid with Query', async () => { await queryBar.setQuery('NOT animal.keyword : "dog" '); await queryBar.submitQuery(); diff --git a/test/functional/fixtures/kbn_archiver/dashboard/current/kibana.json b/test/functional/fixtures/kbn_archiver/dashboard/current/kibana.json index a89dcf714dfc3..c4c2b4ab2d025 100644 --- a/test/functional/fixtures/kbn_archiver/dashboard/current/kibana.json +++ b/test/functional/fixtures/kbn_archiver/dashboard/current/kibana.json @@ -3225,3 +3225,108 @@ "coreMigrationVersion": "8.8.0", "typeMigrationVersion": "10.2.0" } + +{ + "id": "55bc0b4b-a50f-46bf-b154-dd156067eea5", + "type": "dashboard", + "namespaces": [ + "default" + ], + "updated_at": "2024-08-26T13:30:47.442Z", + "created_at": "2024-08-26T13:29:23.580Z", + "version": "WzEwNiwxXQ==", + "attributes": { + "version": 2, + "controlGroupInput": { + "chainingSystem": "HIERARCHICAL", + "controlStyle": "oneLine", + "showApplySelections": true, + "ignoreParentSettingsJSON": "{\"ignoreFilters\":false,\"ignoreQuery\":false,\"ignoreTimerange\":false,\"ignoreValidations\":false}", + "panelsJSON": "{\"41827e70-5285-4d44-8375-4c498449b9a7\":{\"grow\":true,\"order\":0,\"type\":\"optionsListControl\",\"width\":\"medium\",\"explicitInput\":{\"dataViewId\":\"a0f483a0-3dc9-11e8-8660-4d65aa086b3c\",\"fieldName\":\"animal.keyword\",\"searchTechnique\":\"prefix\",\"selectedOptions\":[],\"sort\":{\"by\":\"_count\",\"direction\":\"desc\"}}},\"515e7b9f-4f1b-4a06-beec-763810e4951a\":{\"grow\":true,\"order\":1,\"type\":\"rangeSliderControl\",\"width\":\"medium\",\"explicitInput\":{\"dataViewId\":\"a0f483a0-3dc9-11e8-8660-4d65aa086b3c\",\"fieldName\":\"weightLbs\",\"step\":1}},\"b33b103a-84e2-4c2f-b4bd-be143dbd7e8a\":{\"grow\":true,\"order\":2,\"type\":\"timeSlider\",\"width\":\"large\",\"explicitInput\":{}}}" + }, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}" + }, + "description": "", + "refreshInterval": { + "pause": true, + "value": 60000 + }, + "timeRestore": true, + "optionsJSON": "{\"useMargins\":true,\"syncColors\":false,\"syncCursor\":true,\"syncTooltips\":false,\"hidePanelTitles\":false}", + "panelsJSON": "[{\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":15,\"i\":\"ffc13252-56b4-4e3f-847e-61373fa0be86\"},\"panelIndex\":\"ffc13252-56b4-4e3f-847e-61373fa0be86\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_ffc13252-56b4-4e3f-847e-61373fa0be86\"}]", + "timeFrom": "2018-01-01T00:00:00.000Z", + "title": "Test Control Group Apply Button", + "timeTo": "2018-04-13T00:00:00.000Z" + }, + "references": [ + { + "name": "ffc13252-56b4-4e3f-847e-61373fa0be86:panel_ffc13252-56b4-4e3f-847e-61373fa0be86", + "type": "visualization", + "id": "50643b60-3dd3-11e8-b2b9-5d5dc1715159" + }, + { + "name": "controlGroup_41827e70-5285-4d44-8375-4c498449b9a7:optionsListControlDataView", + "type": "index-pattern", + "id": "a0f483a0-3dc9-11e8-8660-4d65aa086b3c" + }, + { + "name": "controlGroup_515e7b9f-4f1b-4a06-beec-763810e4951a:rangeSliderControlDataView", + "type": "index-pattern", + "id": "a0f483a0-3dc9-11e8-8660-4d65aa086b3c" + } + ], + "managed": false, + "coreMigrationVersion": "8.8.0", + "typeMigrationVersion": "10.2.0" +} + +{ + "id": "0b61857d-b7d3-4b4b-aa6b-773808361cd6", + "type": "dashboard", + "namespaces": [ + "default" + ], + "updated_at": "2024-08-26T15:23:33.053Z", + "created_at": "2024-08-26T15:22:39.194Z", + "version": "WzE1MTksMV0=", + "attributes": { + "version": 2, + "controlGroupInput": { + "chainingSystem": "HIERARCHICAL", + "controlStyle": "oneLine", + "showApplySelections": false, + "ignoreParentSettingsJSON": "{\"ignoreFilters\":false,\"ignoreQuery\":false,\"ignoreTimerange\":false,\"ignoreValidations\":false}", + "panelsJSON": "{\"cd881630-fd28-4e9c-aec5-ae9711d48369\":{\"grow\":true,\"order\":0,\"type\":\"optionsListControl\",\"width\":\"medium\",\"explicitInput\":{\"dataViewId\":\"a0f483a0-3dc9-11e8-8660-4d65aa086b3c\",\"fieldName\":\"sound.keyword\",\"searchTechnique\":\"prefix\",\"selectedOptions\":[\"meow\",\"bark\"],\"sort\":{\"by\":\"_count\",\"direction\":\"desc\"}}}}" + }, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}" + }, + "description": "", + "refreshInterval": { + "pause": true, + "value": 60000 + }, + "timeRestore": true, + "optionsJSON": "{\"useMargins\":true,\"syncColors\":false,\"syncCursor\":true,\"syncTooltips\":false,\"hidePanelTitles\":false}", + "panelsJSON": "[{\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":15,\"i\":\"12415efc-008a-4f02-bad4-5c1f0d9ba1c6\"},\"panelIndex\":\"12415efc-008a-4f02-bad4-5c1f0d9ba1c6\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_12415efc-008a-4f02-bad4-5c1f0d9ba1c6\"}]", + "timeFrom": "2018-01-01T00:00:00.000Z", + "title": "Test Options List Validation", + "timeTo": "2018-04-13T00:00:00.000Z" + }, + "references": [ + { + "name": "12415efc-008a-4f02-bad4-5c1f0d9ba1c6:panel_12415efc-008a-4f02-bad4-5c1f0d9ba1c6", + "type": "visualization", + "id": "50643b60-3dd3-11e8-b2b9-5d5dc1715159" + }, + { + "name": "controlGroup_cd881630-fd28-4e9c-aec5-ae9711d48369:optionsListControlDataView", + "type": "index-pattern", + "id": "a0f483a0-3dc9-11e8-8660-4d65aa086b3c" + } + ], + "managed": false, + "coreMigrationVersion": "8.8.0", + "typeMigrationVersion": "10.2.0" +} \ No newline at end of file diff --git a/test/functional/fixtures/kbn_archiver/dashboard/current/multi_data_view_kibana.json b/test/functional/fixtures/kbn_archiver/dashboard/current/multi_data_view_kibana.json new file mode 100644 index 0000000000000..7a5de78d372aa --- /dev/null +++ b/test/functional/fixtures/kbn_archiver/dashboard/current/multi_data_view_kibana.json @@ -0,0 +1,64 @@ +{ + "id": "2af8906f-143b-4152-9f74-4994fb9c7b3e", + "type": "dashboard", + "namespaces": [ + "default" + ], + "updated_at": "2024-08-27T16:43:33.847Z", + "created_at": "2024-08-27T16:43:33.847Z", + "version": "WzIwNSwxXQ==", + "attributes": { + "version": 2, + "controlGroupInput": { + "chainingSystem": "HIERARCHICAL", + "controlStyle": "oneLine", + "showApplySelections": false, + "ignoreParentSettingsJSON": "{\"ignoreFilters\":false,\"ignoreQuery\":false,\"ignoreTimerange\":false,\"ignoreValidations\":false}", + "panelsJSON": "{\"265b6a28-9ccb-44ae-83c9-3d7a7cac1961\":{\"grow\":true,\"order\":0,\"type\":\"optionsListControl\",\"width\":\"medium\",\"explicitInput\":{\"dataViewId\":\"d3d7af60-4c81-11e8-b3d7-01146121b73d\",\"fieldName\":\"Carrier\",\"searchTechnique\":\"prefix\",\"selectedOptions\":[],\"sort\":{\"by\":\"_count\",\"direction\":\"desc\"}}},\"ed2b93e2-da37-482b-ae43-586a41cc2399\":{\"grow\":true,\"order\":1,\"type\":\"rangeSliderControl\",\"width\":\"medium\",\"explicitInput\":{\"dataViewId\":\"d3d7af60-4c81-11e8-b3d7-01146121b73d\",\"fieldName\":\"AvgTicketPrice\",\"title\":\"Average Ticket Price\",\"step\":1}},\"5e1b146b-8a8b-4117-9218-c4aeaee7bc9a\":{\"grow\":true,\"order\":2,\"type\":\"optionsListControl\",\"width\":\"medium\",\"explicitInput\":{\"dataViewId\":\"0bf35f60-3dc9-11e8-8660-4d65aa086b3c\",\"fieldName\":\"machine.os.raw\",\"title\":\"Operating System\",\"searchTechnique\":\"prefix\",\"selectedOptions\":[],\"sort\":{\"by\":\"_count\",\"direction\":\"desc\"}}},\"c4760951-e793-45d5-a6b7-c72c145af7f9\":{\"grow\":true,\"order\":3,\"type\":\"rangeSliderControl\",\"width\":\"medium\",\"explicitInput\":{\"dataViewId\":\"0bf35f60-3dc9-11e8-8660-4d65aa086b3c\",\"fieldName\":\"bytes\",\"title\":\"Bytes\",\"step\":1}}}" + }, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}" + }, + "description": "", + "refreshInterval": { + "pause": true, + "value": 60000 + }, + "timeRestore": true, + "optionsJSON": "{\"useMargins\":true,\"syncColors\":false,\"syncCursor\":true,\"syncTooltips\":false,\"hidePanelTitles\":false}", + "panelsJSON": "[{\"type\":\"search\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":15,\"i\":\"d75a68e9-67d9-4bed-9dba-85490d3eec37\"},\"panelIndex\":\"d75a68e9-67d9-4bed-9dba-85490d3eec37\",\"embeddableConfig\":{\"description\":\"\",\"enhancements\":{}},\"title\":\"logstash hits\",\"panelRefName\":\"panel_d75a68e9-67d9-4bed-9dba-85490d3eec37\"}]", + "timeFrom": "2018-04-10T00:00:00.000Z", + "title": "Test Control Group With Multiple Data Views", + "timeTo": "2018-11-15T00:00:00.000Z" + }, + "references": [ + { + "name": "d75a68e9-67d9-4bed-9dba-85490d3eec37:panel_d75a68e9-67d9-4bed-9dba-85490d3eec37", + "type": "search", + "id": "2b9247e0-6458-11ed-9957-e76caeeb9f75" + }, + { + "name": "controlGroup_265b6a28-9ccb-44ae-83c9-3d7a7cac1961:optionsListControlDataView", + "type": "index-pattern", + "id": "d3d7af60-4c81-11e8-b3d7-01146121b73d" + }, + { + "name": "controlGroup_ed2b93e2-da37-482b-ae43-586a41cc2399:rangeSliderControlDataView", + "type": "index-pattern", + "id": "d3d7af60-4c81-11e8-b3d7-01146121b73d" + }, + { + "name": "controlGroup_5e1b146b-8a8b-4117-9218-c4aeaee7bc9a:optionsListControlDataView", + "type": "index-pattern", + "id": "0bf35f60-3dc9-11e8-8660-4d65aa086b3c" + }, + { + "name": "controlGroup_c4760951-e793-45d5-a6b7-c72c145af7f9:rangeSliderControlDataView", + "type": "index-pattern", + "id": "0bf35f60-3dc9-11e8-8660-4d65aa086b3c" + } + ], + "managed": false, + "coreMigrationVersion": "8.8.0", + "typeMigrationVersion": "10.2.0" +} \ No newline at end of file diff --git a/test/functional/page_objects/dashboard_page_controls.ts b/test/functional/page_objects/dashboard_page_controls.ts index 16993aeda74c9..28c7df0237b22 100644 --- a/test/functional/page_objects/dashboard_page_controls.ts +++ b/test/functional/page_objects/dashboard_page_controls.ts @@ -476,7 +476,11 @@ export class DashboardPageControls extends FtrService { await this.optionsListWaitForLoading(controlId); if (!skipOpen) await this.optionsListOpenPopover(controlId); await this.retry.try(async () => { - expect(await this.optionsListPopoverGetAvailableOptions()).to.eql(expectation); + const availableOptions = await this.optionsListPopoverGetAvailableOptions(); + expect(availableOptions.suggestions).to.eql(expectation.suggestions); + expect(availableOptions.invalidSelections.sort()).to.eql( + expectation.invalidSelections.sort() + ); }); if (await this.testSubjects.exists('optionsList-cardinality-label')) { expect(await this.optionsListGetCardinalityValue()).to.be( @@ -497,7 +501,9 @@ export class DashboardPageControls extends FtrService { public async optionsListPopoverSearchForOption(search: string) { this.log.debug(`searching for ${search} in options list`); await this.optionsListPopoverAssertOpen(); - await this.testSubjects.setValue(`optionsList-control-search-input`, search); + await this.testSubjects.setValue(`optionsList-control-search-input`, search, { + typeCharByChar: true, + }); await this.optionsListPopoverWaitForLoading(); } diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/index.tsx index 752e52aa27c4a..6f2c91dec9bfe 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/index.tsx @@ -16,8 +16,7 @@ import { import { DataView } from '@kbn/data-views-plugin/common'; import { buildExistsFilter, buildPhraseFilter, Filter } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; -import { controlGroupInputBuilder } from '@kbn/controls-plugin/public'; -import { getDefaultControlGroupInput } from '@kbn/controls-plugin/common'; +import { controlGroupStateBuilder } from '@kbn/controls-plugin/public'; import { NotificationsStart } from '@kbn/core/public'; import { ENVIRONMENT_ALL, @@ -71,10 +70,9 @@ async function getCreationOptions( dataView: DataView ): Promise { try { - const builder = controlGroupInputBuilder; - const controlGroupInput = getDefaultControlGroupInput(); + const controlGroupState = {}; - await builder.addDataControlFromField(controlGroupInput, { + await controlGroupStateBuilder.addDataControlFromField(controlGroupState, { dataViewId: dataView.id ?? '', title: 'Node name', fieldName: 'service.node.name', @@ -92,7 +90,7 @@ async function getCreationOptions( getInitialInput: () => ({ viewMode: ViewMode.VIEW, panels, - controlGroupInput, + controlGroupState, }), }; } catch (error) { From 2789775aa5c40889eb6c66072beac5a352204182 Mon Sep 17 00:00:00 2001 From: Kevin Lacabane Date: Tue, 10 Sep 2024 17:08:08 +0200 Subject: [PATCH 6/8] [eem] builtin definitions docs (#192024) Changed Builtin Definitions section to Entity discovery and added more details --- .../entity_manager/docs/entity_definitions.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md b/x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md index ab0f34c928f27..deedb12ebf390 100644 --- a/x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md +++ b/x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md @@ -18,7 +18,7 @@ History and summary transforms will output their data to indices where history w **Entity definition example**: -One can create a definition with a `POST kbn:/internal/entities/definition` request, or through the [entity client](https://github.com/elastic/kibana/blob/main/x-pack/plugins/observability_solution/entity_manager/server/lib/entity_client.ts). +One can create a definition with a `POST kbn:/internal/entities/definition` request, or through the [entity client](../server/lib/entity_client.ts). Given the `services_from_logs` definition below, the history transform will create one entity document per service per minute (based on `@timestamp` field, granted at least one document exist for a given bucket in the source indices), with the `logRate`, `logErrorRatio` metrics and `data_stream.type`, `sourceIndex` metadata aggregated over one minute. @@ -184,6 +184,14 @@ __services_from_logs summary entity__ The index templates and ingest pipelines created for a given definition are managed by the Entity manager and should not be directly updated. These components still offer extension points that allow customization of each transform through optional components labelled `@platform` and `@custom` where the former is targeted towards Elastic solution teams and the latter for end users. `@custom` will take precedence when both are defined. The extension points allow defining a global component (ie applied to both transforms) with `@custom`, or transform specific components with `-(latest|history)@custom`. -#### Builtin Definitions +#### Managed definitions -Entity discovery is an aggregation of _builtin_ definitions (stored in [builtin directory](../server/lib/entities/built_in)) that Elastic defines and maintains. Because we want to provide updates to existing definitions but also install new ones with future releases, we need a way to perform these actions automatically on behalf of users. To achieve that we ask for an initial _enablement_ step that creates an API key stored as an encrypted saved object. The API key is generated through a REST endpoint and is created with the credentials of the user calling that endpoint. The key requires specific privileges to install/kickoff the transforms (see privileges [here](../server/lib/auth/privileges.ts)). Once a valid key is stored, any actions performed on builtin definitions are made through that key. +Entity manager stores _builtin_ definitions (in [builtin directory](../server/lib/entities/built_in)) that powers Observability features. These definitions are managed by Elastic. To activate these definitions we currently require an _enablement_ step that will 1. create and store an API key that captures the calling user credentials and 2. install and start all builtin definitions bundled with Kibana. The first step is necessary to manage these definitions on behalf of users: with an API key handy we're able to automatically install new definitions or apply updates to existing definitions shipped with future Kibana versions. Note that this is only required because the system user does not have the read/write index privileges required by the transforms. + +Functionally, builtin definitions are similar to custom definitions and share the same schema but one should follow these rules when defining one: +- the definition id [should start with a special prefix](../server/lib/entities/built_in/constants.ts#L8) +- the definition should be `managed: true` +- the definition can only look for data in [these index patterns](../server/lib/entities/built_in/constants.ts#L9) + +Once added to [this list](../server/lib/entities/built_in/index.ts#L13), new builtin definitions will be automatically managed when Entity discovery is enabled. +When updating a builtin definition, for example by adding metadata fields or updating metrics, one should increment the definition `version` according to semantic versioning. Entity manager will automatically update existing or install new builtin definitions at startup if Entity discovery is enabled. From 90efe1dd3c5070a1d77ca468f8c166c820dddb12 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 10 Sep 2024 08:14:56 -0700 Subject: [PATCH 7/8] [Reporting] Add deprecation logging when CSV Download is enabled (#192137) This PR adds logging and messaging in the Upgrade Assistant to inform users that have enabled the deprecated feature to allow CSV Download from the saved search panel in the Dashboard application. ## Summary When `xpack.reporting.csv.enablePanelActionDownload` is enabled in kibana.yml: 1. Kibana startup logs include the message: `[2024-09-04T14:13:17.880-07:00][WARN ][config.deprecation] The "xpack.reporting.csv.enablePanelActionDownload" setting is deprecated` 2. The Stack Management > Upgrade Assistant tool features an item for an issue to resolve manually: image image --- .../reporting/server/config/index.test.ts | 26 ++++++++++++- .../plugins/reporting/server/config/index.ts | 38 ++++++++++++++++++- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/reporting/server/config/index.test.ts b/x-pack/plugins/reporting/server/config/index.test.ts index 22b1f2f043802..a517affac54e6 100644 --- a/x-pack/plugins/reporting/server/config/index.test.ts +++ b/x-pack/plugins/reporting/server/config/index.test.ts @@ -36,6 +36,15 @@ const applyReportingDeprecations = (settings: Record = {}) => { }; describe('deprecations', () => { + it('logs a warning of roles.enabled for defaults', () => { + const { messages } = applyReportingDeprecations({}); + expect(messages).toMatchInlineSnapshot(` + Array [ + "The default mechanism for Reporting privileges will work differently in future versions, which will affect the behavior of this cluster. Set \\"xpack.reporting.roles.enabled\\" to \\"false\\" to adopt the future behavior before upgrading.", + ] + `); + }); + it('logs a warning if roles.enabled: true is set', () => { const { messages } = applyReportingDeprecations({ roles: { enabled: true } }); expect(messages).toMatchInlineSnapshot(` @@ -45,8 +54,21 @@ describe('deprecations', () => { `); }); - it('does not log a warning if roles.enabled: false is set', () => { - const { messages } = applyReportingDeprecations({ roles: { enabled: false } }); + it('logs a warning if csv.enablePanelActionDownload: true is set', () => { + const { messages } = applyReportingDeprecations({ csv: { enablePanelActionDownload: true } }); + expect(messages).toMatchInlineSnapshot(` + Array [ + "The default mechanism for Reporting privileges will work differently in future versions, which will affect the behavior of this cluster. Set \\"xpack.reporting.roles.enabled\\" to \\"false\\" to adopt the future behavior before upgrading.", + "The \\"xpack.reporting.csv.enablePanelActionDownload\\" setting is deprecated.", + ] + `); + }); + + it('does not log a warning recommended settings are used', () => { + const { messages } = applyReportingDeprecations({ + csv: { enablePanelActionDownload: false }, + roles: { enabled: false }, + }); expect(messages).toMatchInlineSnapshot(`Array []`); }); }); diff --git a/x-pack/plugins/reporting/server/config/index.ts b/x-pack/plugins/reporting/server/config/index.ts index 4129717c6d791..a44a51d7d9ae4 100644 --- a/x-pack/plugins/reporting/server/config/index.ts +++ b/x-pack/plugins/reporting/server/config/index.ts @@ -68,11 +68,47 @@ export const config: PluginConfigDescriptor = { }, }); } + + if (reporting?.csv?.enablePanelActionDownload === true) { + addDeprecation({ + configPath: `${fromPath}.csv.enablePanelActionDownload`, + title: i18n.translate('xpack.reporting.deprecations.csvPanelActionDownload.title', { + defaultMessage: + 'The setting to enable CSV Download from saved search panels in dashboards is deprecated.', + }), + level: 'warning', + message: i18n.translate('xpack.reporting.deprecations.csvPanelActionDownload.message', { + defaultMessage: `The "{enablePanelActionDownload}" setting is deprecated.`, + values: { + enablePanelActionDownload: `${fromPath}.csv.enablePanelActionDownload`, + }, + }), + correctiveActions: { + manualSteps: [ + i18n.translate('xpack.reporting.deprecations.csvPanelActionDownload.manualStep1', { + defaultMessage: + 'Remove "{enablePanelActionDownload}" from `kibana.yml` or change the setting to `false`.', + values: { + enablePanelActionDownload: `${fromPath}.csv.enablePanelActionDownload`, + }, + }), + i18n.translate('xpack.reporting.deprecations.csvPanelActionDownload.manualStep2', { + defaultMessage: + 'Use the replacement panel action to generate CSV reports from saved search panels in the Dashboard application.', + }), + ], + }, + }); + } }, ], exposeToUsage: { capture: { maxAttempts: true }, - csv: { maxSizeBytes: true, scroll: { size: true, duration: true } }, + csv: { + enablePanelActionDownload: true, + maxSizeBytes: true, + scroll: { size: true, duration: true }, + }, kibanaServer: false, // show as [redacted] queue: { indexInterval: true, pollEnabled: true, timeout: true }, roles: { enabled: true }, From 65e53eb02bd4835c920b8084ba40259026e413ea Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 10 Sep 2024 08:15:37 -0700 Subject: [PATCH 8/8] [Screenshotting] Change diagnostic endpoint method to GET (#192232) ## Summary Closes https://github.com/elastic/kibana/issues/171698 ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../public/reporting_api_client.test.ts | 2 +- .../kbn-reporting/public/reporting_api_client.ts | 2 +- .../management/components/report_diagnostic.tsx | 2 +- .../server/routes/internal/diagnostic/browser.ts | 4 ++-- .../diagnostic/integration_tests/browser.test.ts | 12 ++++++------ 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/kbn-reporting/public/reporting_api_client.test.ts b/packages/kbn-reporting/public/reporting_api_client.test.ts index d43eea01411bb..c1da4b46ae27a 100644 --- a/packages/kbn-reporting/public/reporting_api_client.test.ts +++ b/packages/kbn-reporting/public/reporting_api_client.test.ts @@ -288,7 +288,7 @@ describe('ReportingAPIClient', () => { it('should send a post request', async () => { await apiClient.verifyBrowser(); - expect(httpClient.post).toHaveBeenCalledWith(expect.stringContaining('/diagnose/browser')); + expect(httpClient.get).toHaveBeenCalledWith(expect.stringContaining('/diagnose/browser')); }); }); diff --git a/packages/kbn-reporting/public/reporting_api_client.ts b/packages/kbn-reporting/public/reporting_api_client.ts index b1579c463f901..247fb4b67d28d 100644 --- a/packages/kbn-reporting/public/reporting_api_client.ts +++ b/packages/kbn-reporting/public/reporting_api_client.ts @@ -251,7 +251,7 @@ export class ReportingAPIClient implements IReportingAPI { public getServerBasePath = () => this.http.basePath.serverBasePath; public verifyBrowser() { - return this.http.post(INTERNAL_ROUTES.DIAGNOSE.BROWSER); + return this.http.get(INTERNAL_ROUTES.DIAGNOSE.BROWSER); } public verifyScreenCapture() { diff --git a/x-pack/plugins/reporting/public/management/components/report_diagnostic.tsx b/x-pack/plugins/reporting/public/management/components/report_diagnostic.tsx index 470fa86b2e9a6..bbaab324a3fd4 100644 --- a/x-pack/plugins/reporting/public/management/components/report_diagnostic.tsx +++ b/x-pack/plugins/reporting/public/management/components/report_diagnostic.tsx @@ -103,7 +103,7 @@ export const ReportDiagnostic = ({ apiClient, clientConfig }: Props) => { id="xpack.reporting.listing.diagnosticSuccessMessage" color="success" title={i18n.translate('xpack.reporting.listing.diagnosticSuccessMessage', { - defaultMessage: 'Everything looks good for reporting to function.', + defaultMessage: 'Everything looks good for screenshot reports to function.', })} /> ); diff --git a/x-pack/plugins/reporting/server/routes/internal/diagnostic/browser.ts b/x-pack/plugins/reporting/server/routes/internal/diagnostic/browser.ts index a4ca554b1e7db..f23a8855849af 100644 --- a/x-pack/plugins/reporting/server/routes/internal/diagnostic/browser.ts +++ b/x-pack/plugins/reporting/server/routes/internal/diagnostic/browser.ts @@ -40,10 +40,10 @@ const path = INTERNAL_ROUTES.DIAGNOSE.BROWSER; export const registerDiagnoseBrowser = (reporting: ReportingCore, logger: Logger) => { const { router } = reporting.getPluginSetupDeps(); - router.post( + router.get( { path, - validate: {}, + validate: false, options: { access: 'internal' }, }, authorizedUserPreRouting(reporting, async (_user, _context, req, res) => { diff --git a/x-pack/plugins/reporting/server/routes/internal/diagnostic/integration_tests/browser.test.ts b/x-pack/plugins/reporting/server/routes/internal/diagnostic/integration_tests/browser.test.ts index d546d3d29ed47..3f1966d2e78d8 100644 --- a/x-pack/plugins/reporting/server/routes/internal/diagnostic/integration_tests/browser.test.ts +++ b/x-pack/plugins/reporting/server/routes/internal/diagnostic/integration_tests/browser.test.ts @@ -25,7 +25,7 @@ type SetupServerReturn = Awaited>; const devtoolMessage = 'DevTools listening on (ws://localhost:4000)'; const fontNotFoundMessage = 'Could not find the default font'; -describe(`POST ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => { +describe(`GET ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => { jest.setTimeout(6000); const reportingSymbol = Symbol('reporting'); const mockLogger = loggingSystemMock.createLogger(); @@ -89,7 +89,7 @@ describe(`POST ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => { screenshotting.diagnose.mockReturnValue(Rx.of(devtoolMessage)); return supertest(httpSetup.server.listener) - .post(INTERNAL_ROUTES.DIAGNOSE.BROWSER) + .get(INTERNAL_ROUTES.DIAGNOSE.BROWSER) .expect(200) .then(({ body }) => { expect(body.success).toEqual(true); @@ -105,7 +105,7 @@ describe(`POST ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => { screenshotting.diagnose.mockReturnValue(Rx.of(logs)); return supertest(httpSetup.server.listener) - .post(INTERNAL_ROUTES.DIAGNOSE.BROWSER) + .get(INTERNAL_ROUTES.DIAGNOSE.BROWSER) .expect(200) .then(({ body }) => { expect(body).toMatchInlineSnapshot(` @@ -127,7 +127,7 @@ describe(`POST ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => { screenshotting.diagnose.mockReturnValue(Rx.of(`${devtoolMessage}\n${fontNotFoundMessage}`)); return supertest(httpSetup.server.listener) - .post(INTERNAL_ROUTES.DIAGNOSE.BROWSER) + .get(INTERNAL_ROUTES.DIAGNOSE.BROWSER) .expect(200) .then(({ body }) => { expect(body).toMatchInlineSnapshot(` @@ -151,11 +151,11 @@ describe(`POST ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => { screenshotting.diagnose.mockReturnValue(Rx.of(devtoolMessage)); - await supertest(httpSetup.server.listener).post(INTERNAL_ROUTES.DIAGNOSE.BROWSER).expect(200); + await supertest(httpSetup.server.listener).get(INTERNAL_ROUTES.DIAGNOSE.BROWSER).expect(200); expect(usageCounter.incrementCounter).toHaveBeenCalledTimes(1); expect(usageCounter.incrementCounter).toHaveBeenCalledWith({ - counterName: `post ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}:success`, + counterName: `get ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}:success`, counterType: 'reportingApi', }); });