diff --git a/.buildkite/pipeline-resource-definitions/locations.yml b/.buildkite/pipeline-resource-definitions/locations.yml index ee90785fd1e88..c306fb8fdc703 100644 --- a/.buildkite/pipeline-resource-definitions/locations.yml +++ b/.buildkite/pipeline-resource-definitions/locations.yml @@ -7,4 +7,10 @@ spec: type: url targets: - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-migration-staging.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-explore.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-serverless-release.yml diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml new file mode 100644 index 0000000000000..8d181174f0e57 --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml @@ -0,0 +1,33 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: buildkite-pipeline-kibana-serverless-security-solution-quality-gate-detection-engine + description: "[MKI] Executes Cypress tests for the Detection Engine team" +spec: + type: buildkite-pipeline + owner: 'group:security-engineering-productivity' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: "Kibana / Serverless / Security Solution Quality Gate / Detection Engine" + description: "[MKI] Executes Cypress tests for the Detection Engine team" + spec: + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_detection_engine.yml + provider_settings: + build_branches: false + build_pull_requests: false + publish_commit_status: false + skip_pull_request_builds_for_existing_commits: false + trigger_mode: none + build_tags: false + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + security-engineering-productivity: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml new file mode 100644 index 0000000000000..01e6d39be6e3e --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml @@ -0,0 +1,33 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: buildkite-pipeline-kibana-serverless-security-solution-quality-gate-entity-analytics + description: "[MKI] Executes Cypress tests for the Entity Analytics team" +spec: + type: buildkite-pipeline + owner: 'group:security-engineering-productivity' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: "Kibana / Serverless / Security Solution Quality Gate / Entity Analytics" + description: "[MKI] Executes Cypress tests for the Entity Analytics team" + spec: + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_entity_analytics.yml + provider_settings: + build_branches: false + build_pull_requests: false + publish_commit_status: false + skip_pull_request_builds_for_existing_commits: false + trigger_mode: none + build_tags: false + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + security-engineering-productivity: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-explore.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-explore.yml new file mode 100644 index 0000000000000..d6e0c5a9fb148 --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-explore.yml @@ -0,0 +1,33 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: buildkite-pipeline-kibana-serverless-security-solution-quality-gate-explore + description: "[MKI] Executes Cypress tests for the Explore team" +spec: + type: buildkite-pipeline + owner: 'group:security-engineering-productivity' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: "Kibana / Serverless / Security Solution Quality Gate / Explore" + description: "[MKI] Executes Cypress tests for the Explore team" + spec: + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_explore.yml + provider_settings: + build_branches: false + build_pull_requests: false + publish_commit_status: false + skip_pull_request_builds_for_existing_commits: false + trigger_mode: none + build_tags: false + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + security-engineering-productivity: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml new file mode 100644 index 0000000000000..3cbf7a01da698 --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml @@ -0,0 +1,33 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: buildkite-pipeline-kibana-serverless-security-solution-quality-gate-gen-ai + description: "[MKI] Executes Cypress tests for the Gen AI team" +spec: + type: buildkite-pipeline + owner: 'group:security-engineering-productivity' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: "Kibana / Serverless / Security Solution Quality Gate / Gen Ai" + description: "[MKI] Executes Cypress tests for the Gen AI team" + spec: + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_gen_ai.yml + provider_settings: + build_branches: false + build_pull_requests: false + publish_commit_status: false + skip_pull_request_builds_for_existing_commits: false + trigger_mode: none + build_tags: false + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + security-engineering-productivity: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml new file mode 100644 index 0000000000000..16d07e86d2ef1 --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml @@ -0,0 +1,33 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: buildkite-pipeline-kibana-serverless-security-solution-quality-gate-investigations + description: "[MKI] Executes Cypress tests for the Investigations team" +spec: + type: buildkite-pipeline + owner: 'group:security-engineering-productivity' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: "Kibana / Serverless / Security Solution Quality Gate / Investigations" + description: "[MKI] Executes Cypress tests for the Investigations team" + spec: + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_investigations.yml + provider_settings: + build_branches: false + build_pull_requests: false + publish_commit_status: false + skip_pull_request_builds_for_existing_commits: false + trigger_mode: none + build_tags: false + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + security-engineering-productivity: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml new file mode 100644 index 0000000000000..0dcd14a27b659 --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml @@ -0,0 +1,33 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: buildkite-pipeline-kibana-serverless-security-solution-quality-gate-rule-management + description: "[MKI] Executes Cypress tests for the Rule Management team" +spec: + type: buildkite-pipeline + owner: 'group:security-engineering-productivity' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: "Kibana / Serverless / Security Solution Quality Gate / Rule Management" + description: "[MKI] Executes Cypress tests for the Rule Management team" + spec: + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_rule_management.yml + provider_settings: + build_branches: false + build_pull_requests: false + publish_commit_status: false + skip_pull_request_builds_for_existing_commits: false + trigger_mode: none + build_tags: false + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + security-engineering-productivity: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ diff --git a/.buildkite/pipelines/security_solution/security_solution_cypress.yml b/.buildkite/pipelines/security_solution/security_solution_cypress.yml deleted file mode 100644 index 4d27fd954c110..0000000000000 --- a/.buildkite/pipelines/security_solution/security_solution_cypress.yml +++ /dev/null @@ -1,123 +0,0 @@ -steps: - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/create_periodic_test_docker_image.sh - label: Build kibana image - key: build_image - agents: - queue: n2-16-spot - timeout_in_minutes: 60 - retry: - automatic: - - exit_status: "-1" - limit: 3 - - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh - label: "Upload runtime info" - key: upload_runtime_info - depends_on: build_image - agents: - queue: n2-4-spot - timeout_in_minutes: 300 - retry: - automatic: - - exit_status: "*" - limit: 1 - - - group: "Execute Tests" - depends_on: build_image - key: test_execution - steps: - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:explore - label: 'Serverless MKI QA Explore - Security Solution Cypress Tests' - agents: - queue: n2-4-spot - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 4 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:investigations - label: 'Serverless MKI QA Investigations - Security Solution Cypress Tests' - agents: - queue: n2-4-spot - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 8 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management - label: 'Serverless MKI QA Rule Management - Security Solution Cypress Tests' - agents: - queue: n2-4-spot - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 8 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management:prebuilt_rules - label: 'Serverless MKI QA Rule Management - Prebuilt Rules - Security Solution Cypress Tests' - agents: - queue: n2-4-spot - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 4 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine - label: 'Serverless MKI QA Detection Engine - Security Solution Cypress Tests' - agents: - queue: n2-4-spot - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 8 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine:exceptions - label: 'Serverless MKI QA Detection Engine - Exceptions - Security Solution Cypress Tests' - agents: - queue: n2-4-spot - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 6 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:ai_assistant - label: 'Serverless MKI QA AI Assistant - Security Solution Cypress Tests' - agents: - queue: n2-4-spot - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 1 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:entity_analytics - label: 'Serverless MKI QA Entity Analytics - Security Solution Cypress Tests' - agents: - queue: n2-4-spot - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 2 - retry: - automatic: - - exit_status: '*' - limit: 1 \ No newline at end of file diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_detection_engine.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_detection_engine.yml new file mode 100644 index 0000000000000..a138c15ad6986 --- /dev/null +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_detection_engine.yml @@ -0,0 +1,71 @@ +steps: + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/create_periodic_test_docker_image.sh + label: Build kibana image + key: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-16 + preemptible: true + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: "-1" + limit: 3 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh + label: "Upload runtime info" + key: upload_runtime_info + depends_on: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 300 + retry: + automatic: + - exit_status: "*" + limit: 1 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine + label: 'Serverless MKI QA Detection Engine - Security Solution Cypress Tests' + key: test_detection_engine + depends_on: build_image + env: + BK_TEST_SUITE_KEY: "serverless-cypress-detection-engine" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 8 + retry: + automatic: + - exit_status: '*' + limit: 1 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine:exceptions + label: 'Serverless MKI QA Detection Engine - Exceptions - Security Solution Cypress Tests' + key: test_detection_engine_exceptions + depends_on: build_image + env: + BK_TEST_SUITE_KEY: "serverless-cypress-detection-engine" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 6 + retry: + automatic: + - exit_status: '*' + limit: 1 \ No newline at end of file diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_entity_analytics.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_entity_analytics.yml new file mode 100644 index 0000000000000..9614f4e877f2d --- /dev/null +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_entity_analytics.yml @@ -0,0 +1,51 @@ +steps: + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/create_periodic_test_docker_image.sh + label: Build kibana image + key: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-16 + preemptible: true + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: "-1" + limit: 3 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh + label: "Upload runtime info" + key: upload_runtime_info + depends_on: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 300 + retry: + automatic: + - exit_status: "*" + limit: 1 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:entity_analytics + label: 'Serverless MKI QA Entity Analytics - Security Solution Cypress Tests' + depends_on: build_image + key: test_entity_analytics + env: + BK_TEST_SUITE_KEY: "serverless-cypress-entity-analytics" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 2 + retry: + automatic: + - exit_status: '*' + limit: 1 \ No newline at end of file diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_explore.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_explore.yml new file mode 100644 index 0000000000000..c1b0f849d9036 --- /dev/null +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_explore.yml @@ -0,0 +1,51 @@ +steps: + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/create_periodic_test_docker_image.sh + label: Build kibana image + key: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-16 + preemptible: true + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: "-1" + limit: 3 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh + label: "Upload runtime info" + key: upload_runtime_info + depends_on: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 300 + retry: + automatic: + - exit_status: "*" + limit: 1 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:explore + depends_on: build_image + key: test_explore + label: 'Serverless MKI QA Explore - Security Solution Cypress Tests' + env: + BK_TEST_SUITE_KEY: "serverless-cypress-explore" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 4 + retry: + automatic: + - exit_status: '*' + limit: 1 diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_gen_ai.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_gen_ai.yml new file mode 100644 index 0000000000000..ee0fef579f1c6 --- /dev/null +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_gen_ai.yml @@ -0,0 +1,51 @@ +steps: + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/create_periodic_test_docker_image.sh + label: Build kibana image + key: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-16 + preemptible: true + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: "-1" + limit: 3 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh + label: "Upload runtime info" + key: upload_runtime_info + depends_on: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 300 + retry: + automatic: + - exit_status: "*" + limit: 1 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:ai_assistant + label: 'Serverless MKI QA AI Assistant - Security Solution Cypress Tests' + depends_on: build_image + key: test_ai_assistant + env: + BK_TEST_SUITE_KEY: "serverless-cypress-gen-ai" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 1 + retry: + automatic: + - exit_status: '*' + limit: 1 \ No newline at end of file diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_investigations.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_investigations.yml new file mode 100644 index 0000000000000..8a5349fea578b --- /dev/null +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_investigations.yml @@ -0,0 +1,51 @@ +steps: + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/create_periodic_test_docker_image.sh + label: Build kibana image + key: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-16 + preemptible: true + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: "-1" + limit: 3 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh + label: "Upload runtime info" + key: upload_runtime_info + depends_on: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 300 + retry: + automatic: + - exit_status: "*" + limit: 1 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:investigations + depends_on: build_image + key: test_investigations + label: 'Serverless MKI QA Investigations - Security Solution Cypress Tests' + env: + BK_TEST_SUITE_KEY: "serverless-cypress-investigations" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 8 + retry: + automatic: + - exit_status: '*' + limit: 1 \ No newline at end of file diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_rule_management.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_rule_management.yml new file mode 100644 index 0000000000000..1cff6dfe25767 --- /dev/null +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_rule_management.yml @@ -0,0 +1,71 @@ +steps: + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/create_periodic_test_docker_image.sh + label: Build kibana image + key: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-16 + preemptible: true + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: "-1" + limit: 3 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh + label: "Upload runtime info" + key: upload_runtime_info + depends_on: build_image + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 300 + retry: + automatic: + - exit_status: "*" + limit: 1 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management + label: 'Serverless MKI QA Rule Management - Security Solution Cypress Tests' + depends_on: build_image + key: test_rule_management + env: + BK_TEST_SUITE_KEY: "serverless-cypress-rule-management" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 8 + retry: + automatic: + - exit_status: '*' + limit: 1 + + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management:prebuilt_rules + label: 'Serverless MKI QA Rule Management - Prebuilt Rules - Security Solution Cypress Tests' + depends_on: build_image + key: test_rule_management_prebuilt_rules + env: + BK_TEST_SUITE_KEY: "serverless-cypress-rule-management" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 4 + retry: + automatic: + - exit_status: '*' + limit: 1 \ No newline at end of file diff --git a/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh b/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh index 8cce28a1401df..cf0dc230b0f40 100755 --- a/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh +++ b/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh @@ -30,6 +30,6 @@ fi QA_API_KEY=$(vault_get security-solution-quality-gate qa_api_key) QA_CONSOLE_URL=$(vault_get security-solution-quality-gate qa_console_url) -BK_ANALYTICS_API_KEY=$(vault_get security-solution-quality-gate serverless-sec-sol-cypress-bk-api-key) +BK_ANALYTICS_API_KEY=$(vault_get security-solution-quality-gate $BK_TEST_SUITE_KEY) QA_CONSOLE_URL=$QA_CONSOLE_URL KIBANA_MKI_USE_LATEST_COMMIT=$KIBANA_OVERRIDE_FLAG BK_ANALYTICS_API_KEY=$BK_ANALYTICS_API_KEY CLOUD_QA_API_KEY=$QA_API_KEY yarn $1; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/pipeline.sh b/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/pipeline.sh deleted file mode 100755 index b3d93e083fa41..0000000000000 --- a/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/pipeline.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -ts-node .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/pipeline.ts diff --git a/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/pipeline.ts b/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/pipeline.ts deleted file mode 100644 index fb9ec67fba888..0000000000000 --- a/.buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/pipeline.ts +++ /dev/null @@ -1,40 +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 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 or the Server - * Side Public License, v 1. - */ - -import { execSync } from 'child_process'; -import fs from 'fs'; - -const getPipeline = (filename: string, removeSteps = true) => { - const str = fs.readFileSync(filename).toString(); - return removeSteps ? str.replace(/^steps:/, '') : str; -}; - -const uploadPipeline = (pipelineContent: string | object) => { - const str = - typeof pipelineContent === 'string' ? pipelineContent : JSON.stringify(pipelineContent); - - execSync('buildkite-agent pipeline upload', { - input: str, - stdio: ['pipe', 'inherit', 'inherit'], - }); -}; - -(async () => { - try { - const pipeline = []; - - pipeline.push( - getPipeline('.buildkite/pipelines/security_solution/security_solution_cypress.yml', false) - ); - // remove duplicated steps - uploadPipeline([...new Set(pipeline)].join('\n')); - } catch (ex) { - console.error('PR pipeline generation error', ex.message); - process.exit(1); - } -})(); diff --git a/.buildkite/scripts/steps/esql_grammar_sync.sh b/.buildkite/scripts/steps/esql_grammar_sync.sh index 2b9bbe2e810ad..33091b7524387 100755 --- a/.buildkite/scripts/steps/esql_grammar_sync.sh +++ b/.buildkite/scripts/steps/esql_grammar_sync.sh @@ -4,7 +4,7 @@ set -euo pipefail synchronize_lexer_grammar () { license_header="$1" source_file="$PARENT_DIR/elasticsearch/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4" - destination_file="./packages/kbn-monaco/src/esql/antlr/esql_lexer.g4" + destination_file="./packages/kbn-esql-ast/src/antlr/esql_lexer.g4" # Copy the file cp "$source_file" "$destination_file" @@ -27,7 +27,7 @@ synchronize_lexer_grammar () { synchronize_parser_grammar () { license_header="$1" source_file="$PARENT_DIR/elasticsearch/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4" - destination_file="./packages/kbn-monaco/src/esql/antlr/esql_parser.g4" + destination_file="./packages/kbn-esql-ast/src/antlr/esql_parser.g4" # Copy the file cp "$source_file" "$destination_file" @@ -105,7 +105,7 @@ main () { .buildkite/scripts/bootstrap.sh # Build ANTLR stuff - cd ./packages/kbn-monaco/src + cd ./packages/kbn-esql-ast/src yarn build:antlr4:esql # Make a commit diff --git a/.eslintignore b/.eslintignore index 296d712a4cdfe..cb4ee2668b226 100644 --- a/.eslintignore +++ b/.eslintignore @@ -39,6 +39,7 @@ snapshots.js /packages/kbn-ui-framework/dist /packages/kbn-flot-charts/lib /packages/kbn-monaco/src/**/antlr +/packages/kbn-esql-ast/src/**/antlr # Bazel /bazel-* diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a4ef92d1ad935..70491a87341e7 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -393,7 +393,10 @@ packages/kbn-eslint-plugin-imports @elastic/kibana-operations packages/kbn-eslint-plugin-telemetry @elastic/obs-knowledge-team examples/eso_model_version_example @elastic/kibana-security x-pack/test/encrypted_saved_objects_api_integration/plugins/api_consumer_plugin @elastic/kibana-security -packages/kbn-esql-utils @elastic/kibana-visualizations +packages/kbn-esql-ast @elastic/kibana-esql +packages/kbn-esql-utils @elastic/kibana-esql +packages/kbn-esql-validation-autocomplete @elastic/kibana-esql +examples/esql_validation_example @elastic/kibana-esql packages/kbn-event-annotation-common @elastic/kibana-visualizations packages/kbn-event-annotation-components @elastic/kibana-visualizations src/plugins/event_annotation_listing @elastic/kibana-visualizations @@ -497,7 +500,7 @@ src/plugins/kibana_react @elastic/appex-sharedux src/plugins/kibana_usage_collection @elastic/kibana-core src/plugins/kibana_utils @elastic/appex-sharedux x-pack/plugins/kubernetes_security @elastic/kibana-cloud-security-posture -packages/kbn-language-documentation-popover @elastic/kibana-visualizations +packages/kbn-language-documentation-popover @elastic/kibana-esql x-pack/examples/lens_config_builder_example @elastic/kibana-visualizations packages/kbn-lens-embeddable-utils @elastic/obs-ux-infra_services-team @elastic/kibana-visualizations packages/kbn-lens-formula-docs @elastic/kibana-visualizations @@ -825,8 +828,8 @@ x-pack/test/licensing_plugin/plugins/test_feature_usage @elastic/kibana-security packages/kbn-test-jest-helpers @elastic/kibana-operations @elastic/appex-qa packages/kbn-test-subj-selector @elastic/kibana-operations @elastic/appex-qa x-pack/examples/testing_embedded_lens @elastic/kibana-visualizations -packages/kbn-text-based-editor @elastic/kibana-visualizations -src/plugins/text_based_languages @elastic/kibana-visualizations +packages/kbn-text-based-editor @elastic/kibana-esql +src/plugins/text_based_languages @elastic/kibana-esql x-pack/examples/third_party_lens_navigation_prompt @elastic/kibana-visualizations x-pack/examples/third_party_vis_lens_example @elastic/kibana-visualizations x-pack/plugins/threat_intelligence @elastic/security-threat-hunting-investigations @@ -966,7 +969,7 @@ packages/kbn-zod-helpers @elastic/security-detection-rule-management /test/api_integration/apis/event_annotations @elastic/kibana-visualizations /x-pack/test_serverless/functional/test_suites/common/visualizations/ @elastic/kibana-visualizations /x-pack/test_serverless/functional/fixtures/kbn_archiver/lens/ @elastic/kibana-visualizations -packages/kbn-monaco/src/esql @elastic/kibana-visualizations +packages/kbn-monaco/src/esql @elastic/kibana-esql # Global Experience @@ -1176,8 +1179,8 @@ x-pack/plugins/observability_solution/infra/server/lib/alerting @elastic/obs-ux- /.bazelversion @elastic/kibana-operations /WORKSPACE.bazel @elastic/kibana-operations /.buildkite/ @elastic/kibana-operations -/.buildkite/scripts/steps/esql_grammar_sync.sh @elastic/kibana-visualizations -/.buildkite/pipelines/esql_grammar_sync.yml @elastic/kibana-visualizations +/.buildkite/scripts/steps/esql_grammar_sync.sh @elastic/kibana-esql +/.buildkite/pipelines/esql_grammar_sync.yml @elastic/kibana-esql /kbn_pm/ @elastic/kibana-operations /x-pack/dev-tools @elastic/kibana-operations /catalog-info.yaml @elastic/kibana-operations @elastic/kibana-tech-leads diff --git a/.github/workflows/label-failed-test.yml b/.github/workflows/label-failed-test.yml index 3d1a26844162b..79ad5673f38af 100644 --- a/.github/workflows/label-failed-test.yml +++ b/.github/workflows/label-failed-test.yml @@ -23,6 +23,7 @@ jobs: working-directory: ./kibana-operations/triage env: GITHUB_TOKEN: ${{secrets.KIBANAMACHINE_TOKEN}} + SLACK_TOKEN: ${{secrets.SLACK_TOKEN_FAILED_TEST_NOTIFIER}} run: | npm install node failed-test-label ${{github.event.issue.number}} || true diff --git a/.github/workflows/skip-failed-test.yml b/.github/workflows/skip-failed-test.yml index 3670157aebae9..5950ed7e74c54 100644 --- a/.github/workflows/skip-failed-test.yml +++ b/.github/workflows/skip-failed-test.yml @@ -41,6 +41,7 @@ jobs: working-directory: ./kibana-operations/triage env: GITHUB_TOKEN: ${{secrets.KIBANAMACHINE_TOKEN}} + SLACK_TOKEN: ${{secrets.SLACK_TOKEN_FAILED_TEST_NOTIFIER}} run: | npm install node failed-test-auto ${{github.event.issue.number}} diff --git a/.i18nrc.json b/.i18nrc.json index d28a3584e0069..0c71b510223ad 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -81,6 +81,7 @@ "interpreter": "src/legacy/core_plugins/interpreter", "imageEmbeddable": "src/plugins/image_embeddable", "kbn": "src/legacy/core_plugins/kibana", + "kbn-esql-validation-autocomplete": "packages/kbn-esql-validation-autocomplete/src", "kbnConfig": "packages/kbn-config/src", "kbnDocViews": "src/legacy/core_plugins/kbn_doc_views", "kibana_react": "src/legacy/core_plugins/kibana_react", diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 164bacdc48c5b..e5c74279d563e 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 02765a9901731..8dc14f95096c1 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 4419100768f07..09d52e25be0b6 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 3d561b10ac09f..a2f87f0442287 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 9e8d2085e3093..2d07cb3143930 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -3539,22 +3539,10 @@ "plugin": "ruleRegistry", "path": "x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts" }, - { - "plugin": "observability", - "path": "x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts" - }, - { - "plugin": "observability", - "path": "x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts" }, - { - "plugin": "slo", - "path": "x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.ts" - }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.ts" diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 289ce3eb30df8..5a4f74751d32c 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 6f2eb214fea64..0a0636a851f7c 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 5b58c21763082..38feaa6de6184 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index e40ead74001dc..970e5f5086564 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 6150b93f18bec..58bacc1852fa8 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 232d68508c782..5560545b7a7a5 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 18fc64d3bfeb0..feb2e7afbc047 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 43f778384c930..de367ce8c5fe3 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.devdocs.json b/api_docs/charts.devdocs.json index d4c7d4e5e0ce3..220c4efcc4680 100644 --- a/api_docs/charts.devdocs.json +++ b/api_docs/charts.devdocs.json @@ -3401,11 +3401,11 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; } | undefined; }" ], diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 1a24f2ed6efd9..9ed9ce9470c18 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 9f950a9b0c694..41e7e278aecf1 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 3f3e34ac49f62..2551f6ebca39c 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 721346ab07e30..d1731971ac1b1 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 66d1bdf05dd7b..0e1088340edac 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index dffe069e9159b..566e5311780c7 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index f15b3f9fd522b..67190926b9ffd 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index b10174fcd1635..46a930cf0c0e7 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index facbf0ca8a2b1..36584095cf5d3 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 6ed1e1c43dbce..f744000e9a1b3 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 09c8fd286e684..b1f2c51cccb67 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index bb12c874c4897..c68265a5fdfa7 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 3f5cfd7695420..01fe3c7949865 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index f14a614c8da57..3e9cd13ab2d36 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index fccd5a61b6986..5bb2e33074343 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 821e4860ede1b..890c65cd1e8e4 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index a2f1532f2678f..154a7a22a814e 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 316f2d0127336..48badad86efb5 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 10e6aad1b3953..3555976fce18a 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 4cc5d8b93bf1b..91dd3677bf0aa 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index bcdae19ead162..173118ddb961f 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index a171d9466a7ca..cb1d734081ac6 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -30,7 +30,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | triggersActionsUi | - | | | inspector, data, savedObjects, console, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, visualizations, dashboard, licensing, savedObjectsTagging, dataViewFieldEditor, lens, security, triggersActionsUi, cases, observabilityShared, banners, maps, @kbn/reporting-public, reporting, timelines, fleet, telemetry, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, exploratoryView, monitoring, securitySolution, cloudLinks, synthetics, uptime, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | | | @kbn/core, visualizations, triggersActionsUi | - | -| | ruleRegistry, observability, securitySolution, slo, synthetics, uptime | - | +| | ruleRegistry, securitySolution, synthetics, uptime, slo | - | | | alerting, discover, securitySolution | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | @@ -182,6 +182,8 @@ Safe to remove. | | data | | | data | | | embeddableEnhanced | +| | expressionGauge | +| | expressionGauge | | | expressions | | | expressions | | | expressions | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index e9693182b4c04..d16fd92ff5d0e 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1204,14 +1204,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## observability - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [custom_threshold_executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts#:~:text=alertFactory), [custom_threshold_executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts#:~:text=alertFactory) | - | - - - ## observabilityOnboarding | Deprecated API | Reference location(s) | Remove By | @@ -1496,7 +1488,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.ts#:~:text=alertFactory), [executor.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.test.ts#:~:text=alertFactory) | - | +| | [executor.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.test.ts#:~:text=alertFactory) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/slo/public/plugin.ts#:~:text=license%24) | 8.8.0 | | | [slo.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/slo/server/saved_objects/slo.ts#:~:text=migrations) | - | @@ -1665,7 +1657,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [to_ast.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/gauge/public/to_ast.ts#:~:text=percentageMode) | - | +| | [to_ast.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/gauge/public/to_ast.ts#:~:text=percentageMode), [to_ast.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/gauge/public/to_ast.ts#:~:text=percentageMode) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 154f96018cfcd..724ea49e81e53 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 1f70e25860722..99ed16b8219e7 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 8c83a37615729..d59fbd64b2805 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 80d1d2fe4ce4a..1c7bc29a7f4c6 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index ff74c0d269504..ed7e9591567d1 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index b5b5ae2a0f09f..98a70da7111ba 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index cbbc7e2e1a7a1..0e1bf12d94027 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -8937,7 +8937,7 @@ "section": "def-public.DefaultEmbeddableApi", "text": "DefaultEmbeddableApi" }, - ">({ maybeId, type, state, parentApi, onApiAvailable, }: { maybeId?: string | undefined; type: string; state: ", + ">({ maybeId, type, state, parentApi, onApiAvailable, panelProps, }: { maybeId?: string | undefined; type: string; state: ", { "pluginId": "@kbn/presentation-containers", "scope": "common", @@ -8953,7 +8953,15 @@ "section": "def-common.PresentationContainer", "text": "PresentationContainer" }, - " | undefined; onApiAvailable?: ((api: ApiType) => void) | undefined; }) => JSX.Element" + " | undefined; onApiAvailable?: ((api: ApiType) => void) | undefined; panelProps?: Pick<", + { + "pluginId": "presentationPanel", + "scope": "public", + "docId": "kibPresentationPanelPluginApi", + "section": "def-public.PresentationPanelProps", + "text": "PresentationPanelProps" + }, + ", \"showShadow\" | \"showBorder\" | \"showBadges\" | \"showNotifications\" | \"hideHeader\" | \"hideInspector\"> | undefined; }) => JSX.Element" ], "path": "src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx", "deprecated": false, @@ -8964,7 +8972,7 @@ "id": "def-public.ReactEmbeddableRenderer.$1", "type": "Object", "tags": [], - "label": "{\n maybeId,\n type,\n state,\n parentApi,\n onApiAvailable,\n}", + "label": "{\n maybeId,\n type,\n state,\n parentApi,\n onApiAvailable,\n panelProps,\n}", "description": [], "path": "src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx", "deprecated": false, @@ -9068,6 +9076,28 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "embeddable", + "id": "def-public.ReactEmbeddableRenderer.$1.panelProps", + "type": "Object", + "tags": [], + "label": "panelProps", + "description": [], + "signature": [ + "Pick<", + { + "pluginId": "presentationPanel", + "scope": "public", + "docId": "kibPresentationPanelPluginApi", + "section": "def-public.PresentationPanelProps", + "text": "PresentationPanelProps" + }, + ", \"showShadow\" | \"showBorder\" | \"showBadges\" | \"showNotifications\" | \"hideHeader\" | \"hideInspector\"> | undefined" + ], + "path": "src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx", + "deprecated": false, + "trackAdoption": false } ] } diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 8d2d02870e3f8..cee7fe6068231 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 556 | 1 | 451 | 10 | +| 557 | 1 | 452 | 10 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index c70a9789442be..e94fa5aff4624 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 30d9e2b601692..60c5c4ca647a8 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index e0ab7b4adf9d4..e08c9fc16de61 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 4a517898ea054..364a75029698d 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index b4e962640ec80..33a83df4e57f4 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 5a8748a48d54b..2cf0bc1a74dc7 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index bc7e37c4e3b8b..ebfae0c9895f6 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index b1c2999766382..adc13e925f3d8 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index babd1ec174e56..313ff37494a39 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.devdocs.json b/api_docs/expression_gauge.devdocs.json index c730e7b812f98..1826fe01494c5 100644 --- a/api_docs/expression_gauge.devdocs.json +++ b/api_docs/expression_gauge.devdocs.json @@ -549,15 +549,7 @@ "section": "def-common.GaugeState", "text": "GaugeState" }, - " & { shape: ", - { - "pluginId": "expressionGauge", - "scope": "common", - "docId": "kibExpressionGaugePluginApi", - "section": "def-common.GaugeShape", - "text": "GaugeShape" - }, - "; colorMode: ", + " & { colorMode: ", "GaugeColorMode", "; palette?: ", { @@ -750,35 +742,6 @@ "deprecated": false, "trackAdoption": false }, - { - "parentPluginId": "expressionGauge", - "id": "def-common.GaugeState.centralMajorMode", - "type": "CompoundType", - "tags": [], - "label": "centralMajorMode", - "description": [], - "signature": [ - "GaugeCentralMajorMode", - " | undefined" - ], - "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "expressionGauge", - "id": "def-common.GaugeState.centralMajor", - "type": "string", - "tags": [], - "label": "centralMajor", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "expressionGauge", "id": "def-common.GaugeState.colorMode", @@ -831,34 +794,12 @@ "label": "shape", "description": [], "signature": [ - "\"arc\" | \"circle\" | \"horizontalBullet\" | \"verticalBullet\"" + "\"arc\" | \"circle\" | \"horizontalBullet\" | \"verticalBullet\" | \"semiCircle\"" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false, "trackAdoption": false }, - { - "parentPluginId": "expressionGauge", - "id": "def-common.GaugeState.percentageMode", - "type": "CompoundType", - "tags": [ - "deprecated" - ], - "label": "percentageMode", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", - "deprecated": true, - "trackAdoption": false, - "references": [ - { - "plugin": "visTypeGauge", - "path": "src/plugins/vis_types/gauge/public/to_ast.ts" - } - ] - }, { "parentPluginId": "expressionGauge", "id": "def-common.GaugeState.respectRanges", @@ -886,6 +827,69 @@ "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "expressionGauge", + "id": "def-common.GaugeState.centralMajorMode", + "type": "CompoundType", + "tags": [ + "deprecated" + ], + "label": "centralMajorMode", + "description": [], + "signature": [ + "GaugeCentralMajorMode", + " | undefined" + ], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": true, + "trackAdoption": false, + "references": [] + }, + { + "parentPluginId": "expressionGauge", + "id": "def-common.GaugeState.centralMajor", + "type": "string", + "tags": [ + "deprecated" + ], + "label": "centralMajor", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": true, + "trackAdoption": false, + "references": [] + }, + { + "parentPluginId": "expressionGauge", + "id": "def-common.GaugeState.percentageMode", + "type": "CompoundType", + "tags": [ + "deprecated" + ], + "label": "percentageMode", + "description": [ + "\nThis field is deprecated and will be removed in a future release" + ], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "visTypeGauge", + "path": "src/plugins/vis_types/gauge/public/to_ast.ts" + }, + { + "plugin": "visTypeGauge", + "path": "src/plugins/vis_types/gauge/public/to_ast.ts" + } + ] } ], "initialIsOpen": false @@ -1036,15 +1040,7 @@ "section": "def-common.GaugeState", "text": "GaugeState" }, - " & { shape: ", - { - "pluginId": "expressionGauge", - "scope": "common", - "docId": "kibExpressionGaugePluginApi", - "section": "def-common.GaugeShape", - "text": "GaugeShape" - }, - "; colorMode: ", + " & { colorMode: ", "GaugeColorMode", "; palette?: ", { @@ -1251,11 +1247,11 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined; setChartSize: (d: ", { @@ -1280,7 +1276,7 @@ "label": "GaugeShape", "description": [], "signature": [ - "\"arc\" | \"circle\" | \"horizontalBullet\" | \"verticalBullet\"" + "\"arc\" | \"circle\" | \"horizontalBullet\" | \"verticalBullet\" | \"semiCircle\"" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false, @@ -1372,7 +1368,7 @@ "label": "GaugeShapes", "description": [], "signature": [ - "{ readonly HORIZONTAL_BULLET: \"horizontalBullet\"; readonly VERTICAL_BULLET: \"verticalBullet\"; readonly ARC: \"arc\"; readonly CIRCLE: \"circle\"; }" + "{ readonly HORIZONTAL_BULLET: \"horizontalBullet\"; readonly VERTICAL_BULLET: \"verticalBullet\"; readonly SEMI_CIRCLE: \"semiCircle\"; readonly ARC: \"arc\"; readonly CIRCLE: \"circle\"; }" ], "path": "src/plugins/chart_expressions/expression_gauge/common/constants.ts", "deprecated": false, diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index ba1db0673263f..ae19d21ea1416 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 59 | 0 | 59 | 2 | +| 59 | 0 | 58 | 2 | ## Client diff --git a/api_docs/expression_heatmap.devdocs.json b/api_docs/expression_heatmap.devdocs.json index 949af2f84bffd..53e77c550dcdf 100644 --- a/api_docs/expression_heatmap.devdocs.json +++ b/api_docs/expression_heatmap.devdocs.json @@ -521,11 +521,11 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" ], diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index c7f160a06aa38..3ec9314ccc55e 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index b4a53e5ba8ddc..a9994100a1401 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 14d09956b6d76..ca00368fec2ce 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 1433e6a9d3424..4910c457f7e96 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.devdocs.json b/api_docs/expression_metric_vis.devdocs.json index 74c0ab8ff17b4..04d285aba5fc0 100644 --- a/api_docs/expression_metric_vis.devdocs.json +++ b/api_docs/expression_metric_vis.devdocs.json @@ -898,11 +898,11 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" ], diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 21c451bd5cc6b..fca7a4ad6d8e1 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index af1e58cf126e7..d01b888fb500f 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 222893c30655f..12f8975d4a16b 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 9dbe42942b3c4..b867f9af35db4 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 19e1748672bf8..629fd81ad81bb 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 426177774cb5f..7819ca3fb951a 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.devdocs.json b/api_docs/expression_x_y.devdocs.json index ad075c5f0e7e0..a077d8d2b545e 100644 --- a/api_docs/expression_x_y.devdocs.json +++ b/api_docs/expression_x_y.devdocs.json @@ -1972,11 +1972,11 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" ], diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index c10ef1d62948e..78267a8d1588e 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index db886f366d3ec..8c5aa5933a5d6 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 8503b3aad67ae..23bd83b6d3ca4 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index d2bb626e69ebf..d11f1d00cb197 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 139a114b0d5c4..a3a5736ee85b9 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 9f2e63b7e87c4..8c1ebc47ca586 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 7da46e62bcacf..c0ad93e774622 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index ceef0a7ebe292..4c28d8a372227 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 143330d37910e..a16cbd2399a48 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 9be08bf7b3726..598009b07f225 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 89b557bc4b56b..e0e9a8ae5d9b2 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 157835f71eda5..aa4c81c88cd3c 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 95c748e658b59..bad62f11cfa6f 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 3c21c130fca7f..bbd5ff77c53ce 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index f75bdbe516dbb..973087cb88e4c 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 11dd04dc2b45e..6ac48664fd72c 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 7bef4ba2f7d11..06d3a0faae4d9 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index f293239722160..c22f2dcd794f0 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 6dcdc1200765a..d12a3bc148715 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 86a70fafec7fa..c1f937eca5904 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index cf5b0ce37017a..4c7b4e5b621f5 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 5850c391496ee..0687326ad04bd 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index d1c1a0d528183..67046a281de45 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index c5a1bdb9dda20..f9e4f09dc4dd9 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 9d06bba72bb96..6e81f4ec8fea2 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 9ce411ff4d887..a1ee989aa23eb 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index a11f4cb0c16a6..784814623d2b2 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index aa4aeb5fd2247..f497985ba6776 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index dd306cf03b694..061988c2e9cb7 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index bcaa7d3113216..5d068972bd9f1 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index ee2eecd71770a..bc693be2bb35b 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index f09167db3ccce..4a7bb61f03058 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index bff24c907bf7f..1a20507c519a2 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 27b2e7070504b..6acc70cfa9209 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 96d16ac7b6060..c32aad7dac5e3 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 481c7269c4e25..7cf9df5ea1666 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 515137171e58c..16f5be9e6b9d9 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 3d95c93ddfe20..0b7391727402a 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 45e6316a51bed..5ce7e47905a40 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 8314e53f416fb..d3d83a142c311 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index dedc33879b3be..7988d7335ebd9 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 5a2996e3168a2..92c7a008dd973 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index fcac785dc8991..4312d4e1450a8 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 7c1260c5bbc99..9edfd40245b17 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index a9168e9144bdc..780879bc557b0 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.devdocs.json b/api_docs/kbn_chart_icons.devdocs.json index e6af0161a3596..193e1ad9b262d 100644 --- a/api_docs/kbn_chart_icons.devdocs.json +++ b/api_docs/kbn_chart_icons.devdocs.json @@ -839,6 +839,117 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/chart-icons", + "id": "def-common.IconChartGaugeArc", + "type": "Function", + "tags": [], + "label": "IconChartGaugeArc", + "description": [], + "signature": [ + "({ title, titleId, ...props }: Omit<", + "EuiIconProps", + ", \"type\">) => JSX.Element" + ], + "path": "packages/kbn-chart-icons/src/assets/chart_gauge_arc.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/chart-icons", + "id": "def-common.IconChartGaugeArc.$1", + "type": "Object", + "tags": [], + "label": "{ title, titleId, ...props }", + "description": [], + "signature": [ + "Omit<", + "EuiIconProps", + ", \"type\">" + ], + "path": "packages/kbn-chart-icons/src/assets/chart_gauge_arc.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/chart-icons", + "id": "def-common.IconChartGaugeCircle", + "type": "Function", + "tags": [], + "label": "IconChartGaugeCircle", + "description": [], + "signature": [ + "({ title, titleId, ...props }: Omit<", + "EuiIconProps", + ", \"type\">) => JSX.Element" + ], + "path": "packages/kbn-chart-icons/src/assets/chart_gauge_circle.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/chart-icons", + "id": "def-common.IconChartGaugeCircle.$1", + "type": "Object", + "tags": [], + "label": "{ title, titleId, ...props }", + "description": [], + "signature": [ + "Omit<", + "EuiIconProps", + ", \"type\">" + ], + "path": "packages/kbn-chart-icons/src/assets/chart_gauge_circle.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/chart-icons", + "id": "def-common.IconChartGaugeSemiCircle", + "type": "Function", + "tags": [], + "label": "IconChartGaugeSemiCircle", + "description": [], + "signature": [ + "({ title, titleId, ...props }: Omit<", + "EuiIconProps", + ", \"type\">) => JSX.Element" + ], + "path": "packages/kbn-chart-icons/src/assets/chart_gauge_semi_circle.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/chart-icons", + "id": "def-common.IconChartGaugeSemiCircle.$1", + "type": "Object", + "tags": [], + "label": "{\n title,\n titleId,\n ...props\n}", + "description": [], + "signature": [ + "Omit<", + "EuiIconProps", + ", \"type\">" + ], + "path": "packages/kbn-chart-icons/src/assets/chart_gauge_semi_circle.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/chart-icons", "id": "def-common.IconChartHeatmap", diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index b5d04c52a168b..5ac8d4d2ffcda 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 78 | 0 | 78 | 0 | +| 84 | 0 | 84 | 0 | ## Common diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index f13e59431bdc4..f57826601da89 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 43f4bf96dda45..314c84039b69a 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 062106ed2940a..1e581e00090be 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index b8ef2d5070e34..557ac9029d3bc 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index b082df6d4b848..8f372aa92c398 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 98d018fc32fa5..00608e4fa664c 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 1cfdae5e3c21a..6601e0e93979c 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 12acb4c239844..f55a2baf259e7 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 3ff6b8b7eb613..fd6444efb9535 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 74d4f52234649..d60374f67f826 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 39237255bacf9..cdfb6d4ac1939 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 7757a2ce011fb..2bf0829f61565 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 26f3d37b3016e..7bf4795fcb02e 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 7cc280d2c9c6f..09602d6313e07 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index f99b2dad5ff2d..6ff2aea28e813 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 238e4adcca111..e3987158fb47c 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index c97621e85aab5..41151c2fb392b 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index bad1a4b07ed8b..6565051fa7b0f 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 10fc0d8f807c6..641d6fac3ce9c 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 34e2381ccba04..109db5775bfad 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index a41b287e02bad..f12ddb976c079 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index f3ba451c0dda0..4d55a6b240245 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 0c706e3e6c6fa..977fd4d625aff 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 736bef7db288a..fed9b5cf103cd 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 0203eac3b23d9..0a7cd85522be6 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 8e21304951e21..777564938be88 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index d422589416b84..09da85ad758a1 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 9d701cb992d6a..858f2ca1b2921 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 7fb83c417a0dd..459159cbe6c3e 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 8865ffa70a48f..2cddad9f70ac6 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 4bb11178ae1b5..718c1aa0ae46b 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index a0eb1f72e0e13..f97f0ba595273 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index fd908bc64658e..a63b5de6c0ec2 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index d0a81348ced9f..d279f235b2fbe 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 5c35cf52c2056..544b2c67648d2 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index c80dfaee79dfc..32b95abd8ca84 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index bb21570613d6d..fc04760951256 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 62f608ba47ede..627c02fca5506 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index ae35d8b7cf32d..5edb32e98dedd 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index d8ef868dc85d7..dc425a664a25e 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index e67caafdb092d..3d73c291a7443 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index ffcb0adb43e5d..eb31c906e1389 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 00a9375e15e24..3815b24f3faf5 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 21f724ef831f5..5b732265671df 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index c3fb247b54e1f..e237021116222 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index fec08c4298097..cbcda87b71150 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 2a2d6b91b344d..cffaf61d00dea 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index eebfc0de6dd47..1306d8e8e0667 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 49db6234b2804..67b74234b10b0 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index a2560123e2082..46695a9e50a63 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 65a08f821bca4..3895f2b0788ad 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 11fa31fa91c25..c064df42d8644 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 160f022c408b7..7be1a3b3e2cf0 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index fcfdf812eb7f9..be11d5170630c 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 7349161857f14..a9e51bf959f3e 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 2b0966d1626c3..c840cb6e8d752 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index e7b0f04f4bd71..756b28492b8a9 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index c881394119f90..d114b717fc7c9 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 275eb9703df2a..9c3fb80e88b64 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 1f0eaed0a8707..68858295cbda6 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 2627aa5d97f61..6bc8634b26aab 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 20d951ace007f..478076de40ab6 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index fd76953903f2f..cad4fbf08fada 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index b669850337e6f..434b5523dc4d3 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 8345d612466e6..ef4676f026283 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index ee3791bb61c24..1a871f7f1224e 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 8572fc88b338f..f495f678b3a07 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 573e88645a600..32a08efdbeffe 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index f6d026b5176aa..6db5e85280a07 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index fc73b661e9d7b..bedae6dba7701 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 4a81e0362997b..61677fd0ef9d3 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 82a1052be4804..37b9ae576a295 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 108272edb153e..f05e12225888a 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 4a44daf69309e..c4c2f3c7693cf 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 91d245cf991cb..d137da8304610 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 2f317c1023b84..7d268e888211b 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 4e550059368d0..72be30817e919 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 8a214057a0c69..839454db70617 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index a74ad94de409e..1ef995723bad7 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 724b77736bd8c..600dec8e5a9eb 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index 519f01408403d..560ffd8749b2c 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index d5f4853d32f89..8d9d14dd0770e 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 969c2de180d5f..0a1aa39996e9b 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 144a21dc0f9f4..0725d5ce8f2c7 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index f15ef622219c5..8520fa75d1586 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 4371da191deea..b72b91037a77f 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 89bb69db2598a..649d896ae346c 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3776,10 +3776,6 @@ "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts" }, - { - "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/mapping/register_mapping_route.ts" - }, { "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/routes/api/settings/register_load_route.ts" @@ -3816,6 +3812,10 @@ "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_privileges_route.ts" }, + { + "plugin": "indexManagement", + "path": "x-pack/plugins/index_management/server/routes/api/mapping/register_mapping_route.ts" + }, { "plugin": "remoteClusters", "path": "x-pack/plugins/remote_clusters/server/routes/api/get_route.ts" @@ -4400,10 +4400,6 @@ "plugin": "serverlessSearch", "path": "x-pack/plugins/serverless_search/server/routes/connectors_routes.ts" }, - { - "plugin": "serverlessSearch", - "path": "x-pack/plugins/serverless_search/server/routes/connectors_routes.ts" - }, { "plugin": "serverlessSearch", "path": "x-pack/plugins/serverless_search/server/routes/mapping_routes.ts" @@ -8096,6 +8092,10 @@ "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_execute_route.ts" }, + { + "plugin": "indexManagement", + "path": "x-pack/plugins/index_management/server/routes/api/mapping/register_update_mapping_route.ts" + }, { "plugin": "remoteClusters", "path": "x-pack/plugins/remote_clusters/server/routes/api/update_route.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 7aa6946a5a57c..7b41b581ee3a7 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index a845ab3eaf2ae..40b4dacd803b3 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index b9af8c3809e48..797322452242b 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 3e5d9eb00ff8b..68572c42d3d17 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 885054879a016..a3bd87e148073 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index b04c3ce36a43c..ae100a79acfb8 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 52262282b0aa2..4c904b51cf10e 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index fc04bbb54d108..511a5132d196c 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 9cf4096fc7b06..0d1b9b1e9b7a2 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 928753a54e795..8fd83cea753cc 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index b429e2c2bba67..63a007d697358 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index b3ac554c56d5d..8433127ca5cca 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index bea97a9d18d08..717c0f95bf224 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index de3b01e818bfe..965ab2a0ab47f 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 80af4726e4f1b..4d5b59c5dd961 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index cc4ce51fa5a4d..17b3596afc0ad 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index a0da4988af8a9..18013c30e1a33 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index fa4b1c197b27a..5b4871beae5f5 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 599e36e2783cb..639000fb83b24 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 82270c2a1dea2..4c4c64ef09ccf 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 1a7ec5abf79c0..fd8cda00c31e1 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 14e441d93c3a3..d5ba18a75a84f 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 50282b57fc991..b8f512bfca3ee 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index e11170eaa2d39..5c6b53814e092 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 8125b9f83c353..20fb69bdb3763 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 873ac67dc6afa..b3a15867c043c 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 1689872abbf88..c55f3b90eba76 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index e0fc5278585e0..02778845d2f5b 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 83bf159adde58..75154a5b97793 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index fe6022714affd..7aa8d270fcd0c 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index da90989d0f810..5fa44700dc691 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 84162691c21b8..87319b239156e 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index a042e95b4dfff..b05f82df40280 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 1116adec01c9c..65bfbff3d6396 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 8c7683e0e3015..9d99427c0cd97 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index 2940e62860825..03434f5973450 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 0ce36c060ddd3..174d76eea2ef0 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 9aa6c327067e9..c568b2f9433cb 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 7ca5108384d94..d54be07ceffdc 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 9acf837aa9f3e..7673cb7de5632 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 8645c5265ca4d..8eac72fa04f4e 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 69e4349c32976..586d427e64a8c 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index ed07db70518ae..36472eb6585e7 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 88024e0715bc8..0831baa979485 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 44f9d5ea98fad..f45dc634e9f55 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 08db474444867..74409524566ff 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index b9de85f5878ce..69f35bdbbc008 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index ee9edfdb8a025..47a6c9130e867 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 91aaf8cc45fbe..6d593bbc707ab 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 29955b9cab591..2a36abb98e1e9 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 107dfddc04ba4..7b1c3c9bb25c9 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 79600e624be8a..cc79cd68c9a7a 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 58538d5d40aaa..c325c72d10fb9 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index ef3c344130478..25729063f86cc 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 532af596fa52f..c8f913798ef33 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 36e2f8e62f958..c3cd3fdf1407f 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index a3b6af3a07fd1..42a0c81565f86 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 46c16861c1f7e..21b0affcb2b45 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 33dc7fbd62341..892c9b7ea8323 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 69e6f7a24ee3d..5d3fb894de87a 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 8ad0b6cc56bd2..8c42456f8d411 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 9cc2a26233e8d..110e7c323a410 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 76e04b2fb9353..5a99582b6c134 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 7181d42ed0c6a..ca5c8cd5a99e0 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 923b302d766de..22b5400ab8776 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index e3ec2721e33ce..b4c9cd2938efa 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index f699e16b1b663..69ceb41108995 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 63249bf8349fa..62083f43d56d2 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index 990aca0277475..6ade06b84793b 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index b64df2f80ff67..0d85fda1c503f 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 69551f39bf6fb..93ccacb1fb8ae 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 0707d86a6b8ec..abe5c9ee4a1fa 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 9a2ea310d3d7f..6478576615ea6 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 2aac29b0755da..93fe46fbba92e 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 85de716c2aa2d..2ec80656d76f6 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index cb3123345b4ad..1ef7ad367243b 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 1830a81bbb81c..4d72afcc4858c 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 0ad2a247c0c29..bcb3b6ce810a1 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index afbdd914128d8..bbbce3940b703 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 8f15de4e34c97..cb8087dc729bd 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index fa6e96bcb63a1..9d796936adcc4 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 9f29eeef3569e..943fe0c0a66e1 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index f521a4f861f65..e574242427fc8 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 823a07a79b847..e0330b96def72 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 6e4f378296319..6f144af187025 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index adce8f24cdc29..ffab9f79644a8 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index c63e800d7e7fe..bb103efa6aa41 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 3a0b1acf25ba8..9048b77e7fd6c 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 701229ddc679b..1d313b010ea55 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index fbf89fb41abbf..de75573dc1344 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index c89a2d5929800..7d9bdb8d7dc8f 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 2c3a3dacba8bb..07f810d1f4dcc 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 3f742a5ebe041..256b815edbb4c 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 4359bf9350d39..7d38f21ae6a0e 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 641f0025ebd08..69128444235a6 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index 0b25ba714e698..59f0b0d6a9004 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 298ec719441e5..b370cc356dd39 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 1df98fff6a88b..0cee6fae1ac65 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 057d40c634225..cf88339409769 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index f26f47f3b6018..3131ea9976d32 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index b7915821f8abc..c8e4cd762d102 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 4a555b1ebce88..8d8776e73e1cc 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 8237760883bd2..2bc2374494cc2 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index a643447ddcc93..c0d0d5526b6ea 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 35f9b3b800e8d..1de276a1857c1 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 1a4fa31a50a1b..61ac3e991b02d 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index f4b2ef53aee44..70fea91785665 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 3a7dc4aff3aeb..74157e661ede3 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index ce092846aa0c4..923e11f36f26c 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 800deed11b2e3..c0015dff97023 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index ffede5a9a2e48..c8f637d77e2da 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index e6f845973a461..954442126a49c 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index f129b6f9d7f14..2297768db26e3 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 7b2937d079e57..5634183d920f0 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 71c4280415a1f..08ef280f25d62 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 65c2e8b8e039a..db79fa2795834 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 100ddf4869460..febe43562c0a4 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index fb4c351a9929b..d698f5beb26f4 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index c606961ead92e..b52f5af1e79db 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 179875b915ab3..27421586b2cd9 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index f676849deb0d8..9712254b3d2b9 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 51443cec280db..b1cfdc567fce3 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 75bc0e0a5ad57..9017117b36384 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 146e3f20f259e..78d2c28440765 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index d5e74db7a9492..72a4ce297d119 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index 7c32860d8ad16..963afbd73f71a 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -840,7 +840,7 @@ "label": "fleet", "description": [], "signature": [ - "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; readonly policySecrets: string; readonly remoteESOoutput: string; readonly performancePresets: string; }" + "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; readonly policySecrets: string; readonly remoteESOoutput: string; readonly performancePresets: string; readonly scalingKubernetesResourcesAndLimits: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 8f104ec19703a..43a4f5611948e 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index adc2ef0358bc7..368d1a8744e55 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 1b3b8d11aeaf1..3f89991a15286 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index d6e7993766ec0..e575482160850 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 476c97ec3a6ce..b7c7609890b9d 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 54b204daa6405..5b5e835cd3ee9 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index c168b7c980013..e254298b2cd32 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index ad05386204da9..e2335afa20614 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index b850439d1d7f5..b415801639393 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 5464f256a286e..c7ed9e68a144c 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index d4984063fbbdc..e9ed9613288f0 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 53b57fad7e883..60d292b1dc18d 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index c92c607da9046..bb804aa2157de 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 2f851b1ad0112..3a4102c1ab3b4 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 0b69c4af4737f..2cb59da48a3c2 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 32304f706f2b9..8e481450773f3 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 89c1477fe1c6c..6e6b6b8a48373 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index d6de021bff279..f89ebe4aa0001 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 19201a9853944..682cad22f105e 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 84acfec117127..298918fc2e902 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 58092dbe01a02..b2b9adb6907c9 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index 3a29382f6d683..f8eb1f0afa838 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index a6e3e06957a34..3160442f41a29 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 3151735c1a803..9534867dc44ef 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index e83c3fe8f26e2..88226ae638c87 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index f2fb3d3e94592..a8fabd625cbe3 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index e88d8a6911158..ba9d350d7689a 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 89fbf3c279549..b265b94cd32cd 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 3fea89c1e4dcb..8f444f7136785 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index d701d8fd45ee7..04d8550e047a9 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index d7efae3f52911..71ead30d3b6d1 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 43a4183b4482a..8deadf8e9d929 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index d3d9d2e35f7f3..3f741476d4514 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 5660b3472aa35..43c2237dedcb1 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 818b1b9f41901..40b2f5f928a7e 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index a0de4421aafdf..fd002c55a873d 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 76d8e6bcfbe71..8a1623071186d 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index b69e5d9f66b6d..134b17ae0f055 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 77231ebf96e2b..2dd4dc3616a8a 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 9e279901e5e09..93c7331eb6b50 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 26fb186b5bb32..151c73d12bb17 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index b5c5bc5a86161..bd69bb7be0265 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 3091c0a27fd01..2c2d34c20b90d 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 386aa8fb374c2..3e447ed14e51b 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 3eb8f95d2522f..8450311f91bb1 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 6b1bb111405c2..64b9f0f7b424b 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 34789bc454b0f..0e5ba2dd45474 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 6bf63ce4b0640..9d21ed714ae11 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index b7ae564dc8bfb..0ffbc70e0129d 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index fcd2ea5a6ff93..6529ad8e1d460 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 140fe0b3887b7..f82e6f75cd0ed 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index a80ea34de6bea..d9a750950c55e 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index 8b0013a9cdd17..aecf760f6adfd 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index c338522113444..fbccb7e38f6e6 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index cab2911fa9d2c..066b6b587e882 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index b3793abd86f17..8112c04f0a222 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 7c56c6ff37f71..5e6e91048190f 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index f70ecf9b65660..6b6b7a01673c9 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index d389f5266b816..30a3ec9aec325 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 328b23332de7b..52d145b0e2d28 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index ce8edc22e8f84..79de140aab5a0 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 556cf56a5aa8c..d33d9bd31781f 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 6d24ca2416f43..dfc1e1f9b2e5b 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index c9deb4d1712d4..4d51e3d3357ad 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index f400fcc990324..cd651dec96549 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 3b84338411887..840d9d5a1edb9 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index d7b7413ea162f..3f7b857fc7503 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 0d9ac32afe0b9..fdac003567be6 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 90d5347b06d0a..a48ab84c6d84a 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 7962634b730fc..558b0ded3aa64 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 6860c170487e0..b131baa3fdaf4 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index cfaaeaa7f52ae..823110677b41b 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index b62e2bcbcdd94..ac7384ba333e9 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index c6e8da8ea4f4d..d3500d10ab068 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 8cf1c681c7b92..8bedae07355d1 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 36d1eabfb9dbc..5f66d23414d82 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 799c47c6286ca..05610b9dec299 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index a26af2b05b1de..e7f53a4bcc8bf 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 4cb94061cc7ca..9e3567f2a5c2e 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 24ef9998af50a..5d593329acf1a 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index b55f268640706..6be676f50f8c3 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index c1779f7763aca..7a17fc89afa6e 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 669ff4ace47af..240bfce6edb20 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 419ddd2461e21..72fe7eb616a00 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index a72073e48f60e..6eabf5a62e162 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index f75b87b7f08e7..18a1e9eaeae0b 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index fc505e026e5d8..d1b7671789322 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index cd2b74e0812a7..6282e67e6f1db 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 2e4a701f52556..35aba0c0c2420 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 708c2148279b6..98796e0e19639 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 696dd6628c928..f81600e95de4e 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 5b8aafce528e8..9c12b607e5d79 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 98cf4c3651b78..6f49e9a586c84 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index cb22801d142a1..42fb5d0ad4bf5 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index c9ccb967bffe2..d545ae335bdd4 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 458c670ea15c7..c8779efe03369 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 503b5763ac1cb..2fd0b55c829e8 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index f6197155ebc03..a06d2b8b24d14 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 81bcfa3c0da57..bfd3ae6ad9e3c 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index ae3bff92e0f4a..a7e0f0188200b 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index c950eba34628f..785b2f8dd1685 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.devdocs.json b/api_docs/kbn_panel_loader.devdocs.json index 5282b2609136d..74454cf0c107b 100644 --- a/api_docs/kbn_panel_loader.devdocs.json +++ b/api_docs/kbn_panel_loader.devdocs.json @@ -11,7 +11,7 @@ "label": "PanelLoader", "description": [], "signature": [ - "(props: { showShadow?: boolean | undefined; dataTestSubj?: string | undefined; }) => JSX.Element" + "(props: { showShadow?: boolean | undefined; showBorder?: boolean | undefined; dataTestSubj?: string | undefined; }) => JSX.Element" ], "path": "packages/kbn-panel-loader/index.tsx", "deprecated": false, @@ -42,6 +42,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/panel-loader", + "id": "def-public.PanelLoader.$1.showBorder", + "type": "CompoundType", + "tags": [], + "label": "showBorder", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-panel-loader/index.tsx", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/panel-loader", "id": "def-public.PanelLoader.$1.dataTestSubj", diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 2612b8b0b4d3c..9c85c74eb94df 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 4 | 0 | 4 | 0 | +| 5 | 0 | 5 | 0 | ## Client diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 916ea107308ae..7f25b515cdcbc 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index f03a5065ef2b8..61057e5cb44bb 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index b29dea5c30eef..84468db30e0a4 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index d41fc93e678e5..57838541f2b2c 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index af20a6d99663a..d749456a29772 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_library.mdx b/api_docs/kbn_presentation_library.mdx index 37e58255e6807..a4d2bd13d4f2b 100644 --- a/api_docs/kbn_presentation_library.mdx +++ b/api_docs/kbn_presentation_library.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-library title: "@kbn/presentation-library" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-library plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-library'] --- import kbnPresentationLibraryObj from './kbn_presentation_library.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 7bdfe6db74151..d06332f64d30f 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 01b26a8695454..1bdcd099b7460 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 734896d336455..53be811c7373b 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 95022a8145192..f3a7250ee5cd3 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 4d158375b6d8b..2cb3ad10ece11 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 1ce1f604c8c4f..5db88b7f67216 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 9f0bf1d4e6e72..a256f5a2ade06 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 87a5f3e5911ae..3fdd43ab808db 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 7fb38b58c802f..a645b81d54775 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 4ac2e461e268f..f29355b087cd8 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index c5ab3bff8ea34..85ac96d6043f0 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index f3d5671532b23..cd22bc2fcdc03 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index e7ea67a0167f2..83fd1b75817aa 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 4c80a17c2a48c..960aec4961774 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 5ded169e941c4..c6edc7a0bd6b8 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index bfbca19fc1beb..99e4c29d4090d 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index fd0c5ef933652..23696a316c8b0 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 13e582dc37254..3dda262e95b47 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index c3355a4af3692..d8b877cd763cd 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index d4d904cf27d32..0f967ca98dc08 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 0cfdc27b84b17..792c52b348649 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 817c822f987a9..5b2a21e5c06ee 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 1d40ab3eab522..3188b1b613230 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 477a5ce275b21..d4b6bd71973d2 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index e3bb273015c40..ad7896a8d9553 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index a3046053af8fb..f03ed99784a5a 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index e3c9ab490fa51..3bcb3361c8d24 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index d0e2a783bb567..adc3bd1c68091 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 923159913c229..a5f81d0762317 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 00922c1711123..e9d2b52346fa9 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index c9ffe7c14dd96..cdffa3e2457b7 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.devdocs.json b/api_docs/kbn_search_connectors.devdocs.json index 12e46a1aeb82a..dd6a979950c9a 100644 --- a/api_docs/kbn_search_connectors.devdocs.json +++ b/api_docs/kbn_search_connectors.devdocs.json @@ -3942,131 +3942,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition", - "type": "Interface", - "tags": [], - "label": "ConnectorServerSideDefinition", - "description": [], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition.categories", - "type": "Array", - "tags": [], - "label": "categories", - "description": [], - "signature": [ - "string[] | undefined" - ], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition.iconPath", - "type": "string", - "tags": [], - "label": "iconPath", - "description": [], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition.isBeta", - "type": "boolean", - "tags": [], - "label": "isBeta", - "description": [], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition.isNative", - "type": "boolean", - "tags": [], - "label": "isNative", - "description": [], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition.isTechPreview", - "type": "CompoundType", - "tags": [], - "label": "isTechPreview", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition.keywords", - "type": "Array", - "tags": [], - "label": "keywords", - "description": [], - "signature": [ - "string[]" - ], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.ConnectorServerSideDefinition.serviceType", - "type": "string", - "tags": [], - "label": "serviceType", - "description": [], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/search-connectors", "id": "def-common.ConnectorStats", @@ -6427,28 +6302,6 @@ } ], "misc": [ - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.CONNECTOR_DEFINITIONS", - "type": "Array", - "tags": [], - "label": "CONNECTOR_DEFINITIONS", - "description": [], - "signature": [ - { - "pluginId": "@kbn/search-connectors", - "scope": "common", - "docId": "kibKbnSearchConnectorsPluginApi", - "section": "def-common.ConnectorServerSideDefinition", - "text": "ConnectorServerSideDefinition" - }, - "[]" - ], - "path": "packages/kbn-search-connectors/connectors.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/search-connectors", "id": "def-common.ConnectorConfiguration", diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 5ef816320cdc0..24ce9ea872fc1 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3219 | 0 | 3219 | 0 | +| 3208 | 0 | 3208 | 0 | ## Common diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index b08e87216acf4..ca8a2c3389d67 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 25ce4d29c7982..ad3cce7bdfa7e 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 1ded7fb6cf12e..cdc511fd44e5a 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 48c431c35fc8d..c6ad9517971d6 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 77c36dd65a847..997eef5f212aa 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 5817693c2a371..978deef5411bf 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 1291088ef45ca..e7d68f0bce5d4 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 042402f65f7b7..e07ca82bcdbe9 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 967e9245a75eb..2573413dc71df 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index ac126f8244be8..e1809eed7ad40 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 94b9831bd0a8b..9de721939d73e 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 19307e3a43762..de23f44b41986 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 8d68bbcd120a9..98c43b3d1c4be 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 56d8696d60e82..6f75bede7db21 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index adaf29f4d6133..fe33dd3357802 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 0dafe2a0d1865..2fe71d161626b 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 5278a0a984cb4..ddc6afc426693 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 60016a60de894..747a38418c228 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index ac7d4fe3abb8b..1e8046c35d80d 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index f4a75a2f00864..1868dd9269493 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index b097e2f09db7e..e6d308455190b 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index aa003513d50ba..eb4aea5754457 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 46d874b2b4074..1ba2ddc3a8bd3 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 533cd3bdd0392..de1779ab1c199 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 877a6e710429a..6ac076e01a69e 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index a24d0bebf1db5..4b88ac8151ba8 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 00458c8d28770..bc8b9598e776e 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index ae858c9b0ef51..200b28c88f05c 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 726922af109c1..541bc799cc663 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 9a40bcbcabc9f..5f2c520dbdf30 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index a3e9238ac828d..f829f23e052d6 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 4135d3b65173c..426ef4b5c4e2a 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 63cfc6c781906..b8bf37b6a698a 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 6b6254227e9a4..963de5c03c96a 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 26db1a7c607ff..7ee61e2ea41e3 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index 7b2632a620270..e1f32327733f9 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 9cd52ba96a599..359dbafffb673 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index c31a4f5be5d45..9b5fd0757d1eb 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 8a2c604c7cd95..8bebe2a873dac 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 1bd6daed2c5ed..5903d512e5681 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index fb56ad0bb4a7f..003828aaee7c5 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 08ca70961c58b..2aec6b8c4ca5a 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index 19dd8d8656dc6..5ab4b419fe5ef 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 5a89750e57956..5d7695206c63a 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 00903d0834151..de26dbfaac0fb 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 25ca58718761c..7c565c3dd5db1 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 6884eec43ff03..71b8d379c56aa 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 4a24406a99ddd..4e72da48c4fb6 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 882cc51f690d8..0a966552e8ef9 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index f5ac1705a8316..91e7e0de877e7 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 6e5d3a967ab0b..0aaf5610e7a69 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 99c7f5d3296f0..91117e8953af5 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 652e2ab2a5667..e9fb9aa98a9bd 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 9e422f56e8b57..7c968d7df4719 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 5e3616fc26257..dbd0e985be866 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index e5e4f696f572a..2e2115defed82 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 07d0dd9a15692..2da2f7f1c3892 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index e1f33e331a55e..d3c73bff0665a 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index df6aeb2dd8248..f91de9fc075c4 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 6d6a1de4a9083..ba5b65f752de7 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index a14fd68a3165b..6c642d316f6b2 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 46c650cc73155..7ffc310234220 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 4151aa11a4f06..a757c0023898f 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index c311fa29920d1..8b0dff41983f5 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 405f41950154e..1cd06cd4f3a03 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 3c5102f768a59..a45497e518298 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 27e7f3b77cd82..51110150805cf 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index c0560ecd25216..41bc00be658ad 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index c42b92f5d3f26..761319e1716a1 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 148c5d4a3b184..1b60fa078b719 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 1e293bd9e58d7..c65e42715e2be 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 5f5222ae2f7e9..38c88d193c05c 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index ee440b51b1da1..530a9539fc80d 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index dae1d30043ebe..729b050c39f12 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 95a8bdd9edbbc..d27bdedf4a434 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index f0894e5e5c483..3dc8f92642f42 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 901b1c735316f..765289ec73e3a 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_es.mdx b/api_docs/kbn_solution_nav_es.mdx index be9242dc97dfe..c9d0b16da23b8 100644 --- a/api_docs/kbn_solution_nav_es.mdx +++ b/api_docs/kbn_solution_nav_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-es title: "@kbn/solution-nav-es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-es plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-es'] --- import kbnSolutionNavEsObj from './kbn_solution_nav_es.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_oblt.mdx b/api_docs/kbn_solution_nav_oblt.mdx index 4dcbe8ef03528..2385303390443 100644 --- a/api_docs/kbn_solution_nav_oblt.mdx +++ b/api_docs/kbn_solution_nav_oblt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-oblt title: "@kbn/solution-nav-oblt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-oblt plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-oblt'] --- import kbnSolutionNavObltObj from './kbn_solution_nav_oblt.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 4ce01c98a9b56..31601be37c056 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 8a4dd5c513bee..785e3672f7c3e 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index cd9c752deaf5d..5bfb3aa098502 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 93222ea3573a5..2d62585a97d22 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 8fb2322c65e94..b4d00f1834302 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index a363aeb28e8af..0fe06fb043bde 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index cf1ea354fea4b..45d889d145fe7 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 33a6ac89295c8..8ebcf09aeea4f 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 69e2dd9be799a..f28a554bfed27 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 2d7976e044e34..70fd1a6a4be29 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 41aec0e74354c..ede11e0bbdc02 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 59dae71de39e7..26fb956bc0b6a 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 520564a80550b..939fa242f541a 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index a9001ad6adc26..de1fe8e9f5ad9 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index fe2a8ae302a09..13fb0ee978ab0 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 50d877d64d3c6..c37fb49bb322c 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index dd5f7aed10011..fd6205880e487 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 19c09ec7318f2..b45207566e1ca 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index b04f953083d79..8ecb0274f842d 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index ce0055c7d6110..767473160596b 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index e36881bf4f24b..a1a60fa5737cd 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 78fad020fb3be..b2b97c82df394 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index d9e25128aff15..d24d5ee8c458a 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 4c10ca8c24076..1310e8b8e39e5 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index f40b42812e317..27fcd6473f52f 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index ee8ece70ff75b..61125c163796d 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 58de8c7aa70b3..999892fe7d3cc 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 3d93cfc2fb5de..b7924a2844737 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.devdocs.json b/api_docs/kbn_visualization_ui_components.devdocs.json index a8177415871ca..329e0a16222f7 100644 --- a/api_docs/kbn_visualization_ui_components.devdocs.json +++ b/api_docs/kbn_visualization_ui_components.devdocs.json @@ -11,9 +11,9 @@ "label": "ChartSwitchTrigger", "description": [], "signature": [ - "({ label, icon, onClick, dataTestSubj, size, }: { label: string; icon?: ", + "({ label, icon, onClick, dataTestSubj, }: { label: string; icon?: ", "IconType", - " | undefined; onClick: () => void; dataTestSubj?: string | undefined; size?: \"m\" | \"s\" | undefined; }) => JSX.Element" + " | undefined; onClick: () => void; dataTestSubj?: string | undefined; }) => JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/chart_switch_trigger.tsx", "deprecated": false, @@ -30,7 +30,7 @@ "signature": [ "{ label: string; icon?: ", "IconType", - " | undefined; onClick: () => void; dataTestSubj?: string | undefined; size?: \"m\" | \"s\" | undefined; }" + " | undefined; onClick: () => void; dataTestSubj?: string | undefined; }" ], "path": "packages/kbn-visualization-ui-components/components/chart_switch_trigger.tsx", "deprecated": false, diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 1ea70ff2c7bf1..9345b98871b42 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 92bb25ac7a894..22ad356779a8c 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 2f8a5042844a1..3655223164bde 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index e4299dbf28ebf..ea9d10768a4a8 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 7c9f7207c8d57..851281ead396c 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 52dffc1c0c9e9..4e733bc33d5d1 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index c2a9c204782e9..e67b49a6d9c9d 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 5b60f2deaf566..117414c43525b 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 9a112d7958298..48c75ffb0be03 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 43ace307a3256..8f8fcc6f6d91f 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -6311,7 +6311,7 @@ "\nIf the visualization has subtypes, update the subtype in state." ], "signature": [ - "((visualizationTypeId: string, state: T) => T) | undefined" + "((visualizationTypeId: string, state: T, layerId?: string | undefined) => T) | undefined" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -6346,6 +6346,21 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.switchVisualizationType.$3", + "type": "string", + "tags": [], + "label": "layerId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] @@ -6360,7 +6375,7 @@ "Description is displayed as the clickable text in the chart switcher" ], "signature": [ - "(state: T) => { icon?: ", + "(state: T, layerId?: string | undefined) => { icon?: ", "IconType", " | undefined; label: string; }" ], @@ -6382,6 +6397,21 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getDescription.$2", + "type": "string", + "tags": [], + "label": "layerId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] @@ -7177,10 +7207,57 @@ }, { "parentPluginId": "lens", - "id": "def-public.Visualization.LayerHeaderComponent", + "id": "def-public.Visualization.isSubtypeCompatible", "type": "Function", "tags": [], - "label": "LayerHeaderComponent", + "label": "isSubtypeCompatible", + "description": [], + "signature": [ + "((subtype1?: string | undefined, subtype2?: string | undefined) => boolean) | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.Visualization.isSubtypeCompatible.$1", + "type": "string", + "tags": [], + "label": "subtype1", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.isSubtypeCompatible.$2", + "type": "string", + "tags": [], + "label": "subtype2", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getCustomLayerHeader", + "type": "Function", + "tags": [], + "label": "getCustomLayerHeader", "description": [ "\nHeader rendered as layer title. This can be used for both static and dynamic content like\nfor extra configurability, such as for switch chart type" ], @@ -7189,7 +7266,7 @@ "VisualizationLayerWidgetProps", ") => React.ReactElement<", "VisualizationLayerWidgetProps", - ", string | React.JSXElementConstructor> | null) | undefined" + ", string | React.JSXElementConstructor> | undefined) | undefined" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -7197,7 +7274,7 @@ "children": [ { "parentPluginId": "lens", - "id": "def-public.Visualization.LayerHeaderComponent.$1", + "id": "def-public.Visualization.getCustomLayerHeader.$1", "type": "CompoundType", "tags": [], "label": "props", @@ -9471,11 +9548,11 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" ], @@ -11595,11 +11672,11 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescription?: string | undefined; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> | Partial public API | Number of teams | |--------------|----------|------------------------| -| 770 | 661 | 40 | +| 771 | 662 | 40 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 46281 | 233 | 35063 | 1788 | +| 46323 | 233 | 35104 | 1791 | ## Plugin Directory @@ -68,7 +68,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 35 | 0 | 33 | 2 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 45 | 0 | 31 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 556 | 1 | 451 | 10 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 557 | 1 | 452 | 10 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 23 | 0 | 23 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | @@ -78,7 +78,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 112 | 0 | 112 | 11 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 126 | 0 | 126 | 12 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'error' renderer to expressions | 17 | 0 | 15 | 2 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Gauge plugin adds a `gauge` renderer and function to the expression plugin. The renderer will display the `gauge` chart. | 59 | 0 | 59 | 2 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Gauge plugin adds a `gauge` renderer and function to the expression plugin. The renderer will display the `gauge` chart. | 59 | 0 | 58 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Heatmap plugin adds a `heatmap` renderer and function to the expression plugin. The renderer will display the `heatmap` chart. | 112 | 0 | 108 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'image' function and renderer to expressions | 26 | 0 | 26 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds a `metric` renderer and function to the expression plugin. The renderer will display the `legacy metric` chart. | 51 | 0 | 51 | 2 | @@ -118,7 +118,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 609 | 3 | 416 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 664 | 0 | 563 | 61 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 669 | 0 | 568 | 61 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | @@ -165,6 +165,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the definition and helper methods around saved searches, used by discover and visualizations. | 79 | 0 | 78 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 13 | 0 | | | [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 32 | 0 | 8 | 4 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Plugin hosting shared features for connectors | 19 | 0 | 19 | 3 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 15 | 0 | 9 | 0 | | searchprofiler | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 408 | 0 | 199 | 2 | @@ -217,7 +218,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the vega visualization. Is the elastic version of vega and vega-lite libraries. | 2 | 0 | 2 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the vislib visualizations. These are the classical area/line/bar, gauge/goal and heatmap charts. We want to replace them with elastic-charts. | 1 | 0 | 1 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line. | 52 | 0 | 50 | 5 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 841 | 12 | 810 | 19 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 862 | 12 | 831 | 19 | | watcher | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | ## Package Directory @@ -251,7 +252,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 19 | 0 | 16 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 62 | 1 | 44 | 3 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 23 | 0 | 19 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 78 | 0 | 78 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 84 | 0 | 84 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 7 | 0 | 2 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 62 | 0 | 17 | 1 | @@ -564,7 +565,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 45 | 0 | 45 | 10 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 51 | 5 | 34 | 0 | | | [@elastic/security-asset-management](https://github.com/orgs/elastic/teams/security-asset-management) | - | 66 | 0 | 66 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 4 | 0 | 4 | 0 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 5 | 0 | 5 | 0 | | | [@elastic/kibana-performance-testing](https://github.com/orgs/elastic/teams/kibana-performance-testing) | - | 3 | 0 | 3 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 1 | 0 | 0 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | @@ -602,7 +603,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 123 | 0 | 120 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 81 | 0 | 81 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 3219 | 0 | 3219 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 3208 | 0 | 3208 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 1 | 17 | 1 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 25 | 0 | 25 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 6d18cc5466bcb..a6d2a02099875 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 0b12ce57fe549..bf8a1216b6d38 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 8b65e3b4395d2..3180687ccd9b2 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index b3e664d6681a7..b39a6c634376c 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 237da900e90e6..5c5f7dfdbfbe1 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 0a8b08dc7afff..ed329837ab86a 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 1237412b1ee20..c3e0b0be97afd 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index cdd65f638a20d..5cf9469fcc6a8 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 01cb318612b0d..5932e0c7437c9 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 6f024b758d091..44707e4ff1a4f 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 86e4dbb7892e9..dfc18ad591456 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 81d35c80f3039..cf338fdef461f 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 6cf8ee0c69b6d..644a1e111baa7 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 2f6dca18c473b..f619d9ad54023 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 83515b3f1b230..f7b9c03480010 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 7bc8ca7dcbe58..6d23f762ecf97 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 4417ba5bdd978..45cf3579325ff 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.devdocs.json b/api_docs/search_connectors.devdocs.json new file mode 100644 index 0000000000000..ae37858d47495 --- /dev/null +++ b/api_docs/search_connectors.devdocs.json @@ -0,0 +1,301 @@ +{ + "id": "searchConnectors", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "searchConnectors", + "id": "def-public.ConnectorDefinition", + "type": "Type", + "tags": [], + "label": "ConnectorDefinition", + "description": [], + "signature": [ + "ConnectorClientSideDefinition", + " & ", + "ConnectorServerSideDefinition" + ], + "path": "x-pack/plugins/search_connectors/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [], + "setup": { + "parentPluginId": "searchConnectors", + "id": "def-public.SearchConnectorsPluginSetup", + "type": "Interface", + "tags": [], + "label": "SearchConnectorsPluginSetup", + "description": [], + "path": "x-pack/plugins/search_connectors/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "searchConnectors", + "id": "def-public.SearchConnectorsPluginSetup.getConnectorTypes", + "type": "Function", + "tags": [], + "label": "getConnectorTypes", + "description": [], + "signature": [ + "() => ", + "ConnectorServerSideDefinition", + "[]" + ], + "path": "x-pack/plugins/search_connectors/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "searchConnectors", + "id": "def-public.SearchConnectorsPluginStart", + "type": "Interface", + "tags": [], + "label": "SearchConnectorsPluginStart", + "description": [], + "path": "x-pack/plugins/search_connectors/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "searchConnectors", + "id": "def-public.SearchConnectorsPluginStart.getConnectorTypes", + "type": "Function", + "tags": [], + "label": "getConnectorTypes", + "description": [], + "signature": [ + "() => ", + "ConnectorDefinition", + "[]" + ], + "path": "x-pack/plugins/search_connectors/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition", + "type": "Interface", + "tags": [], + "label": "ConnectorServerSideDefinition", + "description": [], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition.categories", + "type": "Array", + "tags": [], + "label": "categories", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition.iconPath", + "type": "string", + "tags": [], + "label": "iconPath", + "description": [], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition.isBeta", + "type": "boolean", + "tags": [], + "label": "isBeta", + "description": [], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition.isNative", + "type": "boolean", + "tags": [], + "label": "isNative", + "description": [], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition.isTechPreview", + "type": "CompoundType", + "tags": [], + "label": "isTechPreview", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition.keywords", + "type": "Array", + "tags": [], + "label": "keywords", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "searchConnectors", + "id": "def-server.ConnectorServerSideDefinition.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "searchConnectors", + "id": "def-server.CONNECTOR_DEFINITIONS", + "type": "Array", + "tags": [], + "label": "CONNECTOR_DEFINITIONS", + "description": [], + "signature": [ + "ConnectorServerSideDefinition", + "[]" + ], + "path": "x-pack/plugins/search_connectors/common/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [], + "setup": { + "parentPluginId": "searchConnectors", + "id": "def-server.SearchConnectorsPluginSetup", + "type": "Interface", + "tags": [], + "label": "SearchConnectorsPluginSetup", + "description": [], + "path": "x-pack/plugins/search_connectors/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "searchConnectors", + "id": "def-server.SearchConnectorsPluginSetup.getConnectorTypes", + "type": "Function", + "tags": [], + "label": "getConnectorTypes", + "description": [], + "signature": [ + "() => ", + "ConnectorServerSideDefinition", + "[]" + ], + "path": "x-pack/plugins/search_connectors/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "searchConnectors", + "id": "def-server.SearchConnectorsPluginStart", + "type": "Interface", + "tags": [], + "label": "SearchConnectorsPluginStart", + "description": [], + "path": "x-pack/plugins/search_connectors/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx new file mode 100644 index 0000000000000..454045caa88f5 --- /dev/null +++ b/api_docs/search_connectors.mdx @@ -0,0 +1,50 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibSearchConnectorsPluginApi +slug: /kibana-dev-docs/api/searchConnectors +title: "searchConnectors" +image: https://source.unsplash.com/400x175/?github +description: API docs for the searchConnectors plugin +date: 2024-03-27 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] +--- +import searchConnectorsObj from './search_connectors.devdocs.json'; + +Plugin hosting shared features for connectors + +Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 19 | 0 | 19 | 3 | + +## Client + +### Setup + + +### Start + + +### Consts, variables and types + + +## Server + +### Setup + + +### Start + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 155148592df09..a755b74ae4a11 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index e252b983293b2..d59eebdb13bc7 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 1333eedbee98c..c9983973a0249 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -3348,7 +3348,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly tGridEnabled: true; readonly tGridEventRenderedViewEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly chartEmbeddablesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly assistantStreamingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: false; readonly responseActionsSentinelOneV1Enabled: false; readonly responseActionsSentinelOneV2Enabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: false; readonly expandableTimelineFlyoutEnabled: false; readonly alertsPageFiltersEnabled: true; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: false; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; }" + "{ readonly tGridEnabled: true; readonly tGridEventRenderedViewEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly chartEmbeddablesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly assistantStreamingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: false; readonly expandableTimelineFlyoutEnabled: false; readonly alertsPageFiltersEnabled: true; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index f049aa2ebdbaf..04966c86b4741 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 71ca25aedba67..a09744f2a59e4 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 359478e93b783..09e85e1d1111a 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 2f45c3bcf15c2..229cc9256e2d7 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index ebf10f5bf4d3d..dcf9341120fb8 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index ca398e0c2762c..5ee41b069ec3a 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 19c32699ad166..6ff765127276c 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 36fd1f91ecb55..cfc3fa491f9fc 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index 648883e6a1edd..fcf56ea61a476 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 1345bff60ce5e..62030b013001f 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 7f1e779558b84..9d5d0afb895f0 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 1669890bc810d..f289725eea8e7 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 2e28356b7f72b..1e8e27f870204 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 73596d9c9a343..b3ab9e6e2d1e1 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 6c8d54b346112..306f8283bca93 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 3abaff98a6196..868834f349549 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 50b7dc0bac47f..478f6f05e124f 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index cf453452f8516..c5f340b47e42e 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 9fe151626366e..6f963aca00298 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.devdocs.json b/api_docs/threat_intelligence.devdocs.json index e1e9642ed26f4..9a90f0e74658f 100644 --- a/api_docs/threat_intelligence.devdocs.json +++ b/api_docs/threat_intelligence.devdocs.json @@ -119,7 +119,7 @@ "\nGets Security Solution shared information like browerFields, indexPattern and selectedPatterns in DataView." ], "signature": [ - "SourcererDataView" + "SelectedDataView" ], "path": "x-pack/plugins/threat_intelligence/public/types.ts", "deprecated": false, diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 509374ef8563b..2c7b203575d02 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 511fc685d22d6..bc22b8fa22d58 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 760186ed07f12..eda8d9bc870f4 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 1d2bcd82ab507..96c9ff84a40fc 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 90c23dc69a686..24218eb448ed6 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 09522a4ddb7f6..02d44570a06a8 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index bc1276bb3ff09..3bc9c783ad363 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 248019dfd5bfe..cbcf844203611 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index d53a50b045c0f..12ac1a1663355 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 04f148c18f6a6..43657301c7da2 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 196f2d3938217..a26f3db11b691 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 2752eb10c2cae..efe33187cdfd6 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 34a24849b9d51..d3c43f64a2ba5 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 04fc92575f555..8cc6360d392df 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 1781acd8726c0..6504c1d256919 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 26b7c47843c69..ea0c0eee990cf 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 56638bd2a3f2a..22683ddc4dfeb 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index a977432ec707e..bde9738bc1971 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index bf5aa3e3157f4..fbee990e09428 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 40a44ed697516..78ea3e1d80178 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 42c05431f6332..785c30774101d 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 37f2ef34f17b7..1c7ecbd500eee 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index a13b287be804a..a7b068944222e 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index e17bc91f91747..bf7c07b6de599 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 7ef51b4e90a26..d1364717d7a29 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -7940,6 +7940,500 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor", + "type": "Function", + "tags": [], + "label": "findAccessor", + "description": [], + "signature": [ + "(accessor: string, columns: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + " | undefined" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor.$1", + "type": "string", + "tags": [], + "label": "accessor", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor.$2", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor", + "type": "Function", + "tags": [], + "label": "findAccessor", + "description": [], + "signature": [ + "(accessor: number, columns: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]) => number | ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + " | undefined" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor.$1", + "type": "number", + "tags": [], + "label": "accessor", + "description": [], + "signature": [ + "number" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor.$2", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor", + "type": "Function", + "tags": [], + "label": "findAccessor", + "description": [], + "signature": [ + "(accessor: string | number, columns: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]) => number | ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + " | undefined" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor.$1", + "type": "CompoundType", + "tags": [], + "label": "accessor", + "description": [], + "signature": [ + "string | number" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor.$2", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor", + "type": "Function", + "tags": [], + "label": "findAccessor", + "description": [], + "signature": [ + "(accessor: string | number, columns: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]) => number | ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + " | undefined" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor.$1", + "type": "CompoundType", + "tags": [], + "label": "accessor", + "description": [], + "signature": [ + "string | number" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessor.$2", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail", + "type": "Function", + "tags": [], + "label": "findAccessorOrFail", + "description": [], + "signature": [ + "(accessor: string, columns: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + } + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail.$1", + "type": "string", + "tags": [], + "label": "accessor", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail.$2", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail", + "type": "Function", + "tags": [], + "label": "findAccessorOrFail", + "description": [], + "signature": [ + "(accessor: number, columns: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]) => number | ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + } + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail.$1", + "type": "number", + "tags": [], + "label": "accessor", + "description": [], + "signature": [ + "number" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail.$2", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail", + "type": "Function", + "tags": [], + "label": "findAccessorOrFail", + "description": [], + "signature": [ + "(accessor: string | number, columns: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]) => number | ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + } + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail.$1", + "type": "CompoundType", + "tags": [], + "label": "accessor", + "description": [], + "signature": [ + "string | number" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail.$2", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.findAccessorOrFail", @@ -15146,7 +15640,7 @@ "label": "GaugeShape", "description": [], "signature": [ - "\"arc\" | \"circle\" | \"horizontalBullet\" | \"verticalBullet\"" + "\"arc\" | \"circle\" | \"horizontalBullet\" | \"verticalBullet\" | \"semiCircle\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", "deprecated": false, @@ -16256,7 +16750,7 @@ "label": "GaugeShapes", "description": [], "signature": [ - "{ readonly HORIZONTAL_BULLET: \"horizontalBullet\"; readonly VERTICAL_BULLET: \"verticalBullet\"; readonly ARC: \"arc\"; readonly CIRCLE: \"circle\"; }" + "{ readonly HORIZONTAL_BULLET: \"horizontalBullet\"; readonly VERTICAL_BULLET: \"verticalBullet\"; readonly SEMI_CIRCLE: \"semiCircle\"; readonly ARC: \"arc\"; readonly CIRCLE: \"circle\"; }" ], "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", "deprecated": false, diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 431a0e71feaa6..cab6488193d5c 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-03-26 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 841 | 12 | 810 | 19 | +| 862 | 12 | 831 | 19 | ## Client diff --git a/dev_docs/tutorials/saved_objects.mdx b/dev_docs/tutorials/saved_objects.mdx index d977bc7d6a7b7..f93d774e663f3 100644 --- a/dev_docs/tutorials/saved_objects.mdx +++ b/dev_docs/tutorials/saved_objects.mdx @@ -246,6 +246,36 @@ That way: - SO type versions are decoupled from stack versioning - SO type versions are independent between types +### Saved object migrations on serverless + +On serverless, Kibana cannot have any downtime — even during data migrations. In order to accomplish this we rollout new versions while old versions are still running. As soon as new versions are ready to start serving, requests will be directed to them. + + + + + + +This has a few implications: + +1. A _new version_ of application code should **never** introduce a new Saved Object field and treat it as a **required** field +2. A _new version_ of application code must be **fully backward compatible** with the **previous version's (n-1) Saved Object fields** + +In order to introduce a new, required Saved Object field the following algorithm _must_ be followed: + +1. Introduce a new model version field, consider this field _optional_ in any application code that uses it +2. Provide a `data_backfill` function for the new field +3. Merge to `main` +4. Wait for the next serverless release containing your data migration changes to complete +5. Update your code marking the new field as required in interfaces +6. Merge to `main` + +At step 6 your code that was just merged to `main` will be guaranteed to find a value for the new field in Saved Objects. + + + Not waiting until your `data_backfill` has been released means that none of your SO documents will have the field populated with the value you provided in the `data_backfill` function. The new field value will be `undefined` until migrations have run which only happens _after_ application code has already started running! + + + ### Testing model versions Bugs in model version transitions cause downtime for our users and therefore have a very high impact. Follow the section in the plugin testing guide. diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 42916be46afe8..db9993184b26a 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -66,6 +66,19 @@ Review important information about the {kib} 8.x releases. For information about the {kib} 8.13.0 release, review the following information. +[float] +[[known-issues-8.13.0]] +=== Known issues + +[discrete] +[[known-179457]] +.In Canvas, an empty text element incorrectly triggers a toast notification +[%collapsible] +==== +*Details* + +In Canvas, an empty text element incorrectly triggers a "Markdown content is required in [readOnly] mode" toast notification. For more information, refer to ({kibana-pull}179457[#179457]). +==== + [float] [[breaking-changes-8.13.0]] === Breaking changes diff --git a/examples/esql_validation_example/README.md b/examples/esql_validation_example/README.md new file mode 100644 index 0000000000000..1f4232c13f4b5 --- /dev/null +++ b/examples/esql_validation_example/README.md @@ -0,0 +1,9 @@ +# esql_validation_example + +Examples of the ES|QL validation service. + +To run this example, start kibana with the `--run-examples` flag. + +```bash +yarn start --run-examples +``` \ No newline at end of file diff --git a/examples/esql_validation_example/kibana.jsonc b/examples/esql_validation_example/kibana.jsonc new file mode 100644 index 0000000000000..367f1920ce8b2 --- /dev/null +++ b/examples/esql_validation_example/kibana.jsonc @@ -0,0 +1,17 @@ +{ + "type": "plugin", + "id": "@kbn/esql-validation-example-plugin", + "owner": "@elastic/kibana-esql", + "plugin": { + "id": "esqlValidationExample", + "server": false, + "browser": true, + "configPath": [ + "esql_validation_example" + ], + "requiredPlugins": [ + "dataViews", + "developerExamples" + ] + } + } \ No newline at end of file diff --git a/examples/esql_validation_example/public/app.tsx b/examples/esql_validation_example/public/app.tsx new file mode 100644 index 0000000000000..918fbd6be79ab --- /dev/null +++ b/examples/esql_validation_example/public/app.tsx @@ -0,0 +1,178 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import React, { useEffect, useMemo, useState } from 'react'; +import { + EuiPage, + EuiPageBody, + EuiPageSection, + EuiPageHeader, + EuiSpacer, + EuiFieldText, + EuiCheckboxGroup, + EuiFormRow, + EuiSwitch, + EuiForm, + EuiCallOut, +} from '@elastic/eui'; + +import type { CoreStart } from '@kbn/core/public'; + +import { ESQLCallbacks, validateQuery } from '@kbn/esql-validation-autocomplete'; +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import type { StartDependencies } from './plugin'; +import { CodeSnippet } from './code_snippet'; + +export const App = (props: { core: CoreStart; plugins: StartDependencies }) => { + const [currentErrors, setErrors] = useState([]); + const [currentWarnings, setWarnings] = useState([]); + const [currentQuery, setQuery] = useState( + 'from index1 | eval var0 = round(numberField, 2) | stats by stringField' + ); + + const [ignoreErrors, setIgnoreErrors] = useState(false); + const [callbacksEnabled, setCallbacksEnabled] = useState< + Record<'sources' | 'fields' | 'policies' | 'metaFields', boolean> + >({ + sources: false, + fields: true, + policies: true, + metaFields: true, + }); + + const callbacks: ESQLCallbacks = useMemo( + () => ({ + getSources: callbacksEnabled.sources + ? async () => + ['index1', 'anotherIndex', 'dataStream'].map((name) => ({ name, hidden: false })) + : undefined, + getFieldsFor: callbacksEnabled.fields + ? async () => [ + { name: 'numberField', type: 'number' }, + { name: 'stringField', type: 'string' }, + ] + : undefined, + getMetaFields: callbacksEnabled.metaFields + ? async () => ['_version', '_id', '_index', '_source'] + : undefined, + getPolicies: callbacksEnabled.policies + ? async () => [ + { + name: 'my-policy', + sourceIndices: ['policyIndex'], + matchField: 'otherStringField', + enrichFields: ['otherNumberField'], + }, + ] + : undefined, + }), + [callbacksEnabled] + ); + + useEffect(() => { + if (currentQuery === '') { + return; + } + validateQuery( + currentQuery, + getAstAndSyntaxErrors, + { ignoreOnMissingCallbacks: ignoreErrors }, + callbacks + ).then(({ errors: validationErrors, warnings: validationWarnings }) => { + // syntax errors come with a slight different format than other validation errors + setErrors(validationErrors.map((e) => ('severity' in e ? e.message : e.text))); + setWarnings(validationWarnings.map((e) => e.text)); + }); + }, [currentQuery, ignoreErrors, callbacks]); + + const checkboxes = [ + { + id: 'sources', + label: 'getSources callback => index1, anotherIndex, dataStream', + }, + { + id: 'fields', + label: 'getFieldsFor callback => numberField, stringField', + }, + { + id: 'policies', + label: 'getPolicies callback => my-policy', + }, + { + id: 'metaFields', + label: 'getMetaFields callback => _version, _id, _index, _source', + }, + ]; + + return ( + + + + +

This app shows how to use the ES|QL validation API with all its options

+ + + + { + setCallbacksEnabled({ + ...callbacksEnabled, + [optionId]: !callbacksEnabled[optionId as keyof typeof callbacksEnabled], + }); + }} + /> + + + + + setIgnoreErrors(!ignoreErrors)} + /> + + + 0} + error={currentErrors} + > + setQuery(e.target.value)} + isInvalid={currentErrors.length > 0} + /> + + {currentWarnings.length ? ( + +

Here the list of warnings:

+
    + {currentWarnings.map((message) => ( +
  • {message}
  • + ))} +
+
+ ) : null} +
+ + +
+
+
+ ); +}; diff --git a/examples/esql_validation_example/public/code_snippet.tsx b/examples/esql_validation_example/public/code_snippet.tsx new file mode 100644 index 0000000000000..e80b52b4dd378 --- /dev/null +++ b/examples/esql_validation_example/public/code_snippet.tsx @@ -0,0 +1,78 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { EuiCodeBlock } from '@elastic/eui'; +import React from 'react'; + +interface CodeSnippetProps { + currentQuery: string; + callbacks: Record<'sources' | 'fields' | 'policies' | 'metaFields', boolean>; + ignoreErrors: boolean; +} + +function getCallbacksCode(callbacks: CodeSnippetProps['callbacks']) { + return `({ + ${ + callbacks.sources + ? `getSources: async () => + ['index1', 'anotherIndex', 'dataStream'].map((name) => ({ name, hidden: false })),` + : '' + } + ${ + callbacks.fields + ? ` + // the getFieldsFor callback gets an esql query to get the required fields + // note that the query is not optimized yet, so things like "| limit 0" + // might be appended to speed up the retrieval. + getFieldsFor: async (esqlFieldsQuery: string) => [ + { name: 'numberField', type: 'number' }, + { name: 'stringField', type: 'string' }, + ],` + : '' + } + ${ + callbacks.metaFields + ? `getMetaFields: async () => ['_version', '_id', '_index', '_source'],` + : '' + } + ${ + callbacks.policies + ? `getPolicies: async () => [ + { + name: 'my-policy', + sourceIndices: ['policyIndex'], + matchField: 'otherStringField', + enrichFields: ['otherNumberField'], + }, + ],` + : '' + } +})`.replace(/^\s*\n/gm, ''); +} + +export function CodeSnippet({ currentQuery, callbacks, ignoreErrors }: CodeSnippetProps) { + return ( + + {` +import { ESQLCallbacks, validateQuery } from '@kbn/esql-validation-autocomplete'; +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; + +const currentQuery = "${currentQuery}"; + +const callbacks: ESQLCallbacks = () => ${getCallbacksCode(callbacks)}; + +const {errors, warnings} = validateQuery( + currentQuery, + getAstAndSyntaxErrors, + { ignoreOnMissingCallbacks: ${Boolean(ignoreErrors)} }, + callbacks +); +`} + + ); +} diff --git a/examples/esql_validation_example/public/esql_validation_app.png b/examples/esql_validation_example/public/esql_validation_app.png new file mode 100644 index 0000000000000..b1dd6bc4f3263 Binary files /dev/null and b/examples/esql_validation_example/public/esql_validation_app.png differ diff --git a/examples/esql_validation_example/public/index.tsx b/examples/esql_validation_example/public/index.tsx new file mode 100644 index 0000000000000..e025b806f0596 --- /dev/null +++ b/examples/esql_validation_example/public/index.tsx @@ -0,0 +1,11 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { ESQLValidationExamplePlugin } from './plugin'; + +export const plugin = () => new ESQLValidationExamplePlugin(); diff --git a/examples/esql_validation_example/public/mount.tsx b/examples/esql_validation_example/public/mount.tsx new file mode 100644 index 0000000000000..2133fe83a8406 --- /dev/null +++ b/examples/esql_validation_example/public/mount.tsx @@ -0,0 +1,34 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import * as React from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; + +import type { CoreSetup, AppMountParameters } from '@kbn/core/public'; +import type { StartDependencies } from './plugin'; + +export const mount = + (coreSetup: CoreSetup) => + async ({ element }: AppMountParameters) => { + const [core, plugins] = await coreSetup.getStartServices(); + const { App } = await import('./app'); + + const i18nCore = core.i18n; + + const reactElement = ( + + + + ); + + render(reactElement, element); + return () => { + unmountComponentAtNode(element); + plugins.data.search.session.clear(); + }; + }; diff --git a/examples/esql_validation_example/public/plugin.ts b/examples/esql_validation_example/public/plugin.ts new file mode 100644 index 0000000000000..7d68daa81f89b --- /dev/null +++ b/examples/esql_validation_example/public/plugin.ts @@ -0,0 +1,56 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { Plugin, CoreSetup } from '@kbn/core/public'; +import { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { DeveloperExamplesSetup } from '@kbn/developer-examples-plugin/public'; +import { mount } from './mount'; +import image from './esql_validation_app.png'; + +export interface SetupDependencies { + developerExamples: DeveloperExamplesSetup; +} + +export interface StartDependencies { + data: DataPublicPluginStart; + dataViews: DataViewsPublicPluginStart; +} + +export class ESQLValidationExamplePlugin + implements Plugin +{ + public setup(core: CoreSetup, { developerExamples }: SetupDependencies) { + core.application.register({ + id: 'esql_validation_example', + title: 'ES|QL Validation example', + visibleIn: [], + mount: mount(core), + }); + + developerExamples.register({ + appId: 'esql_validation_example', + title: 'ES|QL Validation', + description: 'Validate ES|QL queries using the @kbn/esql-validation-autocomplete package.', + image, + links: [ + { + label: 'README', + href: 'https://github.com/elastic/kibana/tree/main/packages/kbn-esql-validation-autocomplete/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); + } + + public start() {} + + public stop() {} +} diff --git a/examples/esql_validation_example/tsconfig.json b/examples/esql_validation_example/tsconfig.json new file mode 100644 index 0000000000000..84056b3524cc5 --- /dev/null +++ b/examples/esql_validation_example/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../typings/**/*" + ], + "exclude": [ + "target/**/*", + ], + "kbn_references": [ + "@kbn/core", + "@kbn/data-plugin", + "@kbn/data-views-plugin", + "@kbn/developer-examples-plugin", + "@kbn/esql-ast", + "@kbn/esql-validation-autocomplete", + ] +} diff --git a/package.json b/package.json index 60ff3633e9522..3bfdb8efd067a 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "@elastic/ecs": "^8.11.1", "@elastic/elasticsearch": "^8.12.2", "@elastic/ems-client": "8.5.1", - "@elastic/eui": "93.4.0", + "@elastic/eui": "93.5.1", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", @@ -433,7 +433,10 @@ "@kbn/es-ui-shared-plugin": "link:src/plugins/es_ui_shared", "@kbn/eso-model-version-example": "link:examples/eso_model_version_example", "@kbn/eso-plugin": "link:x-pack/test/encrypted_saved_objects_api_integration/plugins/api_consumer_plugin", + "@kbn/esql-ast": "link:packages/kbn-esql-ast", "@kbn/esql-utils": "link:packages/kbn-esql-utils", + "@kbn/esql-validation-autocomplete": "link:packages/kbn-esql-validation-autocomplete", + "@kbn/esql-validation-example-plugin": "link:examples/esql_validation_example", "@kbn/event-annotation-common": "link:packages/kbn-event-annotation-common", "@kbn/event-annotation-components": "link:packages/kbn-event-annotation-components", "@kbn/event-annotation-listing-plugin": "link:src/plugins/event_annotation_listing", @@ -970,7 +973,7 @@ "deepmerge": "^4.2.2", "del": "^6.1.0", "diff": "^5.1.0", - "elastic-apm-node": "^4.4.1", + "elastic-apm-node": "^4.5.0", "email-addresses": "^5.0.0", "eventsource-parser": "^1.1.1", "execa": "^5.1.1", @@ -1125,7 +1128,7 @@ "suricata-sid-db": "^1.0.2", "swr": "^2.2.5", "symbol-observable": "^1.2.0", - "tar": "^6.1.15", + "tar": "^6.2.1", "textarea-caret": "^3.1.0", "tinycolor2": "1.4.1", "tinygradient": "0.4.3", @@ -1497,7 +1500,7 @@ "@types/styled-components": "^5.1.0", "@types/supertest": "^2.0.12", "@types/tapable": "^1.0.6", - "@types/tar": "^6.1.5", + "@types/tar": "^6.1.11", "@types/testing-library__jest-dom": "^5.14.7", "@types/textarea-caret": "^3.0.1", "@types/tinycolor2": "^1.4.1", diff --git a/packages/core/apps/core-apps-server-internal/src/core_app.test.ts b/packages/core/apps/core-apps-server-internal/src/core_app.test.ts index 153a283fe5696..3c5cfa068765c 100644 --- a/packages/core/apps/core-apps-server-internal/src/core_app.test.ts +++ b/packages/core/apps/core-apps-server-internal/src/core_app.test.ts @@ -316,7 +316,7 @@ describe('CoreApp', () => { }); }); - it('registers expected static dirs if there are public plugins', async () => { + it('registers expected static dirs for all plugins with static dirs', async () => { const uiPlugins = emptyPlugins(); uiPlugins.public.set('some-plugin', { type: PluginType.preboot, @@ -348,6 +348,12 @@ describe('CoreApp', () => { requiredBundles: [], version: '1.0.0', }); + uiPlugins.internal.set('some-plugin-3-internal', { + publicAssetsDir: '/foo-internal', + publicTargetDir: '/bar-internal', + requiredBundles: [], + version: '1.0.0', + }); internalCoreSetup.http.staticAssets.prependServerPath.mockReturnValue('/static-assets-path'); internalCoreSetup.http.staticAssets.getPluginServerPath.mockImplementation( @@ -356,8 +362,8 @@ describe('CoreApp', () => { await coreApp.setup(internalCoreSetup, uiPlugins); expect(internalCoreSetup.http.registerStaticDir).toHaveBeenCalledTimes( - // Twice for all UI plugins + core's UI asset routes - uiPlugins.public.size * 2 + 2 + // Twice for all _internal_ UI plugins + core's UI asset routes + uiPlugins.internal.size * 2 + 2 ); expect(internalCoreSetup.http.registerStaticDir).toHaveBeenCalledWith( '/static-assets-path', @@ -383,5 +389,14 @@ describe('CoreApp', () => { '/plugins/some-plugin-2/assets/{path*}', // legacy expect.any(String) ); + + expect(internalCoreSetup.http.registerStaticDir).toHaveBeenCalledWith( + '/static-assets-path/some-plugin-3-internal/{path*}', + expect.any(String) + ); + expect(internalCoreSetup.http.registerStaticDir).toHaveBeenCalledWith( + '/plugins/some-plugin-3-internal/assets/{path*}', // legacy + expect.any(String) + ); }); }); diff --git a/packages/core/apps/core-apps-server-internal/src/core_app.ts b/packages/core/apps/core-apps-server-internal/src/core_app.ts index a65b3373b2e83..2639e15cca05e 100644 --- a/packages/core/apps/core-apps-server-internal/src/core_app.ts +++ b/packages/core/apps/core-apps-server-internal/src/core_app.ts @@ -283,9 +283,8 @@ export class CoreAppsService { ); }); - for (const [pluginName] of uiPlugins.public) { - const pluginInfo = uiPlugins.internal.get(pluginName); - if (!pluginInfo) continue; // assuming we will never hit this case; a public entry should have internal info registered + for (const [pluginName, pluginInfo] of uiPlugins.internal) { + if (!pluginInfo.publicAssetsDir) continue; /** * Serve UI from sha-scoped and not-sha-scoped paths to allow time for plugin code to migrate * Eventually we only want to serve from the sha scoped path diff --git a/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap b/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap index 8656c7684ce37..875e9273a0305 100644 --- a/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap +++ b/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap @@ -155,6 +155,7 @@ exports[`#start() returns \`Context\` component 1`] = ` "euiHeaderLinks.appNavigation": "App menu", "euiHeaderLinks.openNavigationMenu": "Open menu", "euiHue.label": "Select the HSV color mode \\"hue\\" value", + "euiIconTip.defaultAriaLabel": "Info", "euiImageButton.closeFullScreen": "Press Escape or click to close image fullscreen mode", "euiImageButton.openFullScreen": "Click to open this image in fullscreen mode", "euiInlineEditForm.activateEditModeDescription": "Click to edit this text inline.", diff --git a/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx b/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx index 21069027c6a50..fbb625271aa38 100644 --- a/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx +++ b/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx @@ -797,6 +797,9 @@ export const getEuiContextMapping = (): EuiTokensObject => { 'euiHue.label': i18n.translate('core.euiHue.label', { defaultMessage: 'Select the HSV color mode "hue" value', }), + 'euiIconTip.defaultAriaLabel': i18n.translate('core.euiIconTip.defaultAriaLabel', { + defaultMessage: 'Info', + }), 'euiImageButton.openFullScreen': i18n.translate('core.euiImageButton.openFullScreen', { defaultMessage: 'Click to open this image in fullscreen mode', }), diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index d0a78b272128c..98c50c886c1f0 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -833,6 +833,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D policySecrets: `${FLEET_DOCS}agent-policy.html#agent-policy-secret-values`, remoteESOoutput: `${FLEET_DOCS}monitor-elastic-agent.html#external-elasticsearch-monitoring`, performancePresets: `${FLEET_DOCS}es-output-settings.html#es-output-settings-performance-tuning-settings`, + scalingKubernetesResourcesAndLimits: `${FLEET_DOCS}scaling-on-kubernetes.html#_specifying_resources_and_limits_in_agent_manifests`, }, ecs: { guide: `${ELASTIC_WEBSITE_URL}guide/en/ecs/current/index.html`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index df39d8e33e77c..f51445bdac9b9 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -543,6 +543,7 @@ export interface DocLinks { policySecrets: string; remoteESOoutput: string; performancePresets: string; + scalingKubernetesResourcesAndLimits: string; }>; readonly ecs: { readonly guide: string; diff --git a/packages/kbn-esql-ast/BUILD.bazel b/packages/kbn-esql-ast/BUILD.bazel new file mode 100644 index 0000000000000..34557089d0db4 --- /dev/null +++ b/packages/kbn-esql-ast/BUILD.bazel @@ -0,0 +1,32 @@ +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") + +SRCS = glob( + [ + "**/*.ts", + ], + exclude = [ + "**/*.config.js", + "**/*.mock.*", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +SHARED_DEPS = [ + "@npm//antlr4", +] + +js_library( + name = "kbn-esql-ast", + package_name = "@kbn/esql-ast", + srcs = ["package.json"] + SRCS, + deps = SHARED_DEPS, + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-esql-ast/README.md b/packages/kbn-esql-ast/README.md new file mode 100644 index 0000000000000..76232d371b9cb --- /dev/null +++ b/packages/kbn-esql-ast/README.md @@ -0,0 +1,89 @@ +# ES|QL utility library + +## Folder structure + +This library brings all the foundation data structure to enable all advanced features within an editor for ES|QL as validation, autocomplete, hover, etc... +The package is structure as follow: + +``` +src + |- antlr // => contains the ES|QL grammar files and various compilation assets + | ast_factory.ts // => binding to the Antlr that generates the AST data structure + | ast_errors.ts // => error translation utility from raw Antlr to something understandable (somewhat) + | antlr_error_listener.ts // => The ES|QL syntax error listener + | antlr_facade.ts // => getParser and getLexer utilities + | ... // => miscellaneas utilities to work with AST +``` + +### Basic usage + +#### Get AST from a query string + +This module contains the entire logic to translate from a query string into the AST data structure. +The `getAstAndSyntaxErrors` function returns the AST data structure, unless a syntax error happens in which case the `errors` array gets populated with a Syntax error. + +##### Usage + +```js +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; + +const queryString = "from index | stats 1 + avg(myColumn) "; +const { ast, errors} = await astProvider(queryString); + +if(errors){ + console.log({ syntaxErrors: errors }); +} +// do stuff with the ast +``` + +## How does it work + +The general idea of this package is to provide all ES|QL features on top of a custom compact AST definition (all data structure types defined in `./types.ts`) which is designed to be resilient to many grammar changes. +The pipeline is the following: + +``` +Antlr grammar files +=> Compiled grammar files (.ts assets in the antlr folder) +=> AST Factory (Antlr Parser tree => custom AST) +``` + +Each feature function works with the combination of the AST and the definition files: the former describe the current statement in a easy to traverse way, while the definitions describe what's the expected behaviour of each node in the AST node (i.e. what arguments should it accept? How many arguments? etc...). +While AST requires the grammar to be compiled to be updated, definitions are static files which can be dynamically updated without running the ANTLR compile task. + +#### AST + +The AST is generated by 2 files: `ast_factory.ts` and its buddy `ast_walker.ts`: +* `ast_factory.ts` is a binding to Antlr and access the Parser tree +* Parser tree is passed over to `ast_walker` to append new AST nodes + +In general Antlr is resilient to grammar errors, in the sense that it can produe a Parser tree up to the point of the error, then stops. This is useful to perform partial tasks even with broken queries and this means that a partial AST can be produced even with an invalid query. + +### Keeping ES|QL up to date + +In general when operating on changes here use the `yarn kbn watch` in a terminal window to make sure changes are correctly compiled. + +### How to add new commands/options + +When a new command/option is added to ES|QL it is done via a grammar update. +Therefore adding them requires a two step phase: +* Update the grammar with the new one + * add/fix all AST generator bindings in case of new/changed TOKENS in the `lexer` grammar file +* Update the definition files for commands/options + +To update the grammar: +1. Make sure the `lexer` and `parser` files are up to date with their ES counterparts + * an existing Kibana CI job is updating them already automatically +2. Run the script into the `package.json` to compile the ES|QL grammar. +3. open the `ast_factory.ts` file and add a new `exit` method +4. write some code in the `ast_walker/ts` to translate the Antlr Parser tree into the custom AST (there are already few utilites for that, but sometimes it is required to write some more code if the `parser` introduced a new flow) + * pro tip: use the `http://lab.antlr.org/` to visualize/debug the parser tree for a given statement (copy and paste the grammar files there) +5. if something goes wrong with new quoted/unquoted identifier token, open the `ast_helpers.ts` and check the ids of the new tokens in the `getQuotedText` and `getUnquotedText` functions - please make sure to leave a comment on the token name + +#### Debug and fix grammar changes (tokens, etc...) + +On TOKEN renaming or with subtle `lexer` grammar changes it can happens that test breaks, this can be happen for two main issues: +* A TOKEN name changed so the `ast_walker.ts` doesn't find it any more. Go there and rename the TOKEN name. +* TOKEN order changed and tests started failing. This probably generated some TOKEN id reorder and there are two functions in `ast_helpers.ts` who rely on hardcoded ids: `getQuotedText` and `getUnquotedText`. + * Note that the `getQuotedText` and `getUnquotedText` are automatically updated on grammar changes detected by the Kibana CI sync job. + * to fix this just look at the commented tokens and update the ids. If a new token add it and leave a comment to point to the new token name. + * This choice was made to reduce the bundle size, as importing the `esql_parser` adds some hundreds of Kbs to the bundle otherwise. \ No newline at end of file diff --git a/packages/kbn-esql-ast/index.ts b/packages/kbn-esql-ast/index.ts new file mode 100644 index 0000000000000..cdbde17692545 --- /dev/null +++ b/packages/kbn-esql-ast/index.ts @@ -0,0 +1,37 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +export type { + ESQLAst, + ESQLAstItem, + ESQLCommand, + ESQLCommandOption, + ESQLCommandMode, + ESQLFunction, + ESQLTimeInterval, + ESQLLocation, + ESQLMessage, + ESQLSingleAstItem, + ESQLSource, + ESQLColumn, + ESQLLiteral, + AstProviderFn, + EditorError, +} from './src/types'; + +// Low level functions to parse grammar +export { getParser, getLexer, ROOT_STATEMENT } from './src/antlr_facade'; + +/** + * ES|QL Query string -> AST data structure + * this is the foundational building block for any advanced feature + * a developer wants to build on top of the ESQL language + **/ +export { getAstAndSyntaxErrors } from './src/ast_parser'; + +export { ESQLErrorListener } from './src/antlr_error_listener'; diff --git a/packages/kbn-esql-ast/kibana.jsonc b/packages/kbn-esql-ast/kibana.jsonc new file mode 100644 index 0000000000000..18ab1197119e7 --- /dev/null +++ b/packages/kbn-esql-ast/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/esql-ast", + "owner": "@elastic/kibana-esql" + } \ No newline at end of file diff --git a/packages/kbn-esql-ast/package.json b/packages/kbn-esql-ast/package.json new file mode 100644 index 0000000000000..9783b4bc72938 --- /dev/null +++ b/packages/kbn-esql-ast/package.json @@ -0,0 +1,12 @@ +{ + "name": "@kbn/esql-ast", + "version": "1.0.0", + "private": true, + "license": "SSPL-1.0 OR Elastic License 2.0", + "scripts": { + "build:antlr4:esql": "antlr -Dlanguage=TypeScript src/antlr/esql_lexer.g4 src/antlr/esql_parser.g4 && node ./scripts/fix_generated_antlr.js && node ./scripts/esql_update_ast_script.js", + "prebuild:antlr4": "brew bundle --file=./scripts/antlr4_tools/brewfile", + "build:antlr4": "npm run build:antlr4:esql" + }, + "sideEffects": false + } \ No newline at end of file diff --git a/packages/kbn-esql-ast/scripts/antlr4_tools/.gitignore b/packages/kbn-esql-ast/scripts/antlr4_tools/.gitignore new file mode 100644 index 0000000000000..e4d4e606cb87a --- /dev/null +++ b/packages/kbn-esql-ast/scripts/antlr4_tools/.gitignore @@ -0,0 +1 @@ +brewfile.lock.json diff --git a/packages/kbn-esql-ast/scripts/antlr4_tools/README.md b/packages/kbn-esql-ast/scripts/antlr4_tools/README.md new file mode 100644 index 0000000000000..8bdba8e8d711b --- /dev/null +++ b/packages/kbn-esql-ast/scripts/antlr4_tools/README.md @@ -0,0 +1,3 @@ +## antlr4-tools + +defines a fairly quick way to get [antlr](https://github.com/antlr/antlr4) setup on any machine with brew support, simply run `brew bundle` within this directory. On running the aforementioned command, `antlr` should be become available in your path as a valid executable. diff --git a/packages/kbn-esql-ast/scripts/antlr4_tools/brewfile b/packages/kbn-esql-ast/scripts/antlr4_tools/brewfile new file mode 100644 index 0000000000000..47f89b17dbb10 --- /dev/null +++ b/packages/kbn-esql-ast/scripts/antlr4_tools/brewfile @@ -0,0 +1,2 @@ +brew "openjdk" +brew "antlr" diff --git a/packages/kbn-esql-ast/scripts/esql_update_ast_script.js b/packages/kbn-esql-ast/scripts/esql_update_ast_script.js new file mode 100644 index 0000000000000..78419d758023c --- /dev/null +++ b/packages/kbn-esql-ast/scripts/esql_update_ast_script.js @@ -0,0 +1,116 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +const { join } = require('path'); +const { ESLint } = require('eslint'); +const partition = require('lodash/partition'); +const { readdirSync, readFileSync, writeFileSync } = require('fs'); +const ora = require('ora'); +const log = ora('Updating ES|QL AST walker from antlr grammar').start(); + +async function execute() { + const generatedAntlrFolder = join(__dirname, '..', 'src', 'antlr'); + + const generatedAntlrFolderContents = readdirSync(generatedAntlrFolder); + + const tokenRegex = /public static readonly (?[A-Z_]*(UN)*QUOTED_[A-Z_]+) = (?\d+);/; + const lexerFile = generatedAntlrFolderContents.find((file) => file === 'esql_parser.ts'); + const lexerFileRows = readFileSync(join(generatedAntlrFolder, lexerFile), 'utf8') + .toString() + .split('\n'); + const tokenList = []; + for (const row of lexerFileRows) { + const match = row.match(tokenRegex); + if (match?.groups) { + tokenList.push(match.groups); + } + } + const [unquotedList, quotedList] = partition(tokenList, ({ name }) => /UNQUOTED/.test(name)); + + // now all quote/unquoted tokens are registered + // dump them into the ast_helper file + const astHelperFileFolder = join(__dirname, '..', 'src'); + const astHelperFilename = 'ast_helpers.ts'; + + try { + const astHelperContentRows = readFileSync(join(astHelperFileFolder, astHelperFilename), 'utf8') + .toString() + .split('\n'); + + const startAutoGeneratedComment = astHelperContentRows.findIndex( + (row) => row === '/* SCRIPT_MARKER_START */' + ); + const endAutoGeneratedComment = + astHelperContentRows.findIndex((row) => row === '/* SCRIPT_MARKER_END */') + 1; + + const newFunctionsContent = ` +/* SCRIPT_MARKER_START */ +function getQuotedText(ctx: ParserRuleContext) { + return [ + ${quotedList.map(({ name, value }) => `${value} /* esql_parser.${name} */`).join(', ')} + ] + .map((keyCode) => ctx.getToken(keyCode, 0)) + .filter(nonNullable)[0]; + } + +function getUnquotedText(ctx: ParserRuleContext) { + return [ + ${unquotedList.map(({ name, value }) => `${value} /* esql_parser.${name} */`).join(', ')} + + ] + .map((keyCode) => ctx.getToken(keyCode, 0)) + .filter(nonNullable)[0]; +} +/* SCRIPT_MARKER_END */ +`; + + const fileContent = astHelperContentRows + .slice(0, startAutoGeneratedComment) + .concat(newFunctionsContent.split('\n'), astHelperContentRows.slice(endAutoGeneratedComment)); + + const fileContentString = fileContent.join('\n'); + + const eslint = new ESLint({ + fix: true, + overrideConfig: { + parser: '@typescript-eslint/parser', + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018, + }, + rules: { + '@kbn/imports/no_unresolvable_imports': 'off', + 'prettier/prettier': [ + 'error', + { + parser: 'typescript', + }, + ], + }, + }, + }); + + const results = await eslint.lintText(fileContentString); + + if (results.some(({ messages }) => messages.length > 0)) { + const formatter = await eslint.loadFormatter('stylish'); + const resultText = formatter.format(results); + process.exitCode = 1; + return log.fail(resultText); + } + + const filePath = join(astHelperFileFolder, astHelperFilename); + writeFileSync(filePath, results[0].output || '', { encoding: 'utf8' }); + } catch (err) { + return log.fail(err.message); + } + + log.succeed('Updated ES|QL helper from antlr grammar successfully'); +} + +execute(); diff --git a/packages/kbn-esql-ast/scripts/fix_generated_antlr.js b/packages/kbn-esql-ast/scripts/fix_generated_antlr.js new file mode 100644 index 0000000000000..6a55c7acd2fb6 --- /dev/null +++ b/packages/kbn-esql-ast/scripts/fix_generated_antlr.js @@ -0,0 +1,60 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +const { join } = require('path'); +const { readdirSync, readFileSync, writeFileSync, renameSync } = require('fs'); +const ora = require('ora'); +const log = ora('Updating generated antlr grammar').start(); + +function execute() { + const generatedAntlrFolder = join(__dirname, '..', 'src', 'antlr'); + + const generatedAntlrFolderContents = readdirSync(generatedAntlrFolder); + + // The generated TS produces some TS linting errors + // This script adds a //@ts-nocheck comment at the top of each generated file + // so that the errors can be ignored for now + generatedAntlrFolderContents + .filter((file) => { + const fileExtension = file.split('.')[1]; + return fileExtension.includes('ts'); + }) + .forEach((file) => { + try { + const fileContentRows = readFileSync(join(generatedAntlrFolder, file), 'utf8') + .toString() + .split('\n'); + + if (!/\@ts-nocheck/.test(fileContentRows[0])) { + fileContentRows.unshift('// @ts-nocheck'); + } + + const filePath = join(generatedAntlrFolder, file); + const fileContent = fileContentRows.join('\n'); + + writeFileSync(filePath, fileContent, { encoding: 'utf8' }); + } catch (err) { + return log.fail(err.message); + } + }); + + // Rename generated parserListener file to snakecase to satisfy file casing check + // There doesn't appear to be a way to fix this OOTB with antlr4 + try { + renameSync( + join(generatedAntlrFolder, `esql_parserListener.ts`), + join(generatedAntlrFolder, `esql_parser_listener.ts`) + ); + } catch (err) { + log.warn(`Unable to rename parserListener file to snake-case: ${err.message}`); + } + + log.succeed('Updated generated antlr grammar successfully'); +} + +execute(); diff --git a/packages/kbn-monaco/src/esql/antlr/.gitignore b/packages/kbn-esql-ast/src/antlr/.gitignore similarity index 100% rename from packages/kbn-monaco/src/esql/antlr/.gitignore rename to packages/kbn-esql-ast/src/antlr/.gitignore diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 similarity index 100% rename from packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 rename to packages/kbn-esql-ast/src/antlr/esql_lexer.g4 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp similarity index 100% rename from packages/kbn-monaco/src/esql/antlr/esql_lexer.interp rename to packages/kbn-esql-ast/src/antlr/esql_lexer.interp diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens similarity index 100% rename from packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens rename to packages/kbn-esql-ast/src/antlr/esql_lexer.tokens diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts similarity index 99% rename from packages/kbn-monaco/src/esql/antlr/esql_lexer.ts rename to packages/kbn-esql-ast/src/antlr/esql_lexer.ts index 2e17440a7aabc..5603ea84b7c00 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts @@ -1,5 +1,5 @@ // @ts-nocheck -// Generated from src/esql/antlr/esql_lexer.g4 by ANTLR 4.13.1 +// Generated from src/antlr/esql_lexer.g4 by ANTLR 4.13.1 // noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols import { ATN, diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 similarity index 100% rename from packages/kbn-monaco/src/esql/antlr/esql_parser.g4 rename to packages/kbn-esql-ast/src/antlr/esql_parser.g4 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp b/packages/kbn-esql-ast/src/antlr/esql_parser.interp similarity index 100% rename from packages/kbn-monaco/src/esql/antlr/esql_parser.interp rename to packages/kbn-esql-ast/src/antlr/esql_parser.interp diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens similarity index 100% rename from packages/kbn-monaco/src/esql/antlr/esql_parser.tokens rename to packages/kbn-esql-ast/src/antlr/esql_parser.tokens diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts b/packages/kbn-esql-ast/src/antlr/esql_parser.ts similarity index 99% rename from packages/kbn-monaco/src/esql/antlr/esql_parser.ts rename to packages/kbn-esql-ast/src/antlr/esql_parser.ts index 434619be69900..40f3843403617 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.ts @@ -1,5 +1,5 @@ // @ts-nocheck -// Generated from src/esql/antlr/esql_parser.g4 by ANTLR 4.13.1 +// Generated from src/antlr/esql_parser.g4 by ANTLR 4.13.1 // noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols import { diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts similarity index 99% rename from packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts rename to packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts index da84d62f08d0b..fb3741dc94a8d 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts @@ -1,5 +1,5 @@ // @ts-nocheck -// Generated from src/esql/antlr/esql_parser.g4 by ANTLR 4.13.1 +// Generated from src/antlr/esql_parser.g4 by ANTLR 4.13.1 import {ParseTreeListener} from "antlr4"; diff --git a/packages/kbn-monaco/src/esql/lib/monaco/esql_error_listener.ts b/packages/kbn-esql-ast/src/antlr_error_listener.ts similarity index 75% rename from packages/kbn-monaco/src/esql/lib/monaco/esql_error_listener.ts rename to packages/kbn-esql-ast/src/antlr_error_listener.ts index c6c68b6e73909..0bb2912e2d235 100644 --- a/packages/kbn-monaco/src/esql/lib/monaco/esql_error_listener.ts +++ b/packages/kbn-esql-ast/src/antlr_error_listener.ts @@ -7,10 +7,13 @@ */ import type { Recognizer, RecognitionException } from 'antlr4'; -import { ANTLRErrorListener } from '../../../common/error_listener'; -import { getPosition } from '../ast/ast_position_utils'; +import { ErrorListener } from 'antlr4'; +import type { EditorError } from './types'; +import { getPosition } from './ast_position_utils'; + +export class ESQLErrorListener extends ErrorListener { + protected errors: EditorError[] = []; -export class ESQLErrorListener extends ANTLRErrorListener { syntaxError( recognizer: Recognizer, offendingSymbol: any, @@ -31,7 +34,11 @@ export class ESQLErrorListener extends ANTLRErrorListener { startColumn, endColumn, message: textMessage, - severity: 8, // monaco.MarkerSeverity.Error, + severity: 'error', }); } + + getErrors(): EditorError[] { + return this.errors; + } } diff --git a/packages/kbn-monaco/src/esql/lib/antlr_facade.ts b/packages/kbn-esql-ast/src/antlr_facade.ts similarity index 86% rename from packages/kbn-monaco/src/esql/lib/antlr_facade.ts rename to packages/kbn-esql-ast/src/antlr_facade.ts index a7a9fb2104938..ba35dc342552b 100644 --- a/packages/kbn-monaco/src/esql/lib/antlr_facade.ts +++ b/packages/kbn-esql-ast/src/antlr_facade.ts @@ -8,9 +8,9 @@ import { CommonTokenStream, type CharStream, type ErrorListener } from 'antlr4'; -import { default as ESQLLexer } from '../antlr/esql_lexer'; -import { default as ESQLParser } from '../antlr/esql_parser'; -import { default as ESQLParserListener } from '../antlr/esql_parser_listener'; +import { default as ESQLLexer } from './antlr/esql_lexer'; +import { default as ESQLParser } from './antlr/esql_parser'; +import { default as ESQLParserListener } from './antlr/esql_parser_listener'; export const ROOT_STATEMENT = 'singleStatement'; diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_errors.ts b/packages/kbn-esql-ast/src/ast_errors.ts similarity index 100% rename from packages/kbn-monaco/src/esql/lib/ast/ast_errors.ts rename to packages/kbn-esql-ast/src/ast_errors.ts diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_factory.ts b/packages/kbn-esql-ast/src/ast_factory.ts similarity index 98% rename from packages/kbn-monaco/src/esql/lib/ast/ast_factory.ts rename to packages/kbn-esql-ast/src/ast_factory.ts index a0801ddb2aded..48b9a055aec94 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_factory.ts +++ b/packages/kbn-esql-ast/src/ast_factory.ts @@ -28,8 +28,8 @@ import { type WhereCommandContext, default as esql_parser, type MetaCommandContext, -} from '../../antlr/esql_parser'; -import { default as ESQLParserListener } from '../../antlr/esql_parser_listener'; +} from './antlr/esql_parser'; +import { default as ESQLParserListener } from './antlr/esql_parser_listener'; import { createCommand, createFunction, diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts b/packages/kbn-esql-ast/src/ast_helpers.ts similarity index 99% rename from packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts rename to packages/kbn-esql-ast/src/ast_helpers.ts index 085c258596fc3..0f85e30b96c45 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts +++ b/packages/kbn-esql-ast/src/ast_helpers.ts @@ -16,9 +16,9 @@ import type { DecimalValueContext, IntegerValueContext, QualifiedIntegerLiteralContext, -} from '../../antlr/esql_parser'; +} from './antlr/esql_parser'; import { getPosition } from './ast_position_utils'; -import { DOUBLE_TICKS_REGEX, SINGLE_BACKTICK, TICKS_REGEX } from './shared/constants'; +import { DOUBLE_TICKS_REGEX, SINGLE_BACKTICK, TICKS_REGEX } from './constants'; import type { ESQLCommand, ESQLLiteral, diff --git a/packages/kbn-esql-ast/src/ast_parser.ts b/packages/kbn-esql-ast/src/ast_parser.ts new file mode 100644 index 0000000000000..4e7f8b3701729 --- /dev/null +++ b/packages/kbn-esql-ast/src/ast_parser.ts @@ -0,0 +1,29 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { CharStreams } from 'antlr4'; +import { ESQLErrorListener } from './antlr_error_listener'; +import { getParser, ROOT_STATEMENT } from './antlr_facade'; +import { AstListener } from './ast_factory'; +import type { ESQLAst, EditorError } from './types'; + +export async function getAstAndSyntaxErrors(text: string | undefined): Promise<{ + errors: EditorError[]; + ast: ESQLAst; +}> { + if (text == null) { + return { ast: [], errors: [] }; + } + const errorListener = new ESQLErrorListener(); + const parseListener = new AstListener(); + const parser = getParser(CharStreams.fromString(text), errorListener, parseListener); + + parser[ROOT_STATEMENT](); + + return { ...parseListener.getAst(), errors: errorListener.getErrors() }; +} diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_position_utils.ts b/packages/kbn-esql-ast/src/ast_position_utils.ts similarity index 100% rename from packages/kbn-monaco/src/esql/lib/ast/ast_position_utils.ts rename to packages/kbn-esql-ast/src/ast_position_utils.ts diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts b/packages/kbn-esql-ast/src/ast_walker.ts similarity index 99% rename from packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts rename to packages/kbn-esql-ast/src/ast_walker.ts index f9976901cdd19..05393d7b07c16 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts +++ b/packages/kbn-esql-ast/src/ast_walker.ts @@ -57,7 +57,7 @@ import { type ValueExpressionContext, ValueExpressionDefaultContext, FromIdentifierContext, -} from '../../antlr/esql_parser'; +} from './antlr/esql_parser'; import { createSource, createColumn, @@ -499,7 +499,7 @@ export function visitByOption(ctx: StatsCommandContext, expr: FieldsContext | un } export function visitOrderExpression(ctx: OrderExpressionContext[]) { - const ast = []; + const ast: ESQLAstItem[] = []; for (const orderCtx of ctx) { const expression = collectBooleanExpression(orderCtx.booleanExpression()); if (orderCtx._ordering) { diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/constants.ts b/packages/kbn-esql-ast/src/constants.ts similarity index 100% rename from packages/kbn-monaco/src/esql/lib/ast/shared/constants.ts rename to packages/kbn-esql-ast/src/constants.ts diff --git a/packages/kbn-monaco/src/esql/lib/ast/types.ts b/packages/kbn-esql-ast/src/types.ts similarity index 85% rename from packages/kbn-monaco/src/esql/lib/ast/types.ts rename to packages/kbn-esql-ast/src/types.ts index 32057a9ee3b65..4bce46d776671 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/types.ts +++ b/packages/kbn-esql-ast/src/types.ts @@ -6,8 +6,6 @@ * Side Public License, v 1. */ -import { EditorError } from '../../../types'; - export type ESQLAst = ESQLCommand[]; export type ESQLSingleAstItem = @@ -87,6 +85,17 @@ export interface ESQLMessage { code: string; } -export type AstProviderFn = ( - text: string | undefined -) => Promise<{ ast: ESQLAst; errors: EditorError[] }>; +export type AstProviderFn = (text: string | undefined) => Promise<{ + ast: ESQLAst; + errors: EditorError[]; +}>; + +export interface EditorError { + startLineNumber: number; + endLineNumber: number; + startColumn: number; + endColumn: number; + message: string; + code?: string; + severity: 'error' | 'warning' | number; +} diff --git a/packages/kbn-esql-ast/tsconfig.json b/packages/kbn-esql-ast/tsconfig.json new file mode 100644 index 0000000000000..a53bf973e2373 --- /dev/null +++ b/packages/kbn-esql-ast/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "src/**/*", + "**/*.ts", + ], + "kbn_references": [], + "exclude": [ + "target/**/*", + ] +} diff --git a/packages/kbn-esql-utils/kibana.jsonc b/packages/kbn-esql-utils/kibana.jsonc index 4dd00764681a5..959a5d947b2b8 100644 --- a/packages/kbn-esql-utils/kibana.jsonc +++ b/packages/kbn-esql-utils/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/esql-utils", - "owner": "@elastic/kibana-visualizations" + "owner": "@elastic/kibana-esql" } diff --git a/packages/kbn-esql-validation-autocomplete/BUILD.bazel b/packages/kbn-esql-validation-autocomplete/BUILD.bazel new file mode 100644 index 0000000000000..366eaa3d1a66f --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/BUILD.bazel @@ -0,0 +1,33 @@ +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") + +SRCS = glob( + [ + "**/*.ts", + ], + exclude = [ + "**/*.config.js", + "**/*.mock.*", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +SHARED_DEPS = [ + "//packages/kbn-i18n", + "@npm//js-levenshtein", +] + +js_library( + name = "kbn-esql-validation-autocomplete", + package_name = "@kbn/esql-validation-autocomplete", + srcs = ["package.json"] + SRCS, + deps = SHARED_DEPS, + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-esql-validation-autocomplete/README.md b/packages/kbn-esql-validation-autocomplete/README.md new file mode 100644 index 0000000000000..e521bbe7839d7 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/README.md @@ -0,0 +1,191 @@ +# ES|QL utility library + +## Folder structure + +This library enables all the advanced features for ES|QL, as validation, autocomplete, hover, etc... +The package is structure as follow: + +``` +src + | autocomplete // => the autocomplete/suggest service logic + | code_actions // => the quick fixes service logic + | definitions // => static assets to define all components behaviour of a ES|QL query: commands, functions, etc... + | validation // => the validation logic +``` + +### Basic usage + +#### Validation + +This module contains the validation logic useful to perform a full check of an ES|QL query string. +The validation service can be gracefully degraded leveraging the `ignoreOnMissingCallbacks` option when it is not possible to pass all callbacks: this is useful in environments where it is not possible to connect to a ES instance to retrieve more metadata, while preserving most of the validation value. +For instance, not passing the `getSources` callback will report all index mentioned in the ES|QL with the `Unknown index [...]` error, but with the `ignoreOnMissingCallbacks` option enabled this type of errors will be muted. + +##### Usage + +```js +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import { validateQuery } from '@kbn/esql-validation-autocomplete'; + +// define all callbacks +const myCallbacks = { + getSources: async () => [{name: 'index', hidden: false}], + ... +}; + +// Full validation performed +const { errors, warnings } = await validateQuery("from index | stats 1 + avg(myColumn)", getAstAndSyntaxErrors, undefined, myCallbacks); +``` + +If not all callbacks are available it is possible to gracefully degradate the validation experience with the `ignoreOnMissingCallbacks` option: + +```js +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import { validateQuery } from '@kbn/esql-validation-autocomplete'; + +// define only the getSources callback +const myCallbacks = { + getSources: async () => [{name: 'index', hidden: false}], +}; + +// ignore errors that might be triggered by the lack of some callbacks (i.e. "Unknown columns", etc...) +const { errors, warnings } = await validateQuery( + "from index | stats 1 + avg(myColumn)", + getAstAndSyntaxErrors, + { ignoreOnMissingCallbacks: true }, + myCallbacks +); +``` + +#### Autocomplete + +This is the complete logic for the ES|QL autocomplete language, it is completely indepedent from the actual editor (i.e. Monaco) and the suggestions reported need to be wrapped against the specific editor shape. + +```js +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import { suggest } from '@kbn/esql-validation-autocomplete'; + +const queryString = "from index | stats 1 + avg(myColumn) "; +const myCallbacks = { + getSources: async () => [{name: 'index', hidden: false}], + ... +}; + +const suggestions = await suggest( + queryString, + queryString.length - 1, // the cursor position in a single line context + { triggerCharacter: " "; triggerKind: 1 }, // kind = 0 is a programmatic trigger, while other values are ignored + getAstAndSyntaxErrors, + myCallbacks +); + +// Log the actual text to be injected as suggestion +console.log(suggestions.map(({text}) => text)); + +// for Monaco editor it is required to map each suggestion with the editor specific type +suggestions.map( s => ({ + label: s.label, + insertText: s.text, + insertTextRules: asSnippet + ? monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet + : undefined, + ... + })) +``` + +Note that the autocomplete service will work as best effort with invalid queries, trying to correct them on the fly before generating the suggestions. In case an invalid query cannot be handled an empty suggestion result set will be returned. + +#### Quick fixes + +This feature provides a list of suggestions to propose as fixes for a subset of validation errors. +The feature works in combination with the validation service. + +```js +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import { validateQuery, getActions } from '@kbn/esql-validation-autocomplete'; + +const queryString = "from index2 | stats 1 + avg(myColumn)" + +const myCallbacks = { + getSources: async () => [{name: 'index', hidden: false}], + ... +}; +const { errors, warnings } = await validateQuery(queryString, getAstAndSyntaxErrors, undefined, myCallbacks); + +const {title, edits} = await getActions( + queryString, + errors, + getAstAndSyntaxErrors, + myCallbacks +); + +// log the title of the fix suggestion and the proposed change +// in this example it should suggest to change from "index2" to "index" +console.log({ title, edits }); +``` + +### getAstContext + +This is an important function in order to build more features on top of the existing one. +For instance to show contextual information on Hover the `getAstContext` function can be leveraged to get the correct context for the cursor position: + +```js +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import { getAstContext } from '@kbn/esql-validation-autocomplete'; + +const queryString = "from index2 | stats 1 + avg(myColumn)"; +const offset = queryString.indexOf("avg"); + +const astContext = getAstContext(queryString, getAstAndSyntaxErrors(queryString), offset); + +if(astContext.type === "function"){ + const fnNode = astContext.node; + const fnDefinition = getFunctionDefinition(fnNode.name); + + // show something like "avg( field: number ): number" + console.log(getFunctionSignature(fnDefinition)); +} +``` + + +### How does it work + +The general idea of this package is to provide all ES|QL features on top of a custom compact AST definition (all data structure types defined in `@kbn/esql-ast`) which is designed to be resilient to many grammar changes. +The pipeline is the following: + +``` +Antlr grammar files +=> Compiled grammar files (.ts assets in the antlr folder) +=> AST Factory (Antlr Parser tree => custom AST) +=> featureFn( AST, Definitions, ESQLCallbacks ) +``` + +Each feature function works with the combination of the AST and the definition files: the former describe the current statement in a easy to traverse way, while the definitions describe what's the expected behaviour of each node in the AST node (i.e. what arguments should it accept? How many arguments? etc...). +ESQLCallbacks are a set of utilities to retrieve context metadata like fields/index/policies list and policies metadata. + +While AST requires the grammar to be compiled to be updated, definitions are static files which can be dynamically updated without running the ANTLR compile task. + +#### Validation + +Validation takes an AST as input and generates a list of messages to show to the user. +The validation function leverages the definition files to check if the current AST is respecting the defined behaviour. +Most of the logic rely purely on the definitions, but in some specific cases some ad-hoc conditions are defined within the code for specific commands/options. +The validation test suite generates a set of fixtures at the end of its execution, which are then re-used for other test suites (i.e. some FTR integration tests) as `esql_validation_meta_tests.json`. + +#### Autocomplete + +The autocomplete/suggest task takes a query as input together with the current cursor position, then produces internally an AST to work with, to generate a list of suggestions for the given query. +Note that autocomplete works most of the time with incomplete/invalid queries, so some logic to manipulate the query into something valid (see the `EDITOR_MARKER` or the `countBracketsUnclosed` functions for more). + +Once the AST is produced there's a `getAstContext` function that finds the cursor position node (and its parent command), together with some hint like the type of current context: `expression`, `function`, `newCommand`, `option`. +The most complex case is the `expression` as it can cover a moltitude of cases. The function is highly commented in order to identify the specific cases, but there's probably some obscure area still to comment/clarify. + +### Adding new commands/options/functions/erc... + +To update the definitions: +1. open either approriate definition file within the `definitions` folder and add a new entry to the relative array +2. write new tests for validation and autocomplete + * if a new function is added tests are automatically generated fro both validation and autocomplete with some standard checks + * if a new function requires a new field types, make sure to add the new type to the initial part of the test file + * this will be automatically picked up by the test generator to produce new test cases + * if a new function requires a new type of test, make sure to write it manually \ No newline at end of file diff --git a/packages/kbn-esql-validation-autocomplete/index.ts b/packages/kbn-esql-validation-autocomplete/index.ts new file mode 100644 index 0000000000000..ade1b1fd9f73b --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/index.ts @@ -0,0 +1,76 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +export type { SuggestionRawDefinition, ItemKind } from './src/autocomplete/types'; +export type { CodeAction } from './src/code_actions/types'; +export type { + FunctionDefinition, + CommandDefinition, + CommandOptionsDefinition, + CommandModeDefinition, + Literals, +} from './src/definitions/types'; +export type { ESQLCallbacks } from './src/shared/types'; + +/** + * High level functions + */ + +// Given an the query string, its AST and the cursor position, it returns the node and some context information +export { getAstContext } from './src/shared/context'; +// Validation function +export { validateQuery } from './src/validation/validation'; +// Autocomplete function +export { suggest } from './src/autocomplete/autocomplete'; +// Quick fixes function +export { getActions } from './src/code_actions/actions'; + +/** + * Some utility functions that can be useful to build more feature + * for the ES|QL language + */ +export type { + ValidationErrors, + ESQLVariable, + ESQLRealField, + ESQLPolicy, + ErrorTypes as ESQLValidationErrorTypes, +} from './src/validation/types'; +export { collectVariables } from './src/shared/variables'; +export { + getAllFunctions, + isSupportedFunction, + getFunctionDefinition, + getCommandDefinition, + getAllCommands, + getCommandOption, + getColumnHit, + columnExists, + shouldBeQuotedText, + printFunctionSignature, + isEqualType, + isSourceItem, + isSettingItem, + isFunctionItem, + isOptionItem, + isColumnItem, + isLiteralItem, + isTimeIntervalItem, + isAssignment, + isExpression, + isAssignmentComplete, + isSingleItem, +} from './src/shared/helpers'; +export { ENRICH_MODES } from './src/definitions/settings'; +export { getFunctionSignatures } from './src/definitions/helpers'; + +export { + getFieldsByTypeHelper, + getPolicyHelper, + getSourcesHelper, +} from './src/shared/resources_helpers'; diff --git a/packages/kbn-esql-validation-autocomplete/jest.config.js b/packages/kbn-esql-validation-autocomplete/jest.config.js new file mode 100644 index 0000000000000..a9f9d1421b634 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/jest.config.js @@ -0,0 +1,13 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../..', + roots: ['/packages/kbn-esql-validation-autocomplete'], +}; diff --git a/packages/kbn-esql-validation-autocomplete/kibana.jsonc b/packages/kbn-esql-validation-autocomplete/kibana.jsonc new file mode 100644 index 0000000000000..b7c1d12d48cd1 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/esql-validation-autocomplete", + "owner": "@elastic/kibana-esql" + } \ No newline at end of file diff --git a/packages/kbn-esql-validation-autocomplete/package.json b/packages/kbn-esql-validation-autocomplete/package.json new file mode 100644 index 0000000000000..1589e4aaba238 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/package.json @@ -0,0 +1,7 @@ +{ + "name": "@kbn/esql-validation-autocomplete", + "version": "1.0.0", + "private": true, + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false + } \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts similarity index 94% rename from packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts rename to packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index fc0508fc1582d..b31ca967c55fb 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -6,12 +6,7 @@ * Side Public License, v 1. */ -import { monaco } from '../../../../monaco_imports'; -import { CharStreams } from 'antlr4'; import { suggest } from './autocomplete'; -import { getParser, ROOT_STATEMENT } from '../../antlr_facade'; -import { ESQLErrorListener } from '../../monaco/esql_error_listener'; -import { AstListener } from '../ast_factory'; import { evalFunctionsDefinitions } from '../definitions/functions'; import { builtinFunctions } from '../definitions/builtin'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; @@ -19,6 +14,7 @@ import { chronoLiterals, timeLiterals } from '../definitions/literals'; import { commandDefinitions } from '../definitions/commands'; import { TRIGGER_SUGGESTION_COMMAND } from './factories'; import { camelCase } from 'lodash'; +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; const triggerCharacters = [',', '(', '=', ' ']; @@ -180,13 +176,6 @@ function createCustomCallbackMocks( }; } -function createModelAndPosition(text: string, offset: number) { - return { - model: { getValue: () => text } as monaco.editor.ITextModel, - position: { lineNumber: 1, column: offset } as monaco.Position, - }; -} - function createSuggestContext(text: string, triggerCharacter?: string) { if (triggerCharacter) { return { triggerCharacter, triggerKind: 1 }; // any number is fine here @@ -209,16 +198,6 @@ function getPolicyFields(policyName: string) { } describe('autocomplete', () => { - const getAstAndErrors = async (text: string) => { - const errorListener = new ESQLErrorListener(); - const parseListener = new AstListener(); - const parser = getParser(CharStreams.fromString(text), errorListener, parseListener); - - parser[ROOT_STATEMENT](); - - return { ...parseListener.getAst(), errors: [] }; - }; - type TestArgs = [ string, string[], @@ -244,7 +223,7 @@ describe('autocomplete', () => { const context = createSuggestContext(statement, triggerCharacterString); const offset = typeof triggerCharacter === 'string' - ? statement.lastIndexOf(context.triggerCharacter) + 2 + ? statement.lastIndexOf(context.triggerCharacter) + 1 : triggerCharacter; const testFn = only ? test.only : skip ? test.skip : test; @@ -254,20 +233,20 @@ describe('autocomplete', () => { )}"]`, async () => { const callbackMocks = createCustomCallbackMocks(...customCallbacksArgs); - const { model, position } = createModelAndPosition(statement, offset); const suggestions = await suggest( - model, - position, + statement, + offset, context, - async (text) => (text ? await getAstAndErrors(text) : { ast: [], errors: [] }), + async (text) => (text ? await getAstAndSyntaxErrors(text) : { ast: [], errors: [] }), callbackMocks ); - expect( - suggestions - // simulate the editor behaviour for sorting suggestions - .sort((a, b) => (a.sortText || '').localeCompare(b.sortText || '')) - .map((i) => i.insertText) - ).toEqual(expected); + const suggestionInertTextSorted = suggestions + // simulate the editor behaviour for sorting suggestions + .sort((a, b) => (a.sortText || '').localeCompare(b.sortText || '')) + .map((i) => i.text); + for (const [index, receivedSuggestion] of suggestionInertTextSorted.entries()) { + expect(receivedSuggestion).toEqual(expected[index]); + } } ); }; @@ -340,11 +319,11 @@ describe('autocomplete', () => { testSuggestions('from a,', suggestedIndexes); testSuggestions('from a, b ', ['metadata $0', ',', '|']); testSuggestions('from *,', suggestedIndexes); - testSuggestions('from index', suggestedIndexes, 6 /* index index in from */); - testSuggestions('from a, b [metadata ]', ['_index', '_score'], 20); - testSuggestions('from a, b metadata ', ['_index', '_score'], 19); - testSuggestions('from a, b [metadata _index, ]', ['_score'], 27); - testSuggestions('from a, b metadata _index, ', ['_score'], 26); + testSuggestions('from index', suggestedIndexes, 5 /* space before index */); + testSuggestions('from a, b [metadata ]', ['_index', '_score'], ' ]'); + testSuggestions('from a, b metadata ', ['_index', '_score'], ' '); + testSuggestions('from a, b [metadata _index, ]', ['_score'], ' ]'); + testSuggestions('from a, b metadata _index, ', ['_score'], ' '); }); describe('show', () => { @@ -645,7 +624,7 @@ describe('autocomplete', () => { evalMath: true, }), ], - 32 + '(' ); testSuggestions('from a | eval var0=round(b), var1=round(c) | stats ', [ @@ -657,18 +636,14 @@ describe('autocomplete', () => { ]); // smoke testing with suggestions not at the end of the string - testSuggestions( - 'from a | stats a = min(b) | sort b', - ['by $0', ',', '|'], - 27 /* " " after min(b) */ - ); + testSuggestions('from a | stats a = min(b) | sort b', ['by $0', ',', '|'], ') '); testSuggestions( 'from a | stats avg(b) by stringField', [ ...getFieldNamesByType('number'), ...getFunctionSignaturesByReturnType('eval', 'number', { evalMath: true }), ], - 21 /* b column in avg */ + '(b' ); // while nested functions are not suggested, complete them should be possible via suggestions @@ -712,7 +687,7 @@ describe('autocomplete', () => { 'round', ]), ], - 27 + '(' ); testSuggestions( 'from a | stats avg(round(', @@ -722,7 +697,7 @@ describe('autocomplete', () => { 'round', ]), ], - 26 + '(' ); testSuggestions( 'from a | stats avg(', @@ -740,7 +715,7 @@ describe('autocomplete', () => { 'round', ]), ], - 26 + '(' ); }); @@ -1159,12 +1134,11 @@ describe('autocomplete', () => { const statement = 'from a | drop stringField | eval var0 = abs(numberField) '; const triggerOffset = statement.lastIndexOf(' '); const context = createSuggestContext(statement, statement[triggerOffset]); - const { model, position } = createModelAndPosition(statement, triggerOffset + 2); await suggest( - model, - position, + statement, + triggerOffset + 1, context, - async (text) => (text ? await getAstAndErrors(text) : { ast: [], errors: [] }), + async (text) => (text ? await getAstAndSyntaxErrors(text) : { ast: [], errors: [] }), callbackMocks ); expect(callbackMocks.getFieldsFor).toHaveBeenCalledWith({ @@ -1176,12 +1150,11 @@ describe('autocomplete', () => { const statement = 'from a | drop | eval var0 = abs(numberField) '; const triggerOffset = statement.lastIndexOf('p') + 1; // drop const context = createSuggestContext(statement, statement[triggerOffset]); - const { model, position } = createModelAndPosition(statement, triggerOffset + 2); await suggest( - model, - position, + statement, + triggerOffset + 1, context, - async (text) => (text ? await getAstAndErrors(text) : { ast: [], errors: [] }), + async (text) => (text ? await getAstAndSyntaxErrors(text) : { ast: [], errors: [] }), callbackMocks ); expect(callbackMocks.getFieldsFor).toHaveBeenCalledWith({ query: 'from a' }); @@ -1193,12 +1166,11 @@ describe('autocomplete', () => { const callbackMocks = createCustomCallbackMocks(undefined, undefined, undefined); const triggerOffset = statement.lastIndexOf(' ') + 1; // drop const context = createSuggestContext(statement, statement[triggerOffset]); - const { model, position } = createModelAndPosition(statement, triggerOffset + 2); return suggest( - model, - position, + statement, + triggerOffset + 1, context, - async (text) => (text ? await getAstAndErrors(text) : { ast: [], errors: [] }), + async (text) => (text ? await getAstAndSyntaxErrors(text) : { ast: [], errors: [] }), callbackMocks ); } @@ -1207,12 +1179,14 @@ describe('autocomplete', () => { // test that all functions will retrigger suggestions expect( suggestions - .filter(({ kind }) => kind === 1) + .filter(({ kind }) => kind === 'Function') .every(({ command }) => command === TRIGGER_SUGGESTION_COMMAND) ).toBeTruthy(); // now test that non-function won't retrigger expect( - suggestions.filter(({ kind }) => kind !== 1).every(({ command }) => command == null) + suggestions + .filter(({ kind }) => kind !== 'Function') + .every(({ command }) => command == null) ).toBeTruthy(); }); it('should trigger further suggestions for commands', async () => { diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts similarity index 97% rename from packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts rename to packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index ea849879567b5..84c5f59f49c31 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -7,9 +7,15 @@ */ import uniqBy from 'lodash/uniqBy'; -import type { monaco } from '../../../../monaco_imports'; -import type { AutocompleteCommandDefinition } from './types'; -import { nonNullable } from '../ast_helpers'; +import type { + AstProviderFn, + ESQLAstItem, + ESQLCommand, + ESQLCommandOption, + ESQLFunction, + ESQLSingleAstItem, +} from '@kbn/esql-ast'; +import type { EditorContext, SuggestionRawDefinition } from './types'; import { columnExists, getColumnHit, @@ -32,19 +38,11 @@ import { isSettingItem, isSourceItem, isTimeIntervalItem, - monacoPositionToOffset, getAllFunctions, isSingleItem, + nonNullable, } from '../shared/helpers'; import { collectVariables, excludeVariablesFromCurrentCommand } from '../shared/variables'; -import type { - AstProviderFn, - ESQLAstItem, - ESQLCommand, - ESQLCommandOption, - ESQLFunction, - ESQLSingleAstItem, -} from '../types'; import type { ESQLPolicy, ESQLRealField, ESQLVariable, ReferenceMaps } from '../validation/types'; import { colonCompleteItem, @@ -82,13 +80,13 @@ import { import { ESQLCallbacks } from '../shared/types'; import { getFunctionsToIgnoreForStats, isAggFunctionUsedAlready } from './helper'; -type GetSourceFn = () => Promise; +type GetSourceFn = () => Promise; type GetFieldsByTypeFn = ( type: string | string[], ignored?: string[] -) => Promise; +) => Promise; type GetFieldsMapFn = () => Promise>; -type GetPoliciesFn = () => Promise; +type GetPoliciesFn = () => Promise; type GetPolicyMetadataFn = (name: string) => Promise; type GetMetaFieldsFn = () => Promise; @@ -147,15 +145,12 @@ function countBracketsUnclosed(bracketType: '(' | '[', text: string) { } export async function suggest( - model: monaco.editor.ITextModel, - position: monaco.Position, - context: monaco.languages.CompletionContext, + fullText: string, + offset: number, + context: EditorContext, astProvider: AstProviderFn, resourceRetriever?: ESQLCallbacks -): Promise { - // take the full text but then slice it to the current position - const fullText = model.getValue(); - const offset = monacoPositionToOffset(fullText, position); +): Promise { const innerText = fullText.substring(0, offset); let finalText = innerText; @@ -564,7 +559,7 @@ async function getExpressionSuggestionsByType( const references = { fields: fieldsMap, variables: anyVariables }; - const suggestions: AutocompleteCommandDefinition[] = []; + const suggestions: SuggestionRawDefinition[] = []; // in this flow there's a clear plan here from argument definitions so try to follow it if (argDef) { @@ -877,8 +872,8 @@ async function getExpressionSuggestionsByType( } } // Due to some logic overlapping functions can be repeated - // so dedupe here based on insertText string (it can differ from name) - return uniqBy(suggestions, (suggestion) => suggestion.insertText); + // so dedupe here based on text string (it can differ from name) + return uniqBy(suggestions, (suggestion) => suggestion.text); } async function getBuiltinFunctionNextArgument( @@ -965,7 +960,7 @@ async function getBuiltinFunctionNextArgument( return suggestions; } -function pushItUpInTheList(suggestions: AutocompleteCommandDefinition[], shouldPromote: boolean) { +function pushItUpInTheList(suggestions: SuggestionRawDefinition[], shouldPromote: boolean) { if (!shouldPromote) { return suggestions; } @@ -996,9 +991,9 @@ async function getFieldsOrFunctionsSuggestions( ignoreFn?: string[]; ignoreFields?: string[]; } = {} -): Promise { +): Promise { const filteredFieldsByType = pushItUpInTheList( - (await (fields ? getFieldsByType(types, ignoreFields) : [])) as AutocompleteCommandDefinition[], + (await (fields ? getFieldsByType(types, ignoreFields) : [])) as SuggestionRawDefinition[], functions ); @@ -1058,7 +1053,7 @@ async function getFunctionArgsSuggestions( getFieldsByType: GetFieldsByTypeFn, getFieldsMap: GetFieldsMapFn, getPolicyMetadata: GetPolicyMetadataFn -): Promise { +): Promise { const fnDefinition = getFunctionDefinition(node.name); // early exit on no hit if (!fnDefinition) { @@ -1183,19 +1178,18 @@ async function getFunctionArgsSuggestions( suggestion !== commaCompleteItem ? { ...suggestion, - insertText: + text: hasMoreMandatoryArgs && fnDefinition.type !== 'builtin' - ? `${suggestion.insertText},` - : suggestion.insertText, + ? `${suggestion.text},` + : suggestion.text, } : suggestion ); } - return suggestions.map(({ insertText, ...rest }) => ({ + return suggestions.map(({ text, ...rest }) => ({ ...rest, - insertText: - hasMoreMandatoryArgs && fnDefinition.type !== 'builtin' ? `${insertText},` : insertText, + text: hasMoreMandatoryArgs && fnDefinition.type !== 'builtin' ? `${text},` : text, })); } diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/complete_items.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/complete_items.ts similarity index 70% rename from packages/kbn-monaco/src/esql/lib/ast/autocomplete/complete_items.ts rename to packages/kbn-esql-validation-autocomplete/src/autocomplete/complete_items.ts index 5b2d66c309b0f..8dcb8bff6dbc6 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/complete_items.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/complete_items.ts @@ -7,36 +7,36 @@ */ import { i18n } from '@kbn/i18n'; -import type { AutocompleteCommandDefinition } from './types'; +import type { SuggestionRawDefinition } from './types'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; import { builtinFunctions } from '../definitions/builtin'; import { evalFunctionsDefinitions } from '../definitions/functions'; import { getAllCommands } from '../shared/helpers'; import { - getAutocompleteFunctionDefinition, - getAutocompleteBuiltinDefinition, - getAutocompleteCommandDefinition, + getSuggestionFunctionDefinition, + getSuggestionBuiltinDefinition, + getSuggestionCommandDefinition, TRIGGER_SUGGESTION_COMMAND, buildConstantsDefinitions, } from './factories'; -export const mathCommandDefinition: AutocompleteCommandDefinition[] = evalFunctionsDefinitions.map( - getAutocompleteFunctionDefinition +export const mathCommandDefinition: SuggestionRawDefinition[] = evalFunctionsDefinitions.map( + getSuggestionFunctionDefinition ); -export const aggregationFunctionsDefinitions: AutocompleteCommandDefinition[] = - statsAggregationFunctionDefinitions.map(getAutocompleteFunctionDefinition); +export const aggregationFunctionsDefinitions: SuggestionRawDefinition[] = + statsAggregationFunctionDefinitions.map(getSuggestionFunctionDefinition); export function getAssignmentDefinitionCompletitionItem() { const assignFn = builtinFunctions.find(({ name }) => name === '=')!; - return getAutocompleteBuiltinDefinition(assignFn); + return getSuggestionBuiltinDefinition(assignFn); } export const getNextTokenForNot = ( command: string, option: string | undefined, argType: string -): AutocompleteCommandDefinition[] => { +): SuggestionRawDefinition[] => { const compatibleFunctions = builtinFunctions.filter( ({ name, supportedCommands, supportedOptions, ignoreAsSuggestion }) => !ignoreAsSuggestion && @@ -47,14 +47,14 @@ export const getNextTokenForNot = ( // suggest IS, LIKE, RLIKE and TRUE/FALSE return compatibleFunctions .filter(({ name }) => name === 'like' || name === 'rlike' || name === 'in') - .map(getAutocompleteBuiltinDefinition); + .map(getSuggestionBuiltinDefinition); } if (argType === 'boolean') { // suggest IS, NOT and TRUE/FALSE return [ ...compatibleFunctions .filter(({ name }) => name === 'in') - .map(getAutocompleteBuiltinDefinition), + .map(getSuggestionBuiltinDefinition), ...buildConstantsDefinitions(['true', 'false']), ]; } @@ -67,7 +67,7 @@ export const getBuiltinCompatibleFunctionDefinition = ( argType: string, returnTypes?: string[], { skipAssign }: { skipAssign?: boolean } = {} -): AutocompleteCommandDefinition[] => { +): SuggestionRawDefinition[] => { const compatibleFunctions = builtinFunctions.filter( ({ name, supportedCommands, supportedOptions, signatures, ignoreAsSuggestion }) => !ignoreAsSuggestion && @@ -80,7 +80,7 @@ export const getBuiltinCompatibleFunctionDefinition = ( ) ); if (!returnTypes) { - return compatibleFunctions.map(getAutocompleteBuiltinDefinition); + return compatibleFunctions.map(getSuggestionBuiltinDefinition); } return compatibleFunctions .filter((mathDefinition) => @@ -88,29 +88,29 @@ export const getBuiltinCompatibleFunctionDefinition = ( (signature) => returnTypes[0] === 'any' || returnTypes.includes(signature.returnType) ) ) - .map(getAutocompleteBuiltinDefinition); + .map(getSuggestionBuiltinDefinition); }; -export const commandAutocompleteDefinitions: AutocompleteCommandDefinition[] = getAllCommands().map( - getAutocompleteCommandDefinition +export const commandAutocompleteDefinitions: SuggestionRawDefinition[] = getAllCommands().map( + getSuggestionCommandDefinition ); function buildCharCompleteItem( label: string, detail: string, { sortText, quoted }: { sortText?: string; quoted: boolean } = { quoted: false } -): AutocompleteCommandDefinition { +): SuggestionRawDefinition { return { label, - insertText: quoted ? `"${label}"` : label, - kind: 11, + text: quoted ? `"${label}"` : label, + kind: 'Operator', detail, sortText, }; } export const pipeCompleteItem = buildCharCompleteItem( '|', - i18n.translate('monaco.esql.autocomplete.pipeDoc', { + i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.pipeDoc', { defaultMessage: 'Pipe (|)', }), { sortText: 'C', quoted: false } @@ -118,7 +118,7 @@ export const pipeCompleteItem = buildCharCompleteItem( export const commaCompleteItem = buildCharCompleteItem( ',', - i18n.translate('monaco.esql.autocomplete.commaDoc', { + i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.commaDoc', { defaultMessage: 'Comma (,)', }), { sortText: 'B', quoted: false } @@ -126,25 +126,25 @@ export const commaCompleteItem = buildCharCompleteItem( export const colonCompleteItem = buildCharCompleteItem( ':', - i18n.translate('monaco.esql.autocomplete.colonDoc', { + i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.colonDoc', { defaultMessage: 'Colon (:)', }), { sortText: 'A', quoted: true } ); export const semiColonCompleteItem = buildCharCompleteItem( ';', - i18n.translate('monaco.esql.autocomplete.semiColonDoc', { + i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.semiColonDoc', { defaultMessage: 'Semi colon (;)', }), { sortText: 'A', quoted: true } ); -export const listCompleteItem: AutocompleteCommandDefinition = { +export const listCompleteItem: SuggestionRawDefinition = { label: '( ... )', - insertText: '( $0 )', - insertTextRules: 4, - kind: 11, - detail: i18n.translate('monaco.esql.autocomplete.listDoc', { + text: '( $0 )', + asSnippet: true, + kind: 'Operator', + detail: i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.listDoc', { defaultMessage: 'List of items ( ...)', }), sortText: 'A', diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/documentation_util.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/documentation_util.ts similarity index 79% rename from packages/kbn-monaco/src/esql/lib/ast/autocomplete/documentation_util.ts rename to packages/kbn-esql-validation-autocomplete/src/autocomplete/documentation_util.ts index 0166c94210f8d..0e46046320430 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/documentation_util.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/documentation_util.ts @@ -8,13 +8,19 @@ import { i18n } from '@kbn/i18n'; -const declarationLabel = i18n.translate('monaco.esql.autocomplete.declarationLabel', { - defaultMessage: 'Declaration:', -}); +const declarationLabel = i18n.translate( + 'kbn-esql-validation-autocomplete.esql.autocomplete.declarationLabel', + { + defaultMessage: 'Declaration:', + } +); -const examplesLabel = i18n.translate('monaco.esql.autocomplete.examplesLabel', { - defaultMessage: 'Examples:', -}); +const examplesLabel = i18n.translate( + 'kbn-esql-validation-autocomplete.esql.autocomplete.examplesLabel', + { + defaultMessage: 'Examples:', + } +); /** @internal */ export const buildFunctionDocumentation = ( diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/factories.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts similarity index 66% rename from packages/kbn-monaco/src/esql/lib/ast/autocomplete/factories.ts rename to packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts index a51a754ef1b2e..1c03619c3876f 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/factories.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; -import { AutocompleteCommandDefinition } from './types'; +import { SuggestionRawDefinition } from './types'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; import { evalFunctionsDefinitions } from '../definitions/functions'; import { getFunctionSignatures, getCommandSignature } from '../definitions/helpers'; @@ -35,13 +35,13 @@ function getSafeInsertText(text: string, options: { dashSupported?: boolean } = : text; } -export function getAutocompleteFunctionDefinition(fn: FunctionDefinition) { +export function getSuggestionFunctionDefinition(fn: FunctionDefinition): SuggestionRawDefinition { const fullSignatures = getFunctionSignatures(fn); return { label: fullSignatures[0].declaration, - insertText: `${fn.name}($0)`, - insertTextRules: 4, // monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, - kind: 1, + text: `${fn.name}($0)`, + asSnippet: true, + kind: 'Function', detail: fn.description, documentation: { value: buildFunctionDocumentation(fullSignatures), @@ -53,15 +53,13 @@ export function getAutocompleteFunctionDefinition(fn: FunctionDefinition) { }; } -export function getAutocompleteBuiltinDefinition( - fn: FunctionDefinition -): AutocompleteCommandDefinition { +export function getSuggestionBuiltinDefinition(fn: FunctionDefinition): SuggestionRawDefinition { const hasArgs = fn.signatures.some(({ params }) => params.length > 1); return { label: fn.name, - insertText: hasArgs ? `${fn.name} $0` : fn.name, - ...(hasArgs ? { insertTextRules: 4 } : {}), // monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, - kind: 11, + text: hasArgs ? `${fn.name} $0` : fn.name, + ...(hasArgs ? { insertTextRules: 4 } : {}), // kbn-esql-validation-autocomplete.languages.CompletionItemInsertTextRule.InsertAsSnippet, + kind: 'Operator', detail: fn.description, documentation: { value: '', @@ -76,14 +74,14 @@ export const getCompatibleFunctionDefinition = ( option: string | undefined, returnTypes?: string[], ignored: string[] = [] -): AutocompleteCommandDefinition[] => { +): SuggestionRawDefinition[] => { const fnSupportedByCommand = allFunctions.filter( ({ name, supportedCommands, supportedOptions }) => (option ? supportedOptions?.includes(option) : supportedCommands.includes(command)) && !ignored.includes(name) ); if (!returnTypes) { - return fnSupportedByCommand.map(getAutocompleteFunctionDefinition); + return fnSupportedByCommand.map(getSuggestionFunctionDefinition); } return fnSupportedByCommand .filter((mathDefinition) => @@ -91,21 +89,21 @@ export const getCompatibleFunctionDefinition = ( (signature) => returnTypes[0] === 'any' || returnTypes.includes(signature.returnType) ) ) - .map(getAutocompleteFunctionDefinition); + .map(getSuggestionFunctionDefinition); }; -export function getAutocompleteCommandDefinition( +export function getSuggestionCommandDefinition( command: CommandDefinition -): AutocompleteCommandDefinition { +): SuggestionRawDefinition { const commandDefinition = getCommandDefinition(command.name); const commandSignature = getCommandSignature(commandDefinition); return { label: commandDefinition.name, - insertText: commandDefinition.signature.params.length + text: commandDefinition.signature.params.length ? `${commandDefinition.name} $0` : commandDefinition.name, - insertTextRules: 4, // monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, - kind: 0, + asSnippet: true, + kind: 'Method', detail: commandDefinition.description, documentation: { value: buildDocumentation(commandSignature.declaration, commandSignature.examples), @@ -115,34 +113,37 @@ export function getAutocompleteCommandDefinition( }; } -export const buildFieldsDefinitions = (fields: string[]): AutocompleteCommandDefinition[] => +export const buildFieldsDefinitions = (fields: string[]): SuggestionRawDefinition[] => fields.map((label) => ({ label, - insertText: getSafeInsertText(label), - kind: 4, - detail: i18n.translate('monaco.esql.autocomplete.fieldDefinition', { + text: getSafeInsertText(label), + kind: 'Variable', + detail: i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.fieldDefinition', { defaultMessage: `Field specified by the input table`, }), sortText: 'D', })); -export const buildVariablesDefinitions = (variables: string[]): AutocompleteCommandDefinition[] => +export const buildVariablesDefinitions = (variables: string[]): SuggestionRawDefinition[] => variables.map((label) => ({ label, - insertText: label, - kind: 4, - detail: i18n.translate('monaco.esql.autocomplete.variableDefinition', { - defaultMessage: `Variable specified by the user within the ES|QL query`, - }), + text: label, + kind: 'Variable', + detail: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.autocomplete.variableDefinition', + { + defaultMessage: `Variable specified by the user within the ES|QL query`, + } + ), sortText: 'D', })); -export const buildSourcesDefinitions = (sources: string[]): AutocompleteCommandDefinition[] => +export const buildSourcesDefinitions = (sources: string[]): SuggestionRawDefinition[] => sources.map((label) => ({ label, - insertText: getSafeInsertText(label, { dashSupported: true }), - kind: 21, - detail: i18n.translate('monaco.esql.autocomplete.sourceDefinition', { + text: getSafeInsertText(label, { dashSupported: true }), + kind: 'Reference', + detail: i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.sourceDefinition', { defaultMessage: `Index`, }), sortText: 'A', @@ -151,25 +152,25 @@ export const buildSourcesDefinitions = (sources: string[]): AutocompleteCommandD export const buildConstantsDefinitions = ( userConstants: string[], detail?: string -): AutocompleteCommandDefinition[] => +): SuggestionRawDefinition[] => userConstants.map((label) => ({ label, - insertText: label, - kind: 14, + text: label, + kind: 'Constant', detail: detail ?? - i18n.translate('monaco.esql.autocomplete.constantDefinition', { + i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.constantDefinition', { defaultMessage: `Constant`, }), sortText: 'A', })); -export const buildNewVarDefinition = (label: string): AutocompleteCommandDefinition => { +export const buildNewVarDefinition = (label: string): SuggestionRawDefinition => { return { label, - insertText: `${label} =`, - kind: 21, - detail: i18n.translate('monaco.esql.autocomplete.newVarDoc', { + text: `${label} =`, + kind: 'Variable', + detail: i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.newVarDoc', { defaultMessage: 'Define a new variable', }), sortText: '1', @@ -178,12 +179,12 @@ export const buildNewVarDefinition = (label: string): AutocompleteCommandDefinit export const buildPoliciesDefinitions = ( policies: Array<{ name: string; sourceIndices: string[] }> -): AutocompleteCommandDefinition[] => +): SuggestionRawDefinition[] => policies.map(({ name: label, sourceIndices }) => ({ label, - insertText: getSafeInsertText(label, { dashSupported: true }), - kind: 5, - detail: i18n.translate('monaco.esql.autocomplete.policyDefinition', { + text: getSafeInsertText(label, { dashSupported: true }), + kind: 'Class', + detail: i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.policyDefinition', { defaultMessage: `Policy defined on {count, plural, one {index} other {indices}}: {indices}`, values: { count: sourceIndices.length, @@ -196,17 +197,20 @@ export const buildPoliciesDefinitions = ( export const buildMatchingFieldsDefinition = ( matchingField: string, fields: string[] -): AutocompleteCommandDefinition[] => +): SuggestionRawDefinition[] => fields.map((label) => ({ label, - insertText: label, - kind: 4, - detail: i18n.translate('monaco.esql.autocomplete.matchingFieldDefinition', { - defaultMessage: `Use to match on {matchingField} on the policy`, - values: { - matchingField, - }, - }), + text: label, + kind: 'Variable', + detail: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.autocomplete.matchingFieldDefinition', + { + defaultMessage: `Use to match on {matchingField} on the policy`, + values: { + matchingField, + }, + } + ), sortText: 'D', })); @@ -214,16 +218,16 @@ export const buildOptionDefinition = ( option: CommandOptionsDefinition, isAssignType: boolean = false ) => { - const completeItem: AutocompleteCommandDefinition = { + const completeItem: SuggestionRawDefinition = { label: option.name, - insertText: option.name, - kind: 21, + text: option.name, + kind: 'Reference', detail: option.description, sortText: '1', }; if (isAssignType || option.signature.params.length) { - completeItem.insertText = isAssignType ? `${option.name} = $0` : `${option.name} $0`; - completeItem.insertTextRules = 4; // monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet; + completeItem.text = isAssignType ? `${option.name} = $0` : `${option.name} $0`; + completeItem.asSnippet = true; completeItem.command = TRIGGER_SUGGESTION_COMMAND; } return completeItem; @@ -231,32 +235,35 @@ export const buildOptionDefinition = ( export const buildSettingDefinitions = ( setting: CommandModeDefinition -): AutocompleteCommandDefinition[] => { +): SuggestionRawDefinition[] => { // for now there's just a single setting with one argument return setting.values.map(({ name, description }) => ({ label: `${setting.prefix || ''}${name}`, - insertText: `${setting.prefix || ''}${name}:$0`, - insertTextRules: 4, // monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, - kind: 21, + text: `${setting.prefix || ''}${name}:$0`, + asSnippet: true, + kind: 'Reference', detail: description ? `${setting.description} - ${description}` : setting.description, sortText: 'D', command: TRIGGER_SUGGESTION_COMMAND, })); }; -export const buildNoPoliciesAvailableDefinition = (): AutocompleteCommandDefinition => ({ - label: i18n.translate('monaco.esql.autocomplete.noPoliciesLabel', { +export const buildNoPoliciesAvailableDefinition = (): SuggestionRawDefinition => ({ + label: i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.noPoliciesLabel', { defaultMessage: 'No available policy', }), - insertText: '', - kind: 26, - detail: i18n.translate('monaco.esql.autocomplete.noPoliciesLabelsFound', { - defaultMessage: 'Click to create', - }), + text: '', + kind: 'Issue', + detail: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.autocomplete.noPoliciesLabelsFound', + { + defaultMessage: 'Click to create', + } + ), sortText: 'D', command: { id: 'esql.policies.create', - title: i18n.translate('monaco.esql.autocomplete.createNewPolicy', { + title: i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.createNewPolicy', { defaultMessage: 'Click to create', }), }, @@ -271,7 +278,7 @@ function getUnitDuration(unit: number = 1) { } export function getCompatibleLiterals(commandName: string, types: string[], names?: string[]) { - const suggestions: AutocompleteCommandDefinition[] = []; + const suggestions: SuggestionRawDefinition[] = []; if (types.includes('number') && commandName === 'limit') { // suggest 10/50/100 suggestions.push(...buildConstantsDefinitions(['10', '100', '1000'], '')); @@ -294,7 +301,7 @@ export function getCompatibleLiterals(commandName: string, types: string[], name suggestions.push( ...buildConstantsDefinitions( [commandName === 'grok' ? '"%{WORD:firstWord}"' : '"%{firstWord}"'], - i18n.translate('monaco.esql.autocomplete.aPatternString', { + i18n.translate('kbn-esql-validation-autocomplete.esql.autocomplete.aPatternString', { defaultMessage: 'A pattern string', }) ) diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/helper.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts similarity index 94% rename from packages/kbn-monaco/src/esql/lib/ast/autocomplete/helper.ts rename to packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts index b362a3f01e67f..11b853c2d3cf0 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/helper.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ +import type { ESQLAstItem, ESQLCommand, ESQLFunction } from '@kbn/esql-ast'; import { getFunctionDefinition, isAssignment, isFunctionItem } from '../shared/helpers'; -import type { ESQLAstItem, ESQLCommand, ESQLFunction } from '../types'; function extractFunctionArgs(args: ESQLAstItem[]): ESQLFunction[] { return args.flatMap((arg) => (isAssignment(arg) ? arg.args[1] : arg)).filter(isFunctionItem); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/types.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/types.ts new file mode 100644 index 0000000000000..b4a6e62f24b8e --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/types.ts @@ -0,0 +1,67 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +// This is a subset of the Monaco's editor CompletitionItemKind type +export type ItemKind = + | 'Method' + | 'Function' + | 'Field' + | 'Variable' + | 'Class' + | 'Operator' + | 'Value' + | 'Constant' + | 'Keyword' + | 'Text' + | 'Reference' + | 'Snippet' + | 'Issue'; + +export interface SuggestionRawDefinition { + /* The label to show on the suggestion UI for the entry */ + label: string; + /* The actual text to insert into the editor */ + text: string; + /** + * Should the text be inserted as a snippet? + * That is usually used for special behaviour like moving the cursor in a specific position + * after inserting the text. + * i.e. 'fnName( $0 )' will insert fnName( ) and move the cursor where $0 is. + * */ + asSnippet?: boolean; + /** + * This is useful to identify the suggestion type and apply different styles to it. + */ + kind: ItemKind; + /** + * A very short description for the suggestion entry that can be shown on the UI next to the label + */ + detail: string; + /** + * A longer description for the suggestion entry that can be shown on demand on the UI. + */ + documentation?: { value: string }; + /** + * A string to use for sorting the suggestion within the suggestions list + */ + sortText?: string; + /** + * Suggestions can trigger a command by id. This is useful to trigger specific actions in some contexts + */ + command?: { + title: string; + id: string; + }; +} + +export interface EditorContext { + /** The actual char that triggered the suggestion (1 single char) */ + triggerCharacter?: string; + /** The type of trigger id. triggerKind = 0 is a programmatic trigger, while any other non-zero value is currently ignored. */ + triggerKind: number; +} diff --git a/packages/kbn-monaco/src/esql/lib/ast/code_actions/actions.test.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts similarity index 81% rename from packages/kbn-monaco/src/esql/lib/ast/code_actions/actions.test.ts rename to packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts index c3e21a4c43bed..5cc6e5ae3950b 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/code_actions/actions.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts @@ -6,17 +6,11 @@ * Side Public License, v 1. */ -import { EditorError } from '../../../../types'; -import { CharStreams } from 'antlr4'; import { getActions } from './actions'; -import { getParser, ROOT_STATEMENT } from '../../antlr_facade'; -import { ESQLErrorListener } from '../../monaco/esql_error_listener'; -import { AstListener } from '../ast_factory'; -import { wrapAsMonacoMessage } from '../shared/monaco_utils'; -import { ESQLAst } from '../types'; -import { validateAst } from '../validation/validation'; -import { monaco } from '../../../../monaco_imports'; +import { validateQuery } from '../validation/validation'; import { getAllFunctions } from '../shared/helpers'; +import { wrapAsEditorMessage } from './testing_utils'; +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; function getCallbackMocks() { return { @@ -67,38 +61,6 @@ function getCallbackMocks() { }; } -const getAstAndErrors = async ( - text: string | undefined -): Promise<{ - errors: EditorError[]; - ast: ESQLAst; -}> => { - if (text == null) { - return { ast: [], errors: [] }; - } - const errorListener = new ESQLErrorListener(); - const parseListener = new AstListener(); - const parser = getParser(CharStreams.fromString(text), errorListener, parseListener); - - parser[ROOT_STATEMENT](); - - return { ...parseListener.getAst(), errors: errorListener.getErrors() }; -}; - -function createModelAndRange(text: string) { - return { - model: { getValue: () => text } as monaco.editor.ITextModel, - range: {} as monaco.Range, - }; -} - -function createMonacoContext(errors: EditorError[]): monaco.languages.CodeActionContext { - return { - markers: errors, - trigger: 1, - }; -} - /** * There are different wats to test the code here: one is a direct unit test of the feature, another is * an integration test passing from the query statement validation. The latter is more realistic, but @@ -111,17 +73,18 @@ function testQuickFixesFn( { only, skip }: { only?: boolean; skip?: boolean } = {} ) { const testFn = only ? it.only : skip ? it.skip : it; - const { model, range } = createModelAndRange(statement); testFn(`${statement} => ["${expectedFixes.join('","')}"]`, async () => { const callbackMocks = getCallbackMocks(); - const { errors } = await validateAst(statement, getAstAndErrors, callbackMocks); - - const monacoErrors = wrapAsMonacoMessage('error', statement, errors); - const context = createMonacoContext(monacoErrors); - const actions = await getActions(model, range, context, getAstAndErrors, callbackMocks); - const edits = actions.map( - ({ edit }) => (edit?.edits[0] as monaco.languages.IWorkspaceTextEdit).textEdit.text + const { errors } = await validateQuery( + statement, + getAstAndSyntaxErrors, + undefined, + callbackMocks ); + + const monacoErrors = wrapAsEditorMessage('error', errors); + const actions = await getActions(statement, monacoErrors, getAstAndSyntaxErrors, callbackMocks); + const edits = actions.map(({ edits: actionEdits }) => actionEdits[0].text); expect(edits).toEqual( !options || !options.equalityCheck || options.equalityCheck === 'equal' ? expectedFixes @@ -300,12 +263,15 @@ describe('quick fixes logic', () => { it('should not crash if callback functions are not passed', async () => { const callbackMocks = getCallbackMocks(); const statement = `from a | eval b = a | enrich policy | dissect stringField "%{firstWord}"`; - const { model, range } = createModelAndRange(statement); - const { errors } = await validateAst(statement, getAstAndErrors, callbackMocks); - const monacoErrors = wrapAsMonacoMessage('error', statement, errors); - const context = createMonacoContext(monacoErrors); + const { errors } = await validateQuery( + statement, + getAstAndSyntaxErrors, + undefined, + callbackMocks + ); + const monacoErrors = wrapAsEditorMessage('error', errors); try { - await getActions(model, range, context, getAstAndErrors, { + await getActions(statement, monacoErrors, getAstAndSyntaxErrors, { getFieldsFor: undefined, getSources: undefined, getPolicies: undefined, @@ -319,12 +285,15 @@ describe('quick fixes logic', () => { it('should not crash no callbacks are passed', async () => { const callbackMocks = getCallbackMocks(); const statement = `from a | eval b = a | enrich policy | dissect stringField "%{firstWord}"`; - const { model, range } = createModelAndRange(statement); - const { errors } = await validateAst(statement, getAstAndErrors, callbackMocks); - const monacoErrors = wrapAsMonacoMessage('error', statement, errors); - const context = createMonacoContext(monacoErrors); + const { errors } = await validateQuery( + statement, + getAstAndSyntaxErrors, + undefined, + callbackMocks + ); + const monacoErrors = wrapAsEditorMessage('error', errors); try { - await getActions(model, range, context, getAstAndErrors, undefined); + await getActions(statement, monacoErrors, getAstAndSyntaxErrors, undefined); } catch { fail('Should not throw'); } diff --git a/packages/kbn-monaco/src/esql/lib/ast/code_actions/actions.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts similarity index 79% rename from packages/kbn-monaco/src/esql/lib/ast/code_actions/actions.ts rename to packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts index bb2b5170d1c7b..dc356669b2847 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/code_actions/actions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; import levenshtein from 'js-levenshtein'; -import type { monaco } from '../../../../monaco_imports'; +import type { AstProviderFn, ESQLAst, ESQLCommand, EditorError } from '@kbn/esql-ast'; import { getFieldsByTypeHelper, getPolicyHelper, @@ -20,23 +20,9 @@ import { shouldBeQuotedText, } from '../shared/helpers'; import { ESQLCallbacks } from '../shared/types'; -import { AstProviderFn, ESQLAst, ESQLCommand } from '../types'; import { buildQueryForFieldsFromSource } from '../validation/helpers'; import { DOUBLE_BACKTICK, SINGLE_TICK_REGEX } from '../shared/constants'; - -type GetSourceFn = () => Promise; -type GetFieldsByTypeFn = (type: string | string[], ignored?: string[]) => Promise; -type GetPoliciesFn = () => Promise; -type GetPolicyFieldsFn = (name: string) => Promise; -type GetMetaFieldsFn = () => Promise; - -interface Callbacks { - getSources: GetSourceFn; - getFieldsByType: GetFieldsByTypeFn; - getPolicies: GetPoliciesFn; - getPolicyFields: GetPolicyFieldsFn; - getMetaFields: GetMetaFieldsFn; -} +import type { CodeAction, Callbacks } from './types'; function getFieldsByTypeRetriever(queryString: string, resourceRetriever?: ESQLCallbacks) { const helpers = getFieldsByTypeHelper(queryString, resourceRetriever); @@ -96,29 +82,17 @@ export const getCompatibleFunctionDefinitions = ( return fnSupportedByCommand.map(({ name }) => name); }; -function createAction( - title: string, - solution: string, - error: monaco.editor.IMarkerData, - uri: monaco.Uri -) { +function createAction(title: string, solution: string, error: EditorError): CodeAction { return { title, diagnostics: [error], kind: 'quickfix', - edit: { - edits: [ - { - resource: uri, - textEdit: { - range: error, - text: solution, - }, - versionId: undefined, - }, - ], - }, - isPreferred: true, + edits: [ + { + range: error, + text: solution, + }, + ], }; } @@ -136,8 +110,7 @@ async function getSpellingPossibilities(fn: () => Promise, errorText: } async function getSpellingActionForColumns( - error: monaco.editor.IMarkerData, - uri: monaco.Uri, + error: EditorError, queryString: string, ast: ESQLAst, { getFieldsByType, getPolicies, getPolicyFields }: Callbacks @@ -156,16 +129,15 @@ async function getSpellingActionForColumns( } return availableFields; }, errorText); - return wrapIntoSpellingChangeAction(error, uri, possibleFields); + return wrapIntoSpellingChangeAction(error, possibleFields); } async function getQuotableActionForColumns( - error: monaco.editor.IMarkerData, - uri: monaco.Uri, + error: EditorError, queryString: string, ast: ESQLAst, { getFieldsByType }: Callbacks -) { +): Promise { const commandEndIndex = ast.find((command) => command.location.max > error.endColumn)?.location .max; // the error received is unknwonColumn here, but look around the column to see if there's more @@ -189,22 +161,21 @@ async function getQuotableActionForColumns( const errorText = queryString .substring(error.startColumn - 1, error.endColumn + possibleUnquotedText.length) .trimEnd(); - const actions = []; + const actions: CodeAction[] = []; if (shouldBeQuotedText(errorText)) { const availableFields = new Set(await getFieldsByType('any')); const solution = `\`${errorText.replace(SINGLE_TICK_REGEX, DOUBLE_BACKTICK)}\``; if (availableFields.has(errorText) || availableFields.has(solution)) { actions.push( createAction( - i18n.translate('monaco.esql.quickfix.replaceWithSolution', { + i18n.translate('kbn-esql-validation-autocomplete.esql.quickfix.replaceWithSolution', { defaultMessage: 'Did you mean {solution} ?', values: { solution, }, }), solution, - { ...error, endColumn: error.startColumn + errorText.length }, // override the location - uri + { ...error, endColumn: error.startColumn + errorText.length } // override the location ) ); } @@ -213,8 +184,7 @@ async function getQuotableActionForColumns( } async function getSpellingActionForIndex( - error: monaco.editor.IMarkerData, - uri: monaco.Uri, + error: EditorError, queryString: string, ast: ESQLAst, { getSources }: Callbacks @@ -230,24 +200,22 @@ async function getSpellingActionForIndex( } return sources; }, errorText); - return wrapIntoSpellingChangeAction(error, uri, possibleSources); + return wrapIntoSpellingChangeAction(error, possibleSources); } async function getSpellingActionForPolicies( - error: monaco.editor.IMarkerData, - uri: monaco.Uri, + error: EditorError, queryString: string, ast: ESQLAst, { getPolicies }: Callbacks ) { const errorText = queryString.substring(error.startColumn - 1, error.endColumn - 1); const possiblePolicies = await getSpellingPossibilities(getPolicies, errorText); - return wrapIntoSpellingChangeAction(error, uri, possiblePolicies); + return wrapIntoSpellingChangeAction(error, possiblePolicies); } async function getSpellingActionForFunctions( - error: monaco.editor.IMarkerData, - uri: monaco.Uri, + error: EditorError, queryString: string, ast: ESQLAst ) { @@ -268,26 +236,23 @@ async function getSpellingActionForFunctions( ); return wrapIntoSpellingChangeAction( error, - uri, possibleSolutions.map((fn) => `${fn}${errorText.substring(errorText.lastIndexOf('('))}`) ); } async function getSpellingActionForMetadata( - error: monaco.editor.IMarkerData, - uri: monaco.Uri, + error: EditorError, queryString: string, ast: ESQLAst, { getMetaFields }: Callbacks ) { const errorText = queryString.substring(error.startColumn - 1, error.endColumn - 1); const possibleMetafields = await getSpellingPossibilities(getMetaFields, errorText); - return wrapIntoSpellingChangeAction(error, uri, possibleMetafields); + return wrapIntoSpellingChangeAction(error, possibleMetafields); } async function getSpellingActionForEnrichMode( - error: monaco.editor.IMarkerData, - uri: monaco.Uri, + error: EditorError, queryString: string, ast: ESQLAst, _callbacks: Callbacks @@ -308,38 +273,33 @@ async function getSpellingActionForEnrichMode( if (!possibleEnrichModes.length) { possibleEnrichModes.push(...allModes); } - return wrapIntoSpellingChangeAction(error, uri, possibleEnrichModes); + return wrapIntoSpellingChangeAction(error, possibleEnrichModes); } function wrapIntoSpellingChangeAction( - error: monaco.editor.IMarkerData, - uri: monaco.Uri, + error: EditorError, possibleSolution: string[] -): monaco.languages.CodeAction[] { +): CodeAction[] { return possibleSolution.map((solution) => createAction( // @TODO: workout why the tooltip is truncating the title here - i18n.translate('monaco.esql.quickfix.replaceWithSolution', { + i18n.translate('kbn-esql-validation-autocomplete.esql.quickfix.replaceWithSolution', { defaultMessage: 'Did you mean {solution} ?', values: { solution, }, }), solution, - error, - uri + error ) ); } -function extractQuotedText(rawText: string, error: monaco.editor.IMarkerData) { +function extractQuotedText(rawText: string, error: EditorError) { return rawText.substring(error.startColumn - 2, error.endColumn); } -function inferCodeFromError( - error: monaco.editor.IMarkerData & { owner?: string }, - rawText: string -) { +function inferCodeFromError(error: EditorError & { owner?: string }, rawText: string) { if (error.message.endsWith('expecting STRING')) { const value = extractQuotedText(rawText, error); return /^'(.)*'$/.test(value) ? 'wrongQuotes' : undefined; @@ -347,17 +307,15 @@ function inferCodeFromError( } export async function getActions( - model: monaco.editor.ITextModel, - range: monaco.Range, - context: monaco.languages.CodeActionContext, + innerText: string, + markers: EditorError[], astProvider: AstProviderFn, resourceRetriever?: ESQLCallbacks -): Promise { - const actions: monaco.languages.CodeAction[] = []; - if (context.markers.length === 0) { +): Promise { + const actions: CodeAction[] = []; + if (markers.length === 0) { return actions; } - const innerText = model.getValue(); const { ast } = await astProvider(innerText); const queryForFields = buildQueryForFieldsFromSource(innerText, ast); @@ -377,30 +335,23 @@ export async function getActions( // Markers are sent only on hover and are limited to the hovered area // so unless there are multiple error/markers for the same area, there's just one // in some cases, like syntax + semantic errors (i.e. unquoted fields eval field-1 ), there might be more than one - for (const error of context.markers) { + for (const error of markers) { const code = error.code ?? inferCodeFromError(error, innerText); switch (code) { case 'unknownColumn': const [columnsSpellChanges, columnsQuotedChanges] = await Promise.all([ - getSpellingActionForColumns(error, model.uri, innerText, ast, callbacks), - getQuotableActionForColumns(error, model.uri, innerText, ast, callbacks), + getSpellingActionForColumns(error, innerText, ast, callbacks), + getQuotableActionForColumns(error, innerText, ast, callbacks), ]); actions.push(...(columnsQuotedChanges.length ? columnsQuotedChanges : columnsSpellChanges)); break; case 'unknownIndex': - const indexSpellChanges = await getSpellingActionForIndex( - error, - model.uri, - innerText, - ast, - callbacks - ); + const indexSpellChanges = await getSpellingActionForIndex(error, innerText, ast, callbacks); actions.push(...indexSpellChanges); break; case 'unknownPolicy': const policySpellChanges = await getSpellingActionForPolicies( error, - model.uri, innerText, ast, callbacks @@ -408,18 +359,12 @@ export async function getActions( actions.push(...policySpellChanges); break; case 'unknownFunction': - const fnsSpellChanges = await getSpellingActionForFunctions( - error, - model.uri, - innerText, - ast - ); + const fnsSpellChanges = await getSpellingActionForFunctions(error, innerText, ast); actions.push(...fnsSpellChanges); break; case 'unknownMetadataField': const metadataSpellChanges = await getSpellingActionForMetadata( error, - model.uri, innerText, ast, callbacks @@ -431,7 +376,7 @@ export async function getActions( const errorText = extractQuotedText(innerText, error); actions.push( createAction( - i18n.translate('monaco.esql.quickfix.replaceWithQuote', { + i18n.translate('kbn-esql-validation-autocomplete.esql.quickfix.replaceWithQuote', { defaultMessage: 'Change quote to " (double)', }), errorText.replaceAll("'", '"'), @@ -440,15 +385,13 @@ export async function getActions( ...error, startColumn: error.startColumn - 1, endColumn: error.startColumn + errorText.length, - }, - model.uri + } ) ); break; case 'unsupportedSettingCommandValue': const enrichModeSpellChanges = await getSpellingActionForEnrichMode( error, - model.uri, innerText, ast, callbacks diff --git a/packages/kbn-esql-validation-autocomplete/src/code_actions/testing_utils.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/testing_utils.ts new file mode 100644 index 0000000000000..6c500776966e7 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/testing_utils.ts @@ -0,0 +1,32 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { EditorError, ESQLMessage } from '@kbn/esql-ast'; + +export function wrapAsEditorMessage( + type: 'error' | 'warning', + messages: Array +): EditorError[] { + return messages.map((e) => { + if ('severity' in e) { + return e; + } + const startPosition = e.location ? e.location.min + 1 : 0; + const endPosition = e.location ? e.location.max + 1 : 0; + return { + message: e.text, + startColumn: startPosition, + startLineNumber: 1, + endColumn: endPosition + 1, + endLineNumber: 1, + severity: type, + _source: 'client' as const, + code: e.code, + }; + }); +} diff --git a/packages/kbn-esql-validation-autocomplete/src/code_actions/types.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/types.ts new file mode 100644 index 0000000000000..854f19ff279c1 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/types.ts @@ -0,0 +1,33 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { EditorError } from '../types'; + +type GetSourceFn = () => Promise; +type GetFieldsByTypeFn = (type: string | string[], ignored?: string[]) => Promise; +type GetPoliciesFn = () => Promise; +type GetPolicyFieldsFn = (name: string) => Promise; +type GetMetaFieldsFn = () => Promise; + +export interface Callbacks { + getSources: GetSourceFn; + getFieldsByType: GetFieldsByTypeFn; + getPolicies: GetPoliciesFn; + getPolicyFields: GetPolicyFieldsFn; + getMetaFields: GetMetaFieldsFn; +} + +export interface CodeAction { + title: string; + diagnostics: EditorError[]; + kind: 'quickfix'; + edits: Array<{ + range: EditorError; + text: string; + }>; +} diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/aggs.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts similarity index 72% rename from packages/kbn-monaco/src/esql/lib/ast/definitions/aggs.ts rename to packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts index 36615b265dbc1..94ab3106036fd 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/aggs.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; -import { FunctionDefinition } from './types'; +import type { FunctionDefinition } from './types'; function createNumericAggDefinition({ name, @@ -48,46 +48,52 @@ function createNumericAggDefinition({ export const statsAggregationFunctionDefinitions: FunctionDefinition[] = [ { name: 'avg', - description: i18n.translate('monaco.esql.definitions.avgDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.avgDoc', { defaultMessage: 'Returns the average of the values in a field', }), }, { name: 'max', - description: i18n.translate('monaco.esql.definitions.maxDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.maxDoc', { defaultMessage: 'Returns the maximum value in a field.', }), }, { name: 'min', - description: i18n.translate('monaco.esql.definitions.minDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.minDoc', { defaultMessage: 'Returns the minimum value in a field.', }), }, { name: 'sum', - description: i18n.translate('monaco.esql.definitions.sumDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.sumDoc', { defaultMessage: 'Returns the sum of the values in a field.', }), }, { name: 'median', - description: i18n.translate('monaco.esql.definitions.medianDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.medianDoc', { defaultMessage: 'Returns the 50% percentile.', }), }, { name: 'median_absolute_deviation', - description: i18n.translate('monaco.esql.definitions.medianDeviationDoc', { - defaultMessage: - 'Returns the median of each data point’s deviation from the median of the entire sample.', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.medianDeviationDoc', + { + defaultMessage: + 'Returns the median of each data point’s deviation from the median of the entire sample.', + } + ), }, { name: 'percentile', - description: i18n.translate('monaco.esql.definitions.percentiletDoc', { - defaultMessage: 'Returns the n percentile of a field.', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.percentiletDoc', + { + defaultMessage: 'Returns the n percentile of a field.', + } + ), args: [{ name: 'percentile', type: 'number', value: '90', literalOnly: true }], }, ] @@ -96,7 +102,7 @@ export const statsAggregationFunctionDefinitions: FunctionDefinition[] = [ { name: 'count', type: 'agg', - description: i18n.translate('monaco.esql.definitions.countDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.countDoc', { defaultMessage: 'Returns the count of the values in a field.', }), supportedCommands: ['stats'], @@ -119,9 +125,12 @@ export const statsAggregationFunctionDefinitions: FunctionDefinition[] = [ { name: 'count_distinct', type: 'agg', - description: i18n.translate('monaco.esql.definitions.countDistinctDoc', { - defaultMessage: 'Returns the count of distinct values in a field.', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.countDistinctDoc', + { + defaultMessage: 'Returns the count of distinct values in a field.', + } + ), supportedCommands: ['stats'], signatures: [ { @@ -140,9 +149,12 @@ export const statsAggregationFunctionDefinitions: FunctionDefinition[] = [ { name: 'st_centroid', type: 'agg', - description: i18n.translate('monaco.esql.definitions.stCentroidDoc', { - defaultMessage: 'Returns the count of distinct values in a field.', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.stCentroidDoc', + { + defaultMessage: 'Returns the count of distinct values in a field.', + } + ), supportedCommands: ['stats'], signatures: [ { diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts similarity index 71% rename from packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts rename to packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts index f5b58c823741e..668a2cd20407b 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; -import { FunctionDefinition } from './types'; +import type { FunctionDefinition } from './types'; function createMathDefinition( name: string, @@ -90,28 +90,28 @@ export const builtinFunctions: FunctionDefinition[] = [ createMathDefinition( '+', ['number', 'date', ['date', 'time_literal'], ['time_literal', 'date']], - i18n.translate('monaco.esql.definition.addDoc', { + i18n.translate('kbn-esql-validation-autocomplete.esql.definition.addDoc', { defaultMessage: 'Add (+)', }) ), createMathDefinition( '-', ['number', 'date', ['date', 'time_literal'], ['time_literal', 'date']], - i18n.translate('monaco.esql.definition.subtractDoc', { + i18n.translate('kbn-esql-validation-autocomplete.esql.definition.subtractDoc', { defaultMessage: 'Subtract (-)', }) ), createMathDefinition( '*', ['number'], - i18n.translate('monaco.esql.definition.multiplyDoc', { + i18n.translate('kbn-esql-validation-autocomplete.esql.definition.multiplyDoc', { defaultMessage: 'Multiply (*)', }) ), createMathDefinition( '/', ['number'], - i18n.translate('monaco.esql.definition.divideDoc', { + i18n.translate('kbn-esql-validation-autocomplete.esql.definition.divideDoc', { defaultMessage: 'Divide (/)', }), (fnDef) => { @@ -123,13 +123,16 @@ export const builtinFunctions: FunctionDefinition[] = [ messages.push({ type: 'warning' as const, code: 'divideByZero', - text: i18n.translate('monaco.esql.divide.warning.divideByZero', { - defaultMessage: 'Cannot divide by zero: {left}/{right}', - values: { - left: left.text, - right: right.value, - }, - }), + text: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.divide.warning.divideByZero', + { + defaultMessage: 'Cannot divide by zero: {left}/{right}', + values: { + left: left.text, + right: right.value, + }, + } + ), location: fnDef.location, }); } @@ -141,7 +144,7 @@ export const builtinFunctions: FunctionDefinition[] = [ createMathDefinition( '%', ['number'], - i18n.translate('monaco.esql.definition.moduleDoc', { + i18n.translate('kbn-esql-validation-autocomplete.esql.definition.moduleDoc', { defaultMessage: 'Module (%)', }), (fnDef) => { @@ -153,13 +156,16 @@ export const builtinFunctions: FunctionDefinition[] = [ messages.push({ type: 'warning' as const, code: 'moduleByZero', - text: i18n.translate('monaco.esql.divide.warning.zeroModule', { - defaultMessage: 'Module by zero can return null value: {left}%{right}', - values: { - left: left.text, - right: right.value, - }, - }), + text: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.divide.warning.zeroModule', + { + defaultMessage: 'Module by zero can return null value: {left}%{right}', + values: { + left: left.text, + right: right.value, + }, + } + ), location: fnDef.location, }); } @@ -171,39 +177,51 @@ export const builtinFunctions: FunctionDefinition[] = [ ...[ { name: '==', - description: i18n.translate('monaco.esql.definition.equalToDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.equalToDoc', { defaultMessage: 'Equal to', }), }, { name: '!=', - description: i18n.translate('monaco.esql.definition.notEqualToDoc', { - defaultMessage: 'Not equal to', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definition.notEqualToDoc', + { + defaultMessage: 'Not equal to', + } + ), }, { name: '<', - description: i18n.translate('monaco.esql.definition.lessThanDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.lessThanDoc', { defaultMessage: 'Less than', }), }, { name: '>', - description: i18n.translate('monaco.esql.definition.greaterThanDoc', { - defaultMessage: 'Greater than', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definition.greaterThanDoc', + { + defaultMessage: 'Greater than', + } + ), }, { name: '<=', - description: i18n.translate('monaco.esql.definition.lessThanOrEqualToDoc', { - defaultMessage: 'Less than or equal to', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definition.lessThanOrEqualToDoc', + { + defaultMessage: 'Less than or equal to', + } + ), }, { name: '>=', - description: i18n.translate('monaco.esql.definition.greaterThanOrEqualToDoc', { - defaultMessage: 'Greater than or equal to', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definition.greaterThanOrEqualToDoc', + { + defaultMessage: 'Greater than or equal to', + } + ), }, ].map((op): FunctionDefinition => createComparisonDefinition(op)), ...[ @@ -211,20 +229,20 @@ export const builtinFunctions: FunctionDefinition[] = [ // new special comparison operator for strings only // { // name: '=~', - // description: i18n.translate('monaco.esql.definition.equalToCaseInsensitiveDoc', { + // description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.equalToCaseInsensitiveDoc', { // defaultMessage: 'Case insensitive equality', // }), // }, { name: 'like', - description: i18n.translate('monaco.esql.definition.likeDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.likeDoc', { defaultMessage: 'Filter data based on string patterns', }), }, { name: 'not_like', description: '' }, { name: 'rlike', - description: i18n.translate('monaco.esql.definition.rlikeDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.rlikeDoc', { defaultMessage: 'Filter data based on string regular expressions', }), }, @@ -249,7 +267,7 @@ export const builtinFunctions: FunctionDefinition[] = [ ...[ { name: 'in', - description: i18n.translate('monaco.esql.definition.inDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.inDoc', { defaultMessage: 'Tests if the value an expression takes is contained in a list of other expressions', }), @@ -295,13 +313,13 @@ export const builtinFunctions: FunctionDefinition[] = [ ...[ { name: 'and', - description: i18n.translate('monaco.esql.definition.andDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.andDoc', { defaultMessage: 'and', }), }, { name: 'or', - description: i18n.translate('monaco.esql.definition.orDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.orDoc', { defaultMessage: 'or', }), }, @@ -324,7 +342,7 @@ export const builtinFunctions: FunctionDefinition[] = [ { type: 'builtin' as const, name: 'not', - description: i18n.translate('monaco.esql.definition.notDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.notDoc', { defaultMessage: 'Not', }), supportedCommands: ['eval', 'where', 'row'], @@ -339,13 +357,13 @@ export const builtinFunctions: FunctionDefinition[] = [ ...[ { name: 'is null', - description: i18n.translate('monaco.esql.definition.isNullDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.isNullDoc', { defaultMessage: 'Predicate for NULL comparison: returns true if the value is NULL', }), }, { name: 'is not null', - description: i18n.translate('monaco.esql.definition.isNotNullDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.isNotNullDoc', { defaultMessage: 'Predicate for NULL comparison: returns true if the value is not NULL', }), }, @@ -364,7 +382,7 @@ export const builtinFunctions: FunctionDefinition[] = [ { type: 'builtin' as const, name: '=', - description: i18n.translate('monaco.esql.definition.assignDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.assignDoc', { defaultMessage: 'Assign (=)', }), supportedCommands: ['eval', 'stats', 'row', 'dissect', 'where', 'enrich'], @@ -382,7 +400,7 @@ export const builtinFunctions: FunctionDefinition[] = [ { name: 'functions', type: 'builtin', - description: i18n.translate('monaco.esql.definition.functionsDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.functionsDoc', { defaultMessage: 'Show ES|QL avaialble functions with signatures', }), supportedCommands: ['meta'], @@ -396,7 +414,7 @@ export const builtinFunctions: FunctionDefinition[] = [ { name: 'info', type: 'builtin', - description: i18n.translate('monaco.esql.definition.infoDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.infoDoc', { defaultMessage: 'Show information about the current ES node', }), supportedCommands: ['show'], diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/commands.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts similarity index 79% rename from packages/kbn-monaco/src/esql/lib/ast/definitions/commands.ts rename to packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts index 44e48484e2c66..14e80ff5cfdf4 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/commands.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts @@ -7,6 +7,13 @@ */ import { i18n } from '@kbn/i18n'; +import type { + ESQLColumn, + ESQLCommand, + ESQLAstItem, + ESQLMessage, + ESQLFunction, +} from '@kbn/esql-ast'; import { getFunctionDefinition, isAssignment, @@ -14,8 +21,7 @@ import { isFunctionItem, isLiteralItem, } from '../shared/helpers'; -import type { ESQLColumn, ESQLCommand, ESQLAstItem, ESQLMessage, ESQLFunction } from '../types'; -import { enrichModes } from './settings'; +import { ENRICH_MODES } from './settings'; import { appendSeparatorOption, asOption, @@ -29,7 +35,7 @@ import type { CommandDefinition } from './types'; export const commandDefinitions: CommandDefinition[] = [ { name: 'row', - description: i18n.translate('monaco.esql.definitions.rowDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.rowDoc', { defaultMessage: 'Produces a row with one or more columns with values that you specify. This can be useful for testing.', }), @@ -44,7 +50,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'from', - description: i18n.translate('monaco.esql.definitions.fromDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.fromDoc', { defaultMessage: 'Retrieves data from one or more data streams, indices, or aliases. In a query or subquery, you must use the from command first and it does not need a leading pipe. For example, to retrieve data from an index:', }), @@ -58,7 +64,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'meta', - description: i18n.translate('monaco.esql.definitions.metaDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.metaDoc', { defaultMessage: 'Returns information about the ES|QL environment', }), examples: ['meta functions'], @@ -71,7 +77,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'show', - description: i18n.translate('monaco.esql.definitions.showDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.showDoc', { defaultMessage: 'Returns information about the deployment and its capabilities', }), examples: ['show info'], @@ -84,7 +90,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'stats', - description: i18n.translate('monaco.esql.definitions.statsDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.statsDoc', { defaultMessage: 'Calculates aggregate statistics, such as average, count, and sum, over the incoming search results set. Similar to SQL aggregation, if the stats command is used without a BY clause, only one row is returned, which is the aggregation over the entire incoming search results set. When you use a BY clause, one row is returned for each distinct value in the field specified in the BY clause. The stats command returns only the fields in the aggregation, and you can use a wide range of statistical functions with the stats command. When you perform more than one aggregation, separate each aggregation with a comma.', }), @@ -100,9 +106,12 @@ export const commandDefinitions: CommandDefinition[] = [ if (!command.args.length) { messages.push({ location: command.location, - text: i18n.translate('monaco.esql.validation.statsNoArguments', { - defaultMessage: 'At least one aggregation or grouping expression required in [STATS]', - }), + text: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.statsNoArguments', + { + defaultMessage: 'At least one aggregation or grouping expression required in [STATS]', + } + ), type: 'error', code: 'statsNoArguments', }); @@ -140,13 +149,16 @@ export const commandDefinitions: CommandDefinition[] = [ messages.push( ...noAggsExpressions.map((fn) => ({ location: fn.location, - text: i18n.translate('monaco.esql.validation.statsNoAggFunction', { - defaultMessage: - 'At least one aggregation function required in [STATS], found [{expression}]', - values: { - expression: fn.text, - }, - }), + text: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.statsNoAggFunction', + { + defaultMessage: + 'At least one aggregation function required in [STATS], found [{expression}]', + values: { + expression: fn.text, + }, + } + ), type: 'error' as const, code: 'statsNoAggFunction', })) @@ -179,13 +191,16 @@ export const commandDefinitions: CommandDefinition[] = [ messages.push( ...invalidExpressions.map((fn) => ({ location: fn.location, - text: i18n.translate('monaco.esql.validation.noCombinationOfAggAndNonAggValues', { - defaultMessage: - 'Cannot combine aggregation and non-aggregation values in [STATS], found [{expression}]', - values: { - expression: fn.text, - }, - }), + text: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.noCombinationOfAggAndNonAggValues', + { + defaultMessage: + 'Cannot combine aggregation and non-aggregation values in [STATS], found [{expression}]', + values: { + expression: fn.text, + }, + } + ), type: 'error' as const, code: 'statsNoCombinationOfAggAndNonAggValues', })) @@ -198,7 +213,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'eval', - description: i18n.translate('monaco.esql.definitions.evalDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.evalDoc', { defaultMessage: 'Calculates an expression and puts the resulting value into a search results field.', }), @@ -217,7 +232,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'rename', - description: i18n.translate('monaco.esql.definitions.renameDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.renameDoc', { defaultMessage: 'Renames an old column to a new one', }), examples: ['… | rename old as new', '… | rename old as new, a as b'], @@ -230,7 +245,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'limit', - description: i18n.translate('monaco.esql.definitions.limitDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.limitDoc', { defaultMessage: 'Returns the first search results, in search order, based on the "limit" specified.', }), @@ -244,7 +259,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'keep', - description: i18n.translate('monaco.esql.definitions.keepDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.keepDoc', { defaultMessage: 'Rearranges fields in the input table by applying the keep clauses in fields', }), examples: ['… | keep a', '… | keep a,b'], @@ -257,7 +272,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'drop', - description: i18n.translate('monaco.esql.definitions.dropDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.dropDoc', { defaultMessage: 'Drops columns', }), examples: ['… | drop a', '… | drop a,b'], @@ -274,9 +289,12 @@ export const commandDefinitions: CommandDefinition[] = [ messages.push( ...wildcardItems.map((column) => ({ location: (column as ESQLColumn).location, - text: i18n.translate('monaco.esql.validation.dropAllColumnsError', { - defaultMessage: 'Removing all fields is not allowed [*]', - }), + text: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.dropAllColumnsError', + { + defaultMessage: 'Removing all fields is not allowed [*]', + } + ), type: 'error' as const, code: 'dropAllColumnsError', })) @@ -288,9 +306,13 @@ export const commandDefinitions: CommandDefinition[] = [ if (droppingTimestamp) { messages.push({ location: (droppingTimestamp as ESQLColumn).location, - text: i18n.translate('monaco.esql.validation.dropTimestampWarning', { - defaultMessage: 'Drop [@timestamp] will remove all time filters to the search results', - }), + text: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.dropTimestampWarning', + { + defaultMessage: + 'Drop [@timestamp] will remove all time filters to the search results', + } + ), type: 'warning', code: 'dropTimestampWarning', }); @@ -300,7 +322,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'sort', - description: i18n.translate('monaco.esql.definitions.sortDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.sortDoc', { defaultMessage: 'Sorts all results by the specified fields. By default, null values are treated as being larger than any other value. With an ascending sort order, null values are sorted last, and with a descending sort order, null values are sorted first. You can change that by providing NULLS FIRST or NULLS LAST', }), @@ -322,7 +344,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'where', - description: i18n.translate('monaco.esql.definitions.whereDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.whereDoc', { defaultMessage: 'Uses "predicate-expressions" to filter search results. A predicate expression, when evaluated, returns TRUE or FALSE. The where command only returns the results that evaluate to TRUE. For example, to filter results for a specific field value', }), @@ -336,7 +358,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'dissect', - description: i18n.translate('monaco.esql.definitions.dissectDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.dissectDoc', { defaultMessage: 'Extracts multiple string values from a single string input, based on a pattern', }), @@ -353,7 +375,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'grok', - description: i18n.translate('monaco.esql.definitions.grokDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.grokDoc', { defaultMessage: 'Extracts multiple string values from a single string input, based on a pattern', }), @@ -370,7 +392,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'mv_expand', - description: i18n.translate('monaco.esql.definitions.mvExpandDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvExpandDoc', { defaultMessage: 'Expands multivalued fields into one row per value, duplicating other fields', }), examples: ['row a=[1,2,3] | mv_expand a'], @@ -383,7 +405,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'enrich', - description: i18n.translate('monaco.esql.definitions.enrichDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.enrichDoc', { defaultMessage: 'Enrich table with another table. Before you can use enrich, you need to create and execute an enrich policy.', }), @@ -393,7 +415,7 @@ export const commandDefinitions: CommandDefinition[] = [ '… | enrich my-policy on pivotField with a = enrichFieldA, b = enrichFieldB', ], options: [onOption, withOption], - modes: [enrichModes], + modes: [ENRICH_MODES], signature: { multipleParams: false, params: [{ name: 'policyName', type: 'source', innerType: 'policy' }], diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts similarity index 77% rename from packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts rename to packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts index 46712fed700bd..99f373879dbb6 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts @@ -7,9 +7,9 @@ */ import { i18n } from '@kbn/i18n'; +import type { ESQLFunction } from '@kbn/esql-ast'; import { isLiteralItem } from '../shared/helpers'; -import { ESQLFunction } from '../types'; -import { FunctionDefinition } from './types'; +import type { FunctionDefinition } from './types'; const validateLogFunctions = (fnDef: ESQLFunction) => { const messages = []; @@ -20,12 +20,15 @@ const validateLogFunctions = (fnDef: ESQLFunction) => { messages.push({ type: 'warning' as const, code: 'logOfNegativeValue', - text: i18n.translate('monaco.esql.divide.warning.logOfNegativeValue', { - defaultMessage: 'Log of a negative number results in null: {value}', - values: { - value: arg.value, - }, - }), + text: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.divide.warning.logOfNegativeValue', + { + defaultMessage: 'Log of a negative number results in null: {value}', + values: { + value: arg.value, + }, + } + ), location: arg.location, }); } @@ -36,7 +39,7 @@ const validateLogFunctions = (fnDef: ESQLFunction) => { export const evalFunctionsDefinitions: FunctionDefinition[] = [ { name: 'round', - description: i18n.translate('monaco.esql.definitions.roundDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.roundDoc', { defaultMessage: 'Returns a number rounded to the decimal, specified by he closest integer value. The default is to round to an integer.', }), @@ -56,7 +59,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'abs', - description: i18n.translate('monaco.esql.definitions.absDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.absDoc', { defaultMessage: 'Returns the absolute value.', }), signatures: [ @@ -69,7 +72,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'ceil', - description: i18n.translate('monaco.esql.definitions.ceilDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.ceilDoc', { defaultMessage: 'Round a number up to the nearest integer.', }), signatures: [ @@ -82,7 +85,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'log10', - description: i18n.translate('monaco.esql.definitions.log10Doc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.log10Doc', { defaultMessage: 'Returns the log base 10.', }), signatures: [ @@ -97,7 +100,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ { name: 'log', - description: i18n.translate('monaco.esql.definitions.logDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.logDoc', { defaultMessage: 'A scalar function log(based, value) returns the logarithm of a value for a particular base, as specified in the argument', }), @@ -118,7 +121,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'pow', - description: i18n.translate('monaco.esql.definitions.powDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.powDoc', { defaultMessage: 'Returns the the value of a base (first argument) raised to a power (second argument).', }), @@ -135,7 +138,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'concat', - description: i18n.translate('monaco.esql.definitions.concatDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.concatDoc', { defaultMessage: 'Concatenates two or more strings.', }), signatures: [ @@ -149,7 +152,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'replace', - description: i18n.translate('monaco.esql.definitions.replaceDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.replaceDoc', { defaultMessage: 'The function substitutes in the string (1st argument) any match of the regular expression (2nd argument) with the replacement string (3rd argument). If any of the arguments are NULL, the result is NULL.', }), @@ -167,7 +170,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'substring', - description: i18n.translate('monaco.esql.definitions.substringDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.substringDoc', { defaultMessage: 'Returns a substring of a string, specified by a start position and an optional length.', }), @@ -185,7 +188,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_lower', - description: i18n.translate('monaco.esql.definitions.toLowerDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toLowerDoc', { defaultMessage: 'Returns a new string representing the input string converted to lower case.', }), signatures: [ @@ -198,7 +201,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_upper', - description: i18n.translate('monaco.esql.definitions.toUpperDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toUpperDoc', { defaultMessage: 'Returns a new string representing the input string converted to upper case.', }), signatures: [ @@ -211,7 +214,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'trim', - description: i18n.translate('monaco.esql.definitions.trimDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.trimDoc', { defaultMessage: 'Removes leading and trailing whitespaces from strings.', }), signatures: [ @@ -224,7 +227,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'starts_with', - description: i18n.translate('monaco.esql.definitions.startsWithDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.startsWithDoc', { defaultMessage: 'Returns a boolean that indicates whether a keyword string starts with another string.', }), @@ -241,7 +244,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'ends_with', - description: i18n.translate('monaco.esql.definitions.endsWithDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.endsWithDoc', { defaultMessage: 'Returns a boolean that indicates whether a keyword string ends with another string:', }), @@ -258,7 +261,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'split', - description: i18n.translate('monaco.esql.definitions.splitDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.splitDoc', { defaultMessage: 'Splits a single valued string into multiple strings.', }), signatures: [ @@ -275,7 +278,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ { name: 'to_string', alias: ['to_str'], - description: i18n.translate('monaco.esql.definitions.toStringDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toStringDoc', { defaultMessage: 'Converts to string.', }), signatures: [ @@ -289,7 +292,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ { name: 'to_boolean', alias: ['to_bool'], - description: i18n.translate('monaco.esql.definitions.toBooleanDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toBooleanDoc', { defaultMessage: 'Converts to boolean.', }), signatures: [ @@ -302,9 +305,12 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_cartesianpoint', - description: i18n.translate('monaco.esql.definitions.toCartesianPointDoc', { - defaultMessage: 'Converts an input value to a `point` value.', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.toCartesianPointDoc', + { + defaultMessage: 'Converts an input value to a `point` value.', + } + ), signatures: [ { params: [{ name: 'field', type: 'any' }], @@ -315,9 +321,12 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_cartesianshape', - description: i18n.translate('monaco.esql.definitions.toCartesianshapeDoc', { - defaultMessage: 'Converts an input value to a cartesian_shape value.', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.toCartesianshapeDoc', + { + defaultMessage: 'Converts an input value to a cartesian_shape value.', + } + ), signatures: [ { params: [{ name: 'field', type: 'any' }], @@ -329,7 +338,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ { name: 'to_datetime', alias: ['to_dt'], - description: i18n.translate('monaco.esql.definitions.toDateTimeDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toDateTimeDoc', { defaultMessage: 'Converts to date.', }), signatures: [ @@ -342,7 +351,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_degrees', - description: i18n.translate('monaco.esql.definitions.toDegreesDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toDegreesDoc', { defaultMessage: 'Coverts to degrees', }), signatures: [ @@ -356,7 +365,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ { name: 'to_double', alias: ['to_dbl'], - description: i18n.translate('monaco.esql.definitions.toDoubleDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toDoubleDoc', { defaultMessage: 'Converts to double.', }), signatures: [ @@ -369,7 +378,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_geopoint', - description: i18n.translate('monaco.esql.definitions.toGeopointDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toGeopointDoc', { defaultMessage: 'Converts to geo_point.', }), signatures: [ @@ -382,7 +391,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_geoshape', - description: i18n.translate('monaco.esql.definitions.toGeoshapeDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toGeoshapeDoc', { defaultMessage: 'Converts an input value to a geo_shape value.', }), signatures: [ @@ -396,7 +405,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ { name: 'to_integer', alias: ['to_int'], - description: i18n.translate('monaco.esql.definitions.toIntegerDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toIntegerDoc', { defaultMessage: 'Converts to integer.', }), signatures: [ @@ -409,7 +418,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_long', - description: i18n.translate('monaco.esql.definitions.toLongDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toLongDoc', { defaultMessage: 'Converts to long.', }), signatures: [ @@ -422,7 +431,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_radians', - description: i18n.translate('monaco.esql.definitions.toRadiansDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toRadiansDoc', { defaultMessage: 'Converts to radians', }), signatures: [ @@ -436,9 +445,12 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ { name: 'to_unsigned_long', alias: ['to_ul', 'to_ulong'], - description: i18n.translate('monaco.esql.definitions.toUnsignedLongDoc', { - defaultMessage: 'Converts to unsigned long.', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.toUnsignedLongDoc', + { + defaultMessage: 'Converts to unsigned long.', + } + ), signatures: [ { params: [{ name: 'field', type: 'any' }], @@ -449,7 +461,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'to_ip', - description: i18n.translate('monaco.esql.definitions.toIpDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toIpDoc', { defaultMessage: 'Converts to ip.', }), signatures: [ @@ -463,7 +475,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ { name: 'to_version', alias: ['to_ver'], - description: i18n.translate('monaco.esql.definitions.toVersionDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.toVersionDoc', { defaultMessage: 'Converts to version.', }), signatures: [ @@ -481,9 +493,12 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'date_extract', - description: i18n.translate('monaco.esql.definitions.dateExtractDoc', { - defaultMessage: `Extracts parts of a date, like year, month, day, hour. The supported field types are those provided by java.time.temporal.ChronoField`, - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateExtractDoc', + { + defaultMessage: `Extracts parts of a date, like year, month, day, hour. The supported field types are those provided by java.time.temporal.ChronoField`, + } + ), signatures: [ { params: [ @@ -502,7 +517,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'date_format', - description: i18n.translate('monaco.esql.definitions.dateFormatDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.dateFormatDoc', { defaultMessage: `Returns a string representation of a date in the provided format. If no format is specified, the "yyyy-MM-dd'T'HH:mm:ss.SSSZ" format is used.`, }), signatures: [ @@ -518,7 +533,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'date_trunc', - description: i18n.translate('monaco.esql.definitions.dateTruncDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.dateTruncDoc', { defaultMessage: `Rounds down a date to the closest interval. Intervals can be expressed using the timespan literal syntax.`, }), signatures: [ @@ -534,7 +549,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'date_parse', - description: i18n.translate('monaco.esql.definitions.dateParseDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.dateParseDoc', { defaultMessage: `Parse dates from strings.`, }), signatures: [ @@ -552,7 +567,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'auto_bucket', - description: i18n.translate('monaco.esql.definitions.autoBucketDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.autoBucketDoc', { defaultMessage: `Automatically bucket dates based on a given range and bucket target.`, }), signatures: [ @@ -582,7 +597,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'case', - description: i18n.translate('monaco.esql.definitions.caseDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.caseDoc', { defaultMessage: 'Accepts pairs of conditions and values. The function returns the value that belongs to the first condition that evaluates to `true`. If the number of arguments is odd, the last argument is the default value which is returned when no condition matches.', }), @@ -602,7 +617,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'length', - description: i18n.translate('monaco.esql.definitions.lengthDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.lengthDoc', { defaultMessage: 'Returns the character length of a string.', }), signatures: [ @@ -615,7 +630,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'acos', - description: i18n.translate('monaco.esql.definitions.acosDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.acosDoc', { defaultMessage: 'Inverse cosine trigonometric function', }), signatures: [ @@ -628,7 +643,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'asin', - description: i18n.translate('monaco.esql.definitions.asinDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.asinDoc', { defaultMessage: 'Inverse sine trigonometric function', }), signatures: [ @@ -641,7 +656,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'atan', - description: i18n.translate('monaco.esql.definitions.atanDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.atanDoc', { defaultMessage: 'Inverse tangent trigonometric function', }), signatures: [ @@ -654,7 +669,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'atan2', - description: i18n.translate('monaco.esql.definitions.atan2Doc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.atan2Doc', { defaultMessage: 'The angle between the positive x-axis and the ray from the origin to the point (x , y) in the Cartesian plane', }), @@ -671,7 +686,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'coalesce', - description: i18n.translate('monaco.esql.definitions.coalesceDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.coalesceDoc', { defaultMessage: 'Returns the first non-null value.', }), signatures: [ @@ -685,7 +700,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'cos', - description: i18n.translate('monaco.esql.definitions.cosDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.cosDoc', { defaultMessage: 'Cosine trigonometric function', }), signatures: [ @@ -698,7 +713,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'cosh', - description: i18n.translate('monaco.esql.definitions.coshDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.coshDoc', { defaultMessage: 'Cosine hyperbolic function', }), signatures: [ @@ -711,7 +726,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'floor', - description: i18n.translate('monaco.esql.definitions.floorDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.floorDoc', { defaultMessage: 'Round a number down to the nearest integer.', }), signatures: [ @@ -724,7 +739,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'greatest', - description: i18n.translate('monaco.esql.definitions.greatestDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.greatestDoc', { defaultMessage: 'Returns the maximum value from many columns.', }), signatures: [ @@ -738,7 +753,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'least', - description: i18n.translate('monaco.esql.definitions.leastDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.leastDoc', { defaultMessage: 'Returns the minimum value from many columns.', }), signatures: [ @@ -752,7 +767,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'left', - description: i18n.translate('monaco.esql.definitions.leftDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.leftDoc', { defaultMessage: 'Return the substring that extracts length chars from the string starting from the left.', }), @@ -769,7 +784,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'ltrim', - description: i18n.translate('monaco.esql.definitions.ltrimDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.ltrimDoc', { defaultMessage: 'Removes leading whitespaces from strings.', }), signatures: [ @@ -782,7 +797,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'now', - description: i18n.translate('monaco.esql.definitions.nowDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.nowDoc', { defaultMessage: 'Returns current date and time.', }), signatures: [ @@ -795,7 +810,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'right', - description: i18n.translate('monaco.esql.definitions.rightDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.rightDoc', { defaultMessage: 'Return the substring that extracts length chars from the string starting from the right.', }), @@ -812,7 +827,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'rtrim', - description: i18n.translate('monaco.esql.definitions.rtrimDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.rtrimDoc', { defaultMessage: 'Removes trailing whitespaces from strings.', }), signatures: [ @@ -825,7 +840,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'sin', - description: i18n.translate('monaco.esql.definitions.sinDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.sinDoc', { defaultMessage: 'Sine trigonometric function.', }), signatures: [ @@ -838,7 +853,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'sinh', - description: i18n.translate('monaco.esql.definitions.sinhDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.sinhDoc', { defaultMessage: 'Sine hyperbolic function.', }), signatures: [ @@ -851,7 +866,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'sqrt', - description: i18n.translate('monaco.esql.definitions.sqrtDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.sqrtDoc', { defaultMessage: 'Returns the square root of a number. ', }), signatures: [ @@ -864,7 +879,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'tan', - description: i18n.translate('monaco.esql.definitions.tanDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.tanDoc', { defaultMessage: 'Tangent trigonometric function.', }), signatures: [ @@ -877,7 +892,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'tanh', - description: i18n.translate('monaco.esql.definitions.tanhDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.tanhDoc', { defaultMessage: 'Tangent hyperbolic function.', }), signatures: [ @@ -890,7 +905,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'cidr_match', - description: i18n.translate('monaco.esql.definitions.cidrMatchDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.cidrMatchDoc', { defaultMessage: 'The function takes a first parameter of type IP, followed by one or more parameters evaluated to a CIDR specificatione.', }), @@ -911,7 +926,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_avg', - description: i18n.translate('monaco.esql.definitions.mvAvgDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvAvgDoc', { defaultMessage: 'Converts a multivalued field into a single valued field containing the average of all of the values.', }), @@ -925,7 +940,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_concat', - description: i18n.translate('monaco.esql.definitions.mvConcatDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvConcatDoc', { defaultMessage: 'Converts a multivalued string field into a single valued field containing the concatenation of all values separated by a delimiter', }), @@ -942,7 +957,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_count', - description: i18n.translate('monaco.esql.definitions.mvCountDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvCountDoc', { defaultMessage: 'Converts a multivalued field into a single valued field containing a count of the number of values', }), @@ -956,7 +971,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_dedupe', - description: i18n.translate('monaco.esql.definitions.mvDedupeDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvDedupeDoc', { defaultMessage: 'Removes duplicates from a multivalued field', }), signatures: [ @@ -969,7 +984,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_first', - description: i18n.translate('monaco.esql.definitions.mvFirstDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvFirstDoc', { defaultMessage: 'Reduce a multivalued field to a single valued field containing the first value.', }), @@ -983,7 +998,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_last', - description: i18n.translate('monaco.esql.definitions.mvLastDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvLastDoc', { defaultMessage: 'Reduce a multivalued field to a single valued field containing the last value.', }), @@ -997,7 +1012,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_max', - description: i18n.translate('monaco.esql.definitions.mvMaxDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvMaxDoc', { defaultMessage: 'Converts a multivalued field into a single valued field containing the maximum value.', }), @@ -1011,7 +1026,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_min', - description: i18n.translate('monaco.esql.definitions.mvMinDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvMinDoc', { defaultMessage: 'Converts a multivalued field into a single valued field containing the minimum value.', }), @@ -1025,7 +1040,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_median', - description: i18n.translate('monaco.esql.definitions.mvMedianDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvMedianDoc', { defaultMessage: 'Converts a multivalued field into a single valued field containing the median value.', }), @@ -1039,7 +1054,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'mv_sum', - description: i18n.translate('monaco.esql.definitions.mvSumDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mvSumDoc', { defaultMessage: 'Converts a multivalued field into a single valued field containing the sum of all of the values.', }), @@ -1053,7 +1068,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'pi', - description: i18n.translate('monaco.esql.definitions.piDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.piDoc', { defaultMessage: 'The ratio of a circle’s circumference to its diameter.', }), signatures: [ @@ -1066,7 +1081,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'e', - description: i18n.translate('monaco.esql.definitions.eDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.eDoc', { defaultMessage: 'Euler’s number.', }), signatures: [ @@ -1079,7 +1094,7 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, { name: 'tau', - description: i18n.translate('monaco.esql.definitions.tauDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.tauDoc', { defaultMessage: 'The ratio of a circle’s circumference to its radius.', }), signatures: [ diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/helpers.ts similarity index 98% rename from packages/kbn-monaco/src/esql/lib/ast/definitions/helpers.ts rename to packages/kbn-esql-validation-autocomplete/src/definitions/helpers.ts index a8f403ef0f330..89485f2174a42 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/helpers.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { CommandDefinition, FunctionDefinition } from './types'; +import type { CommandDefinition, FunctionDefinition } from './types'; /** * Given a function definition, this function will return a list of function signatures diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/literals.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/literals.ts new file mode 100644 index 0000000000000..9369414378385 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/literals.ts @@ -0,0 +1,190 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; +import type { Literals } from './types'; + +export const timeLiterals: Literals[] = [ + { + name: 'year', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.year', + { + defaultMessage: 'Year', + } + ), + }, + { + name: 'years', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.years', + { + defaultMessage: 'Years (Plural)', + } + ), + }, + { + name: 'month', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.month', + { + defaultMessage: 'Month', + } + ), + }, + { + name: 'months', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.months', + { + defaultMessage: 'Months (Plural)', + } + ), + }, + { + name: 'week', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.week', + { + defaultMessage: 'Week', + } + ), + }, + { + name: 'weeks', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.weeks', + { + defaultMessage: 'Weeks (Plural)', + } + ), + }, + { + name: 'day', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.day', + { + defaultMessage: 'Day', + } + ), + }, + { + name: 'days', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.days', + { + defaultMessage: 'Days (Plural)', + } + ), + }, + { + name: 'hour', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.hour', + { + defaultMessage: 'Hour', + } + ), + }, + { + name: 'hours', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.hours', + { + defaultMessage: 'Hours (Plural)', + } + ), + }, + { + name: 'minute', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.minute', + { + defaultMessage: 'Minute', + } + ), + }, + { + name: 'minutes', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.minutes', + { + defaultMessage: 'Minutes (Plural)', + } + ), + }, + { + name: 'second', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.second', + { + defaultMessage: 'Second', + } + ), + }, + { + name: 'seconds', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.seconds', + { + defaultMessage: 'Seconds (Plural)', + } + ), + }, + { + name: 'millisecond', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.millisecond', + { + defaultMessage: 'Millisecond', + } + ), + }, + { + name: 'milliseconds', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.milliseconds', + { + defaultMessage: 'Milliseconds (Plural)', + } + ), + }, +]; + +export const chronoLiterals: Literals[] = [ + 'ALIGNED_DAY_OF_WEEK_IN_MONTH', + 'ALIGNED_DAY_OF_WEEK_IN_YEAR', + 'ALIGNED_WEEK_OF_MONTH', + 'ALIGNED_WEEK_OF_YEAR', + 'AMPM_OF_DAY', + 'CLOCK_HOUR_OF_AMPM', + 'CLOCK_HOUR_OF_DAY', + 'DAY_OF_MONTH', + 'DAY_OF_WEEK', + 'DAY_OF_YEAR', + 'EPOCH_DAY', + 'ERA', + 'HOUR_OF_AMPM', + 'HOUR_OF_DAY', + 'INSTANT_SECONDS', + 'MICRO_OF_DAY', + 'MICRO_OF_SECOND', + 'MILLI_OF_DAY', + 'MILLI_OF_SECOND', + 'MINUTE_OF_DAY', + 'MINUTE_OF_HOUR', + 'MONTH_OF_YEAR', + 'NANO_OF_DAY', + 'NANO_OF_SECOND', + 'OFFSET_SECONDS', + 'PROLEPTIC_MONTH', + 'SECOND_OF_DAY', + 'SECOND_OF_MINUTE', + 'YEAR', + 'YEAR_OF_ERA', +].map((name) => ({ name: `"${name}"`, description: '' })); diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/options.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/options.ts similarity index 60% rename from packages/kbn-monaco/src/esql/lib/ast/definitions/options.ts rename to packages/kbn-esql-validation-autocomplete/src/definitions/options.ts index cac6978970ce0..f8b41be1b1ae4 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/options.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/options.ts @@ -7,13 +7,14 @@ */ import { i18n } from '@kbn/i18n'; +import type { ESQLCommandOption, ESQLMessage } from '@kbn/esql-ast'; import { isColumnItem, isLiteralItem } from '../shared/helpers'; -import { ESQLCommandOption, ESQLMessage } from '../types'; -import { CommandOptionsDefinition } from './types'; +import { getMessageFromId } from '../validation/errors'; +import type { CommandOptionsDefinition } from './types'; export const byOption: CommandOptionsDefinition = { name: 'by', - description: i18n.translate('monaco.esql.definitions.byDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.byDoc', { defaultMessage: 'By', }), signature: { @@ -25,7 +26,7 @@ export const byOption: CommandOptionsDefinition = { export const metadataOption: CommandOptionsDefinition = { name: 'metadata', - description: i18n.translate('monaco.esql.definitions.metadataDoc', { + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.metadataDoc', { defaultMessage: 'Metadata', }), signature: { @@ -38,33 +39,29 @@ export const metadataOption: CommandOptionsDefinition = { const messages: ESQLMessage[] = []; // need to test the parent command here if (/\[metadata/i.test(command.text)) { - messages.push({ - location: option.location, - text: i18n.translate('monaco.esql.validation.metadataBracketsDeprecation', { - defaultMessage: "Square brackets '[]' need to be removed from FROM METADATA declaration", - }), - type: 'warning', - code: 'metadataBracketsDeprecation', - }); + messages.push( + getMessageFromId({ + messageId: 'metadataBracketsDeprecation', + values: {}, + locations: option.location, + }) + ); } const fields = option.args.filter(isColumnItem); const metadataFieldsAvailable = references as unknown as Set; if (metadataFieldsAvailable.size > 0) { for (const field of fields) { if (!metadataFieldsAvailable.has(field.name)) { - messages.push({ - location: field.location, - text: i18n.translate('monaco.esql.validation.wrongMetadataArgumentType', { - defaultMessage: - 'Metadata field [{value}] is not available. Available metadata fields are: [{availableFields}]', + messages.push( + getMessageFromId({ + messageId: 'unknownMetadataField', values: { value: field.name, availableFields: Array.from(metadataFieldsAvailable).join(', '), }, - }), - type: 'error', - code: 'unknownMetadataField', - }); + locations: field.location, + }) + ); } } } @@ -74,7 +71,9 @@ export const metadataOption: CommandOptionsDefinition = { export const asOption: CommandOptionsDefinition = { name: 'as', - description: i18n.translate('monaco.esql.definitions.asDoc', { defaultMessage: 'As' }), + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.asDoc', { + defaultMessage: 'As', + }), signature: { multipleParams: false, params: [ @@ -87,7 +86,9 @@ export const asOption: CommandOptionsDefinition = { export const onOption: CommandOptionsDefinition = { name: 'on', - description: i18n.translate('monaco.esql.definitions.onDoc', { defaultMessage: 'On' }), + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.onDoc', { + defaultMessage: 'On', + }), signature: { multipleParams: false, params: [{ name: 'matchingColumn', type: 'column' }], @@ -97,7 +98,9 @@ export const onOption: CommandOptionsDefinition = { export const withOption: CommandOptionsDefinition = { name: 'with', - description: i18n.translate('monaco.esql.definitions.withDoc', { defaultMessage: 'With' }), + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.withDoc', { + defaultMessage: 'With', + }), signature: { multipleParams: true, params: [{ name: 'assignment', type: 'any' }], @@ -107,10 +110,13 @@ export const withOption: CommandOptionsDefinition = { export const appendSeparatorOption: CommandOptionsDefinition = { name: 'append_separator', - description: i18n.translate('monaco.esql.definitions.appendSeparatorDoc', { - defaultMessage: - 'The character(s) that separate the appended fields. Default to empty string ("").', - }), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.appendSeparatorDoc', + { + defaultMessage: + 'The character(s) that separate the appended fields. Default to empty string ("").', + } + ), signature: { multipleParams: false, params: [{ name: 'separator', type: 'string' }], @@ -125,18 +131,13 @@ export const appendSeparatorOption: CommandOptionsDefinition = { (!isLiteralItem(firstArg) || firstArg.literalType !== 'string') ) { const value = 'value' in firstArg ? firstArg.value : firstArg.name; - messages.push({ - location: firstArg.location, - text: i18n.translate('monaco.esql.validation.wrongDissectOptionArgumentType', { - defaultMessage: - 'Invalid value for DISSECT append_separator: expected a string, but was [{value}]', - values: { - value, - }, - }), - type: 'error', - code: 'wrongDissectOptionArgumentType', - }); + messages.push( + getMessageFromId({ + messageId: 'wrongDissectOptionArgumentType', + values: { value }, + locations: firstArg.location, + }) + ); } return messages; }, diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/settings.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/settings.ts new file mode 100644 index 0000000000000..a038142ab20f3 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/settings.ts @@ -0,0 +1,44 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; +import type { CommandModeDefinition } from './types'; + +export const ENRICH_MODES: CommandModeDefinition = { + name: 'ccq.mode', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.ccqModeDoc', { + defaultMessage: 'Cross-clusters query mode', + }), + prefix: '_', + values: [ + { + name: 'any', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.ccqAnyDoc', { + defaultMessage: 'Enrich takes place on any cluster', + }), + }, + { + name: 'coordinator', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.ccqCoordinatorDoc', + { + defaultMessage: 'Enrich takes place on the coordinating cluster receiving an ES|QL', + } + ), + }, + { + name: 'remote', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.ccqRemoteDoc', + { + defaultMessage: 'Enrich takes place on the cluster hosting the target index.', + } + ), + }, + ], +}; diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/types.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts similarity index 98% rename from packages/kbn-monaco/src/esql/lib/ast/definitions/types.ts rename to packages/kbn-esql-validation-autocomplete/src/definitions/types.ts index 4667c0504982f..111846f1f515f 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { ESQLCommand, ESQLCommandOption, ESQLFunction, ESQLMessage } from '../types'; +import type { ESQLCommand, ESQLCommandOption, ESQLFunction, ESQLMessage } from '@kbn/esql-ast'; export interface FunctionDefinition { type: 'builtin' | 'agg' | 'eval'; diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts b/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts new file mode 100644 index 0000000000000..ed4e854f95e97 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts @@ -0,0 +1,15 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +export const EDITOR_MARKER = 'marker_esql_editor'; + +export const TICKS_REGEX = /^`{1}|`{1}$/g; +export const DOUBLE_TICKS_REGEX = /``/g; +export const SINGLE_TICK_REGEX = /`/g; +export const SINGLE_BACKTICK = '`'; +export const DOUBLE_BACKTICK = '``'; diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts b/packages/kbn-esql-validation-autocomplete/src/shared/context.ts similarity index 81% rename from packages/kbn-monaco/src/esql/lib/ast/shared/context.ts rename to packages/kbn-esql-validation-autocomplete/src/shared/context.ts index b9b8219e149fe..2a9ae25a1d4e5 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/context.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import { enrichModes } from '../definitions/settings'; import type { ESQLAstItem, ESQLSingleAstItem, @@ -15,7 +14,8 @@ import type { ESQLCommand, ESQLCommandOption, ESQLCommandMode, -} from '../types'; +} from '@kbn/esql-ast'; +import { ENRICH_MODES } from '../definitions/settings'; import { EDITOR_MARKER } from './constants'; import { isOptionItem, @@ -136,7 +136,20 @@ function isBuiltinFunction(node: ESQLFunction) { return getFunctionDefinition(node.name)?.type === 'builtin'; } -export function getAstContext(innerText: string, ast: ESQLAst, offset: number) { +/** + * Given a ES|QL query string, its AST and the cursor position, + * it returns the type of context for the position ("list", "function", "option", "setting", "expression", "newCommand") + * plus the whole hierarchy of nodes (command, option, setting and actual position node) context. + * + * Type details: + * * "list": the cursor is inside a "in" list of values (i.e. `a in (1, 2, )`) + * * "function": the cursor is inside a function call (i.e. `fn()`) + * * "option": the cursor is inside a command option (i.e. `command ... by `) + * * "setting": the cursor is inside a setting (i.e. `command _`) + * * "expression": the cursor is inside a command expression (i.e. `command ... ` or `command a = ... `) + * * "newCommand": the cursor is at the beginning of a new command (i.e. `command1 | command2 | `) + */ +export function getAstContext(queryString: string, ast: ESQLAst, offset: number) { const { command, option, setting, node } = findAstPosition(ast, offset); if (node) { if (node.type === 'function') { @@ -154,13 +167,12 @@ export function getAstContext(innerText: string, ast: ESQLAst, offset: number) { return { type: 'option' as const, command, node, option, setting }; } // for now it's only an enrich thing - if (node.type === 'source' && node.text === enrichModes.prefix) { + if (node.type === 'source' && node.text === ENRICH_MODES.prefix) { // command _ return { type: 'setting' as const, command, node, option, setting }; } } - - if (!command || (innerText.length <= offset && getLastCharFromTrimmed(innerText) === '|')) { + if (!command || (queryString.length <= offset && getLastCharFromTrimmed(queryString) === '|')) { // // ... | return { type: 'newCommand' as const, command: undefined, node, option, setting }; } diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts similarity index 94% rename from packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts rename to packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index 8fea0aa83ec9e..8eab378214a47 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -6,8 +6,17 @@ * Side Public License, v 1. */ -import type { monaco } from '../../../../monaco_imports'; -import { AutocompleteCommandDefinition } from '../autocomplete/types'; +import type { + ESQLAstItem, + ESQLColumn, + ESQLCommandMode, + ESQLCommandOption, + ESQLFunction, + ESQLLiteral, + ESQLSingleAstItem, + ESQLSource, + ESQLTimeInterval, +} from '@kbn/esql-ast'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; import { builtinFunctions } from '../definitions/builtin'; import { commandDefinitions } from '../definitions/commands'; @@ -22,25 +31,19 @@ import { withOption, appendSeparatorOption, } from '../definitions/options'; -import { +import type { CommandDefinition, CommandOptionsDefinition, FunctionDefinition, SignatureArgType, } from '../definitions/types'; -import { - ESQLAstItem, - ESQLColumn, - ESQLCommandMode, - ESQLCommandOption, - ESQLFunction, - ESQLLiteral, - ESQLSingleAstItem, - ESQLSource, - ESQLTimeInterval, -} from '../types'; -import { ESQLRealField, ESQLVariable, ReferenceMaps } from '../validation/types'; +import type { ESQLRealField, ESQLVariable, ReferenceMaps } from '../validation/types'; import { removeMarkerArgFromArgsList } from './context'; +import type { ReasonTypes } from './types'; + +export function nonNullable(v: T): v is NonNullable { + return v != null; +} export function isSingleItem(arg: ESQLAstItem): arg is ESQLSingleAstItem { return arg && !Array.isArray(arg); @@ -114,22 +117,10 @@ export function isComma(char: string) { return char === ','; } -export function isSourceCommand({ label }: AutocompleteCommandDefinition) { +export function isSourceCommand({ label }: { label: string }) { return ['from', 'row', 'show'].includes(String(label)); } -// From Monaco position to linear offset -export function monacoPositionToOffset(expression: string, position: monaco.Position): number { - const lines = expression.split(/\n/); - return lines - .slice(0, position.lineNumber) - .reduce( - (prev, current, index) => - prev + (index === position.lineNumber - 1 ? position.column - 1 : current.length + 1), - 0 - ); -} - let fnLookups: Map | undefined; let commandLookups: Map | undefined; @@ -150,8 +141,6 @@ function buildFunctionLookup() { return fnLookups; } -type ReasonTypes = 'missingCommand' | 'unsupportedFunction' | 'unknownFunction'; - export function isSupportedFunction( name: string, parentCommand?: string, diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/resources_helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts similarity index 98% rename from packages/kbn-monaco/src/esql/lib/ast/shared/resources_helpers.ts rename to packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts index c02d5db099f2b..e44d874f8674c 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/resources_helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ +import type { ESQLAst } from '@kbn/esql-ast'; import type { ESQLCallbacks } from './types'; import type { ESQLRealField } from '../validation/types'; -import type { ESQLAst } from '../types'; export function buildQueryUntilPreviousCommand(ast: ESQLAst, queryString: string) { const prevCommand = ast[Math.max(ast.length - 2, 0)]; diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/types.ts b/packages/kbn-esql-validation-autocomplete/src/shared/types.ts similarity index 90% rename from packages/kbn-monaco/src/esql/lib/ast/shared/types.ts rename to packages/kbn-esql-validation-autocomplete/src/shared/types.ts index 7c6eaf74f1282..c64585b2bab55 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/types.ts @@ -18,6 +18,6 @@ export interface ESQLCallbacks { {}, { name: string; sourceIndices: string[]; matchField: string; enrichFields: string[] } >; - getPolicyFields?: CallbackFn; - getPolicyMatchingField?: CallbackFn; } + +export type ReasonTypes = 'missingCommand' | 'unsupportedFunction' | 'unknownFunction'; diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/variables.ts b/packages/kbn-esql-validation-autocomplete/src/shared/variables.ts similarity index 99% rename from packages/kbn-monaco/src/esql/lib/ast/shared/variables.ts rename to packages/kbn-esql-validation-autocomplete/src/shared/variables.ts index f6f8d1cfaf3dd..9debf8a67083f 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/variables.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/variables.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { ESQLAstItem, ESQLCommand, ESQLCommandOption, ESQLFunction } from '../types'; +import type { ESQLAstItem, ESQLCommand, ESQLCommandOption, ESQLFunction } from '@kbn/esql-ast'; import type { ESQLVariable, ESQLRealField } from '../validation/types'; import { DOUBLE_BACKTICK, EDITOR_MARKER, SINGLE_BACKTICK } from './constants'; import { diff --git a/packages/kbn-esql-validation-autocomplete/src/types.ts b/packages/kbn-esql-validation-autocomplete/src/types.ts new file mode 100644 index 0000000000000..c2cbdac1aaafb --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/types.ts @@ -0,0 +1,17 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +export interface EditorError { + startLineNumber: number; + endLineNumber: number; + startColumn: number; + endColumn: number; + message: string; + code?: string; + severity: 'error' | 'warning' | number; +} diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/.gitignore b/packages/kbn-esql-validation-autocomplete/src/validation/.gitignore similarity index 100% rename from packages/kbn-monaco/src/esql/lib/ast/validation/.gitignore rename to packages/kbn-esql-validation-autocomplete/src/validation/.gitignore diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/errors.ts b/packages/kbn-esql-validation-autocomplete/src/validation/errors.ts new file mode 100644 index 0000000000000..b7e02f10683f3 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/validation/errors.ts @@ -0,0 +1,391 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; +import type { ESQLLocation, ESQLMessage } from '@kbn/esql-ast'; +import type { ErrorTypes, ErrorValues } from './types'; + +function getMessageAndTypeFromId({ + messageId, + values, +}: { + messageId: K; + values: ErrorValues; +}): { message: string; type?: 'error' | 'warning' } { + // Use a less strict type instead of doing a typecast on each message type + const out = values as unknown as Record; + // i18n validation wants to the values prop to be declared inline, so need to unpack and redeclare again all props + switch (messageId) { + case 'wrongArgumentType': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.wrongArgumentType', + { + defaultMessage: + 'Argument of [{name}] must be [{argType}], found value [{value}] type [{givenType}]', + values: { + name: out.name, + argType: out.argType, + value: out.value, + givenType: out.givenType, + }, + } + ), + }; + case 'unknownColumn': + return { + message: i18n.translate('kbn-esql-validation-autocomplete.esql.validation.unknownColumn', { + defaultMessage: 'Unknown column [{name}]', + values: { name: out.name }, + }), + }; + case 'unknownIndex': + return { + message: i18n.translate('kbn-esql-validation-autocomplete.esql.validation.unknownIndex', { + defaultMessage: 'Unknown index [{name}]', + values: { name: out.name }, + }), + }; + case 'unknownFunction': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.missingFunction', + { + defaultMessage: 'Unknown function [{name}]', + values: { name: out.name }, + } + ), + }; + case 'wrongArgumentNumber': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.wrongArgumentExactNumber', + { + defaultMessage: + 'Error: [{fn}] function expects exactly {numArgs, plural, one {one argument} other {{numArgs} arguments}}, got {passedArgs}.', + values: { + fn: out.fn, + numArgs: out.numArgs, + passedArgs: out.passedArgs, + }, + } + ), + }; + case 'wrongArgumentNumberTooMany': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.wrongArgumentTooManyNumber', + { + defaultMessage: + 'Error: [{fn}] function expects {extraArgs, plural, =0 {} other {no more than }}{numArgs, plural, one {one argument} other {{numArgs} arguments}}, got {passedArgs}.', + values: { + fn: out.fn, + numArgs: out.numArgs, + passedArgs: out.passedArgs, + extraArgs: out.extraArgs, + }, + } + ), + }; + case 'wrongArgumentNumberTooFew': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.wrongArgumentTooFewNumber', + { + defaultMessage: + 'Error: [{fn}] function expects {missingArgs, plural, =0 {} other {at least }}{numArgs, plural, one {one argument} other {{numArgs} arguments}}, got {passedArgs}.', + values: { + fn: out.fn, + numArgs: out.numArgs, + passedArgs: out.passedArgs, + missingArgs: out.missingArgs, + }, + } + ), + }; + case 'noNestedArgumentSupport': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.noNestedArgumentSupport', + { + defaultMessage: + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [{name}] of type [{argType}]", + values: { name: out.name, argType: out.argType }, + } + ), + }; + case 'shadowFieldType': + return { + message: i18n.translate('kbn-esql-validation-autocomplete.esql.validation.typeOverwrite', { + defaultMessage: + 'Column [{field}] of type {fieldType} has been overwritten as new type: {newType}', + values: { field: out.field, fieldType: out.fieldType, newType: out.newType }, + }), + type: 'warning', + }; + case 'unsupportedColumnTypeForCommand': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.unsupportedColumnTypeForCommand', + { + defaultMessage: + '{command} only supports {type} {typeCount, plural, one {type} other {types}} values, found [{column}] of type [{givenType}]', + values: { + command: out.command, + type: out.type, + typeCount: out.typeCount, + column: out.column, + givenType: out.givenType, + }, + } + ), + }; + case 'unknownOption': + return { + message: i18n.translate('kbn-esql-validation-autocomplete.esql.validation.unknownOption', { + defaultMessage: 'Invalid option for {command}: [{option}]', + values: { + command: out.command, + option: out.option, + }, + }), + }; + case 'unsupportedFunctionForCommand': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.unsupportedFunctionForCommand', + { + defaultMessage: '{command} does not support function {name}', + values: { + command: out.command, + name: out.name, + }, + } + ), + }; + case 'unsupportedFunctionForCommandOption': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.unsupportedFunctionforCommandOption', + { + defaultMessage: '{command} {option} does not support function {name}', + values: { + command: out.command, + option: out.option, + name: out.name, + }, + } + ), + }; + case 'unknownInterval': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.unknownInterval', + { + defaultMessage: `Unexpected time interval qualifier: '{value}'`, + values: { + value: out.value, + }, + } + ), + }; + case 'unsupportedTypeForCommand': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.unsupportedTypeForCommand', + { + defaultMessage: '{command} does not support [{type}] in expression [{value}]', + values: { + command: out.command, + type: out.type, + value: out.value, + }, + } + ), + }; + case 'unknownPolicy': + return { + message: i18n.translate('kbn-esql-validation-autocomplete.esql.validation.unknownPolicy', { + defaultMessage: 'Unknown policy [{name}]', + values: { + name: out.name, + }, + }), + }; + case 'unknownAggregateFunction': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.unknowAggregateFunction', + { + defaultMessage: + 'Expected an aggregate function or group but got [{value}] of type [{type}]', + values: { + type: out.type, + value: out.value, + }, + } + ), + }; + case 'wildcardNotSupportedForCommand': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.wildcardNotSupportedForCommand', + { + defaultMessage: 'Using wildcards (*) in {command} is not allowed [{value}]', + values: { + command: out.command, + value: out.value, + }, + } + ), + }; + case 'noWildcardSupportAsArg': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.wildcardNotSupportedForFunction', + { + defaultMessage: 'Using wildcards (*) in {name} is not allowed', + values: { + name: out.name, + }, + } + ), + }; + case 'unsupportedFieldType': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.unsupportedFieldType', + { + defaultMessage: + 'Field [{field}] cannot be retrieved, it is unsupported or not indexed; returning null', + values: { + field: out.field, + }, + } + ), + type: 'warning', + }; + case 'unsupportedSetting': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.unsupportedSetting', + { + defaultMessage: 'Unsupported setting [{setting}], expected [{expected}]', + values: { + setting: out.setting, + expected: out.expected, + }, + } + ), + type: 'error', + }; + case 'unsupportedSettingCommandValue': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.unsupportedSettingValue', + { + defaultMessage: + 'Unrecognized value [{value}] for {command}, mode needs to be one of [{expected}]', + values: { + expected: out.expected, + value: out.value, + command: out.command, + }, + } + ), + type: 'error', + }; + case 'expectedConstant': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.expectedConstantValue', + { + defaultMessage: 'Argument of [{fn}] must be a constant, received [{given}]', + values: { + given: out.given, + fn: out.fn, + }, + } + ), + type: 'error', + }; + case 'metadataBracketsDeprecation': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.metadataBracketsDeprecation', + { + defaultMessage: + "Square brackets '[]' need to be removed from FROM METADATA declaration", + } + ), + type: 'warning', + }; + case 'unknownMetadataField': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.wrongMetadataArgumentType', + { + defaultMessage: + 'Metadata field [{value}] is not available. Available metadata fields are: [{availableFields}]', + values: { + value: out.value, + availableFields: out.availableFields, + }, + } + ), + type: 'error', + }; + case 'wrongDissectOptionArgumentType': + return { + message: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.validation.wrongDissectOptionArgumentType', + { + defaultMessage: + 'Invalid value for DISSECT append_separator: expected a string, but was [{value}]', + values: { + value: out.value, + }, + } + ), + type: 'error', + }; + } + return { message: '' }; +} + +export function getMessageFromId({ + locations, + ...payload +}: { + messageId: K; + values: ErrorValues; + locations: ESQLLocation; +}): ESQLMessage { + const { message, type = 'error' } = getMessageAndTypeFromId(payload); + return createMessage(type, message, locations, payload.messageId); +} + +export function createMessage( + type: 'error' | 'warning', + message: string, + location: ESQLLocation, + messageId: string +) { + return { + type, + text: message, + location, + code: messageId, + }; +} + +export function getUnknownTypeLabel() { + return i18n.translate('kbn-esql-validation-autocomplete.esql.validation.unknownColumnType', { + defaultMessage: 'Unknown type', + }); +} diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json new file mode 100644 index 0000000000000..0db7e695f8a62 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -0,0 +1,12644 @@ +{ + "indexes": [ + "a_index", + "index", + "other_index", + ".secret_index", + "my-index", + "unsupported_index" + ], + "fields": [ + { + "name": "numberField", + "type": "number" + }, + { + "name": "dateField", + "type": "date" + }, + { + "name": "booleanField", + "type": "boolean" + }, + { + "name": "ipField", + "type": "ip" + }, + { + "name": "stringField", + "type": "string" + }, + { + "name": "cartesianPointField", + "type": "cartesian_point" + }, + { + "name": "geoPointField", + "type": "geo_point" + }, + { + "name": "any#Char$Field", + "type": "number" + }, + { + "name": "kubernetes.something.something", + "type": "number" + }, + { + "name": "@timestamp", + "type": "date" + }, + { + "name": "otherStringField", + "type": "keyword" + } + ], + "enrichFields": [ + { + "name": "otherField", + "type": "string" + }, + { + "name": "yetAnotherField", + "type": "number" + }, + { + "name": "otherStringField", + "type": "keyword" + } + ], + "policies": [ + { + "name": "policy", + "sourceIndices": [ + "enrich_index" + ], + "matchField": "otherStringField", + "enrichFields": [ + "otherField", + "yetAnotherField" + ] + }, + { + "name": "policy$", + "sourceIndices": [ + "enrich_index" + ], + "matchField": "otherStringField", + "enrichFields": [ + "otherField", + "yetAnotherField" + ] + } + ], + "unsupported_field": [ + { + "name": "unsupported_field", + "type": "unsupported" + } + ], + "testCases": [ + { + "query": "eval", + "error": [ + "SyntaxError: mismatched input 'eval' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "stats", + "error": [ + "SyntaxError: mismatched input 'stats' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "rename", + "error": [ + "SyntaxError: mismatched input 'rename' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "limit", + "error": [ + "SyntaxError: mismatched input 'limit' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "keep", + "error": [ + "SyntaxError: mismatched input 'keep' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "drop", + "error": [ + "SyntaxError: mismatched input 'drop' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "mv_expand", + "error": [ + "SyntaxError: mismatched input 'mv_expand' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "dissect", + "error": [ + "SyntaxError: mismatched input 'dissect' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "grok", + "error": [ + "SyntaxError: mismatched input 'grok' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "f", + "error": [ + "SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'meta', 'row', 'show'}" + ], + "warning": [] + }, + { + "query": "from ", + "error": [ + "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''" + ], + "warning": [] + }, + { + "query": "from index,", + "error": [ + "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''" + ], + "warning": [] + }, + { + "query": "from assignment = 1", + "error": [ + "SyntaxError: mismatched input '=' expecting ", + "Unknown index [assignment]" + ], + "warning": [] + }, + { + "query": "from index", + "error": [], + "warning": [] + }, + { + "query": "FROM index", + "error": [], + "warning": [] + }, + { + "query": "FrOm index", + "error": [], + "warning": [] + }, + { + "query": "from `index`", + "error": [], + "warning": [] + }, + { + "query": "from index, other_index", + "error": [], + "warning": [] + }, + { + "query": "from index, missingIndex", + "error": [ + "Unknown index [missingIndex]" + ], + "warning": [] + }, + { + "query": "from fn()", + "error": [ + "Unknown index [fn()]" + ], + "warning": [] + }, + { + "query": "from average()", + "error": [ + "Unknown index [average()]" + ], + "warning": [] + }, + { + "query": "from index [METADATA _id]", + "error": [], + "warning": [ + "Square brackets '[]' need to be removed from FROM METADATA declaration" + ] + }, + { + "query": "from index [metadata _id]", + "error": [], + "warning": [ + "Square brackets '[]' need to be removed from FROM METADATA declaration" + ] + }, + { + "query": "from index [METADATA _id, _source]", + "error": [], + "warning": [ + "Square brackets '[]' need to be removed from FROM METADATA declaration" + ] + }, + { + "query": "from index [METADATA _id, _source2]", + "error": [ + "Metadata field [_source2] is not available. Available metadata fields are: [_id, _source]" + ], + "warning": [ + "Square brackets '[]' need to be removed from FROM METADATA declaration" + ] + }, + { + "query": "from index [metadata _id, _source] [METADATA _id2]", + "error": [ + "SyntaxError: mismatched input '[' expecting " + ], + "warning": [ + "Square brackets '[]' need to be removed from FROM METADATA declaration" + ] + }, + { + "query": "from remote-ccs:indexes [METADATA _id]", + "error": [], + "warning": [ + "Square brackets '[]' need to be removed from FROM METADATA declaration" + ] + }, + { + "query": "from *:indexes [METADATA _id]", + "error": [], + "warning": [ + "Square brackets '[]' need to be removed from FROM METADATA declaration" + ] + }, + { + "query": "from index METADATA _id", + "error": [], + "warning": [] + }, + { + "query": "from index metadata _id", + "error": [], + "warning": [] + }, + { + "query": "from index METADATA _id, _source", + "error": [], + "warning": [] + }, + { + "query": "from index METADATA _id, _source2", + "error": [ + "Metadata field [_source2] is not available. Available metadata fields are: [_id, _source]" + ], + "warning": [] + }, + { + "query": "from index metadata _id, _source METADATA _id2", + "error": [ + "SyntaxError: mismatched input 'METADATA' expecting " + ], + "warning": [] + }, + { + "query": "from remote-ccs:indexes METADATA _id", + "error": [], + "warning": [] + }, + { + "query": "from *:indexes METADATA _id", + "error": [], + "warning": [] + }, + { + "query": "from index (metadata _id)", + "error": [ + "SyntaxError: mismatched input '(metadata' expecting " + ], + "warning": [] + }, + { + "query": "from ind*, other*", + "error": [], + "warning": [] + }, + { + "query": "from index*", + "error": [], + "warning": [] + }, + { + "query": "from *a_i*dex*", + "error": [], + "warning": [] + }, + { + "query": "from in*ex*", + "error": [], + "warning": [] + }, + { + "query": "from *n*ex", + "error": [], + "warning": [] + }, + { + "query": "from *n*ex*", + "error": [], + "warning": [] + }, + { + "query": "from i*d*x*", + "error": [], + "warning": [] + }, + { + "query": "from i*d*x", + "error": [], + "warning": [] + }, + { + "query": "from i***x*", + "error": [], + "warning": [] + }, + { + "query": "from i****", + "error": [], + "warning": [] + }, + { + "query": "from i**", + "error": [], + "warning": [] + }, + { + "query": "from index**", + "error": [], + "warning": [] + }, + { + "query": "from *ex", + "error": [], + "warning": [] + }, + { + "query": "from *ex*", + "error": [], + "warning": [] + }, + { + "query": "from in*ex", + "error": [], + "warning": [] + }, + { + "query": "from ind*ex", + "error": [], + "warning": [] + }, + { + "query": "from indexes*", + "error": [ + "Unknown index [indexes*]" + ], + "warning": [] + }, + { + "query": "from remote-*:indexes*", + "error": [], + "warning": [] + }, + { + "query": "from remote-*:indexes", + "error": [], + "warning": [] + }, + { + "query": "from remote-ccs:indexes", + "error": [], + "warning": [] + }, + { + "query": "from a_index, remote-ccs:indexes", + "error": [], + "warning": [] + }, + { + "query": "from .secret_index", + "error": [], + "warning": [] + }, + { + "query": "from my-index", + "error": [], + "warning": [] + }, + { + "query": "from numberField", + "error": [ + "Unknown index [numberField]" + ], + "warning": [] + }, + { + "query": "from policy", + "error": [ + "Unknown index [policy]" + ], + "warning": [] + }, + { + "query": "row", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "row missing_column", + "error": [ + "Unknown column [missing_column]" + ], + "warning": [] + }, + { + "query": "row fn()", + "error": [ + "Unknown function [fn]" + ], + "warning": [] + }, + { + "query": "row missing_column, missing_column2", + "error": [ + "Unknown column [missing_column]", + "Unknown column [missing_column2]" + ], + "warning": [] + }, + { + "query": "row a=1", + "error": [], + "warning": [] + }, + { + "query": "row a=1, missing_column", + "error": [ + "Unknown column [missing_column]" + ], + "warning": [] + }, + { + "query": "row a=1, b = average()", + "error": [ + "Unknown function [average]" + ], + "warning": [] + }, + { + "query": "row a = [1, 2, 3]", + "error": [], + "warning": [] + }, + { + "query": "row a = [true, false]", + "error": [], + "warning": [] + }, + { + "query": "row a = [\"a\", \"b\"]", + "error": [], + "warning": [] + }, + { + "query": "row a = null", + "error": [], + "warning": [] + }, + { + "query": "row a = (1)", + "error": [], + "warning": [] + }, + { + "query": "row a = (1, 2, 3)", + "error": [ + "SyntaxError: no viable alternative at input '(1,'", + "SyntaxError: extraneous input ')' expecting " + ], + "warning": [] + }, + { + "query": "row a=NOT true", + "error": [], + "warning": [] + }, + { + "query": "row NOT true", + "error": [], + "warning": [] + }, + { + "query": "row a=NOT false", + "error": [], + "warning": [] + }, + { + "query": "row NOT false", + "error": [], + "warning": [] + }, + { + "query": "row var = 1 in ", + "error": [ + "SyntaxError: mismatched input '' expecting '('" + ], + "warning": [] + }, + { + "query": "row var = 1 in (", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "Error: [in] function expects exactly 2 arguments, got 1." + ], + "warning": [] + }, + { + "query": "row var = 1 not in ", + "error": [ + "SyntaxError: mismatched input '' expecting '('" + ], + "warning": [] + }, + { + "query": "row var = 1 in (1, 2, 3)", + "error": [], + "warning": [] + }, + { + "query": "row var = 5 in (1, 2, 3)", + "error": [], + "warning": [] + }, + { + "query": "row var = 5 not in (1, 2, 3)", + "error": [], + "warning": [] + }, + { + "query": "row var = 1 in (1, 2, 3, round(5))", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" in (\"a\", \"b\", \"c\")", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" in (\"a\", \"b\", \"c\")", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" not in (\"a\", \"b\", \"c\")", + "error": [], + "warning": [] + }, + { + "query": "row var = 1 in (\"a\", \"b\", \"c\")", + "error": [ + "Argument of [in] must be [number[]], found value [(\"a\", \"b\", \"c\")] type [(string, string, string)]" + ], + "warning": [] + }, + { + "query": "row var = 5 in (\"a\", \"b\", \"c\")", + "error": [ + "Argument of [in] must be [number[]], found value [(\"a\", \"b\", \"c\")] type [(string, string, string)]" + ], + "warning": [] + }, + { + "query": "row var = 5 not in (\"a\", \"b\", \"c\")", + "error": [ + "Argument of [not_in] must be [number[]], found value [(\"a\", \"b\", \"c\")] type [(string, string, string)]" + ], + "warning": [] + }, + { + "query": "row var = 5 not in (1, 2, 3, \"a\")", + "error": [ + "Argument of [not_in] must be [number[]], found value [(1, 2, 3, \"a\")] type [(number, number, number, string)]" + ], + "warning": [] + }, + { + "query": "row var = abs(5)", + "error": [], + "warning": [] + }, + { + "query": "row abs(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = abs(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = abs(\"a\")", + "error": [ + "Argument of [abs] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = acos(5)", + "error": [], + "warning": [] + }, + { + "query": "row acos(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = acos(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = acos(\"a\")", + "error": [ + "Argument of [acos] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = asin(5)", + "error": [], + "warning": [] + }, + { + "query": "row asin(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = asin(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = asin(\"a\")", + "error": [ + "Argument of [asin] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = atan(5)", + "error": [], + "warning": [] + }, + { + "query": "row atan(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = atan(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = atan(\"a\")", + "error": [ + "Argument of [atan] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = atan2(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row atan2(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = atan2(to_integer(\"a\"), to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = atan2(\"a\", \"a\")", + "error": [ + "Argument of [atan2] must be [number], found value [\"a\"] type [string]", + "Argument of [atan2] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = auto_bucket(now(), 5, \"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row auto_bucket(now(), 5, \"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = auto_bucket(now(), 5, 5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row auto_bucket(now(), 5, 5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = case(true, \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row case(true, \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = ceil(5)", + "error": [], + "warning": [] + }, + { + "query": "row ceil(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = ceil(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = ceil(\"a\")", + "error": [ + "Argument of [ceil] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = cidr_match(to_ip(\"127.0.0.1\"), \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row cidr_match(to_ip(\"127.0.0.1\"), \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = cidr_match(to_ip(\"a\"), to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = cidr_match(\"a\", 5)", + "error": [ + "Argument of [cidr_match] must be [ip], found value [\"a\"] type [string]", + "Argument of [cidr_match] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = coalesce(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row coalesce(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = concat(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row concat(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = concat(to_string(\"a\"), to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = concat(5, 5)", + "error": [ + "Argument of [concat] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = cos(5)", + "error": [], + "warning": [] + }, + { + "query": "row cos(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = cos(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = cos(\"a\")", + "error": [ + "Argument of [cos] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = cosh(5)", + "error": [], + "warning": [] + }, + { + "query": "row cosh(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = cosh(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = cosh(\"a\")", + "error": [ + "Argument of [cosh] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", now())", + "error": [], + "warning": [] + }, + { + "query": "row date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", now())", + "error": [], + "warning": [] + }, + { + "query": "row var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", to_datetime(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = date_extract(\"a\", \"a\")", + "error": [ + "Argument of [date_extract] must be [chrono_literal], found value [\"a\"] type [string]", + "Argument of [date_extract] must be [date], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = date_format(now(), \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row date_format(now(), \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = date_format(to_datetime(\"a\"), to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = date_format(\"a\", 5)", + "error": [ + "Argument of [date_format] must be [date], found value [\"a\"] type [string]", + "Argument of [date_format] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = date_parse(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row date_parse(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = date_parse(to_string(\"a\"), to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = date_parse(5, 5)", + "error": [ + "Argument of [date_parse] must be [string], found value [5] type [number]", + "Argument of [date_parse] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = date_trunc(1 year, now())", + "error": [], + "warning": [] + }, + { + "query": "row date_trunc(1 year, now())", + "error": [], + "warning": [] + }, + { + "query": "row var = date_trunc(1 year, to_datetime(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = date_trunc(\"a\", \"a\")", + "error": [ + "Argument of [date_trunc] must be [time_literal], found value [\"a\"] type [string]", + "Argument of [date_trunc] must be [date], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = e()", + "error": [], + "warning": [] + }, + { + "query": "row e()", + "error": [], + "warning": [] + }, + { + "query": "row var = e()", + "error": [], + "warning": [] + }, + { + "query": "row var = e()", + "error": [], + "warning": [] + }, + { + "query": "row var = ends_with(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row ends_with(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = ends_with(to_string(\"a\"), to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = ends_with(5, 5)", + "error": [ + "Argument of [ends_with] must be [string], found value [5] type [number]", + "Argument of [ends_with] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = floor(5)", + "error": [], + "warning": [] + }, + { + "query": "row floor(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = floor(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = floor(\"a\")", + "error": [ + "Argument of [floor] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = greatest(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row greatest(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = least(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row least(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = left(\"a\", 5)", + "error": [], + "warning": [] + }, + { + "query": "row left(\"a\", 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = left(to_string(\"a\"), to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = left(5, \"a\")", + "error": [ + "Argument of [left] must be [string], found value [5] type [number]", + "Argument of [left] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = length(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row length(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = length(to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = length(5)", + "error": [ + "Argument of [length] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = log(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row log(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = log(to_integer(\"a\"), to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = log(\"a\", \"a\")", + "error": [ + "Argument of [log] must be [number], found value [\"a\"] type [string]", + "Argument of [log] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = log10(5)", + "error": [], + "warning": [] + }, + { + "query": "row log10(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = log10(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = log10(\"a\")", + "error": [ + "Argument of [log10] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = ltrim(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row ltrim(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = ltrim(to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = ltrim(5)", + "error": [ + "Argument of [ltrim] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = mv_avg(5)", + "error": [], + "warning": [] + }, + { + "query": "row mv_avg(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_avg(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_avg(\"a\")", + "error": [ + "Argument of [mv_avg] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = mv_concat(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row mv_concat(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_concat(to_string(\"a\"), to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_concat(5, 5)", + "error": [ + "Argument of [mv_concat] must be [string], found value [5] type [number]", + "Argument of [mv_concat] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = mv_count(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row mv_count(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_dedupe(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row mv_dedupe(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_first(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row mv_first(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_last(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row mv_last(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_max(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row mv_max(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_median(5)", + "error": [], + "warning": [] + }, + { + "query": "row mv_median(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_median(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_median(\"a\")", + "error": [ + "Argument of [mv_median] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = mv_min(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row mv_min(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_sum(5)", + "error": [], + "warning": [] + }, + { + "query": "row mv_sum(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_sum(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_sum(\"a\")", + "error": [ + "Argument of [mv_sum] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = now()", + "error": [], + "warning": [] + }, + { + "query": "row now()", + "error": [], + "warning": [] + }, + { + "query": "row var = now()", + "error": [], + "warning": [] + }, + { + "query": "row var = now()", + "error": [], + "warning": [] + }, + { + "query": "row var = pi()", + "error": [], + "warning": [] + }, + { + "query": "row pi()", + "error": [], + "warning": [] + }, + { + "query": "row var = pi()", + "error": [], + "warning": [] + }, + { + "query": "row var = pi()", + "error": [], + "warning": [] + }, + { + "query": "row var = pow(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row pow(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = pow(to_integer(\"a\"), to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = pow(\"a\", \"a\")", + "error": [ + "Argument of [pow] must be [number], found value [\"a\"] type [string]", + "Argument of [pow] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = replace(\"a\", \"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row replace(\"a\", \"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = replace(to_string(\"a\"), to_string(\"a\"), to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = replace(5, 5, 5)", + "error": [ + "Argument of [replace] must be [string], found value [5] type [number]", + "Argument of [replace] must be [string], found value [5] type [number]", + "Argument of [replace] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = right(\"a\", 5)", + "error": [], + "warning": [] + }, + { + "query": "row right(\"a\", 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = right(to_string(\"a\"), to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = right(5, \"a\")", + "error": [ + "Argument of [right] must be [string], found value [5] type [number]", + "Argument of [right] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = round(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row round(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = round(to_integer(\"a\"), to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = round(\"a\", \"a\")", + "error": [ + "Argument of [round] must be [number], found value [\"a\"] type [string]", + "Argument of [round] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = rtrim(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row rtrim(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = rtrim(to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = rtrim(5)", + "error": [ + "Argument of [rtrim] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = sin(5)", + "error": [], + "warning": [] + }, + { + "query": "row sin(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = sin(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = sin(\"a\")", + "error": [ + "Argument of [sin] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = sinh(5)", + "error": [], + "warning": [] + }, + { + "query": "row sinh(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = sinh(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = sinh(\"a\")", + "error": [ + "Argument of [sinh] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = split(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row split(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = split(to_string(\"a\"), to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = split(5, 5)", + "error": [ + "Argument of [split] must be [string], found value [5] type [number]", + "Argument of [split] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = sqrt(5)", + "error": [], + "warning": [] + }, + { + "query": "row sqrt(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = sqrt(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = sqrt(\"a\")", + "error": [ + "Argument of [sqrt] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = starts_with(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row starts_with(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = starts_with(to_string(\"a\"), to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = starts_with(5, 5)", + "error": [ + "Argument of [starts_with] must be [string], found value [5] type [number]", + "Argument of [starts_with] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = substring(\"a\", 5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row substring(\"a\", 5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = substring(to_string(\"a\"), to_integer(\"a\"), to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = substring(5, \"a\", \"a\")", + "error": [ + "Argument of [substring] must be [string], found value [5] type [number]", + "Argument of [substring] must be [number], found value [\"a\"] type [string]", + "Argument of [substring] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = tan(5)", + "error": [], + "warning": [] + }, + { + "query": "row tan(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = tan(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = tan(\"a\")", + "error": [ + "Argument of [tan] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = tanh(5)", + "error": [], + "warning": [] + }, + { + "query": "row tanh(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = tanh(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = tanh(\"a\")", + "error": [ + "Argument of [tanh] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = tau()", + "error": [], + "warning": [] + }, + { + "query": "row tau()", + "error": [], + "warning": [] + }, + { + "query": "row var = tau()", + "error": [], + "warning": [] + }, + { + "query": "row var = tau()", + "error": [], + "warning": [] + }, + { + "query": "row var = to_boolean(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_boolean(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_bool(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_cartesianpoint(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_cartesianpoint(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_cartesianshape(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_cartesianshape(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_datetime(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_datetime(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_dt(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_degrees(5)", + "error": [], + "warning": [] + }, + { + "query": "row to_degrees(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = to_degrees(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = to_degrees(\"a\")", + "error": [ + "Argument of [to_degrees] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = to_double(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_double(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_dbl(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_geopoint(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_geopoint(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_geoshape(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_geoshape(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_integer(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_integer(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_int(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_ip(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_ip(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_long(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_long(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_lower(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_lower(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_lower(to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = to_lower(5)", + "error": [ + "Argument of [to_lower] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = to_radians(5)", + "error": [], + "warning": [] + }, + { + "query": "row to_radians(5)", + "error": [], + "warning": [] + }, + { + "query": "row var = to_radians(to_integer(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = to_radians(\"a\")", + "error": [ + "Argument of [to_radians] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = to_string(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_string(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_str(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_unsigned_long(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_unsigned_long(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_ul(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_ulong(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_upper(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_upper(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_upper(to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = to_upper(5)", + "error": [ + "Argument of [to_upper] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = to_version(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_version(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_ver(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_version(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row to_version(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = to_ver(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = trim(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row trim(\"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = trim(to_string(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = trim(5)", + "error": [ + "Argument of [trim] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = 5 > 0", + "error": [], + "warning": [] + }, + { + "query": "row var = NOT 5 > 0", + "error": [], + "warning": [] + }, + { + "query": "row var = (numberField > 0)", + "error": [ + "Unknown column [numberField]" + ], + "warning": [] + }, + { + "query": "row var = (NOT (5 > 0))", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" > 0", + "error": [ + "Argument of [>] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = 5 >= 0", + "error": [], + "warning": [] + }, + { + "query": "row var = NOT 5 >= 0", + "error": [], + "warning": [] + }, + { + "query": "row var = (numberField >= 0)", + "error": [ + "Unknown column [numberField]" + ], + "warning": [] + }, + { + "query": "row var = (NOT (5 >= 0))", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" >= 0", + "error": [ + "Argument of [>=] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = 5 < 0", + "error": [], + "warning": [] + }, + { + "query": "row var = NOT 5 < 0", + "error": [], + "warning": [] + }, + { + "query": "row var = (numberField < 0)", + "error": [ + "Unknown column [numberField]" + ], + "warning": [] + }, + { + "query": "row var = (NOT (5 < 0))", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" < 0", + "error": [ + "Argument of [<] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = 5 <= 0", + "error": [], + "warning": [] + }, + { + "query": "row var = NOT 5 <= 0", + "error": [], + "warning": [] + }, + { + "query": "row var = (numberField <= 0)", + "error": [ + "Unknown column [numberField]" + ], + "warning": [] + }, + { + "query": "row var = (NOT (5 <= 0))", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" <= 0", + "error": [ + "Argument of [<=] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = 5 == 0", + "error": [], + "warning": [] + }, + { + "query": "row var = NOT 5 == 0", + "error": [], + "warning": [] + }, + { + "query": "row var = (numberField == 0)", + "error": [ + "Unknown column [numberField]" + ], + "warning": [] + }, + { + "query": "row var = (NOT (5 == 0))", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" == 0", + "error": [ + "Argument of [==] must be [number], found value [\"a\"] type [string]" + ], + "warning": [] + }, + { + "query": "row var = 1 + 1", + "error": [], + "warning": [] + }, + { + "query": "row var = (5 + 1)", + "error": [], + "warning": [] + }, + { + "query": "row var = 1 - 1", + "error": [], + "warning": [] + }, + { + "query": "row var = (5 - 1)", + "error": [], + "warning": [] + }, + { + "query": "row var = 1 * 1", + "error": [], + "warning": [] + }, + { + "query": "row var = (5 * 1)", + "error": [], + "warning": [] + }, + { + "query": "row var = 1 / 1", + "error": [], + "warning": [] + }, + { + "query": "row var = (5 / 1)", + "error": [], + "warning": [] + }, + { + "query": "row var = 1 % 1", + "error": [], + "warning": [] + }, + { + "query": "row var = (5 % 1)", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" NOT like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "row var = NOT \"a\" like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "row var = NOT \"a\" NOT like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "row var = 5 like \"?a\"", + "error": [ + "Argument of [like] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = 5 NOT like \"?a\"", + "error": [ + "Argument of [not_like] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = NOT 5 like \"?a\"", + "error": [ + "Argument of [like] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = NOT 5 NOT like \"?a\"", + "error": [ + "Argument of [not_like] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = \"a\" rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "row var = \"a\" NOT rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "row var = NOT \"a\" rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "row var = NOT \"a\" NOT rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "row var = 5 rlike \"?a\"", + "error": [ + "Argument of [rlike] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = 5 NOT rlike \"?a\"", + "error": [ + "Argument of [not_rlike] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = NOT 5 rlike \"?a\"", + "error": [ + "Argument of [rlike] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row var = NOT 5 NOT rlike \"?a\"", + "error": [ + "Argument of [not_rlike] must be [string], found value [5] type [number]" + ], + "warning": [] + }, + { + "query": "row 1 anno", + "error": [ + "ROW does not support [date_period] in expression [1 anno]" + ], + "warning": [] + }, + { + "query": "row var = 1 anno", + "error": [ + "Unexpected time interval qualifier: 'anno'" + ], + "warning": [] + }, + { + "query": "row now() + 1 anno", + "error": [ + "Unexpected time interval qualifier: 'anno'" + ], + "warning": [] + }, + { + "query": "row 1 year", + "error": [ + "ROW does not support [date_period] in expression [1 year]" + ], + "warning": [] + }, + { + "query": "row 1 year", + "error": [ + "ROW does not support [date_period] in expression [1 year]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 year", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 YEAR", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Year", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 year", + "error": [], + "warning": [] + }, + { + "query": "row 1 year + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 year] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 year", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 year] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 year", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 year] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 year", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 year] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 years", + "error": [ + "ROW does not support [date_period] in expression [1 years]" + ], + "warning": [] + }, + { + "query": "row 1 years", + "error": [ + "ROW does not support [date_period] in expression [1 years]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 years", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 YEARS", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Years", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 years", + "error": [], + "warning": [] + }, + { + "query": "row 1 years + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 years] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 years", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 years] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 years", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 years] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 years", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 years] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 month", + "error": [ + "ROW does not support [date_period] in expression [1 month]" + ], + "warning": [] + }, + { + "query": "row 1 month", + "error": [ + "ROW does not support [date_period] in expression [1 month]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 month", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 MONTH", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Month", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 month", + "error": [], + "warning": [] + }, + { + "query": "row 1 month + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 month] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 month", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 month] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 month", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 month] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 month", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 month] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 months", + "error": [ + "ROW does not support [date_period] in expression [1 months]" + ], + "warning": [] + }, + { + "query": "row 1 months", + "error": [ + "ROW does not support [date_period] in expression [1 months]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 months", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 MONTHS", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Months", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 months", + "error": [], + "warning": [] + }, + { + "query": "row 1 months + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 months] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 months", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 months] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 months", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 months] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 months", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 months] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 week", + "error": [ + "ROW does not support [date_period] in expression [1 week]" + ], + "warning": [] + }, + { + "query": "row 1 week", + "error": [ + "ROW does not support [date_period] in expression [1 week]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 week", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 WEEK", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Week", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 week", + "error": [], + "warning": [] + }, + { + "query": "row 1 week + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 week] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 week", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 week] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 week", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 week] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 week", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 week] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 weeks", + "error": [ + "ROW does not support [date_period] in expression [1 weeks]" + ], + "warning": [] + }, + { + "query": "row 1 weeks", + "error": [ + "ROW does not support [date_period] in expression [1 weeks]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 weeks", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 WEEKS", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Weeks", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 weeks", + "error": [], + "warning": [] + }, + { + "query": "row 1 weeks + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 weeks] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 weeks", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 weeks] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 weeks", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 weeks] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 weeks", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 weeks] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 day", + "error": [ + "ROW does not support [date_period] in expression [1 day]" + ], + "warning": [] + }, + { + "query": "row 1 day", + "error": [ + "ROW does not support [date_period] in expression [1 day]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 day", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 DAY", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Day", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 day", + "error": [], + "warning": [] + }, + { + "query": "row 1 day + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 day] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 day", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 day] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 day", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 day] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 day", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 day] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 days", + "error": [ + "ROW does not support [date_period] in expression [1 days]" + ], + "warning": [] + }, + { + "query": "row 1 days", + "error": [ + "ROW does not support [date_period] in expression [1 days]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 days", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 DAYS", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Days", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 days", + "error": [], + "warning": [] + }, + { + "query": "row 1 days + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 days] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 days", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 days] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 days", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 days] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 days", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 days] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 hour", + "error": [ + "ROW does not support [date_period] in expression [1 hour]" + ], + "warning": [] + }, + { + "query": "row 1 hour", + "error": [ + "ROW does not support [date_period] in expression [1 hour]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 hour", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 HOUR", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Hour", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 hour", + "error": [], + "warning": [] + }, + { + "query": "row 1 hour + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 hour] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 hour", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 hour] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 hour", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 hour] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 hour", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 hour] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 hours", + "error": [ + "ROW does not support [date_period] in expression [1 hours]" + ], + "warning": [] + }, + { + "query": "row 1 hours", + "error": [ + "ROW does not support [date_period] in expression [1 hours]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 hours", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 HOURS", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Hours", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 hours", + "error": [], + "warning": [] + }, + { + "query": "row 1 hours + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 hours] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 hours", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 hours] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 hours", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 hours] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 hours", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 hours] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 minute", + "error": [ + "ROW does not support [date_period] in expression [1 minute]" + ], + "warning": [] + }, + { + "query": "row 1 minute", + "error": [ + "ROW does not support [date_period] in expression [1 minute]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 minute", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 MINUTE", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Minute", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 minute", + "error": [], + "warning": [] + }, + { + "query": "row 1 minute + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 minute] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 minute", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 minute] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 minute", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 minute] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 minute", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 minute] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 minutes", + "error": [ + "ROW does not support [date_period] in expression [1 minutes]" + ], + "warning": [] + }, + { + "query": "row 1 minutes", + "error": [ + "ROW does not support [date_period] in expression [1 minutes]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 minutes", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 MINUTES", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Minutes", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 minutes", + "error": [], + "warning": [] + }, + { + "query": "row 1 minutes + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 minutes] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 minutes", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 minutes] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 minutes", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 minutes] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 minutes", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 minutes] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 second", + "error": [ + "ROW does not support [date_period] in expression [1 second]" + ], + "warning": [] + }, + { + "query": "row 1 second", + "error": [ + "ROW does not support [date_period] in expression [1 second]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 second", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 SECOND", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Second", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 second", + "error": [], + "warning": [] + }, + { + "query": "row 1 second + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 second] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 second", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 second] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 second", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 second] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 second", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 second] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 seconds", + "error": [ + "ROW does not support [date_period] in expression [1 seconds]" + ], + "warning": [] + }, + { + "query": "row 1 seconds", + "error": [ + "ROW does not support [date_period] in expression [1 seconds]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 seconds", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 SECONDS", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Seconds", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 seconds", + "error": [], + "warning": [] + }, + { + "query": "row 1 seconds + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 seconds] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 seconds", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 seconds] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 seconds", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 seconds] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 seconds", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 seconds] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 millisecond", + "error": [ + "ROW does not support [date_period] in expression [1 millisecond]" + ], + "warning": [] + }, + { + "query": "row 1 millisecond", + "error": [ + "ROW does not support [date_period] in expression [1 millisecond]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 millisecond", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 MILLISECOND", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Millisecond", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 millisecond", + "error": [], + "warning": [] + }, + { + "query": "row 1 millisecond + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 millisecond] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 millisecond", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 millisecond] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 millisecond", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 millisecond] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 millisecond", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 millisecond] type [duration]" + ], + "warning": [] + }, + { + "query": "row 1 milliseconds", + "error": [ + "ROW does not support [date_period] in expression [1 milliseconds]" + ], + "warning": [] + }, + { + "query": "row 1 milliseconds", + "error": [ + "ROW does not support [date_period] in expression [1 milliseconds]" + ], + "warning": [] + }, + { + "query": "row var = now() - 1 milliseconds", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 MILLISECONDS", + "error": [], + "warning": [] + }, + { + "query": "row var = now() - 1 Milliseconds", + "error": [], + "warning": [] + }, + { + "query": "row var = now() + 1 milliseconds", + "error": [], + "warning": [] + }, + { + "query": "row 1 milliseconds + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 milliseconds] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() * 1 milliseconds", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 milliseconds] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() / 1 milliseconds", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 milliseconds] type [duration]" + ], + "warning": [] + }, + { + "query": "row var = now() % 1 milliseconds", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 milliseconds] type [duration]" + ], + "warning": [] + }, + { + "query": "meta", + "error": [ + "SyntaxError: missing 'functions' at ''" + ], + "warning": [] + }, + { + "query": "meta functions", + "error": [], + "warning": [] + }, + { + "query": "meta functions()", + "error": [ + "SyntaxError: token recognition error at: '('", + "SyntaxError: token recognition error at: ')'" + ], + "warning": [] + }, + { + "query": "meta functions blah", + "error": [ + "SyntaxError: token recognition error at: 'b'", + "SyntaxError: token recognition error at: 'l'", + "SyntaxError: token recognition error at: 'a'", + "SyntaxError: token recognition error at: 'h'" + ], + "warning": [] + }, + { + "query": "meta info", + "error": [ + "SyntaxError: token recognition error at: 'i'", + "SyntaxError: token recognition error at: 'n'", + "SyntaxError: token recognition error at: 'fo'", + "SyntaxError: missing 'functions' at ''" + ], + "warning": [] + }, + { + "query": "show", + "error": [ + "SyntaxError: missing 'info' at ''" + ], + "warning": [] + }, + { + "query": "show functions", + "error": [ + "SyntaxError: token recognition error at: 'f'", + "SyntaxError: token recognition error at: 'u'", + "SyntaxError: token recognition error at: 'n'", + "SyntaxError: token recognition error at: 'c'", + "SyntaxError: token recognition error at: 't'", + "SyntaxError: token recognition error at: 'io'", + "SyntaxError: token recognition error at: 'n'", + "SyntaxError: token recognition error at: 's'", + "SyntaxError: missing 'info' at ''" + ], + "warning": [] + }, + { + "query": "show info", + "error": [], + "warning": [] + }, + { + "query": "show numberField", + "error": [ + "SyntaxError: token recognition error at: 'n'", + "SyntaxError: token recognition error at: 'u'", + "SyntaxError: token recognition error at: 'm'", + "SyntaxError: token recognition error at: 'b'", + "SyntaxError: token recognition error at: 'e'", + "SyntaxError: token recognition error at: 'r'", + "SyntaxError: token recognition error at: 'F'", + "SyntaxError: token recognition error at: 'ie'", + "SyntaxError: token recognition error at: 'l'", + "SyntaxError: token recognition error at: 'd'", + "SyntaxError: missing 'info' at ''" + ], + "warning": [] + }, + { + "query": "from index | limit ", + "error": [ + "SyntaxError: missing INTEGER_LITERAL at ''" + ], + "warning": [] + }, + { + "query": "from index | limit 4 ", + "error": [], + "warning": [] + }, + { + "query": "from index | limit 4.5", + "error": [ + "SyntaxError: mismatched input '4.5' expecting INTEGER_LITERAL" + ], + "warning": [] + }, + { + "query": "from index | limit a", + "error": [ + "SyntaxError: mismatched input 'a' expecting INTEGER_LITERAL" + ], + "warning": [] + }, + { + "query": "from index | limit numberField", + "error": [ + "SyntaxError: mismatched input 'numberField' expecting INTEGER_LITERAL" + ], + "warning": [] + }, + { + "query": "from index | limit stringField", + "error": [ + "SyntaxError: mismatched input 'stringField' expecting INTEGER_LITERAL" + ], + "warning": [] + }, + { + "query": "from index | limit 4", + "error": [], + "warning": [] + }, + { + "query": "from index | keep ", + "error": [ + "SyntaxError: missing ID_PATTERN at ''" + ], + "warning": [] + }, + { + "query": "from index | keep stringField, numberField, dateField", + "error": [], + "warning": [] + }, + { + "query": "from index | keep `stringField`, `numberField`, `dateField`", + "error": [], + "warning": [] + }, + { + "query": "from index | keep 4.5", + "error": [ + "SyntaxError: token recognition error at: '4'", + "SyntaxError: token recognition error at: '5'", + "SyntaxError: missing ID_PATTERN at '.'", + "SyntaxError: missing ID_PATTERN at ''" + ], + "warning": [] + }, + { + "query": "from index | keep `4.5`", + "error": [ + "Unknown column [4.5]" + ], + "warning": [] + }, + { + "query": "from index | keep missingField, numberField, dateField", + "error": [ + "Unknown column [missingField]" + ], + "warning": [] + }, + { + "query": "from index | keep `any#Char$Field`", + "error": [], + "warning": [] + }, + { + "query": "from index | project ", + "error": [ + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + ], + "warning": [] + }, + { + "query": "from index | project stringField, numberField, dateField", + "error": [ + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + ], + "warning": [] + }, + { + "query": "from index | PROJECT stringField, numberField, dateField", + "error": [ + "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + ], + "warning": [] + }, + { + "query": "from index | project missingField, numberField, dateField", + "error": [ + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + ], + "warning": [] + }, + { + "query": "from index | keep s*", + "error": [], + "warning": [] + }, + { + "query": "from index | keep *Field", + "error": [], + "warning": [] + }, + { + "query": "from index | keep s*Field", + "error": [], + "warning": [] + }, + { + "query": "from index | keep string*Field", + "error": [], + "warning": [] + }, + { + "query": "from index | keep s*, n*", + "error": [], + "warning": [] + }, + { + "query": "from index | keep m*", + "error": [ + "Unknown column [m*]" + ], + "warning": [] + }, + { + "query": "from index | keep *m", + "error": [ + "Unknown column [*m]" + ], + "warning": [] + }, + { + "query": "from index | keep d*m", + "error": [ + "Unknown column [d*m]" + ], + "warning": [] + }, + { + "query": "from unsupported_index | keep unsupported_field", + "error": [], + "warning": [ + "Field [unsupported_field] cannot be retrieved, it is unsupported or not indexed; returning null" + ] + }, + { + "query": "FROM index | STATS ROUND(AVG(numberField * 1.5)), COUNT(*), MIN(numberField * 10) | KEEP `MIN(numberField * 10)`", + "error": [], + "warning": [] + }, + { + "query": "FROM index | STATS COUNT(*), MIN(numberField * 10), MAX(numberField)| KEEP `COUNT(*)`", + "error": [], + "warning": [] + }, + { + "query": "from index | drop ", + "error": [ + "SyntaxError: missing ID_PATTERN at ''" + ], + "warning": [] + }, + { + "query": "from index | drop stringField, numberField, dateField", + "error": [], + "warning": [] + }, + { + "query": "from index | drop 4.5", + "error": [ + "SyntaxError: token recognition error at: '4'", + "SyntaxError: token recognition error at: '5'", + "SyntaxError: missing ID_PATTERN at '.'", + "SyntaxError: missing ID_PATTERN at ''" + ], + "warning": [] + }, + { + "query": "from index | drop missingField, numberField, dateField", + "error": [ + "Unknown column [missingField]" + ], + "warning": [] + }, + { + "query": "from index | drop `any#Char$Field`", + "error": [], + "warning": [] + }, + { + "query": "from index | drop s*", + "error": [], + "warning": [] + }, + { + "query": "from index | drop s**Field", + "error": [], + "warning": [] + }, + { + "query": "from index | drop *Field*", + "error": [], + "warning": [] + }, + { + "query": "from index | drop s*F*d", + "error": [], + "warning": [] + }, + { + "query": "from index | drop *Field", + "error": [], + "warning": [] + }, + { + "query": "from index | drop s*Field", + "error": [], + "warning": [] + }, + { + "query": "from index | drop string*Field", + "error": [], + "warning": [] + }, + { + "query": "from index | drop s*, n*", + "error": [], + "warning": [] + }, + { + "query": "from index | drop m*", + "error": [ + "Unknown column [m*]" + ], + "warning": [] + }, + { + "query": "from index | drop *m", + "error": [ + "Unknown column [*m]" + ], + "warning": [] + }, + { + "query": "from index | drop d*m", + "error": [ + "Unknown column [d*m]" + ], + "warning": [] + }, + { + "query": "from index | drop *", + "error": [ + "Removing all fields is not allowed [*]" + ], + "warning": [] + }, + { + "query": "from index | drop stringField, *", + "error": [ + "Removing all fields is not allowed [*]" + ], + "warning": [] + }, + { + "query": "from index | drop @timestamp", + "error": [], + "warning": [ + "Drop [@timestamp] will remove all time filters to the search results" + ] + }, + { + "query": "from index | drop stringField, @timestamp", + "error": [], + "warning": [ + "Drop [@timestamp] will remove all time filters to the search results" + ] + }, + { + "query": "FROM index | STATS ROUND(AVG(numberField * 1.5)), COUNT(*), MIN(numberField * 10) | DROP `MIN(numberField * 10)`", + "error": [], + "warning": [] + }, + { + "query": "FROM index | STATS COUNT(*), MIN(numberField * 10), MAX(numberField)| DROP `COUNT(*)`", + "error": [], + "warning": [] + }, + { + "query": "from a_index | mv_expand ", + "error": [ + "SyntaxError: missing {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER} at ''" + ], + "warning": [] + }, + { + "query": "from a_index | mv_expand stringField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | mv_expand numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | mv_expand dateField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | mv_expand booleanField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | mv_expand ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | mv_expand numberField, b", + "error": [ + "SyntaxError: token recognition error at: ','", + "SyntaxError: extraneous input 'b' expecting " + ], + "warning": [] + }, + { + "query": "row a = \"a\" | mv_expand a", + "error": [], + "warning": [] + }, + { + "query": "row a = [1, 2, 3] | mv_expand a", + "error": [], + "warning": [] + }, + { + "query": "row a = [true, false] | mv_expand a", + "error": [], + "warning": [] + }, + { + "query": "row a = [\"a\", \"b\"] | mv_expand a", + "error": [], + "warning": [] + }, + { + "query": "from a_index | rename", + "error": [ + "SyntaxError: mismatched input '' expecting ID_PATTERN" + ], + "warning": [] + }, + { + "query": "from a_index | rename stringField", + "error": [ + "SyntaxError: mismatched input '' expecting 'as'" + ], + "warning": [] + }, + { + "query": "from a_index | rename a", + "error": [ + "SyntaxError: mismatched input '' expecting 'as'", + "Unknown column [a]" + ], + "warning": [] + }, + { + "query": "from a_index | rename stringField as", + "error": [ + "SyntaxError: missing ID_PATTERN at ''" + ], + "warning": [] + }, + { + "query": "from a_index | rename missingField as", + "error": [ + "SyntaxError: missing ID_PATTERN at ''", + "Unknown column [missingField]" + ], + "warning": [] + }, + { + "query": "from a_index | rename stringField as b", + "error": [], + "warning": [] + }, + { + "query": "from a_index | rename stringField AS b", + "error": [], + "warning": [] + }, + { + "query": "from a_index | rename stringField As b", + "error": [], + "warning": [] + }, + { + "query": "from a_index | rename stringField As b, b AS c", + "error": [], + "warning": [] + }, + { + "query": "from a_index | rename fn() as a", + "error": [ + "SyntaxError: token recognition error at: '('", + "SyntaxError: token recognition error at: ')'", + "Unknown column [fn]", + "Unknown column [a]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField + 1 | rename `numberField + 1` as a", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) | rename `avg(numberField)` as avg0", + "error": [], + "warning": [] + }, + { + "query": "from a_index |eval numberField + 1 | rename `numberField + 1` as ", + "error": [ + "SyntaxError: missing ID_PATTERN at ''" + ], + "warning": [] + }, + { + "query": "from a_index | rename s* as strings", + "error": [ + "Using wildcards (*) in RENAME is not allowed [s*]", + "Unknown column [strings]" + ], + "warning": [] + }, + { + "query": "row a = 10 | rename a as `this``is fine`", + "error": [], + "warning": [] + }, + { + "query": "row a = 10 | rename a as this is fine", + "error": [ + "SyntaxError: mismatched input 'is' expecting " + ], + "warning": [] + }, + { + "query": "from a_index | dissect", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField", + "error": [ + "SyntaxError: missing STRING at ''" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField 2", + "error": [ + "SyntaxError: mismatched input '2' expecting STRING" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField .", + "error": [ + "SyntaxError: mismatched input '' expecting {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "Unknown column [stringField.]" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField %a", + "error": [ + "SyntaxError: mismatched input '%' expecting STRING", + "SyntaxError: mismatched input '' expecting '='" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField \"%{firstWord}\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | dissect numberField \"%{firstWord}\"", + "error": [ + "DISSECT only supports string type values, found [numberField] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField \"%{firstWord}\" option ", + "error": [ + "SyntaxError: mismatched input '' expecting '='" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField \"%{firstWord}\" option = ", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', OPENING_BRACKET}", + "Invalid option for DISSECT: [option]" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField \"%{firstWord}\" option = 1", + "error": [ + "Invalid option for DISSECT: [option]" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField \"%{firstWord}\" append_separator = \"-\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | dissect stringField \"%{firstWord}\" ignore_missing = true", + "error": [ + "Invalid option for DISSECT: [ignore_missing]" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField \"%{firstWord}\" append_separator = true", + "error": [ + "Invalid value for DISSECT append_separator: expected a string, but was [true]" + ], + "warning": [] + }, + { + "query": "from a_index | dissect stringField \"%{firstWord}\" | keep firstWord", + "error": [], + "warning": [] + }, + { + "query": "from a_index | grok", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | grok stringField", + "error": [ + "SyntaxError: missing STRING at ''" + ], + "warning": [] + }, + { + "query": "from a_index | grok stringField 2", + "error": [ + "SyntaxError: mismatched input '2' expecting STRING" + ], + "warning": [] + }, + { + "query": "from a_index | grok stringField .", + "error": [ + "SyntaxError: mismatched input '' expecting {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "Unknown column [stringField.]" + ], + "warning": [] + }, + { + "query": "from a_index | grok stringField %a", + "error": [ + "SyntaxError: mismatched input '%' expecting STRING" + ], + "warning": [] + }, + { + "query": "from a_index | grok stringField \"%{firstWord}\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | grok numberField \"%{firstWord}\"", + "error": [ + "GROK only supports string type values, found [numberField] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | grok stringField \"%{firstWord}\" | keep firstWord", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where b", + "error": [ + "Unknown column [b]" + ], + "warning": [] + }, + { + "query": "from a_index | where true", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT true", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where false", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT false", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT 1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where +1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT +1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 * 1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT 1 * 1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where -1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT -1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 / 1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT 1 / 1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1.0 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT 1.0 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1.5 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT 1.5 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (numberField > 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (NOT (numberField > 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField > 0", + "error": [ + "Argument of [>] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField >= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField >= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (numberField >= 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (NOT (numberField >= 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 >= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField >= 0", + "error": [ + "Argument of [>=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField < 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField < 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (numberField < 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (NOT (numberField < 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 < 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField < 0", + "error": [ + "Argument of [<] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField <= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField <= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (numberField <= 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (NOT (numberField <= 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 <= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField <= 0", + "error": [ + "Argument of [<=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField == 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField == 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (numberField == 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where (NOT (numberField == 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 == 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField == 0", + "error": [ + "Argument of [==] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where - numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where - round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + - numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 - numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where - numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where - round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + - numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 - numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where + numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where + round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + + numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where + numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where + round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + + numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where not booleanField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where -- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where -- round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + -- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 -- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where -+ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where -+ round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + -+ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 -+ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where +- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where +- round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + +- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 +- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ++ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ++ round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + ++ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 ++ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where not not booleanField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where --- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where --- round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + --- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 --- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where -+- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where -+- round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + -+- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 -+- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where +-+ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where +-+ round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + +-+ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 +-+ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where +++ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where +++ round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + +++ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 +++ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where not not not booleanField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ---- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ---- round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + ---- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 ---- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where -+-+ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where -+-+ round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + -+-+ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 -+-+ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where +-+- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where +-+- round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + +-+- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 +-+- numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ++++ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ++++ round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 + ++++ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where 1 ++++ numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where not not not not booleanField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where *+ numberField", + "error": [ + "SyntaxError: extraneous input '*' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | where /+ numberField", + "error": [ + "SyntaxError: extraneous input '/' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | where %+ numberField", + "error": [ + "SyntaxError: extraneous input '%' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField =~ 0", + "error": [ + "Argument of [=~] must be [string], found value [numberField] type [number]", + "Argument of [=~] must be [string], found value [0] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField =~ 0", + "error": [ + "Argument of [=~] must be [string], found value [numberField] type [number]", + "Argument of [=~] must be [string], found value [0] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where (numberField =~ 0)", + "error": [ + "Argument of [=~] must be [string], found value [numberField] type [number]", + "Argument of [=~] must be [string], found value [0] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where (NOT (numberField =~ 0))", + "error": [ + "Argument of [=~] must be [string], found value [numberField] type [number]", + "Argument of [=~] must be [string], found value [0] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where 1 =~ 0", + "error": [ + "Argument of [=~] must be [string], found value [1] type [number]", + "Argument of [=~] must be [string], found value [0] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField =~ 0", + "error": [ + "Argument of [=~] must be [string], found value [0] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField NOT like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT stringField like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT stringField NOT like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField like \"?a\"", + "error": [ + "Argument of [like] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField NOT like \"?a\"", + "error": [ + "Argument of [not_like] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField like \"?a\"", + "error": [ + "Argument of [like] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField NOT like \"?a\"", + "error": [ + "Argument of [not_like] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where stringField rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField NOT rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT stringField rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where NOT stringField NOT rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField rlike \"?a\"", + "error": [ + "Argument of [rlike] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where numberField NOT rlike \"?a\"", + "error": [ + "Argument of [not_rlike] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField rlike \"?a\"", + "error": [ + "Argument of [rlike] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where NOT numberField NOT rlike \"?a\"", + "error": [ + "Argument of [not_rlike] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where cidr_match(ipField)", + "error": [ + "Error: [cidr_match] function expects at least 2 arguments, got 1." + ], + "warning": [] + }, + { + "query": "from a_index | eval cidr = \"172.0.0.1/30\" | where cidr_match(ipField, \"172.0.0.1/30\", cidr)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where numberField Is nOt NuLL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where dateField Is nOt NuLL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where booleanField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where booleanField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where booleanField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where booleanField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where booleanField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where booleanField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where booleanField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where booleanField Is nOt NuLL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ipField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ipField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ipField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ipField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ipField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ipField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ipField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ipField Is nOt NuLL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where stringField Is nOt NuLL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cartesianPointField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cartesianPointField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cartesianPointField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cartesianPointField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cartesianPointField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cartesianPointField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cartesianPointField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cartesianPointField Is nOt NuLL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where geoPointField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where geoPointField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where geoPointField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where geoPointField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where geoPointField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where geoPointField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where geoPointField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where geoPointField Is nOt NuLL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where avg(numberField)", + "error": [ + "WHERE does not support function avg" + ], + "warning": [] + }, + { + "query": "from a_index | where avg(numberField) > 0", + "error": [ + "WHERE does not support function avg" + ], + "warning": [] + }, + { + "query": "from a_index | where max(numberField)", + "error": [ + "WHERE does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | where max(numberField) > 0", + "error": [ + "WHERE does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | where min(numberField)", + "error": [ + "WHERE does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | where min(numberField) > 0", + "error": [ + "WHERE does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | where sum(numberField)", + "error": [ + "WHERE does not support function sum" + ], + "warning": [] + }, + { + "query": "from a_index | where sum(numberField) > 0", + "error": [ + "WHERE does not support function sum" + ], + "warning": [] + }, + { + "query": "from a_index | where median(numberField)", + "error": [ + "WHERE does not support function median" + ], + "warning": [] + }, + { + "query": "from a_index | where median(numberField) > 0", + "error": [ + "WHERE does not support function median" + ], + "warning": [] + }, + { + "query": "from a_index | where median_absolute_deviation(numberField)", + "error": [ + "WHERE does not support function median_absolute_deviation" + ], + "warning": [] + }, + { + "query": "from a_index | where median_absolute_deviation(numberField) > 0", + "error": [ + "WHERE does not support function median_absolute_deviation" + ], + "warning": [] + }, + { + "query": "from a_index | where percentile(numberField, 5)", + "error": [ + "WHERE does not support function percentile" + ], + "warning": [] + }, + { + "query": "from a_index | where percentile(numberField, 5) > 0", + "error": [ + "WHERE does not support function percentile" + ], + "warning": [] + }, + { + "query": "from a_index | where count(stringField)", + "error": [ + "WHERE does not support function count" + ], + "warning": [] + }, + { + "query": "from a_index | where count(stringField) > 0", + "error": [ + "WHERE does not support function count" + ], + "warning": [] + }, + { + "query": "from a_index | where count_distinct(stringField, numberField)", + "error": [ + "WHERE does not support function count_distinct" + ], + "warning": [] + }, + { + "query": "from a_index | where count_distinct(stringField, numberField) > 0", + "error": [ + "WHERE does not support function count_distinct" + ], + "warning": [] + }, + { + "query": "from a_index | where abs(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where abs(stringField) > 0", + "error": [ + "Argument of [abs] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where acos(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where acos(stringField) > 0", + "error": [ + "Argument of [acos] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where asin(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where asin(stringField) > 0", + "error": [ + "Argument of [asin] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where atan(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where atan(stringField) > 0", + "error": [ + "Argument of [atan] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where atan2(numberField, numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where atan2(stringField, stringField) > 0", + "error": [ + "Argument of [atan2] must be [number], found value [stringField] type [string]", + "Argument of [atan2] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where ceil(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where ceil(stringField) > 0", + "error": [ + "Argument of [ceil] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(concat(stringField, stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(concat(numberField, numberField)) > 0", + "error": [ + "Argument of [concat] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where cos(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cos(stringField) > 0", + "error": [ + "Argument of [cos] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where cosh(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where cosh(stringField) > 0", + "error": [ + "Argument of [cosh] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where e() > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where e() > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where floor(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where floor(stringField) > 0", + "error": [ + "Argument of [floor] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(left(stringField, numberField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(left(numberField, stringField)) > 0", + "error": [ + "Argument of [left] must be [string], found value [numberField] type [number]", + "Argument of [left] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(stringField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(numberField) > 0", + "error": [ + "Argument of [length] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where log(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where log(stringField, stringField) > 0", + "error": [ + "Argument of [log] must be [number], found value [stringField] type [string]", + "Argument of [log] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where log10(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where log10(stringField) > 0", + "error": [ + "Argument of [log10] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(ltrim(stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(ltrim(numberField)) > 0", + "error": [ + "Argument of [ltrim] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where mv_avg(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where mv_avg(stringField) > 0", + "error": [ + "Argument of [mv_avg] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(mv_concat(stringField, stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(mv_concat(numberField, numberField)) > 0", + "error": [ + "Argument of [mv_concat] must be [string], found value [numberField] type [number]", + "Argument of [mv_concat] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where mv_median(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where mv_median(stringField) > 0", + "error": [ + "Argument of [mv_median] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where mv_sum(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where mv_sum(stringField) > 0", + "error": [ + "Argument of [mv_sum] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where pi() > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where pi() > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where pow(numberField, numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where pow(stringField, stringField) > 0", + "error": [ + "Argument of [pow] must be [number], found value [stringField] type [string]", + "Argument of [pow] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(replace(stringField, stringField, stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(replace(numberField, numberField, numberField)) > 0", + "error": [ + "Argument of [replace] must be [string], found value [numberField] type [number]", + "Argument of [replace] must be [string], found value [numberField] type [number]", + "Argument of [replace] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(right(stringField, numberField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(right(numberField, stringField)) > 0", + "error": [ + "Argument of [right] must be [string], found value [numberField] type [number]", + "Argument of [right] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where round(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where round(stringField, stringField) > 0", + "error": [ + "Argument of [round] must be [number], found value [stringField] type [string]", + "Argument of [round] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(rtrim(stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(rtrim(numberField)) > 0", + "error": [ + "Argument of [rtrim] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where sin(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where sin(stringField) > 0", + "error": [ + "Argument of [sin] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where sinh(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where sinh(stringField) > 0", + "error": [ + "Argument of [sinh] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(split(stringField, stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(split(numberField, numberField)) > 0", + "error": [ + "Argument of [split] must be [string], found value [numberField] type [number]", + "Argument of [split] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where sqrt(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where sqrt(stringField) > 0", + "error": [ + "Argument of [sqrt] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(substring(stringField, numberField, numberField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(substring(numberField, stringField, stringField)) > 0", + "error": [ + "Argument of [substring] must be [string], found value [numberField] type [number]", + "Argument of [substring] must be [number], found value [stringField] type [string]", + "Argument of [substring] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where tan(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where tan(stringField) > 0", + "error": [ + "Argument of [tan] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where tanh(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where tanh(stringField) > 0", + "error": [ + "Argument of [tanh] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where tau() > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where tau() > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where to_degrees(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where to_degrees(stringField) > 0", + "error": [ + "Argument of [to_degrees] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(to_lower(stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(to_lower(numberField)) > 0", + "error": [ + "Argument of [to_lower] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where to_radians(numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where to_radians(stringField) > 0", + "error": [ + "Argument of [to_radians] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(to_upper(stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(to_upper(numberField)) > 0", + "error": [ + "Argument of [to_upper] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | where length(trim(stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(trim(numberField)) > 0", + "error": [ + "Argument of [trim] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval ", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval b = stringField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField + 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField + ", + "error": [ + "SyntaxError: no viable alternative at input 'numberField + '" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField + 1", + "error": [ + "Argument of [+] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval a=b", + "error": [ + "Unknown column [b]" + ], + "warning": [] + }, + { + "query": "from a_index | eval a=b, ", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "Unknown column [b]" + ], + "warning": [] + }, + { + "query": "from a_index | eval a=round", + "error": [ + "Unknown column [round]" + ], + "warning": [] + }, + { + "query": "from a_index | eval a=round(", + "error": [ + "SyntaxError: no viable alternative at input 'round('" + ], + "warning": [] + }, + { + "query": "from a_index | eval a=round(numberField) ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=round(numberField), ", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | eval a=round(numberField) + round(numberField) ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=round(numberField) + round(stringField) ", + "error": [ + "Argument of [round] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval a=round(numberField) + round(stringField), numberField ", + "error": [ + "Argument of [round] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval a=round(numberField) + round(numberField), numberField ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=round(numberField) + round(numberField), b = numberField ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=[1, 2, 3]", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=[true, false]", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=[\"a\", \"b\"]", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval dateField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval booleanField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval booleanField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval booleanField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval booleanField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval booleanField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval booleanField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval booleanField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ipField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ipField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ipField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ipField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ipField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ipField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ipField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cartesianPointField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cartesianPointField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cartesianPointField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cartesianPointField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cartesianPointField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cartesianPointField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cartesianPointField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval geoPointField IS NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval geoPointField IS null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval geoPointField is null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval geoPointField is NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval geoPointField IS NOT NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval geoPointField IS NOT null", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval geoPointField IS not NULL", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval - numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=- round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + - numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 - numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval - numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=- round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + - numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 - numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval + numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+ round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + + numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval + numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+ round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + + numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval not booleanField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval -- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=-- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=-- round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + -- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 -- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval -+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=-+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=-+ round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + -+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 -+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval +- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+- round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + +- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 +- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=++ round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + ++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 ++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval not not booleanField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval --- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=--- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=--- round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + --- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 --- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval -+- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=-+- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=-+- round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + -+- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 -+- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval +-+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+-+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+-+ round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + +-+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 +-+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval +++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+++ round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + +++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 +++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval not not not booleanField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ---- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=---- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=---- round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + ---- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 ---- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval -+-+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=-+-+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=-+-+ round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + -+-+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 -+-+ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval +-+- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+-+- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=+-+- round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + +-+- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 +-+- numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ++++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=++++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval a=++++ round(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + ++++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 ++++ numberField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval not not not not booleanField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval *+ numberField", + "error": [ + "SyntaxError: extraneous input '*' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | eval /+ numberField", + "error": [ + "SyntaxError: extraneous input '/' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | eval %+ numberField", + "error": [ + "SyntaxError: extraneous input '%' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = avg(numberField)", + "error": [ + "EVAL does not support function avg" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = avg(numberField) > 0", + "error": [ + "EVAL does not support function avg" + ], + "warning": [] + }, + { + "query": "from a_index | eval avg(numberField)", + "error": [ + "EVAL does not support function avg" + ], + "warning": [] + }, + { + "query": "from a_index | eval avg(numberField) > 0", + "error": [ + "EVAL does not support function avg" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = max(numberField)", + "error": [ + "EVAL does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = max(numberField) > 0", + "error": [ + "EVAL does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | eval max(numberField)", + "error": [ + "EVAL does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | eval max(numberField) > 0", + "error": [ + "EVAL does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = min(numberField)", + "error": [ + "EVAL does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = min(numberField) > 0", + "error": [ + "EVAL does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | eval min(numberField)", + "error": [ + "EVAL does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | eval min(numberField) > 0", + "error": [ + "EVAL does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = sum(numberField)", + "error": [ + "EVAL does not support function sum" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = sum(numberField) > 0", + "error": [ + "EVAL does not support function sum" + ], + "warning": [] + }, + { + "query": "from a_index | eval sum(numberField)", + "error": [ + "EVAL does not support function sum" + ], + "warning": [] + }, + { + "query": "from a_index | eval sum(numberField) > 0", + "error": [ + "EVAL does not support function sum" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = median(numberField)", + "error": [ + "EVAL does not support function median" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = median(numberField) > 0", + "error": [ + "EVAL does not support function median" + ], + "warning": [] + }, + { + "query": "from a_index | eval median(numberField)", + "error": [ + "EVAL does not support function median" + ], + "warning": [] + }, + { + "query": "from a_index | eval median(numberField) > 0", + "error": [ + "EVAL does not support function median" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = median_absolute_deviation(numberField)", + "error": [ + "EVAL does not support function median_absolute_deviation" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = median_absolute_deviation(numberField) > 0", + "error": [ + "EVAL does not support function median_absolute_deviation" + ], + "warning": [] + }, + { + "query": "from a_index | eval median_absolute_deviation(numberField)", + "error": [ + "EVAL does not support function median_absolute_deviation" + ], + "warning": [] + }, + { + "query": "from a_index | eval median_absolute_deviation(numberField) > 0", + "error": [ + "EVAL does not support function median_absolute_deviation" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = percentile(numberField, 5)", + "error": [ + "EVAL does not support function percentile" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = percentile(numberField, 5) > 0", + "error": [ + "EVAL does not support function percentile" + ], + "warning": [] + }, + { + "query": "from a_index | eval percentile(numberField, 5)", + "error": [ + "EVAL does not support function percentile" + ], + "warning": [] + }, + { + "query": "from a_index | eval percentile(numberField, 5) > 0", + "error": [ + "EVAL does not support function percentile" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = count(stringField)", + "error": [ + "EVAL does not support function count" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = count(stringField) > 0", + "error": [ + "EVAL does not support function count" + ], + "warning": [] + }, + { + "query": "from a_index | eval count(stringField)", + "error": [ + "EVAL does not support function count" + ], + "warning": [] + }, + { + "query": "from a_index | eval count(stringField) > 0", + "error": [ + "EVAL does not support function count" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = count_distinct(stringField, numberField)", + "error": [ + "EVAL does not support function count_distinct" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = count_distinct(stringField, numberField) > 0", + "error": [ + "EVAL does not support function count_distinct" + ], + "warning": [] + }, + { + "query": "from a_index | eval count_distinct(stringField, numberField)", + "error": [ + "EVAL does not support function count_distinct" + ], + "warning": [] + }, + { + "query": "from a_index | eval count_distinct(stringField, numberField) > 0", + "error": [ + "EVAL does not support function count_distinct" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = st_centroid(cartesianPointField)", + "error": [ + "EVAL does not support function st_centroid" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = st_centroid(cartesianPointField) > 0", + "error": [ + "EVAL does not support function st_centroid" + ], + "warning": [] + }, + { + "query": "from a_index | eval st_centroid(cartesianPointField)", + "error": [ + "EVAL does not support function st_centroid" + ], + "warning": [] + }, + { + "query": "from a_index | eval st_centroid(cartesianPointField) > 0", + "error": [ + "EVAL does not support function st_centroid" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = st_centroid(geoPointField)", + "error": [ + "EVAL does not support function st_centroid" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = st_centroid(geoPointField) > 0", + "error": [ + "EVAL does not support function st_centroid" + ], + "warning": [] + }, + { + "query": "from a_index | eval st_centroid(geoPointField)", + "error": [ + "EVAL does not support function st_centroid" + ], + "warning": [] + }, + { + "query": "from a_index | eval st_centroid(geoPointField) > 0", + "error": [ + "EVAL does not support function st_centroid" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = abs(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval abs(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = abs(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval abs(stringField)", + "error": [ + "Argument of [abs] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval abs(numberField, extraArg)", + "error": [ + "Error: [abs] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = abs(*)", + "error": [ + "Using wildcards (*) in abs is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = acos(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval acos(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = acos(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval acos(stringField)", + "error": [ + "Argument of [acos] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval acos(numberField, extraArg)", + "error": [ + "Error: [acos] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = acos(*)", + "error": [ + "Using wildcards (*) in acos is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = asin(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval asin(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = asin(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval asin(stringField)", + "error": [ + "Argument of [asin] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval asin(numberField, extraArg)", + "error": [ + "Error: [asin] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = asin(*)", + "error": [ + "Using wildcards (*) in asin is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = atan(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval atan(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = atan(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval atan(stringField)", + "error": [ + "Argument of [atan] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval atan(numberField, extraArg)", + "error": [ + "Error: [atan] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = atan(*)", + "error": [ + "Using wildcards (*) in atan is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = atan2(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval atan2(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = atan2(to_integer(stringField), to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval atan2(stringField, stringField)", + "error": [ + "Argument of [atan2] must be [number], found value [stringField] type [string]", + "Argument of [atan2] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval atan2(numberField, numberField, extraArg)", + "error": [ + "Error: [atan2] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = auto_bucket(dateField, numberField, \"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval auto_bucket(dateField, numberField, \"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval auto_bucket(dateField, numberField, stringField, stringField)", + "error": [ + "Argument of [auto_bucket] must be a constant, received [stringField]", + "Argument of [auto_bucket] must be a constant, received [stringField]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = auto_bucket(dateField, numberField, 5, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval auto_bucket(dateField, numberField, 5, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval auto_bucket(dateField, numberField, numberField, numberField)", + "error": [ + "Argument of [auto_bucket] must be a constant, received [numberField]", + "Argument of [auto_bucket] must be a constant, received [numberField]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = case(booleanField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval case(booleanField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = ceil(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ceil(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = ceil(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ceil(stringField)", + "error": [ + "Argument of [ceil] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval ceil(numberField, extraArg)", + "error": [ + "Error: [ceil] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = ceil(*)", + "error": [ + "Using wildcards (*) in ceil is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = cidr_match(ipField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cidr_match(ipField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = cidr_match(to_ip(stringField), to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cidr_match(stringField, numberField)", + "error": [ + "Argument of [cidr_match] must be [ip], found value [stringField] type [string]", + "Argument of [cidr_match] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = coalesce(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval coalesce(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = concat(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval concat(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = concat(to_string(stringField), to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval concat(numberField, numberField)", + "error": [ + "Argument of [concat] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = cos(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cos(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = cos(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cos(stringField)", + "error": [ + "Argument of [cos] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval cos(numberField, extraArg)", + "error": [ + "Error: [cos] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = cos(*)", + "error": [ + "Using wildcards (*) in cos is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = cosh(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cosh(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = cosh(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval cosh(stringField)", + "error": [ + "Argument of [cosh] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval cosh(numberField, extraArg)", + "error": [ + "Error: [cosh] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = cosh(*)", + "error": [ + "Using wildcards (*) in cosh is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", to_datetime(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_extract(stringField, stringField)", + "error": [ + "Argument of [date_extract] must be [chrono_literal], found value [stringField] type [string]", + "Argument of [date_extract] must be [date], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", dateField, extraArg)", + "error": [ + "Error: [date_extract] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = date_format(dateField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_format(dateField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = date_format(to_datetime(stringField), to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_format(stringField, numberField)", + "error": [ + "Argument of [date_format] must be [date], found value [stringField] type [string]", + "Argument of [date_format] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval date_format(dateField, stringField, extraArg)", + "error": [ + "Error: [date_format] function expects no more than 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = date_parse(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_parse(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = date_parse(to_string(stringField), to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_parse(numberField, numberField)", + "error": [ + "Argument of [date_parse] must be [string], found value [numberField] type [number]", + "Argument of [date_parse] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval date_parse(stringField, stringField, extraArg)", + "error": [ + "Error: [date_parse] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = date_trunc(1 year, dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_trunc(1 year, dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = date_trunc(1 year, to_datetime(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_trunc(stringField, stringField)", + "error": [ + "Argument of [date_trunc] must be [time_literal], found value [stringField] type [string]", + "Argument of [date_trunc] must be [date], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval date_trunc(1 year, dateField, extraArg)", + "error": [ + "Error: [date_trunc] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = e()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval e()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = e()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval e()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval e(extraArg)", + "error": [ + "Error: [e] function expects exactly 0 arguments, got 1." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = ends_with(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ends_with(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = ends_with(to_string(stringField), to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ends_with(numberField, numberField)", + "error": [ + "Argument of [ends_with] must be [string], found value [numberField] type [number]", + "Argument of [ends_with] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval ends_with(stringField, stringField, extraArg)", + "error": [ + "Error: [ends_with] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = floor(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval floor(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = floor(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval floor(stringField)", + "error": [ + "Argument of [floor] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval floor(numberField, extraArg)", + "error": [ + "Error: [floor] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = floor(*)", + "error": [ + "Using wildcards (*) in floor is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = greatest(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval greatest(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = least(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval least(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = left(stringField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval left(stringField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = left(to_string(stringField), to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval left(numberField, stringField)", + "error": [ + "Argument of [left] must be [string], found value [numberField] type [number]", + "Argument of [left] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval left(stringField, numberField, extraArg)", + "error": [ + "Error: [left] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = length(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval length(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = length(to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval length(numberField)", + "error": [ + "Argument of [length] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval length(stringField, extraArg)", + "error": [ + "Error: [length] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = length(*)", + "error": [ + "Using wildcards (*) in length is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = log(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval log(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = log(to_integer(stringField), to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval log(stringField, stringField)", + "error": [ + "Argument of [log] must be [number], found value [stringField] type [string]", + "Argument of [log] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval log(numberField, numberField, extraArg)", + "error": [ + "Error: [log] function expects no more than 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = log10(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval log10(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = log10(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval log10(stringField)", + "error": [ + "Argument of [log10] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval log10(numberField, extraArg)", + "error": [ + "Error: [log10] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = log10(*)", + "error": [ + "Using wildcards (*) in log10 is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = ltrim(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ltrim(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = ltrim(to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ltrim(numberField)", + "error": [ + "Argument of [ltrim] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval ltrim(stringField, extraArg)", + "error": [ + "Error: [ltrim] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = ltrim(*)", + "error": [ + "Using wildcards (*) in ltrim is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_avg(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_avg(stringField)", + "error": [ + "Argument of [mv_avg] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval mv_avg(numberField, extraArg)", + "error": [ + "Error: [mv_avg] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_avg(*)", + "error": [ + "Using wildcards (*) in mv_avg is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_concat(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_concat(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_concat(to_string(stringField), to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_concat(numberField, numberField)", + "error": [ + "Argument of [mv_concat] must be [string], found value [numberField] type [number]", + "Argument of [mv_concat] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval mv_concat(stringField, stringField, extraArg)", + "error": [ + "Error: [mv_concat] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_count(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_count(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_count(*)", + "error": [ + "Using wildcards (*) in mv_count is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_dedupe(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_dedupe(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_dedupe(*)", + "error": [ + "Using wildcards (*) in mv_dedupe is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_first(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_first(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_first(*)", + "error": [ + "Using wildcards (*) in mv_first is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_last(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_last(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_last(*)", + "error": [ + "Using wildcards (*) in mv_last is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_max(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_max(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_max(*)", + "error": [ + "Using wildcards (*) in mv_max is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_median(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_median(stringField)", + "error": [ + "Argument of [mv_median] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval mv_median(numberField, extraArg)", + "error": [ + "Error: [mv_median] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_median(*)", + "error": [ + "Using wildcards (*) in mv_median is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_min(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_min(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_min(*)", + "error": [ + "Using wildcards (*) in mv_min is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_sum(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_sum(stringField)", + "error": [ + "Argument of [mv_sum] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval mv_sum(numberField, extraArg)", + "error": [ + "Error: [mv_sum] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_sum(*)", + "error": [ + "Using wildcards (*) in mv_sum is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval now()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = now()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval now()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval now(extraArg)", + "error": [ + "Error: [now] function expects exactly 0 arguments, got 1." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = pi()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval pi()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = pi()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval pi()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval pi(extraArg)", + "error": [ + "Error: [pi] function expects exactly 0 arguments, got 1." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = pow(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval pow(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = pow(to_integer(stringField), to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval pow(stringField, stringField)", + "error": [ + "Argument of [pow] must be [number], found value [stringField] type [string]", + "Argument of [pow] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval pow(numberField, numberField, extraArg)", + "error": [ + "Error: [pow] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = replace(stringField, stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval replace(stringField, stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = replace(to_string(stringField), to_string(stringField), to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval replace(numberField, numberField, numberField)", + "error": [ + "Argument of [replace] must be [string], found value [numberField] type [number]", + "Argument of [replace] must be [string], found value [numberField] type [number]", + "Argument of [replace] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval replace(stringField, stringField, stringField, extraArg)", + "error": [ + "Error: [replace] function expects exactly 3 arguments, got 4." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = right(stringField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval right(stringField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = right(to_string(stringField), to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval right(numberField, stringField)", + "error": [ + "Argument of [right] must be [string], found value [numberField] type [number]", + "Argument of [right] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval right(stringField, numberField, extraArg)", + "error": [ + "Error: [right] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = round(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval round(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = round(to_integer(stringField), to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval round(stringField, stringField)", + "error": [ + "Argument of [round] must be [number], found value [stringField] type [string]", + "Argument of [round] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval round(numberField, numberField, extraArg)", + "error": [ + "Error: [round] function expects no more than 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = rtrim(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval rtrim(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = rtrim(to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval rtrim(numberField)", + "error": [ + "Argument of [rtrim] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval rtrim(stringField, extraArg)", + "error": [ + "Error: [rtrim] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = rtrim(*)", + "error": [ + "Using wildcards (*) in rtrim is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = sin(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval sin(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = sin(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval sin(stringField)", + "error": [ + "Argument of [sin] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval sin(numberField, extraArg)", + "error": [ + "Error: [sin] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = sin(*)", + "error": [ + "Using wildcards (*) in sin is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = sinh(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval sinh(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = sinh(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval sinh(stringField)", + "error": [ + "Argument of [sinh] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval sinh(numberField, extraArg)", + "error": [ + "Error: [sinh] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = sinh(*)", + "error": [ + "Using wildcards (*) in sinh is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = split(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval split(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = split(to_string(stringField), to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval split(numberField, numberField)", + "error": [ + "Argument of [split] must be [string], found value [numberField] type [number]", + "Argument of [split] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval split(stringField, stringField, extraArg)", + "error": [ + "Error: [split] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = sqrt(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval sqrt(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = sqrt(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval sqrt(stringField)", + "error": [ + "Argument of [sqrt] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval sqrt(numberField, extraArg)", + "error": [ + "Error: [sqrt] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = sqrt(*)", + "error": [ + "Using wildcards (*) in sqrt is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = starts_with(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval starts_with(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = starts_with(to_string(stringField), to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval starts_with(numberField, numberField)", + "error": [ + "Argument of [starts_with] must be [string], found value [numberField] type [number]", + "Argument of [starts_with] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval starts_with(stringField, stringField, extraArg)", + "error": [ + "Error: [starts_with] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = substring(stringField, numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval substring(stringField, numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = substring(to_string(stringField), to_integer(stringField), to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval substring(numberField, stringField, stringField)", + "error": [ + "Argument of [substring] must be [string], found value [numberField] type [number]", + "Argument of [substring] must be [number], found value [stringField] type [string]", + "Argument of [substring] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval substring(stringField, numberField, numberField, extraArg)", + "error": [ + "Error: [substring] function expects exactly 3 arguments, got 4." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = tan(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval tan(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = tan(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval tan(stringField)", + "error": [ + "Argument of [tan] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval tan(numberField, extraArg)", + "error": [ + "Error: [tan] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = tan(*)", + "error": [ + "Using wildcards (*) in tan is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = tanh(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval tanh(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = tanh(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval tanh(stringField)", + "error": [ + "Argument of [tanh] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval tanh(numberField, extraArg)", + "error": [ + "Error: [tanh] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = tanh(*)", + "error": [ + "Using wildcards (*) in tanh is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = tau()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval tau()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = tau()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval tau()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval tau(extraArg)", + "error": [ + "Error: [tau] function expects exactly 0 arguments, got 1." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_boolean(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_boolean(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_bool(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_boolean(*)", + "error": [ + "Using wildcards (*) in to_boolean is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_cartesianpoint(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_cartesianpoint(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_cartesianpoint(*)", + "error": [ + "Using wildcards (*) in to_cartesianpoint is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_cartesianshape(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_cartesianshape(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_cartesianshape(*)", + "error": [ + "Using wildcards (*) in to_cartesianshape is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_datetime(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_datetime(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_dt(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_datetime(*)", + "error": [ + "Using wildcards (*) in to_datetime is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_degrees(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_degrees(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_degrees(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_degrees(stringField)", + "error": [ + "Argument of [to_degrees] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval to_degrees(numberField, extraArg)", + "error": [ + "Error: [to_degrees] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_degrees(*)", + "error": [ + "Using wildcards (*) in to_degrees is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_double(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_double(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_dbl(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_double(*)", + "error": [ + "Using wildcards (*) in to_double is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_geopoint(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_geopoint(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_geopoint(*)", + "error": [ + "Using wildcards (*) in to_geopoint is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_geoshape(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_geoshape(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_geoshape(*)", + "error": [ + "Using wildcards (*) in to_geoshape is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_integer(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_integer(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_int(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_integer(*)", + "error": [ + "Using wildcards (*) in to_integer is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_ip(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_ip(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_ip(*)", + "error": [ + "Using wildcards (*) in to_ip is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_long(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_long(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_long(*)", + "error": [ + "Using wildcards (*) in to_long is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_lower(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_lower(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_lower(to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_lower(numberField)", + "error": [ + "Argument of [to_lower] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval to_lower(stringField, extraArg)", + "error": [ + "Error: [to_lower] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_lower(*)", + "error": [ + "Using wildcards (*) in to_lower is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_radians(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_radians(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_radians(to_integer(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_radians(stringField)", + "error": [ + "Argument of [to_radians] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval to_radians(numberField, extraArg)", + "error": [ + "Error: [to_radians] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_radians(*)", + "error": [ + "Using wildcards (*) in to_radians is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_string(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_string(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_str(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_string(*)", + "error": [ + "Using wildcards (*) in to_string is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_unsigned_long(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_unsigned_long(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_ul(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_ulong(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_unsigned_long(*)", + "error": [ + "Using wildcards (*) in to_unsigned_long is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_upper(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_upper(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_upper(to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_upper(numberField)", + "error": [ + "Argument of [to_upper] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval to_upper(stringField, extraArg)", + "error": [ + "Error: [to_upper] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_upper(*)", + "error": [ + "Using wildcards (*) in to_upper is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_version(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_version(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_ver(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_version(*)", + "error": [ + "Using wildcards (*) in to_version is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = to_version(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval to_version(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_ver(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = to_version(*)", + "error": [ + "Using wildcards (*) in to_version is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = trim(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval trim(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = trim(to_string(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval trim(numberField)", + "error": [ + "Argument of [trim] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval trim(stringField, extraArg)", + "error": [ + "Error: [trim] function expects exactly one argument, got 2." + ], + "warning": [] + }, + { + "query": "from a_index | eval var = trim(*)", + "error": [ + "Using wildcards (*) in trim is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | eval log10(-1)", + "error": [], + "warning": [ + "Log of a negative number results in null: -1" + ] + }, + { + "query": "from a_index | eval log(-1)", + "error": [], + "warning": [ + "Log of a negative number results in null: -1" + ] + }, + { + "query": "from a_index | eval log(-1, 20)", + "error": [], + "warning": [ + "Log of a negative number results in null: -1" + ] + }, + { + "query": "from a_index | eval log(-1, -20)", + "error": [], + "warning": [ + "Log of a negative number results in null: -1", + "Log of a negative number results in null: -20" + ] + }, + { + "query": "from a_index | eval var0 = log(-1, -20)", + "error": [], + "warning": [ + "Log of a negative number results in null: -1", + "Log of a negative number results in null: -20" + ] + }, + { + "query": "from a_index | eval numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval NOT numberField > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField > 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (NOT (numberField > 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField > 0", + "error": [ + "Argument of [>] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField >= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval NOT numberField >= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField >= 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (NOT (numberField >= 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 >= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField >= 0", + "error": [ + "Argument of [>=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField < 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval NOT numberField < 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField < 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (NOT (numberField < 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 < 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField < 0", + "error": [ + "Argument of [<] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField <= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval NOT numberField <= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField <= 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (NOT (numberField <= 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 <= 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField <= 0", + "error": [ + "Argument of [<=] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField == 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval NOT numberField == 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField == 0)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (NOT (numberField == 0))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 == 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField == 0", + "error": [ + "Argument of [==] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField + 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField + 1)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 + 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField - 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField - 1)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 - 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField * 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField * 1)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 * 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField / 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField / 1)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 / 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField % 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval (numberField % 1)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 % 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1/0", + "error": [], + "warning": [ + "Cannot divide by zero: 1/0" + ] + }, + { + "query": "from a_index | eval var = 1/0", + "error": [], + "warning": [ + "Cannot divide by zero: 1/0" + ] + }, + { + "query": "from a_index | eval 1 + 1/0", + "error": [], + "warning": [ + "Cannot divide by zero: 1/0" + ] + }, + { + "query": "from a_index | eval 1%0", + "error": [], + "warning": [ + "Module by zero can return null value: 1%0" + ] + }, + { + "query": "from a_index | eval var = 1%0", + "error": [], + "warning": [ + "Module by zero can return null value: 1%0" + ] + }, + { + "query": "from a_index | eval 1 + 1%0", + "error": [], + "warning": [ + "Module by zero can return null value: 1%0" + ] + }, + { + "query": "from a_index | eval stringField like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField NOT like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval NOT stringField like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval NOT stringField NOT like \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField like \"?a\"", + "error": [ + "Argument of [like] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField NOT like \"?a\"", + "error": [ + "Argument of [not_like] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval NOT numberField like \"?a\"", + "error": [ + "Argument of [like] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval NOT numberField NOT like \"?a\"", + "error": [ + "Argument of [not_like] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField NOT rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval NOT stringField rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval NOT stringField NOT rlike \"?a\"", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField rlike \"?a\"", + "error": [ + "Argument of [rlike] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField NOT rlike \"?a\"", + "error": [ + "Argument of [not_rlike] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval NOT numberField rlike \"?a\"", + "error": [ + "Argument of [rlike] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval NOT numberField NOT rlike \"?a\"", + "error": [ + "Argument of [not_rlike] must be [string], found value [numberField] type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 in (1, 2, 3)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField in (1, 2, 3)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField not in (1, 2, 3)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval numberField not in (1, 2, 3, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 in (1, 2, 3, round(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval \"a\" in (\"a\", \"b\", \"c\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField in (\"a\", \"b\", \"c\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField not in (\"a\", \"b\", \"c\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval stringField not in (\"a\", \"b\", \"c\", stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 in (\"a\", \"b\", \"c\")", + "error": [ + "Argument of [in] must be [number[]], found value [(\"a\", \"b\", \"c\")] type [(string, string, string)]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField in (\"a\", \"b\", \"c\")", + "error": [ + "Argument of [in] must be [number[]], found value [(\"a\", \"b\", \"c\")] type [(string, string, string)]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField not in (\"a\", \"b\", \"c\")", + "error": [ + "Argument of [not_in] must be [number[]], found value [(\"a\", \"b\", \"c\")] type [(string, string, string)]" + ], + "warning": [] + }, + { + "query": "from a_index | eval numberField not in (1, 2, 3, stringField)", + "error": [ + "Argument of [not_in] must be [number[]], found value [(1, 2, 3, stringField)] type [(number, number, number, string)]" + ], + "warning": [] + }, + { + "query": "from a_index | eval avg(numberField)", + "error": [ + "EVAL does not support function avg" + ], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) | eval `avg(numberField)` + 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval not", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "Error: [not] function expects exactly one argument, got 0." + ], + "warning": [] + }, + { + "query": "from a_index | eval in", + "error": [ + "SyntaxError: mismatched input 'in' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField in stringField", + "error": [ + "SyntaxError: missing '(' at 'stringField'", + "SyntaxError: mismatched input '' expecting {',', ')'}" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField in stringField)", + "error": [ + "SyntaxError: missing '(' at 'stringField'", + "Error: [in] function expects exactly 2 arguments, got 1." + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField not in stringField", + "error": [ + "SyntaxError: missing '(' at 'stringField'", + "SyntaxError: mismatched input '' expecting {',', ')'}" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 anno", + "error": [ + "EVAL does not support [date_period] in expression [1 anno]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = 1 anno", + "error": [ + "Unexpected time interval qualifier: 'anno'" + ], + "warning": [] + }, + { + "query": "from a_index | eval now() + 1 anno", + "error": [ + "Unexpected time interval qualifier: 'anno'" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 year", + "error": [ + "EVAL does not support [date_period] in expression [1 year]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 year", + "error": [ + "EVAL does not support [date_period] in expression [1 year]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 year", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 year", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 YEAR", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Year", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 year", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 year + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 year] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 year", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 year] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 year", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 year] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 year", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 year] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 years", + "error": [ + "EVAL does not support [date_period] in expression [1 years]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 years", + "error": [ + "EVAL does not support [date_period] in expression [1 years]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 years", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 years", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 YEARS", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Years", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 years", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 years + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 years] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 years", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 years] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 years", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 years] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 years", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 years] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 month", + "error": [ + "EVAL does not support [date_period] in expression [1 month]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 month", + "error": [ + "EVAL does not support [date_period] in expression [1 month]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 month", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 month", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 MONTH", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Month", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 month", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 month + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 month] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 month", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 month] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 month", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 month] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 month", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 month] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 months", + "error": [ + "EVAL does not support [date_period] in expression [1 months]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 months", + "error": [ + "EVAL does not support [date_period] in expression [1 months]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 months", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 months", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 MONTHS", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Months", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 months", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 months + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 months] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 months", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 months] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 months", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 months] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 months", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 months] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 week", + "error": [ + "EVAL does not support [date_period] in expression [1 week]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 week", + "error": [ + "EVAL does not support [date_period] in expression [1 week]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 week", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 week", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 WEEK", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Week", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 week", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 week + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 week] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 week", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 week] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 week", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 week] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 week", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 week] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 weeks", + "error": [ + "EVAL does not support [date_period] in expression [1 weeks]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 weeks", + "error": [ + "EVAL does not support [date_period] in expression [1 weeks]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 weeks", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 weeks", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 WEEKS", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Weeks", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 weeks", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 weeks + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 weeks] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 weeks", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 weeks] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 weeks", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 weeks] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 weeks", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 weeks] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 day", + "error": [ + "EVAL does not support [date_period] in expression [1 day]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 day", + "error": [ + "EVAL does not support [date_period] in expression [1 day]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 day", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 day", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 DAY", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Day", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 day", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 day + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 day] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 day", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 day] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 day", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 day] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 day", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 day] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 days", + "error": [ + "EVAL does not support [date_period] in expression [1 days]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 days", + "error": [ + "EVAL does not support [date_period] in expression [1 days]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 days", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 days", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 DAYS", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Days", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 days", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 days + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 days] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 days", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 days] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 days", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 days] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 days", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 days] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 hour", + "error": [ + "EVAL does not support [date_period] in expression [1 hour]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 hour", + "error": [ + "EVAL does not support [date_period] in expression [1 hour]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 hour", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 hour", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 HOUR", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Hour", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 hour", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 hour + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 hour] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 hour", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 hour] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 hour", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 hour] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 hour", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 hour] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 hours", + "error": [ + "EVAL does not support [date_period] in expression [1 hours]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 hours", + "error": [ + "EVAL does not support [date_period] in expression [1 hours]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 hours", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 hours", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 HOURS", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Hours", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 hours", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 hours + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 hours] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 hours", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 hours] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 hours", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 hours] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 hours", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 hours] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 minute", + "error": [ + "EVAL does not support [date_period] in expression [1 minute]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 minute", + "error": [ + "EVAL does not support [date_period] in expression [1 minute]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 minute", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 minute", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 MINUTE", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Minute", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 minute", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 minute + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 minute] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 minute", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 minute] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 minute", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 minute] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 minute", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 minute] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 minutes", + "error": [ + "EVAL does not support [date_period] in expression [1 minutes]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 minutes", + "error": [ + "EVAL does not support [date_period] in expression [1 minutes]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 minutes", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 minutes", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 MINUTES", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Minutes", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 minutes", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 minutes + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 minutes] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 minutes", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 minutes] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 minutes", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 minutes] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 minutes", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 minutes] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 second", + "error": [ + "EVAL does not support [date_period] in expression [1 second]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 second", + "error": [ + "EVAL does not support [date_period] in expression [1 second]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 second", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 second", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 SECOND", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Second", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 second", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 second + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 second] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 second", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 second] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 second", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 second] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 second", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 second] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 seconds", + "error": [ + "EVAL does not support [date_period] in expression [1 seconds]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 seconds", + "error": [ + "EVAL does not support [date_period] in expression [1 seconds]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 seconds", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 seconds", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 SECONDS", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Seconds", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 seconds", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 seconds + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 seconds] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 seconds", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 seconds] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 seconds", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 seconds] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 seconds", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 seconds] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 millisecond", + "error": [ + "EVAL does not support [date_period] in expression [1 millisecond]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 millisecond", + "error": [ + "EVAL does not support [date_period] in expression [1 millisecond]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 millisecond", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 millisecond", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 MILLISECOND", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Millisecond", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 millisecond", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 millisecond + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 millisecond] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 millisecond", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 millisecond] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 millisecond", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 millisecond] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 millisecond", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 millisecond] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 milliseconds", + "error": [ + "EVAL does not support [date_period] in expression [1 milliseconds]" + ], + "warning": [] + }, + { + "query": "from a_index | eval 1 milliseconds", + "error": [ + "EVAL does not support [date_period] in expression [1 milliseconds]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() - 1 milliseconds", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 milliseconds", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 MILLISECONDS", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField - 1 Milliseconds", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = dateField + 1 milliseconds", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval 1 milliseconds + 1 year", + "error": [ + "Argument of [+] must be [date], found value [1 milliseconds] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() * 1 milliseconds", + "error": [ + "Argument of [*] must be [number], found value [now()] type [date]", + "Argument of [*] must be [number], found value [1 milliseconds] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() / 1 milliseconds", + "error": [ + "Argument of [/] must be [number], found value [now()] type [date]", + "Argument of [/] must be [number], found value [1 milliseconds] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = now() % 1 milliseconds", + "error": [ + "Argument of [%] must be [number], found value [now()] type [date]", + "Argument of [%] must be [number], found value [1 milliseconds] type [duration]" + ], + "warning": [] + }, + { + "query": "from a_index | stats ", + "error": [ + "At least one aggregation or grouping expression required in [STATS]" + ], + "warning": [] + }, + { + "query": "from a_index | stats by stringField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats by ", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | stats numberField ", + "error": [ + "Expected an aggregate function or group but got [numberField] of type [FieldAttribute]" + ], + "warning": [] + }, + { + "query": "from a_index | stats numberField=", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | stats numberField=5 by ", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) by wrongField", + "error": [ + "Unknown column [wrongField]" + ], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) by wrongField + 1", + "error": [ + "Unknown column [wrongField]" + ], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) by var0 = wrongField + 1", + "error": [ + "Unknown column [wrongField]" + ], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) by 1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) by percentile(numberField)", + "error": [ + "STATS BY does not support function percentile" + ], + "warning": [] + }, + { + "query": "from a_index | stats count(`numberField`)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats count(`numberField`) | keep `count(``numberField``)` ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats count(`numberField`) | drop `count(``numberField``)` ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats count(`numberField`) | eval `count(``numberField``)` ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) by stringField, percentile(numberField) by ipField", + "error": [ + "SyntaxError: mismatched input 'by' expecting ", + "STATS BY does not support function percentile" + ], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), percentile(numberField, 50) by ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), percentile(numberField, 50) BY ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) + percentile(numberField, 50) BY ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) - percentile(numberField, 50) BY ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) * percentile(numberField, 50) BY ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) / percentile(numberField, 50) BY ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) % percentile(numberField, 50) BY ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats count(* + 1) BY ipField", + "error": [ + "SyntaxError: no viable alternative at input 'count(* +'" + ], + "warning": [] + }, + { + "query": "from a_index | stats count(* + round(numberField)) BY ipField", + "error": [ + "SyntaxError: no viable alternative at input 'count(* +'" + ], + "warning": [] + }, + { + "query": "from a_index | stats count(round(*)) BY ipField", + "error": [ + "Using wildcards (*) in round is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | stats count(count(*)) BY ipField", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [count(*)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats numberField + 1", + "error": [ + "At least one aggregation function required in [STATS], found [numberField+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats 5 + avg(numberField) +1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 +1 + avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 +1 + numberField", + "error": [ + "At least one aggregation function required in [STATS], found [5+1+numberField]" + ], + "warning": [] + }, + { + "query": "from a_index | stats 5 + numberField +1", + "error": [ + "At least one aggregation function required in [STATS], found [5+numberField+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats 5 + numberField +1, var0 = sum(numberField)", + "error": [ + "At least one aggregation function required in [STATS], found [5+numberField+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round( sum(numberField) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round( sum(numberField) ) + round( sum(numberField) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round( numberField + sum(numberField) )", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(numberField+sum(numberField))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round( numberField + sum(numberField) ), var0 = sum(numberField)", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(numberField+sum(numberField))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var0 = round( numberField + sum(numberField) ), var1 = sum(numberField)", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(numberField+sum(numberField))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round( sum(numberField + numberField) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round( sum(numberField + round(numberField)) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round( sum(numberField + round(numberField)) ) + round( sum(numberField + round(numberField)) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(round( numberField ) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(round( numberField ) ) + sum(round( numberField ) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 + avg(numberField) +1+1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 +1+1 + avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 +1+1 + numberField", + "error": [ + "At least one aggregation function required in [STATS], found [5+1+1+numberField]" + ], + "warning": [] + }, + { + "query": "from a_index | stats 5 + numberField +1+1", + "error": [ + "At least one aggregation function required in [STATS], found [5+numberField+1+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats 5 + numberField +1+1, var0 = sum(numberField)", + "error": [ + "At least one aggregation function required in [STATS], found [5+numberField+1+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round(round( sum(numberField) ))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round( sum(numberField) )) + round(round( sum(numberField) ))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round( numberField + sum(numberField) ))", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(round(numberField+sum(numberField)))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round(round( numberField + sum(numberField) )), var0 = sum(numberField)", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(round(numberField+sum(numberField)))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var0 = round(round( numberField + sum(numberField) )), var1 = sum(numberField)", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(round(numberField+sum(numberField)))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round(round( sum(numberField + numberField) ))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round( sum(numberField + round(numberField)) ))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round( sum(numberField + round(numberField)) )) + round(round( sum(numberField + round(numberField)) ))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(round(round( numberField )) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(round(round( numberField )) ) + sum(round(round( numberField )) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 + avg(numberField) +1+1+1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 +1+1+1 + avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 +1+1+1 + numberField", + "error": [ + "At least one aggregation function required in [STATS], found [5+1+1+1+numberField]" + ], + "warning": [] + }, + { + "query": "from a_index | stats 5 + numberField +1+1+1", + "error": [ + "At least one aggregation function required in [STATS], found [5+numberField+1+1+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats 5 + numberField +1+1+1, var0 = sum(numberField)", + "error": [ + "At least one aggregation function required in [STATS], found [5+numberField+1+1+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round( sum(numberField) )))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round( sum(numberField) ))) + round(round(round( sum(numberField) )))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round( numberField + sum(numberField) )))", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(round(round(numberField+sum(numberField))))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round( numberField + sum(numberField) ))), var0 = sum(numberField)", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(round(round(numberField+sum(numberField))))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var0 = round(round(round( numberField + sum(numberField) ))), var1 = sum(numberField)", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(round(round(numberField+sum(numberField))))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round( sum(numberField + numberField) )))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round( sum(numberField + round(numberField)) )))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round( sum(numberField + round(numberField)) ))) + round(round(round( sum(numberField + round(numberField)) )))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(round(round(round( numberField ))) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(round(round(round( numberField ))) ) + sum(round(round(round( numberField ))) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 + avg(numberField) +1+1+1+1", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 +1+1+1+1 + avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 +1+1+1+1 + numberField", + "error": [ + "At least one aggregation function required in [STATS], found [5+1+1+1+1+numberField]" + ], + "warning": [] + }, + { + "query": "from a_index | stats 5 + numberField +1+1+1+1", + "error": [ + "At least one aggregation function required in [STATS], found [5+numberField+1+1+1+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats 5 + numberField +1+1+1+1, var0 = sum(numberField)", + "error": [ + "At least one aggregation function required in [STATS], found [5+numberField+1+1+1+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round(round( sum(numberField) ))))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round(round( sum(numberField) )))) + round(round(round(round( sum(numberField) ))))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round(round( numberField + sum(numberField) ))))", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(round(round(round(numberField+sum(numberField)))))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round(round( numberField + sum(numberField) )))), var0 = sum(numberField)", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(round(round(round(numberField+sum(numberField)))))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var0 = round(round(round(round( numberField + sum(numberField) )))), var1 = sum(numberField)", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [round(round(round(round(numberField+sum(numberField)))))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round(round( sum(numberField + numberField) ))))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round(round( sum(numberField + round(numberField)) ))))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(round(round(round( sum(numberField + round(numberField)) )))) + round(round(round(round( sum(numberField + round(numberField)) ))))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(round(round(round(round( numberField )))) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(round(round(round(round( numberField )))) ) + sum(round(round(round(round( numberField )))) )", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats 5 + numberField + 1", + "error": [ + "At least one aggregation function required in [STATS], found [5+numberField+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats numberField + 1 by ipField", + "error": [ + "At least one aggregation function required in [STATS], found [numberField+1]" + ], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), percentile(numberField, 50) + 1 by ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats count(*)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats count()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = count(*)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = count()", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = avg(numberField), count(*)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = avg(fn(number)), count(*)", + "error": [ + "Unknown function [fn]" + ], + "warning": [] + }, + { + "query": "from a_index | STATS sum( numberField ) + abs( numberField ) ", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [sum(numberField)+abs(numberField)]" + ], + "warning": [] + }, + { + "query": "from a_index | STATS abs( numberField + sum( numberField )) ", + "error": [ + "Cannot combine aggregation and non-aggregation values in [STATS], found [abs(numberField+sum(numberField))]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(avg(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(avg(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(avg(numberField)) + avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(avg(numberField)) + avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = avg(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), avg(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = avg(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = avg(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField) by round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = avg(numberField) by var1 = round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), avg(numberField) by round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = avg(numberField) by var1 = round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), avg(numberField) by round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = avg(numberField) by var1 = round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = avg(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats avg(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats avg(stringField)", + "error": [ + "Argument of [avg] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = avg(*)", + "error": [ + "Using wildcards (*) in avg is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = max(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats max(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(max(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(max(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(max(numberField)) + max(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(max(numberField)) + max(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats max(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = max(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), max(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = max(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats max(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = max(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), max(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = max(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats max(numberField) by round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = max(numberField) by var1 = round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), max(numberField) by round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = max(numberField) by var1 = round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), max(numberField) by round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = max(numberField) by var1 = round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = max(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats max(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats max(stringField)", + "error": [ + "Argument of [max] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = max(*)", + "error": [ + "Using wildcards (*) in max is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = min(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats min(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(min(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(min(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(min(numberField)) + min(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(min(numberField)) + min(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats min(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = min(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), min(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = min(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats min(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = min(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), min(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = min(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats min(numberField) by round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = min(numberField) by var1 = round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), min(numberField) by round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = min(numberField) by var1 = round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), min(numberField) by round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = min(numberField) by var1 = round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = min(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats min(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats min(stringField)", + "error": [ + "Argument of [min] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = min(*)", + "error": [ + "Using wildcards (*) in min is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(sum(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(sum(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(sum(numberField)) + sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(sum(numberField)) + sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = sum(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), sum(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = sum(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = sum(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats sum(numberField) by round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = sum(numberField) by var1 = round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), sum(numberField) by round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = sum(numberField) by var1 = round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), sum(numberField) by round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = sum(numberField) by var1 = round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = sum(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats sum(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats sum(stringField)", + "error": [ + "Argument of [sum] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = sum(*)", + "error": [ + "Using wildcards (*) in sum is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(median(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(median(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(median(numberField)) + median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(median(numberField)) + median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats median(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = median(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), median(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = median(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = median(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats median(numberField) by round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = median(numberField) by var1 = round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), median(numberField) by round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = median(numberField) by var1 = round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), median(numberField) by round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = median(numberField) by var1 = round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = median(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats median(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats median(stringField)", + "error": [ + "Argument of [median] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = median(*)", + "error": [ + "Using wildcards (*) in median is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = median_absolute_deviation(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats median_absolute_deviation(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(median_absolute_deviation(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(median_absolute_deviation(numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(median_absolute_deviation(numberField)) + median_absolute_deviation(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(median_absolute_deviation(numberField)) + median_absolute_deviation(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats median_absolute_deviation(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = median_absolute_deviation(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), median_absolute_deviation(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = median_absolute_deviation(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats median_absolute_deviation(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = median_absolute_deviation(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), median_absolute_deviation(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = median_absolute_deviation(numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats median_absolute_deviation(numberField) by round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = median_absolute_deviation(numberField) by var1 = round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), median_absolute_deviation(numberField) by round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = median_absolute_deviation(numberField) by var1 = round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), median_absolute_deviation(numberField) by round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = median_absolute_deviation(numberField) by var1 = round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = median_absolute_deviation(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats median_absolute_deviation(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats median_absolute_deviation(stringField)", + "error": [ + "Argument of [median_absolute_deviation] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = median_absolute_deviation(*)", + "error": [ + "Using wildcards (*) in median_absolute_deviation is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = percentile(numberField, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats percentile(numberField, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(percentile(numberField, 5))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(percentile(numberField, 5))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(percentile(numberField, 5)) + percentile(numberField, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(percentile(numberField, 5)) + percentile(numberField, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats percentile(numberField, numberField)", + "error": [ + "Argument of [percentile] must be a constant, received [numberField]" + ], + "warning": [] + }, + { + "query": "from a_index | stats percentile(numberField / 2, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = percentile(numberField / 2, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), percentile(numberField / 2, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = percentile(numberField / 2, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats percentile(numberField, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = percentile(numberField, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), percentile(numberField, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = percentile(numberField, 5)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats percentile(numberField, 5) by round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var0 = percentile(numberField, 5) by var1 = round(numberField / 2)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), percentile(numberField, 5) by round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = percentile(numberField, 5) by var1 = round(numberField / 2), ipField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), percentile(numberField, 5) by round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats avg(numberField), var0 = percentile(numberField, 5) by var1 = round(numberField / 2), numberField / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = percentile(avg(numberField), 5)", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats percentile(avg(numberField), 5)", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats percentile(stringField, 5)", + "error": [ + "Argument of [percentile] must be [number], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = count(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats count(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(count(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(count(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(count(stringField)) + count(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(count(stringField)) + count(stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = count_distinct(stringField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats count_distinct(stringField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(count_distinct(stringField, numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(count_distinct(stringField, numberField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = round(count_distinct(stringField, numberField)) + count_distinct(stringField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats round(count_distinct(stringField, numberField)) + count_distinct(stringField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = st_centroid(cartesianPointField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats st_centroid(cartesianPointField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = st_centroid(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats st_centroid(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats st_centroid(stringField)", + "error": [ + "Argument of [st_centroid] must be [cartesian_point], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = st_centroid(*)", + "error": [ + "Using wildcards (*) in st_centroid is not allowed" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = st_centroid(geoPointField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats st_centroid(geoPointField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats var = st_centroid(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats st_centroid(avg(numberField))", + "error": [ + "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]" + ], + "warning": [] + }, + { + "query": "from a_index | stats st_centroid(stringField)", + "error": [ + "Argument of [st_centroid] must be [cartesian_point], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = st_centroid(*)", + "error": [ + "Using wildcards (*) in st_centroid is not allowed" + ], + "warning": [] + }, + { + "query": "FROM index\n | EVAL numberField * 3.281\n | STATS avg_numberField = AVG(`numberField * 3.281`)", + "error": [], + "warning": [] + }, + { + "query": "FROM index | STATS AVG(numberField) by round(numberField) + 1 | EVAL `round(numberField) + 1` / 2", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort ", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | sort \"field\" ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort wrongField ", + "error": [ + "Unknown column [wrongField]" + ], + "warning": [] + }, + { + "query": "from a_index | sort numberField, ", + "error": [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + ], + "warning": [] + }, + { + "query": "from a_index | sort numberField, stringField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort \"field\" desc ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField desc ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField desc nulls ", + "error": [ + "SyntaxError: missing {'first', 'last'} at ''" + ], + "warning": [] + }, + { + "query": "from a_index | sort numberField desc nulls first", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField desc first", + "error": [ + "SyntaxError: extraneous input 'first' expecting " + ], + "warning": [] + }, + { + "query": "from a_index | sort numberField desc nulls last", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField desc last", + "error": [ + "SyntaxError: extraneous input 'last' expecting " + ], + "warning": [] + }, + { + "query": "from a_index | sort \"field\" asc ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField asc ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField asc nulls ", + "error": [ + "SyntaxError: missing {'first', 'last'} at ''" + ], + "warning": [] + }, + { + "query": "from a_index | sort numberField asc nulls first", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField asc first", + "error": [ + "SyntaxError: extraneous input 'first' expecting " + ], + "warning": [] + }, + { + "query": "from a_index | sort numberField asc nulls last", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField asc last", + "error": [ + "SyntaxError: extraneous input 'last' expecting " + ], + "warning": [] + }, + { + "query": "from a_index | sort numberField nulls first", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField first", + "error": [ + "SyntaxError: extraneous input 'first' expecting " + ], + "warning": [] + }, + { + "query": "from a_index | sort numberField nulls last", + "error": [], + "warning": [] + }, + { + "query": "from a_index | sort numberField last", + "error": [ + "SyntaxError: extraneous input 'last' expecting " + ], + "warning": [] + }, + { + "query": "row a = 1 | stats COUNT(*) | sort `COUNT(*)`", + "error": [], + "warning": [] + }, + { + "query": "ROW a = 1 | STATS couNt(*) | SORT `couNt(*)`", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich", + "error": [ + "SyntaxError: missing ENRICH_POLICY_NAME at ''" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _", + "error": [ + "Unknown policy [_]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _:", + "error": [ + "SyntaxError: token recognition error at: ':'", + "Unknown policy [_]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _:policy", + "error": [ + "Unrecognized value [_] for ENRICH, mode needs to be one of [_ANY, _COORDINATOR, _REMOTE]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich :policy", + "error": [ + "SyntaxError: token recognition error at: ':'" + ], + "warning": [] + }, + { + "query": "from a_index | enrich any:", + "error": [ + "SyntaxError: token recognition error at: ':'", + "Unknown policy [any]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _any:", + "error": [ + "SyntaxError: token recognition error at: ':'", + "Unknown policy [_any]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich any:policy", + "error": [ + "Unrecognized value [any] for ENRICH, mode needs to be one of [_ANY, _COORDINATOR, _REMOTE]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich `this``is fine`", + "error": [ + "SyntaxError: mismatched input '`this``is fine`' expecting ENRICH_POLICY_NAME" + ], + "warning": [] + }, + { + "query": "from a_index | enrich this is fine", + "error": [ + "SyntaxError: mismatched input 'is' expecting ", + "Unknown policy [this]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _any:policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich _any : policy ", + "error": [ + "SyntaxError: token recognition error at: ':'", + "SyntaxError: extraneous input 'policy' expecting ", + "Unknown policy [_any]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _any: policy ", + "error": [ + "SyntaxError: token recognition error at: ':'", + "SyntaxError: extraneous input 'policy' expecting ", + "Unknown policy [_any]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _any:policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich _ANY:policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich _coordinator:policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich _coordinator : policy ", + "error": [ + "SyntaxError: token recognition error at: ':'", + "SyntaxError: extraneous input 'policy' expecting ", + "Unknown policy [_coordinator]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _coordinator: policy ", + "error": [ + "SyntaxError: token recognition error at: ':'", + "SyntaxError: extraneous input 'policy' expecting ", + "Unknown policy [_coordinator]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _coordinator:policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich _COORDINATOR:policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich _remote:policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich _remote : policy ", + "error": [ + "SyntaxError: token recognition error at: ':'", + "SyntaxError: extraneous input 'policy' expecting ", + "Unknown policy [_remote]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _remote: policy ", + "error": [ + "SyntaxError: token recognition error at: ':'", + "SyntaxError: extraneous input 'policy' expecting ", + "Unknown policy [_remote]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich _remote:policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich _REMOTE:policy ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich _unknown:policy", + "error": [ + "Unrecognized value [_unknown] for ENRICH, mode needs to be one of [_ANY, _COORDINATOR, _REMOTE]" + ], + "warning": [] + }, + { + "query": "from a_index |enrich missing-policy ", + "error": [ + "Unknown policy [missing-policy]" + ], + "warning": [] + }, + { + "query": "from a_index |enrich policy on ", + "error": [ + "SyntaxError: missing ID_PATTERN at ''" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy on b ", + "error": [ + "Unknown column [b]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy on `this``is fine`", + "error": [ + "Unknown column [this`is fine]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy on this is fine", + "error": [ + "SyntaxError: mismatched input 'is' expecting ", + "Unknown column [this]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy on stringField with ", + "error": [ + "SyntaxError: mismatched input '' expecting ID_PATTERN" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy on stringField with var0 ", + "error": [ + "Unknown column [var0]" + ], + "warning": [] + }, + { + "query": "from a_index |enrich policy on numberField with var0 = ", + "error": [ + "SyntaxError: missing ID_PATTERN at ''", + "Unknown column [var0]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy on stringField with var0 = c ", + "error": [ + "Unknown column [var0]", + "Unknown column [c]" + ], + "warning": [] + }, + { + "query": "from a_index |enrich policy on numberField with var0 = , ", + "error": [ + "SyntaxError: missing ID_PATTERN at ','", + "SyntaxError: mismatched input '' expecting ID_PATTERN", + "Unknown column [var0]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy on stringField with var0 = otherField, var1 ", + "error": [ + "Unknown column [var1]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy on stringField with var0 = otherField ", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich policy on stringField with var0 = otherField, yetAnotherField ", + "error": [], + "warning": [] + }, + { + "query": "from a_index |enrich policy on numberField with var0 = otherField, var1 = ", + "error": [ + "SyntaxError: missing ID_PATTERN at ''", + "Unknown column [var1]" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy on stringField with var0 = otherField, var1 = yetAnotherField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich policy on stringField with var0 = otherField, `this``is fine` = yetAnotherField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich policy with ", + "error": [ + "SyntaxError: mismatched input '' expecting ID_PATTERN" + ], + "warning": [] + }, + { + "query": "from a_index | enrich policy with otherField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich policy | eval otherField", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich policy with var0 = otherField | eval var0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | enrich my-pol*", + "error": [ + "Using wildcards (*) in ENRICH is not allowed [my-pol*]" + ], + "warning": [] + }, + { + "query": "from a_index | eval stringField = 5", + "error": [], + "warning": [ + "Column [stringField] of type string has been overwritten as new type: number" + ] + }, + { + "query": "from a_index | eval numberField = \"5\"", + "error": [], + "warning": [ + "Column [numberField] of type number has been overwritten as new type: string" + ] + }, + { + "query": "from a_index | eval round(numberField) + 1 | eval `round(numberField) + 1` + 1 | keep ```round(numberField) + 1`` + 1`", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval round(numberField) + 1 | eval `round(numberField) + 1` + 1 | eval ```round(numberField) + 1`` + 1` + 1 | keep ```````round(numberField) + 1```` + 1`` + 1`", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval round(numberField) + 1 | eval `round(numberField) + 1` + 1 | eval ```round(numberField) + 1`` + 1` + 1 | eval ```````round(numberField) + 1```` + 1`` + 1` + 1 | keep ```````````````round(numberField) + 1```````` + 1```` + 1`` + 1`", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval round(numberField) + 1 | eval `round(numberField) + 1` + 1 | eval ```round(numberField) + 1`` + 1` + 1 | eval ```````round(numberField) + 1```` + 1`` + 1` + 1 | eval ```````````````round(numberField) + 1```````` + 1```` + 1`` + 1` + 1 | keep ```````````````````````````````round(numberField) + 1```````````````` + 1```````` + 1```` + 1`` + 1`", + "error": [], + "warning": [] + } + ] +} \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/validation/helpers.ts similarity index 97% rename from packages/kbn-monaco/src/esql/lib/ast/validation/helpers.ts rename to packages/kbn-esql-validation-autocomplete/src/validation/helpers.ts index e7999e4e63a9a..a60d705d0d0d3 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/helpers.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { ESQLAst } from '../types'; +import type { ESQLAst } from '@kbn/esql-ast'; import type { ESQLPolicy } from './types'; export function buildQueryForFieldsFromSource(queryString: string, ast: ESQLAst) { diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/resources.ts b/packages/kbn-esql-validation-autocomplete/src/validation/resources.ts similarity index 95% rename from packages/kbn-monaco/src/esql/lib/ast/validation/resources.ts rename to packages/kbn-esql-validation-autocomplete/src/validation/resources.ts index ac2307455d257..4f8552db72e72 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/resources.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/resources.ts @@ -6,15 +6,14 @@ * Side Public License, v 1. */ -import { nonNullable } from '../ast_helpers'; -import { createMapFromList, isSourceItem } from '../shared/helpers'; +import type { ESQLCommand } from '@kbn/esql-ast'; +import { createMapFromList, isSourceItem, nonNullable } from '../shared/helpers'; import { getFieldsByTypeHelper, getPolicyHelper, getSourcesHelper, } from '../shared/resources_helpers'; import type { ESQLCallbacks } from '../shared/types'; -import type { ESQLCommand } from '../types'; import { buildQueryForFieldsForStringSources, buildQueryForFieldsFromSource, diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/types.ts b/packages/kbn-esql-validation-autocomplete/src/validation/types.ts similarity index 89% rename from packages/kbn-monaco/src/esql/lib/ast/validation/types.ts rename to packages/kbn-esql-validation-autocomplete/src/validation/types.ts index dd3cf92248734..0aec2b79eaa89 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/types.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import { EditorError } from '../../../../types'; -import { ESQLMessage, ESQLLocation } from '../types'; +import type { ESQLMessage, ESQLLocation } from '@kbn/esql-ast'; +import type { EditorError } from '../types'; export interface ESQLVariable { name: string; @@ -152,6 +152,18 @@ export interface ValidationErrors { message: string; type: { fn: string; given: string }; }; + metadataBracketsDeprecation: { + message: string; + type: {}; + }; + unknownMetadataField: { + message: string; + type: { value: string; availableFields: string }; + }; + wrongDissectOptionArgumentType: { + message: string; + type: { value: string | number }; + }; } export type ErrorTypes = keyof ValidationErrors; @@ -161,3 +173,7 @@ export interface ValidationResult { errors: Array; warnings: ESQLMessage[]; } + +export interface ValidationOptions { + ignoreOnMissingCallbacks?: boolean; +} diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts new file mode 100644 index 0000000000000..1d934731b9725 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -0,0 +1,2596 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { join } from 'path'; +import { writeFile, readFile } from 'fs/promises'; +import { ignoreErrorsMap, validateQuery } from './validation'; +import { evalFunctionsDefinitions } from '../definitions/functions'; +import { getFunctionSignatures } from '../definitions/helpers'; +import { FunctionDefinition } from '../definitions/types'; +import { chronoLiterals, timeLiterals } from '../definitions/literals'; +import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; +import capitalize from 'lodash/capitalize'; +import { camelCase } from 'lodash'; +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import { nonNullable } from '../shared/helpers'; + +const fieldTypes = ['number', 'date', 'boolean', 'ip', 'string', 'cartesian_point', 'geo_point']; +const fields = [ + ...fieldTypes.map((type) => ({ name: `${camelCase(type)}Field`, type })), + { name: 'any#Char$Field', type: 'number' }, + { name: 'kubernetes.something.something', type: 'number' }, + { name: '@timestamp', type: 'date' }, +]; +const enrichFields = [ + { name: 'otherField', type: 'string' }, + { name: 'yetAnotherField', type: 'number' }, +]; +// eslint-disable-next-line @typescript-eslint/naming-convention +const unsupported_field = [{ name: 'unsupported_field', type: 'unsupported' }]; +const indexes = [ + 'a_index', + 'index', + 'other_index', + '.secret_index', + 'my-index', + 'unsupported_index', +]; +const policies = [ + { + name: 'policy', + sourceIndices: ['enrich_index'], + matchField: 'otherStringField', + enrichFields: ['otherField', 'yetAnotherField'], + }, + { + name: 'policy$', + sourceIndices: ['enrich_index'], + matchField: 'otherStringField', + enrichFields: ['otherField', 'yetAnotherField'], + }, +]; + +const NESTING_LEVELS = 4; +const NESTED_DEPTHS = Array(NESTING_LEVELS) + .fill(0) + .map((_, i) => i + 1); + +function getCallbackMocks() { + return { + getFieldsFor: jest.fn(async ({ query }) => { + if (/enrich/.test(query)) { + return enrichFields; + } + if (/unsupported_index/.test(query)) { + return unsupported_field; + } + if (/dissect|grok/.test(query)) { + return [{ name: 'firstWord', type: 'string' }]; + } + return fields; + }), + getSources: jest.fn(async () => + indexes.map((name) => ({ + name, + hidden: name.startsWith('.'), + })) + ), + getPolicies: jest.fn(async () => policies), + getMetaFields: jest.fn(async () => ['_id', '_source']), + }; +} + +const toInteger = evalFunctionsDefinitions.find(({ name }) => name === 'to_integer')!; +const toStringSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_string')!; +const toDateSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_datetime')!; +const toBooleanSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_boolean')!; +const toIpSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_ip')!; +const toGeoPointSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_geopoint')!; +const toCartesianPointSignature = evalFunctionsDefinitions.find( + ({ name }) => name === 'to_cartesianpoint' +)!; + +const toAvgSignature = statsAggregationFunctionDefinitions.find(({ name }) => name === 'avg')!; + +const nestedFunctions = { + number: prepareNestedFunction(toInteger), + string: prepareNestedFunction(toStringSignature), + date: prepareNestedFunction(toDateSignature), + boolean: prepareNestedFunction(toBooleanSignature), + ip: prepareNestedFunction(toIpSignature), + geo_point: prepareNestedFunction(toGeoPointSignature), + cartesian_point: prepareNestedFunction(toCartesianPointSignature), +}; + +const literals = { + chrono_literal: chronoLiterals[0].name, + time_literal: timeLiterals[0].name, +}; +function getLiteralType(typeString: 'chrono_literal' | 'time_literal') { + if (typeString === 'chrono_literal') { + return literals[typeString]; + } + return `1 ${literals[typeString]}`; +} +function getFieldName( + typeString: string, + { useNestedFunction, isStats }: { useNestedFunction: boolean; isStats: boolean } +) { + if (useNestedFunction && isStats) { + return prepareNestedFunction(toAvgSignature); + } + return useNestedFunction && typeString in nestedFunctions + ? nestedFunctions[typeString as keyof typeof nestedFunctions] + : `${camelCase(typeString)}Field`; +} + +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 prepareNestedFunction(fnSignature: FunctionDefinition): string { + return getFunctionSignatures( + { + ...fnSignature, + signatures: [ + { + ...fnSignature?.signatures[0]!, + params: getFieldMapping(fnSignature?.signatures[0]!.params), + }, + ], + }, + { withTypes: false } + )[0].declaration; +} +function getFieldMapping( + params: FunctionDefinition['signatures'][number]['params'], + { useNestedFunction, useLiterals }: { useNestedFunction: boolean; useLiterals: boolean } = { + useNestedFunction: false, + useLiterals: true, + } +) { + const literalValues = { + string: `"a"`, + number: '5', + }; + return params.map(({ name: _name, type, literalOnly, ...rest }) => { + const typeString: string = type; + if (fieldTypes.includes(typeString)) { + const fieldName = + literalOnly && 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 'chrono_literal' | 'time_literal'), + type, + ...rest, + }; + } + if (/[]$/.test(typeString)) { + return { + name: getMultiValue(typeString), + type, + ...rest, + }; + } + return { name: 'stringField', type, ...rest }; + }); +} + +function generateWrongMappingForArgs( + name: string, + signatures: FunctionDefinition['signatures'], + currentParams: FunctionDefinition['signatures'][number]['params'], + values: { stringField: string; numberField: string; booleanField: string } +) { + const literalValues = { + string: `"a"`, + number: '5', + }; + const wrongFieldMapping = currentParams.map(({ name: _name, literalOnly, type, ...rest }, i) => { + // this thing is complex enough, let's not make it harder for constants + if (literalOnly) { + return { name: literalValues[type as keyof typeof literalValues], type, ...rest }; + } + const canBeFieldButNotString = Boolean( + fieldTypes.filter((t) => t !== 'string').includes(type) && + signatures.every(({ params: fnParams }) => fnParams[i].type !== 'string') + ); + const canBeFieldButNotNumber = + fieldTypes.filter((t) => t !== 'number').includes(type) && + signatures.every(({ params: fnParams }) => fnParams[i].type !== 'number'); + const isLiteralType = /literal$/.test(type); + // pick a field name purposely wrong + const nameValue = + canBeFieldButNotString || isLiteralType + ? values.stringField + : canBeFieldButNotNumber + ? values.numberField + : values.booleanField; + return { name: nameValue, type, ...rest }; + }); + + const generatedFieldTypes = { + [values.stringField]: 'string', + [values.numberField]: 'number', + [values.booleanField]: 'boolean', + }; + + const expectedErrors = signatures[0].params + .filter(({ literalOnly }) => !literalOnly) + .map(({ type }, i) => { + const fieldName = wrongFieldMapping[i].name; + if ( + fieldName === 'numberField' && + signatures.every(({ params: fnParams }) => fnParams[i].type !== 'string') + ) { + return; + } + return `Argument of [${name}] must be [${type}], found value [${fieldName}] type [${generatedFieldTypes[fieldName]}]`; + }) + .filter(nonNullable); + return { wrongFieldMapping, expectedErrors }; +} + +describe('validation logic', () => { + const testCases: Array<{ query: string; error: string[]; warning: string[] }> = []; + + describe('Full validation performed', () => { + afterAll(async () => { + const targetFolder = join(__dirname, 'esql_validation_meta_tests.json'); + try { + await writeFile( + targetFolder, + JSON.stringify( + { + indexes, + fields: fields.concat([{ name: policies[0].matchField, type: 'keyword' }]), + enrichFields: enrichFields.concat([ + { name: policies[0].matchField, type: 'keyword' }, + ]), + policies, + unsupported_field, + testCases, + }, + null, + 2 + ) + ); + } catch (e) { + throw new Error(`Error writing test cases to ${targetFolder}: ${e.message}`); + } + }); + + function testErrorsAndWarningsFn( + statement: string, + expectedErrors: string[] = [], + expectedWarnings: string[] = [], + { only, skip }: { only?: boolean; skip?: boolean } = {} + ) { + const testFn = only ? it.only : skip ? it.skip : it; + testCases.push({ + query: statement, + error: expectedErrors, + warning: expectedWarnings, + }); + + testFn( + `${statement} => ${expectedErrors.length} errors, ${expectedWarnings.length} warnings`, + async () => { + const callbackMocks = getCallbackMocks(); + const { warnings, errors } = await validateQuery( + statement, + getAstAndSyntaxErrors, + undefined, + callbackMocks + ); + expect(errors.map((e) => ('message' in e ? e.message : e.text))).toEqual(expectedErrors); + expect(warnings.map((w) => w.text)).toEqual(expectedWarnings); + } + ); + } + + type TestArgs = [string, string[], string[]?]; + + // Make only and skip work with our custom wrapper + const testErrorsAndWarnings = Object.assign(testErrorsAndWarningsFn, { + skip: (...args: TestArgs) => { + const warningArgs = [[]].slice(args.length - 2); + return testErrorsAndWarningsFn( + ...((args.length > 1 ? [...args, ...warningArgs] : args) as TestArgs), + { + skip: true, + } + ); + }, + only: (...args: TestArgs) => { + const warningArgs = [[]].slice(args.length - 2); + return testErrorsAndWarningsFn( + ...((args.length > 1 ? [...args, ...warningArgs] : args) as TestArgs), + { + only: true, + } + ); + }, + }); + + describe('ESQL query should start with a source command', () => { + ['eval', 'stats', 'rename', 'limit', 'keep', 'drop', 'mv_expand', 'dissect', 'grok'].map( + (command) => + testErrorsAndWarnings(command, [ + `SyntaxError: mismatched input '${command}' expecting {'explain', 'from', 'meta', 'row', 'show'}`, + ]) + ); + }); + + describe('from', () => { + testErrorsAndWarnings('f', [ + `SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'meta', 'row', 'show'}`, + ]); + testErrorsAndWarnings(`from `, [ + "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''", + ]); + testErrorsAndWarnings(`from index,`, [ + "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''", + ]); + testErrorsAndWarnings(`from assignment = 1`, [ + "SyntaxError: mismatched input '=' expecting ", + 'Unknown index [assignment]', + ]); + testErrorsAndWarnings(`from index`, []); + testErrorsAndWarnings(`FROM index`, []); + testErrorsAndWarnings(`FrOm index`, []); + testErrorsAndWarnings('from `index`', []); + + testErrorsAndWarnings(`from index, other_index`, []); + testErrorsAndWarnings(`from index, missingIndex`, ['Unknown index [missingIndex]']); + testErrorsAndWarnings(`from fn()`, ['Unknown index [fn()]']); + testErrorsAndWarnings(`from average()`, ['Unknown index [average()]']); + for (const isWrapped of [true, false]) { + function setWrapping(option: string) { + return isWrapped ? `[${option}]` : option; + } + function addBracketsWarning() { + return isWrapped + ? ["Square brackets '[]' need to be removed from FROM METADATA declaration"] + : []; + } + testErrorsAndWarnings( + `from index ${setWrapping('METADATA _id')}`, + [], + addBracketsWarning() + ); + testErrorsAndWarnings( + `from index ${setWrapping('metadata _id')}`, + [], + addBracketsWarning() + ); + + testErrorsAndWarnings( + `from index ${setWrapping('METADATA _id, _source')}`, + [], + addBracketsWarning() + ); + testErrorsAndWarnings( + `from index ${setWrapping('METADATA _id, _source2')}`, + [ + 'Metadata field [_source2] is not available. Available metadata fields are: [_id, _source]', + ], + addBracketsWarning() + ); + testErrorsAndWarnings( + `from index ${setWrapping('metadata _id, _source')} ${setWrapping('METADATA _id2')}`, + [ + isWrapped + ? "SyntaxError: mismatched input '[' expecting " + : "SyntaxError: mismatched input 'METADATA' expecting ", + ], + addBracketsWarning() + ); + + testErrorsAndWarnings( + `from remote-ccs:indexes ${setWrapping('METADATA _id')}`, + [], + addBracketsWarning() + ); + testErrorsAndWarnings( + `from *:indexes ${setWrapping('METADATA _id')}`, + [], + addBracketsWarning() + ); + } + testErrorsAndWarnings(`from index (metadata _id)`, [ + "SyntaxError: mismatched input '(metadata' expecting ", + ]); + testErrorsAndWarnings(`from ind*, other*`, []); + testErrorsAndWarnings(`from index*`, []); + testErrorsAndWarnings(`from *a_i*dex*`, []); + testErrorsAndWarnings(`from in*ex*`, []); + testErrorsAndWarnings(`from *n*ex`, []); + testErrorsAndWarnings(`from *n*ex*`, []); + testErrorsAndWarnings(`from i*d*x*`, []); + testErrorsAndWarnings(`from i*d*x`, []); + testErrorsAndWarnings(`from i***x*`, []); + testErrorsAndWarnings(`from i****`, []); + testErrorsAndWarnings(`from i**`, []); + testErrorsAndWarnings(`from index**`, []); + testErrorsAndWarnings(`from *ex`, []); + testErrorsAndWarnings(`from *ex*`, []); + testErrorsAndWarnings(`from in*ex`, []); + testErrorsAndWarnings(`from ind*ex`, []); + testErrorsAndWarnings(`from indexes*`, ['Unknown index [indexes*]']); + + testErrorsAndWarnings(`from remote-*:indexes*`, []); + testErrorsAndWarnings(`from remote-*:indexes`, []); + testErrorsAndWarnings(`from remote-ccs:indexes`, []); + testErrorsAndWarnings(`from a_index, remote-ccs:indexes`, []); + testErrorsAndWarnings('from .secret_index', []); + testErrorsAndWarnings('from my-index', []); + testErrorsAndWarnings('from numberField', ['Unknown index [numberField]']); + testErrorsAndWarnings('from policy', ['Unknown index [policy]']); + }); + + describe('row', () => { + testErrorsAndWarnings('row', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('row missing_column', ['Unknown column [missing_column]']); + testErrorsAndWarnings('row fn()', ['Unknown function [fn]']); + testErrorsAndWarnings('row missing_column, missing_column2', [ + 'Unknown column [missing_column]', + 'Unknown column [missing_column2]', + ]); + testErrorsAndWarnings('row a=1', []); + testErrorsAndWarnings('row a=1, missing_column', ['Unknown column [missing_column]']); + testErrorsAndWarnings('row a=1, b = average()', ['Unknown function [average]']); + testErrorsAndWarnings('row a = [1, 2, 3]', []); + testErrorsAndWarnings('row a = [true, false]', []); + testErrorsAndWarnings('row a = ["a", "b"]', []); + testErrorsAndWarnings('row a = null', []); + testErrorsAndWarnings('row a = (1)', []); + testErrorsAndWarnings('row a = (1, 2, 3)', [ + "SyntaxError: no viable alternative at input '(1,'", + "SyntaxError: extraneous input ')' expecting ", + ]); + for (const bool of ['true', 'false']) { + testErrorsAndWarnings(`row a=NOT ${bool}`, []); + testErrorsAndWarnings(`row NOT ${bool}`, []); + } + + testErrorsAndWarnings('row var = 1 in ', [ + "SyntaxError: mismatched input '' expecting '('", + ]); + testErrorsAndWarnings('row var = 1 in (', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + 'Error: [in] function expects exactly 2 arguments, got 1.', + ]); + testErrorsAndWarnings('row var = 1 not in ', [ + "SyntaxError: mismatched input '' expecting '('", + ]); + testErrorsAndWarnings('row var = 1 in (1, 2, 3)', []); + testErrorsAndWarnings('row var = 5 in (1, 2, 3)', []); + testErrorsAndWarnings('row var = 5 not in (1, 2, 3)', []); + testErrorsAndWarnings('row var = 1 in (1, 2, 3, round(5))', []); + testErrorsAndWarnings('row var = "a" in ("a", "b", "c")', []); + testErrorsAndWarnings('row var = "a" in ("a", "b", "c")', []); + testErrorsAndWarnings('row var = "a" not in ("a", "b", "c")', []); + testErrorsAndWarnings('row var = 1 in ("a", "b", "c")', [ + 'Argument of [in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', + ]); + testErrorsAndWarnings('row var = 5 in ("a", "b", "c")', [ + 'Argument of [in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', + ]); + testErrorsAndWarnings('row var = 5 not in ("a", "b", "c")', [ + 'Argument of [not_in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', + ]); + testErrorsAndWarnings('row var = 5 not in (1, 2, 3, "a")', [ + 'Argument of [not_in] must be [number[]], found value [(1, 2, 3, "a")] type [(number, number, number, string)]', + ]); + + function tweakSignatureForRowCommand(signature: string) { + /** + * row has no access to any field, so replace it with literal + * or functions (for dates) + */ + return signature + .replace(/numberField/g, '5') + .replace(/stringField/g, '"a"') + .replace(/dateField/g, 'now()') + .replace(/booleanField/g, 'true') + .replace(/ipField/g, 'to_ip("127.0.0.1")'); + } + + for (const { name, alias, signatures, ...defRest } of evalFunctionsDefinitions) { + for (const { params, ...signRest } of signatures) { + const fieldMapping = getFieldMapping(params); + const signatureStringCorrect = tweakSignatureForRowCommand( + getFunctionSignatures( + { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, + { withTypes: false } + )[0].declaration + ); + + testErrorsAndWarnings(`row var = ${signatureStringCorrect}`, []); + testErrorsAndWarnings(`row ${signatureStringCorrect}`, []); + + if (alias) { + for (const otherName of alias) { + const signatureStringWithAlias = tweakSignatureForRowCommand( + getFunctionSignatures( + { + name: otherName, + ...defRest, + signatures: [{ params: fieldMapping, ...signRest }], + }, + { withTypes: false } + )[0].declaration + ); + + testErrorsAndWarnings(`row var = ${signatureStringWithAlias}`, []); + } + } + + // Skip functions that have only arguments of type "any", as it is not possible to pass "the wrong type". + // auto_bucket and 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') && + !['auto_bucket', 'to_version'].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 + ); + + testErrorsAndWarnings(`row var = ${signatureString}`, []); + + const { wrongFieldMapping, expectedErrors } = generateWrongMappingForArgs( + name, + signatures, + params, + { stringField: '"a"', numberField: '5', booleanField: 'true' } + ); + const wrongSignatureString = tweakSignatureForRowCommand( + getFunctionSignatures( + { name, ...defRest, signatures: [{ params: wrongFieldMapping, ...signRest }] }, + { withTypes: false } + )[0].declaration + ); + testErrorsAndWarnings(`row var = ${wrongSignatureString}`, expectedErrors); + } + } + } + for (const op of ['>', '>=', '<', '<=', '==']) { + testErrorsAndWarnings(`row var = 5 ${op} 0`, []); + testErrorsAndWarnings(`row var = NOT 5 ${op} 0`, []); + testErrorsAndWarnings(`row var = (numberField ${op} 0)`, ['Unknown column [numberField]']); + testErrorsAndWarnings(`row var = (NOT (5 ${op} 0))`, []); + testErrorsAndWarnings(`row var = "a" ${op} 0`, [ + `Argument of [${op}] must be [number], found value ["a"] type [string]`, + ]); + } + for (const op of ['+', '-', '*', '/', '%']) { + testErrorsAndWarnings(`row var = 1 ${op} 1`, []); + testErrorsAndWarnings(`row var = (5 ${op} 1)`, []); + } + + for (const op of ['like', 'rlike']) { + testErrorsAndWarnings(`row var = "a" ${op} "?a"`, []); + testErrorsAndWarnings(`row var = "a" NOT ${op} "?a"`, []); + testErrorsAndWarnings(`row var = NOT "a" ${op} "?a"`, []); + testErrorsAndWarnings(`row var = NOT "a" NOT ${op} "?a"`, []); + testErrorsAndWarnings(`row var = 5 ${op} "?a"`, [ + `Argument of [${op}] must be [string], found value [5] type [number]`, + ]); + testErrorsAndWarnings(`row var = 5 NOT ${op} "?a"`, [ + `Argument of [not_${op}] must be [string], found value [5] type [number]`, + ]); + testErrorsAndWarnings(`row var = NOT 5 ${op} "?a"`, [ + `Argument of [${op}] must be [string], found value [5] type [number]`, + ]); + testErrorsAndWarnings(`row var = NOT 5 NOT ${op} "?a"`, [ + `Argument of [not_${op}] must be [string], found value [5] type [number]`, + ]); + } + + describe('date math', () => { + testErrorsAndWarnings('row 1 anno', [ + 'ROW does not support [date_period] in expression [1 anno]', + ]); + testErrorsAndWarnings('row var = 1 anno', ["Unexpected time interval qualifier: 'anno'"]); + testErrorsAndWarnings('row now() + 1 anno', ["Unexpected time interval qualifier: 'anno'"]); + for (const timeLiteral of timeLiterals) { + testErrorsAndWarnings(`row 1 ${timeLiteral.name}`, [ + `ROW does not support [date_period] in expression [1 ${timeLiteral.name}]`, + ]); + testErrorsAndWarnings(`row 1 ${timeLiteral.name}`, [ + `ROW does not support [date_period] in expression [1 ${timeLiteral.name}]`, + ]); + + // this is not possible for now + // testErrorsAndWarnings(`row var = 1 ${timeLiteral.name}`, [ + // `Row does not support [date_period] in expression [1 ${timeLiteral.name}]`, + // ]); + testErrorsAndWarnings(`row var = now() - 1 ${timeLiteral.name}`, []); + testErrorsAndWarnings(`row var = now() - 1 ${timeLiteral.name.toUpperCase()}`, []); + testErrorsAndWarnings(`row var = now() - 1 ${capitalize(timeLiteral.name)}`, []); + testErrorsAndWarnings(`row var = now() + 1 ${timeLiteral.name}`, []); + testErrorsAndWarnings(`row 1 ${timeLiteral.name} + 1 year`, [ + `Argument of [+] must be [date], found value [1 ${timeLiteral.name}] type [duration]`, + ]); + for (const op of ['*', '/', '%']) { + testErrorsAndWarnings(`row var = now() ${op} 1 ${timeLiteral.name}`, [ + `Argument of [${op}] must be [number], found value [now()] type [date]`, + `Argument of [${op}] must be [number], found value [1 ${timeLiteral.name}] type [duration]`, + ]); + } + } + }); + }); + + describe('meta', () => { + testErrorsAndWarnings('meta', ["SyntaxError: missing 'functions' at ''"]); + testErrorsAndWarnings('meta functions', []); + testErrorsAndWarnings('meta functions()', [ + "SyntaxError: token recognition error at: '('", + "SyntaxError: token recognition error at: ')'", + ]); + testErrorsAndWarnings('meta functions blah', [ + "SyntaxError: token recognition error at: 'b'", + "SyntaxError: token recognition error at: 'l'", + "SyntaxError: token recognition error at: 'a'", + "SyntaxError: token recognition error at: 'h'", + ]); + testErrorsAndWarnings('meta info', [ + "SyntaxError: token recognition error at: 'i'", + "SyntaxError: token recognition error at: 'n'", + "SyntaxError: token recognition error at: 'fo'", + "SyntaxError: missing 'functions' at ''", + ]); + }); + + describe('show', () => { + testErrorsAndWarnings('show', ["SyntaxError: missing 'info' at ''"]); + testErrorsAndWarnings('show functions', [ + "SyntaxError: token recognition error at: 'f'", + "SyntaxError: token recognition error at: 'u'", + "SyntaxError: token recognition error at: 'n'", + "SyntaxError: token recognition error at: 'c'", + "SyntaxError: token recognition error at: 't'", + "SyntaxError: token recognition error at: 'io'", + "SyntaxError: token recognition error at: 'n'", + "SyntaxError: token recognition error at: 's'", + "SyntaxError: missing 'info' at ''", + ]); + testErrorsAndWarnings('show info', []); + testErrorsAndWarnings('show numberField', [ + "SyntaxError: token recognition error at: 'n'", + "SyntaxError: token recognition error at: 'u'", + "SyntaxError: token recognition error at: 'm'", + "SyntaxError: token recognition error at: 'b'", + "SyntaxError: token recognition error at: 'e'", + "SyntaxError: token recognition error at: 'r'", + "SyntaxError: token recognition error at: 'F'", + "SyntaxError: token recognition error at: 'ie'", + "SyntaxError: token recognition error at: 'l'", + "SyntaxError: token recognition error at: 'd'", + "SyntaxError: missing 'info' at ''", + ]); + }); + + describe('limit', () => { + testErrorsAndWarnings('from index | limit ', [ + `SyntaxError: missing INTEGER_LITERAL at ''`, + ]); + testErrorsAndWarnings('from index | limit 4 ', []); + testErrorsAndWarnings('from index | limit 4.5', [ + "SyntaxError: mismatched input '4.5' expecting INTEGER_LITERAL", + ]); + testErrorsAndWarnings('from index | limit a', [ + "SyntaxError: mismatched input 'a' expecting INTEGER_LITERAL", + ]); + testErrorsAndWarnings('from index | limit numberField', [ + "SyntaxError: mismatched input 'numberField' expecting INTEGER_LITERAL", + ]); + testErrorsAndWarnings('from index | limit stringField', [ + "SyntaxError: mismatched input 'stringField' expecting INTEGER_LITERAL", + ]); + testErrorsAndWarnings('from index | limit 4', []); + }); + + describe('keep', () => { + testErrorsAndWarnings('from index | keep ', ["SyntaxError: missing ID_PATTERN at ''"]); + testErrorsAndWarnings('from index | keep stringField, numberField, dateField', []); + testErrorsAndWarnings('from index | keep `stringField`, `numberField`, `dateField`', []); + testErrorsAndWarnings('from index | keep 4.5', [ + "SyntaxError: token recognition error at: '4'", + "SyntaxError: token recognition error at: '5'", + "SyntaxError: missing ID_PATTERN at '.'", + "SyntaxError: missing ID_PATTERN at ''", + ]); + testErrorsAndWarnings('from index | keep `4.5`', ['Unknown column [4.5]']); + testErrorsAndWarnings('from index | keep missingField, numberField, dateField', [ + 'Unknown column [missingField]', + ]); + testErrorsAndWarnings('from index | keep `any#Char$Field`', []); + testErrorsAndWarnings('from index | project ', [ + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + ]); + testErrorsAndWarnings('from index | project stringField, numberField, dateField', [ + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + ]); + testErrorsAndWarnings('from index | PROJECT stringField, numberField, dateField', [ + "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + ]); + testErrorsAndWarnings('from index | project missingField, numberField, dateField', [ + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + ]); + testErrorsAndWarnings('from index | keep s*', []); + testErrorsAndWarnings('from index | keep *Field', []); + testErrorsAndWarnings('from index | keep s*Field', []); + testErrorsAndWarnings('from index | keep string*Field', []); + testErrorsAndWarnings('from index | keep s*, n*', []); + testErrorsAndWarnings('from index | keep m*', ['Unknown column [m*]']); + testErrorsAndWarnings('from index | keep *m', ['Unknown column [*m]']); + testErrorsAndWarnings('from index | keep d*m', ['Unknown column [d*m]']); + testErrorsAndWarnings( + 'from unsupported_index | keep unsupported_field', + [], + [ + 'Field [unsupported_field] cannot be retrieved, it is unsupported or not indexed; returning null', + ] + ); + + testErrorsAndWarnings( + `FROM index | STATS ROUND(AVG(numberField * 1.5)), COUNT(*), MIN(numberField * 10) | KEEP \`MIN(numberField * 10)\``, + [] + ); + testErrorsAndWarnings( + `FROM index | STATS COUNT(*), MIN(numberField * 10), MAX(numberField)| KEEP \`COUNT(*)\``, + [] + ); + }); + + describe('drop', () => { + testErrorsAndWarnings('from index | drop ', ["SyntaxError: missing ID_PATTERN at ''"]); + testErrorsAndWarnings('from index | drop stringField, numberField, dateField', []); + testErrorsAndWarnings('from index | drop 4.5', [ + "SyntaxError: token recognition error at: '4'", + "SyntaxError: token recognition error at: '5'", + "SyntaxError: missing ID_PATTERN at '.'", + "SyntaxError: missing ID_PATTERN at ''", + ]); + testErrorsAndWarnings('from index | drop missingField, numberField, dateField', [ + 'Unknown column [missingField]', + ]); + testErrorsAndWarnings('from index | drop `any#Char$Field`', []); + testErrorsAndWarnings('from index | drop s*', []); + testErrorsAndWarnings('from index | drop s**Field', []); + testErrorsAndWarnings('from index | drop *Field*', []); + testErrorsAndWarnings('from index | drop s*F*d', []); + testErrorsAndWarnings('from index | drop *Field', []); + testErrorsAndWarnings('from index | drop s*Field', []); + testErrorsAndWarnings('from index | drop string*Field', []); + testErrorsAndWarnings('from index | drop s*, n*', []); + testErrorsAndWarnings('from index | drop m*', ['Unknown column [m*]']); + testErrorsAndWarnings('from index | drop *m', ['Unknown column [*m]']); + testErrorsAndWarnings('from index | drop d*m', ['Unknown column [d*m]']); + testErrorsAndWarnings('from index | drop *', ['Removing all fields is not allowed [*]']); + testErrorsAndWarnings('from index | drop stringField, *', [ + 'Removing all fields is not allowed [*]', + ]); + testErrorsAndWarnings( + 'from index | drop @timestamp', + [], + ['Drop [@timestamp] will remove all time filters to the search results'] + ); + testErrorsAndWarnings( + 'from index | drop stringField, @timestamp', + [], + ['Drop [@timestamp] will remove all time filters to the search results'] + ); + testErrorsAndWarnings( + `FROM index | STATS ROUND(AVG(numberField * 1.5)), COUNT(*), MIN(numberField * 10) | DROP \`MIN(numberField * 10)\``, + [] + ); + testErrorsAndWarnings( + `FROM index | STATS COUNT(*), MIN(numberField * 10), MAX(numberField)| DROP \`COUNT(*)\``, + [] + ); + }); + + describe('mv_expand', () => { + testErrorsAndWarnings('from a_index | mv_expand ', [ + "SyntaxError: missing {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER} at ''", + ]); + for (const type of ['string', 'number', 'date', 'boolean', 'ip']) { + testErrorsAndWarnings(`from a_index | mv_expand ${type}Field`, []); + } + + testErrorsAndWarnings('from a_index | mv_expand numberField, b', [ + "SyntaxError: token recognition error at: ','", + "SyntaxError: extraneous input 'b' expecting ", + ]); + + testErrorsAndWarnings('row a = "a" | mv_expand a', []); + testErrorsAndWarnings('row a = [1, 2, 3] | mv_expand a', []); + testErrorsAndWarnings('row a = [true, false] | mv_expand a', []); + testErrorsAndWarnings('row a = ["a", "b"] | mv_expand a', []); + }); + + describe('rename', () => { + testErrorsAndWarnings('from a_index | rename', [ + "SyntaxError: mismatched input '' expecting ID_PATTERN", + ]); + testErrorsAndWarnings('from a_index | rename stringField', [ + "SyntaxError: mismatched input '' expecting 'as'", + ]); + testErrorsAndWarnings('from a_index | rename a', [ + "SyntaxError: mismatched input '' expecting 'as'", + 'Unknown column [a]', + ]); + testErrorsAndWarnings('from a_index | rename stringField as', [ + "SyntaxError: missing ID_PATTERN at ''", + ]); + testErrorsAndWarnings('from a_index | rename missingField as', [ + "SyntaxError: missing ID_PATTERN at ''", + 'Unknown column [missingField]', + ]); + testErrorsAndWarnings('from a_index | rename stringField as b', []); + testErrorsAndWarnings('from a_index | rename stringField AS b', []); + testErrorsAndWarnings('from a_index | rename stringField As b', []); + testErrorsAndWarnings('from a_index | rename stringField As b, b AS c', []); + testErrorsAndWarnings('from a_index | rename fn() as a', [ + "SyntaxError: token recognition error at: '('", + "SyntaxError: token recognition error at: ')'", + 'Unknown column [fn]', + 'Unknown column [a]', + ]); + testErrorsAndWarnings( + 'from a_index | eval numberField + 1 | rename `numberField + 1` as a', + [] + ); + testErrorsAndWarnings( + 'from a_index | stats avg(numberField) | rename `avg(numberField)` as avg0', + [] + ); + testErrorsAndWarnings('from a_index |eval numberField + 1 | rename `numberField + 1` as ', [ + "SyntaxError: missing ID_PATTERN at ''", + ]); + testErrorsAndWarnings('from a_index | rename s* as strings', [ + 'Using wildcards (*) in RENAME is not allowed [s*]', + 'Unknown column [strings]', + ]); + testErrorsAndWarnings('row a = 10 | rename a as `this``is fine`', []); + testErrorsAndWarnings('row a = 10 | rename a as this is fine', [ + "SyntaxError: mismatched input 'is' expecting ", + ]); + }); + + describe('dissect', () => { + testErrorsAndWarnings('from a_index | dissect', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('from a_index | dissect stringField', [ + "SyntaxError: missing STRING at ''", + ]); + testErrorsAndWarnings('from a_index | dissect stringField 2', [ + "SyntaxError: mismatched input '2' expecting STRING", + ]); + testErrorsAndWarnings('from a_index | dissect stringField .', [ + "SyntaxError: mismatched input '' expecting {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + 'Unknown column [stringField.]', + ]); + testErrorsAndWarnings('from a_index | dissect stringField %a', [ + "SyntaxError: mismatched input '%' expecting STRING", + "SyntaxError: mismatched input '' expecting '='", + ]); + // Do not try to validate the dissect pattern string + testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}"', []); + testErrorsAndWarnings('from a_index | dissect numberField "%{firstWord}"', [ + 'DISSECT only supports string type values, found [numberField] of type [number]', + ]); + testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}" option ', [ + "SyntaxError: mismatched input '' expecting '='", + ]); + testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}" option = ', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', OPENING_BRACKET}", + 'Invalid option for DISSECT: [option]', + ]); + testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}" option = 1', [ + 'Invalid option for DISSECT: [option]', + ]); + testErrorsAndWarnings( + 'from a_index | dissect stringField "%{firstWord}" append_separator = "-"', + [] + ); + testErrorsAndWarnings( + 'from a_index | dissect stringField "%{firstWord}" ignore_missing = true', + ['Invalid option for DISSECT: [ignore_missing]'] + ); + testErrorsAndWarnings( + 'from a_index | dissect stringField "%{firstWord}" append_separator = true', + ['Invalid value for DISSECT append_separator: expected a string, but was [true]'] + ); + testErrorsAndWarnings( + 'from a_index | dissect stringField "%{firstWord}" | keep firstWord', + [] + ); + // testErrorsAndWarnings('from a_index | dissect s* "%{a}"', [ + // 'Using wildcards (*) in dissect is not allowed [s*]', + // ]); + }); + + describe('grok', () => { + testErrorsAndWarnings('from a_index | grok', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('from a_index | grok stringField', [ + "SyntaxError: missing STRING at ''", + ]); + testErrorsAndWarnings('from a_index | grok stringField 2', [ + "SyntaxError: mismatched input '2' expecting STRING", + ]); + testErrorsAndWarnings('from a_index | grok stringField .', [ + "SyntaxError: mismatched input '' expecting {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + 'Unknown column [stringField.]', + ]); + testErrorsAndWarnings('from a_index | grok stringField %a', [ + "SyntaxError: mismatched input '%' expecting STRING", + ]); + // Do not try to validate the grok pattern string + testErrorsAndWarnings('from a_index | grok stringField "%{firstWord}"', []); + testErrorsAndWarnings('from a_index | grok numberField "%{firstWord}"', [ + 'GROK only supports string type values, found [numberField] of type [number]', + ]); + testErrorsAndWarnings('from a_index | grok stringField "%{firstWord}" | keep firstWord', []); + // testErrorsAndWarnings('from a_index | grok s* "%{a}"', [ + // 'Using wildcards (*) in grok is not allowed [s*]', + // ]); + }); + + describe('where', () => { + testErrorsAndWarnings('from a_index | where b', ['Unknown column [b]']); + for (const cond of ['true', 'false']) { + testErrorsAndWarnings(`from a_index | where ${cond}`, []); + testErrorsAndWarnings(`from a_index | where NOT ${cond}`, []); + } + for (const nValue of ['1', '+1', '1 * 1', '-1', '1 / 1', '1.0', '1.5']) { + testErrorsAndWarnings(`from a_index | where ${nValue} > 0`, []); + testErrorsAndWarnings(`from a_index | where NOT ${nValue} > 0`, []); + } + for (const op of ['>', '>=', '<', '<=', '==']) { + testErrorsAndWarnings(`from a_index | where numberField ${op} 0`, []); + testErrorsAndWarnings(`from a_index | where NOT numberField ${op} 0`, []); + testErrorsAndWarnings(`from a_index | where (numberField ${op} 0)`, []); + testErrorsAndWarnings(`from a_index | where (NOT (numberField ${op} 0))`, []); + testErrorsAndWarnings(`from a_index | where 1 ${op} 0`, []); + testErrorsAndWarnings(`from a_index | eval stringField ${op} 0`, [ + `Argument of [${op}] must be [number], found value [stringField] type [string]`, + ]); + } + + for (const nesting of NESTED_DEPTHS) { + for (const evenOp of ['-', '+']) { + for (const oddOp of ['-', '+']) { + // This builds a combination of +/- operators + // i.e. ---- something, -+-+ something, +-+- something, etc... + const unaryCombination = Array(nesting) + .fill('- ') + .map((_, i) => (i % 2 ? oddOp : evenOp)) + .join(''); + testErrorsAndWarnings(`from a_index | where ${unaryCombination} numberField > 0`, []); + testErrorsAndWarnings( + `from a_index | where ${unaryCombination} round(numberField) > 0`, + [] + ); + testErrorsAndWarnings( + `from a_index | where 1 + ${unaryCombination} numberField > 0`, + [] + ); + // still valid + testErrorsAndWarnings(`from a_index | where 1 ${unaryCombination} numberField > 0`, []); + } + } + testErrorsAndWarnings( + `from a_index | where ${Array(nesting).fill('not ').join('')} booleanField`, + [] + ); + } + for (const wrongOp of ['*', '/', '%']) { + testErrorsAndWarnings(`from a_index | where ${wrongOp}+ numberField`, [ + `SyntaxError: extraneous input '${wrongOp}' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, + ]); + } + + // Skip these tests until the insensitive case equality gets restored back + testErrorsAndWarnings.skip(`from a_index | where numberField =~ 0`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings.skip(`from a_index | where NOT numberField =~ 0`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings.skip(`from a_index | where (numberField =~ 0)`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings.skip(`from a_index | where (NOT (numberField =~ 0))`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings.skip(`from a_index | where 1 =~ 0`, [ + 'Argument of [=~] must be [string], found value [1] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings.skip(`from a_index | eval stringField =~ 0`, [ + `Argument of [=~] must be [string], found value [0] type [number]`, + ]); + + for (const op of ['like', 'rlike']) { + testErrorsAndWarnings(`from a_index | where stringField ${op} "?a"`, []); + testErrorsAndWarnings(`from a_index | where stringField NOT ${op} "?a"`, []); + testErrorsAndWarnings(`from a_index | where NOT stringField ${op} "?a"`, []); + testErrorsAndWarnings(`from a_index | where NOT stringField NOT ${op} "?a"`, []); + testErrorsAndWarnings(`from a_index | where numberField ${op} "?a"`, [ + `Argument of [${op}] must be [string], found value [numberField] type [number]`, + ]); + testErrorsAndWarnings(`from a_index | where numberField NOT ${op} "?a"`, [ + `Argument of [not_${op}] must be [string], found value [numberField] type [number]`, + ]); + testErrorsAndWarnings(`from a_index | where NOT numberField ${op} "?a"`, [ + `Argument of [${op}] must be [string], found value [numberField] type [number]`, + ]); + testErrorsAndWarnings(`from a_index | where NOT numberField NOT ${op} "?a"`, [ + `Argument of [not_${op}] must be [string], found value [numberField] type [number]`, + ]); + } + + testErrorsAndWarnings(`from a_index | where cidr_match(ipField)`, [ + `Error: [cidr_match] function expects at least 2 arguments, got 1.`, + ]); + testErrorsAndWarnings( + `from a_index | eval cidr = "172.0.0.1/30" | where cidr_match(ipField, "172.0.0.1/30", cidr)`, + [] + ); + + for (const field of fieldTypes) { + testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS NULL`, []); + testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS null`, []); + testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field is null`, []); + testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field is NULL`, []); + testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS NOT NULL`, []); + testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS NOT null`, []); + testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS not NULL`, []); + testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field Is nOt NuLL`, []); + } + + for (const { + name, + alias, + signatures, + ...defRest + } of statsAggregationFunctionDefinitions.filter( + ({ name: fnName, signatures: statsSignatures }) => + statsSignatures.some(({ returnType, params }) => ['number'].includes(returnType)) + )) { + for (const { params, ...signRest } of signatures) { + const fieldMapping = getFieldMapping(params); + + testErrorsAndWarnings( + `from a_index | where ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMapping, ...signRest }], + }, + { withTypes: false } + )[0].declaration + }`, + [`WHERE does not support function ${name}`] + ); + + testErrorsAndWarnings( + `from a_index | where ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMapping, ...signRest }], + }, + { withTypes: false } + )[0].declaration + } > 0`, + [`WHERE does not support function ${name}`] + ); + } + } + + // Test that all functions work in where + const numericOrStringFunctions = evalFunctionsDefinitions.filter(({ name, signatures }) => { + return signatures.some( + ({ returnType, params }) => + ['number', 'string'].includes(returnType) && + params.every(({ type }) => ['number', 'string'].includes(type)) + ); + }); + for (const { name, signatures, ...rest } of numericOrStringFunctions) { + const supportedSignatures = signatures.filter(({ returnType }) => + ['number', 'string'].includes(returnType) + ); + for (const { params, returnType, ...restSign } of supportedSignatures) { + const correctMapping = params + .filter(({ optional }) => !optional) + .map(({ type }) => + ['number', 'string'].includes(Array.isArray(type) ? type.join(', ') : type) + ? { name: `${type}Field`, type } + : { name: `numberField`, type } + ); + testErrorsAndWarnings( + `from a_index | where ${returnType !== 'number' ? 'length(' : ''}${ + // hijacking a bit this function to produce a function call + getFunctionSignatures( + { + name, + ...rest, + signatures: [{ params: correctMapping, returnType, ...restSign }], + }, + { withTypes: false } + )[0].declaration + }${returnType !== 'number' ? ')' : ''} > 0`, + [] + ); + + const { wrongFieldMapping, expectedErrors } = generateWrongMappingForArgs( + name, + signatures, + params, + { stringField: 'stringField', numberField: 'numberField', booleanField: 'booleanField' } + ); + testErrorsAndWarnings( + `from a_index | where ${returnType !== 'number' ? 'length(' : ''}${ + // hijacking a bit this function to produce a function call + getFunctionSignatures( + { + name, + ...rest, + signatures: [{ params: wrongFieldMapping, returnType, ...restSign }], + }, + { withTypes: false } + )[0].declaration + }${returnType !== 'number' ? ')' : ''} > 0`, + expectedErrors + ); + } + } + }); + + describe('eval', () => { + testErrorsAndWarnings('from a_index | eval ', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('from a_index | eval stringField ', []); + testErrorsAndWarnings('from a_index | eval b = stringField', []); + testErrorsAndWarnings('from a_index | eval numberField + 1', []); + testErrorsAndWarnings('from a_index | eval numberField + ', [ + "SyntaxError: no viable alternative at input 'numberField + '", + ]); + testErrorsAndWarnings('from a_index | eval stringField + 1', [ + 'Argument of [+] must be [number], found value [stringField] type [string]', + ]); + testErrorsAndWarnings('from a_index | eval a=b', ['Unknown column [b]']); + testErrorsAndWarnings('from a_index | eval a=b, ', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + 'Unknown column [b]', + ]); + testErrorsAndWarnings('from a_index | eval a=round', ['Unknown column [round]']); + testErrorsAndWarnings('from a_index | eval a=round(', [ + "SyntaxError: no viable alternative at input 'round('", + ]); + testErrorsAndWarnings('from a_index | eval a=round(numberField) ', []); + testErrorsAndWarnings('from a_index | eval a=round(numberField), ', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('from a_index | eval a=round(numberField) + round(numberField) ', []); + testErrorsAndWarnings('from a_index | eval a=round(numberField) + round(stringField) ', [ + 'Argument of [round] must be [number], found value [stringField] type [string]', + ]); + testErrorsAndWarnings( + 'from a_index | eval a=round(numberField) + round(stringField), numberField ', + ['Argument of [round] must be [number], found value [stringField] type [string]'] + ); + testErrorsAndWarnings( + 'from a_index | eval a=round(numberField) + round(numberField), numberField ', + [] + ); + testErrorsAndWarnings( + 'from a_index | eval a=round(numberField) + round(numberField), b = numberField ', + [] + ); + + testErrorsAndWarnings('from a_index | eval a=[1, 2, 3]', []); + testErrorsAndWarnings('from a_index | eval a=[true, false]', []); + testErrorsAndWarnings('from a_index | eval a=["a", "b"]', []); + testErrorsAndWarnings('from a_index | eval a=null', []); + + for (const field of fieldTypes) { + testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS NULL`, []); + testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS null`, []); + testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field is null`, []); + testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field is NULL`, []); + testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS NOT NULL`, []); + testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS NOT null`, []); + testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS not NULL`, []); + } + + for (const nesting of NESTED_DEPTHS) { + for (const evenOp of ['-', '+']) { + for (const oddOp of ['-', '+']) { + // This builds a combination of +/- operators + // i.e. ---- something, -+-+ something, +-+- something, etc... + const unaryCombination = Array(nesting) + .fill('- ') + .map((_, i) => (i % 2 ? oddOp : evenOp)) + .join(''); + testErrorsAndWarnings(`from a_index | eval ${unaryCombination} numberField`, []); + testErrorsAndWarnings(`from a_index | eval a=${unaryCombination} numberField`, []); + testErrorsAndWarnings( + `from a_index | eval a=${unaryCombination} round(numberField)`, + [] + ); + testErrorsAndWarnings(`from a_index | eval 1 + ${unaryCombination} numberField`, []); + // still valid + testErrorsAndWarnings(`from a_index | eval 1 ${unaryCombination} numberField`, []); + } + } + + testErrorsAndWarnings( + `from a_index | eval ${Array(nesting).fill('not ').join('')} booleanField`, + [] + ); + } + + for (const wrongOp of ['*', '/', '%']) { + testErrorsAndWarnings(`from a_index | eval ${wrongOp}+ numberField`, [ + `SyntaxError: extraneous input '${wrongOp}' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, + ]); + } + + for (const { name, alias, signatures, ...defRest } of statsAggregationFunctionDefinitions) { + for (const { params, ...signRest } of signatures) { + const fieldMapping = getFieldMapping(params); + testErrorsAndWarnings( + `from a_index | eval var = ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMapping, ...signRest }], + }, + { withTypes: false } + )[0].declaration + }`, + [`EVAL does not support function ${name}`] + ); + + testErrorsAndWarnings( + `from a_index | eval var = ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMapping, ...signRest }], + }, + { withTypes: false } + )[0].declaration + } > 0`, + [`EVAL does not support function ${name}`] + ); + + testErrorsAndWarnings( + `from a_index | eval ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMapping, ...signRest }], + }, + { withTypes: false } + )[0].declaration + }`, + [`EVAL does not support function ${name}`] + ); + + testErrorsAndWarnings( + `from a_index | eval ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMapping, ...signRest }], + }, + { withTypes: false } + )[0].declaration + } > 0`, + [`EVAL does not support function ${name}`] + ); + } + } + + for (const { name, alias, signatures, ...defRest } of evalFunctionsDefinitions) { + for (const { params, ...signRest } of signatures) { + const fieldMapping = getFieldMapping(params); + testErrorsAndWarnings( + `from a_index | eval var = ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMapping, ...signRest }], + }, + { withTypes: false } + )[0].declaration + }`, + [] + ); + testErrorsAndWarnings( + `from a_index | eval ${ + getFunctionSignatures( + { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, + { withTypes: false } + )[0].declaration + }`, + [] + ); + if (params.some(({ literalOnly }) => literalOnly)) { + const fieldReplacedType = params + .filter(({ literalOnly }) => literalOnly) + .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(({ literalOnly, ...rest }) => rest) + ); + testErrorsAndWarnings( + `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; + + testErrorsAndWarnings(`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". + // auto_bucket and 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') && + !['auto_bucket', 'to_version'].includes(name) + ) { + // now test nested functions + const fieldMappingWithNestedFunctions = getFieldMapping(params, { + useNestedFunction: true, + useLiterals: true, + }); + testErrorsAndWarnings( + `from a_index | eval var = ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMappingWithNestedFunctions, ...signRest }], + }, + { withTypes: false } + )[0].declaration + }` + ); + + const { wrongFieldMapping, expectedErrors } = generateWrongMappingForArgs( + name, + signatures, + params, + { + stringField: 'stringField', + numberField: 'numberField', + booleanField: 'booleanField', + } + ); + testErrorsAndWarnings( + `from a_index | eval ${ + getFunctionSignatures( + { name, ...defRest, signatures: [{ params: wrongFieldMapping, ...signRest }] }, + { withTypes: false } + )[0].declaration + }`, + expectedErrors + ); + + if (!signRest.minParams) { + // test that additional args are spotted + const fieldMappingWithOneExtraArg = getFieldMapping(params).concat({ + name: 'extraArg', + type: 'number', + }); + const refSignature = signatures[0]; + // get the expected args from the first signature in case of errors + const minNumberOfArgs = refSignature.params.filter( + ({ optional }) => !optional + ).length; + const fullNumberOfArgs = refSignature.params.length; + const hasOptionalArgs = minNumberOfArgs < fullNumberOfArgs; + const hasTooManyArgs = fieldMappingWithOneExtraArg.length > fullNumberOfArgs; + + // 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 '; + } + testErrorsAndWarnings( + `from a_index | eval ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMappingWithOneExtraArg, ...signRest }], + }, + { withTypes: false } + )[0].declaration + }`, + [ + `Error: [${name}] function expects ${messageQuantifier}${ + fullNumberOfArgs === 1 + ? 'one argument' + : fullNumberOfArgs === 0 + ? '0 arguments' + : `${fullNumberOfArgs} arguments` + }, got ${fieldMappingWithOneExtraArg.length}.`, + ] + ); + } + } + + // test that wildcard won't work as arg + if (fieldMapping.length === 1 && !signRest.minParams) { + const fieldMappingWithWildcard = [...fieldMapping]; + fieldMappingWithWildcard[0].name = '*'; + + testErrorsAndWarnings( + `from a_index | eval var = ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMappingWithWildcard, ...signRest }], + }, + { withTypes: false } + )[0].declaration + }`, + [`Using wildcards (*) in ${name} is not allowed`] + ); + } + } + } + testErrorsAndWarnings( + 'from a_index | eval log10(-1)', + [], + ['Log of a negative number results in null: -1'] + ); + testErrorsAndWarnings( + 'from a_index | eval log(-1)', + [], + ['Log of a negative number results in null: -1'] + ); + testErrorsAndWarnings( + 'from a_index | eval log(-1, 20)', + [], + ['Log of a negative number results in null: -1'] + ); + testErrorsAndWarnings( + 'from a_index | eval log(-1, -20)', + [], + [ + 'Log of a negative number results in null: -1', + 'Log of a negative number results in null: -20', + ] + ); + testErrorsAndWarnings( + 'from a_index | eval var0 = log(-1, -20)', + [], + [ + 'Log of a negative number results in null: -1', + 'Log of a negative number results in null: -20', + ] + ); + for (const op of ['>', '>=', '<', '<=', '==']) { + testErrorsAndWarnings(`from a_index | eval numberField ${op} 0`, []); + testErrorsAndWarnings(`from a_index | eval NOT numberField ${op} 0`, []); + testErrorsAndWarnings(`from a_index | eval (numberField ${op} 0)`, []); + testErrorsAndWarnings(`from a_index | eval (NOT (numberField ${op} 0))`, []); + testErrorsAndWarnings(`from a_index | eval 1 ${op} 0`, []); + testErrorsAndWarnings(`from a_index | eval stringField ${op} 0`, [ + `Argument of [${op}] must be [number], found value [stringField] type [string]`, + ]); + } + for (const op of ['+', '-', '*', '/', '%']) { + testErrorsAndWarnings(`from a_index | eval numberField ${op} 1`, []); + testErrorsAndWarnings(`from a_index | eval (numberField ${op} 1)`, []); + testErrorsAndWarnings(`from a_index | eval 1 ${op} 1`, []); + } + for (const divideByZeroExpr of ['1/0', 'var = 1/0', '1 + 1/0']) { + testErrorsAndWarnings( + `from a_index | eval ${divideByZeroExpr}`, + [], + ['Cannot divide by zero: 1/0'] + ); + } + for (const divideByZeroExpr of ['1%0', 'var = 1%0', '1 + 1%0']) { + testErrorsAndWarnings( + `from a_index | eval ${divideByZeroExpr}`, + [], + ['Module by zero can return null value: 1%0'] + ); + } + for (const op of ['like', 'rlike']) { + testErrorsAndWarnings(`from a_index | eval stringField ${op} "?a"`, []); + testErrorsAndWarnings(`from a_index | eval stringField NOT ${op} "?a"`, []); + testErrorsAndWarnings(`from a_index | eval NOT stringField ${op} "?a"`, []); + testErrorsAndWarnings(`from a_index | eval NOT stringField NOT ${op} "?a"`, []); + testErrorsAndWarnings(`from a_index | eval numberField ${op} "?a"`, [ + `Argument of [${op}] must be [string], found value [numberField] type [number]`, + ]); + testErrorsAndWarnings(`from a_index | eval numberField NOT ${op} "?a"`, [ + `Argument of [not_${op}] must be [string], found value [numberField] type [number]`, + ]); + testErrorsAndWarnings(`from a_index | eval NOT numberField ${op} "?a"`, [ + `Argument of [${op}] must be [string], found value [numberField] type [number]`, + ]); + testErrorsAndWarnings(`from a_index | eval NOT numberField NOT ${op} "?a"`, [ + `Argument of [not_${op}] must be [string], found value [numberField] type [number]`, + ]); + } + // test lists + testErrorsAndWarnings('from a_index | eval 1 in (1, 2, 3)', []); + testErrorsAndWarnings('from a_index | eval numberField in (1, 2, 3)', []); + testErrorsAndWarnings('from a_index | eval numberField not in (1, 2, 3)', []); + testErrorsAndWarnings('from a_index | eval numberField not in (1, 2, 3, numberField)', []); + testErrorsAndWarnings('from a_index | eval 1 in (1, 2, 3, round(numberField))', []); + testErrorsAndWarnings('from a_index | eval "a" in ("a", "b", "c")', []); + testErrorsAndWarnings('from a_index | eval stringField in ("a", "b", "c")', []); + testErrorsAndWarnings('from a_index | eval stringField not in ("a", "b", "c")', []); + testErrorsAndWarnings( + 'from a_index | eval stringField not in ("a", "b", "c", stringField)', + [] + ); + testErrorsAndWarnings('from a_index | eval 1 in ("a", "b", "c")', [ + 'Argument of [in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', + ]); + testErrorsAndWarnings('from a_index | eval numberField in ("a", "b", "c")', [ + 'Argument of [in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', + ]); + testErrorsAndWarnings('from a_index | eval numberField not in ("a", "b", "c")', [ + 'Argument of [not_in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', + ]); + testErrorsAndWarnings('from a_index | eval numberField not in (1, 2, 3, stringField)', [ + 'Argument of [not_in] must be [number[]], found value [(1, 2, 3, stringField)] type [(number, number, number, string)]', + ]); + + testErrorsAndWarnings('from a_index | eval avg(numberField)', [ + 'EVAL does not support function avg', + ]); + testErrorsAndWarnings( + 'from a_index | stats avg(numberField) | eval `avg(numberField)` + 1', + [] + ); + testErrorsAndWarnings('from a_index | eval not', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + 'Error: [not] function expects exactly one argument, got 0.', + ]); + testErrorsAndWarnings('from a_index | eval in', [ + "SyntaxError: mismatched input 'in' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + + testErrorsAndWarnings('from a_index | eval stringField in stringField', [ + "SyntaxError: missing '(' at 'stringField'", + "SyntaxError: mismatched input '' expecting {',', ')'}", + ]); + + testErrorsAndWarnings('from a_index | eval stringField in stringField)', [ + "SyntaxError: missing '(' at 'stringField'", + 'Error: [in] function expects exactly 2 arguments, got 1.', + ]); + testErrorsAndWarnings('from a_index | eval stringField not in stringField', [ + "SyntaxError: missing '(' at 'stringField'", + "SyntaxError: mismatched input '' expecting {',', ')'}", + ]); + + describe('date math', () => { + testErrorsAndWarnings('from a_index | eval 1 anno', [ + 'EVAL does not support [date_period] in expression [1 anno]', + ]); + testErrorsAndWarnings('from a_index | eval var = 1 anno', [ + "Unexpected time interval qualifier: 'anno'", + ]); + testErrorsAndWarnings('from a_index | eval now() + 1 anno', [ + "Unexpected time interval qualifier: 'anno'", + ]); + for (const timeLiteral of timeLiterals) { + testErrorsAndWarnings(`from a_index | eval 1 ${timeLiteral.name}`, [ + `EVAL does not support [date_period] in expression [1 ${timeLiteral.name}]`, + ]); + testErrorsAndWarnings(`from a_index | eval 1 ${timeLiteral.name}`, [ + `EVAL does not support [date_period] in expression [1 ${timeLiteral.name}]`, + ]); + + // this is not possible for now + // testErrorsAndWarnings(`from a_index | eval var = 1 ${timeLiteral.name}`, [ + // `Eval does not support [date_period] in expression [1 ${timeLiteral.name}]`, + // ]); + testErrorsAndWarnings(`from a_index | eval var = now() - 1 ${timeLiteral.name}`, []); + testErrorsAndWarnings(`from a_index | eval var = dateField - 1 ${timeLiteral.name}`, []); + testErrorsAndWarnings( + `from a_index | eval var = dateField - 1 ${timeLiteral.name.toUpperCase()}`, + [] + ); + testErrorsAndWarnings( + `from a_index | eval var = dateField - 1 ${capitalize(timeLiteral.name)}`, + [] + ); + testErrorsAndWarnings(`from a_index | eval var = dateField + 1 ${timeLiteral.name}`, []); + testErrorsAndWarnings(`from a_index | eval 1 ${timeLiteral.name} + 1 year`, [ + `Argument of [+] must be [date], found value [1 ${timeLiteral.name}] type [duration]`, + ]); + for (const op of ['*', '/', '%']) { + testErrorsAndWarnings(`from a_index | eval var = now() ${op} 1 ${timeLiteral.name}`, [ + `Argument of [${op}] must be [number], found value [now()] type [date]`, + `Argument of [${op}] must be [number], found value [1 ${timeLiteral.name}] type [duration]`, + ]); + } + } + }); + }); + + describe('stats', () => { + testErrorsAndWarnings('from a_index | stats ', [ + 'At least one aggregation or grouping expression required in [STATS]', + ]); + testErrorsAndWarnings('from a_index | stats by stringField', []); + testErrorsAndWarnings('from a_index | stats by ', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('from a_index | stats numberField ', [ + 'Expected an aggregate function or group but got [numberField] of type [FieldAttribute]', + ]); + testErrorsAndWarnings('from a_index | stats numberField=', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('from a_index | stats numberField=5 by ', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('from a_index | stats avg(numberField) by wrongField', [ + 'Unknown column [wrongField]', + ]); + testErrorsAndWarnings('from a_index | stats avg(numberField) by wrongField + 1', [ + 'Unknown column [wrongField]', + ]); + testErrorsAndWarnings('from a_index | stats avg(numberField) by var0 = wrongField + 1', [ + 'Unknown column [wrongField]', + ]); + testErrorsAndWarnings('from a_index | stats avg(numberField) by 1', []); + testErrorsAndWarnings('from a_index | stats avg(numberField) by percentile(numberField)', [ + 'STATS BY does not support function percentile', + ]); + testErrorsAndWarnings('from a_index | stats count(`numberField`)', []); + + for (const subCommand of ['keep', 'drop', 'eval']) { + testErrorsAndWarnings( + `from a_index | stats count(\`numberField\`) | ${subCommand} \`count(\`\`numberField\`\`)\` `, + [] + ); + } + + testErrorsAndWarnings( + 'from a_index | stats avg(numberField) by stringField, percentile(numberField) by ipField', + [ + "SyntaxError: mismatched input 'by' expecting ", + 'STATS BY does not support function percentile', + ] + ); + + testErrorsAndWarnings( + 'from a_index | stats avg(numberField), percentile(numberField, 50) by ipField', + [] + ); + + testErrorsAndWarnings( + 'from a_index | stats avg(numberField), percentile(numberField, 50) BY ipField', + [] + ); + for (const op of ['+', '-', '*', '/', '%']) { + testErrorsAndWarnings( + `from a_index | stats avg(numberField) ${op} percentile(numberField, 50) BY ipField`, + [] + ); + } + testErrorsAndWarnings('from a_index | stats count(* + 1) BY ipField', [ + "SyntaxError: no viable alternative at input 'count(* +'", + ]); + testErrorsAndWarnings('from a_index | stats count(* + round(numberField)) BY ipField', [ + "SyntaxError: no viable alternative at input 'count(* +'", + ]); + testErrorsAndWarnings('from a_index | stats count(round(*)) BY ipField', [ + 'Using wildcards (*) in round is not allowed', + ]); + testErrorsAndWarnings('from a_index | stats count(count(*)) BY ipField', [ + `Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [count(*)] of type [number]`, + ]); + testErrorsAndWarnings('from a_index | stats numberField + 1', [ + 'At least one aggregation function required in [STATS], found [numberField+1]', + ]); + + for (const nesting of NESTED_DEPTHS) { + const moreBuiltinWrapping = Array(nesting).fill('+1').join(''); + testErrorsAndWarnings( + `from a_index | stats 5 + avg(numberField) ${moreBuiltinWrapping}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats 5 ${moreBuiltinWrapping} + avg(numberField)`, + [] + ); + testErrorsAndWarnings(`from a_index | stats 5 ${moreBuiltinWrapping} + numberField`, [ + `At least one aggregation function required in [STATS], found [5${moreBuiltinWrapping}+numberField]`, + ]); + testErrorsAndWarnings(`from a_index | stats 5 + numberField ${moreBuiltinWrapping}`, [ + `At least one aggregation function required in [STATS], found [5+numberField${moreBuiltinWrapping}]`, + ]); + testErrorsAndWarnings( + `from a_index | stats 5 + numberField ${moreBuiltinWrapping}, var0 = sum(numberField)`, + [ + `At least one aggregation function required in [STATS], found [5+numberField${moreBuiltinWrapping}]`, + ] + ); + const evalFnWrapping = Array(nesting).fill('round(').join(''); + const closingWrapping = Array(nesting).fill(')').join(''); + // stress test the validation of the nesting check here + testErrorsAndWarnings( + `from a_index | stats ${evalFnWrapping} sum(numberField) ${closingWrapping}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats ${evalFnWrapping} sum(numberField) ${closingWrapping} + ${evalFnWrapping} sum(numberField) ${closingWrapping}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats ${evalFnWrapping} numberField + sum(numberField) ${closingWrapping}`, + [ + `Cannot combine aggregation and non-aggregation values in [STATS], found [${evalFnWrapping}numberField+sum(numberField)${closingWrapping}]`, + ] + ); + testErrorsAndWarnings( + `from a_index | stats ${evalFnWrapping} numberField + sum(numberField) ${closingWrapping}, var0 = sum(numberField)`, + [ + `Cannot combine aggregation and non-aggregation values in [STATS], found [${evalFnWrapping}numberField+sum(numberField)${closingWrapping}]`, + ] + ); + testErrorsAndWarnings( + `from a_index | stats var0 = ${evalFnWrapping} numberField + sum(numberField) ${closingWrapping}, var1 = sum(numberField)`, + [ + `Cannot combine aggregation and non-aggregation values in [STATS], found [${evalFnWrapping}numberField+sum(numberField)${closingWrapping}]`, + ] + ); + testErrorsAndWarnings( + `from a_index | stats ${evalFnWrapping} sum(numberField + numberField) ${closingWrapping}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats ${evalFnWrapping} sum(numberField + round(numberField)) ${closingWrapping}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats ${evalFnWrapping} sum(numberField + round(numberField)) ${closingWrapping} + ${evalFnWrapping} sum(numberField + round(numberField)) ${closingWrapping}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats sum(${evalFnWrapping} numberField ${closingWrapping} )`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats sum(${evalFnWrapping} numberField ${closingWrapping} ) + sum(${evalFnWrapping} numberField ${closingWrapping} )`, + [] + ); + } + + testErrorsAndWarnings('from a_index | stats 5 + numberField + 1', [ + 'At least one aggregation function required in [STATS], found [5+numberField+1]', + ]); + + testErrorsAndWarnings('from a_index | stats numberField + 1 by ipField', [ + 'At least one aggregation function required in [STATS], found [numberField+1]', + ]); + + testErrorsAndWarnings( + 'from a_index | stats avg(numberField), percentile(numberField, 50) + 1 by ipField', + [] + ); + + testErrorsAndWarnings('from a_index | stats count(*)', []); + testErrorsAndWarnings('from a_index | stats count()', []); + testErrorsAndWarnings('from a_index | stats var0 = count(*)', []); + testErrorsAndWarnings('from a_index | stats var0 = count()', []); + testErrorsAndWarnings('from a_index | stats var0 = avg(numberField), count(*)', []); + testErrorsAndWarnings('from a_index | stats var0 = avg(fn(number)), count(*)', [ + 'Unknown function [fn]', + ]); + + // test all not allowed combinations + testErrorsAndWarnings('from a_index | STATS sum( numberField ) + abs( numberField ) ', [ + 'Cannot combine aggregation and non-aggregation values in [STATS], found [sum(numberField)+abs(numberField)]', + ]); + testErrorsAndWarnings('from a_index | STATS abs( numberField + sum( numberField )) ', [ + 'Cannot combine aggregation and non-aggregation values in [STATS], found [abs(numberField+sum(numberField))]', + ]); + + for (const { name, alias, signatures, ...defRest } of statsAggregationFunctionDefinitions) { + for (const { params, ...signRest } of signatures) { + const fieldMapping = getFieldMapping(params); + + const correctSignature = getFunctionSignatures( + { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, + { withTypes: false } + )[0].declaration; + testErrorsAndWarnings(`from a_index | stats var = ${correctSignature}`, []); + testErrorsAndWarnings(`from a_index | stats ${correctSignature}`, []); + + if (signRest.returnType === 'number') { + testErrorsAndWarnings(`from a_index | stats var = round(${correctSignature})`, []); + testErrorsAndWarnings(`from a_index | stats round(${correctSignature})`, []); + testErrorsAndWarnings( + `from a_index | stats var = round(${correctSignature}) + ${correctSignature}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats round(${correctSignature}) + ${correctSignature}`, + [] + ); + } + + if (params.some(({ literalOnly }) => literalOnly)) { + const fieldReplacedType = params + .filter(({ literalOnly }) => literalOnly) + .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(({ literalOnly, ...rest }) => rest) + ); + testErrorsAndWarnings( + `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; + + testErrorsAndWarnings(`from a_index | stats var = ${signatureStringWithAlias}`, []); + } + } + + // test only numeric functions for now + if (params[0].type === 'number') { + const nestedBuiltin = 'numberField / 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( numberField / 2 ) + testErrorsAndWarnings(`from a_index | stats ${fnSignatureWithBuiltinString}`, []); + testErrorsAndWarnings( + `from a_index | stats var0 = ${fnSignatureWithBuiltinString}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats avg(numberField), ${fnSignatureWithBuiltinString}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats avg(numberField), var0 = ${fnSignatureWithBuiltinString}`, + [] + ); + + const nestedEvalAndBuiltin = 'round(numberField / 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(numberField / 2) ) + testErrorsAndWarnings( + `from a_index | stats ${fnSignatureWithEvalAndBuiltinString}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats var0 = ${fnSignatureWithEvalAndBuiltinString}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats avg(numberField), ${fnSignatureWithEvalAndBuiltinString}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats avg(numberField), var0 = ${fnSignatureWithEvalAndBuiltinString}`, + [] + ); + // from a_index | STATS aggFn(round(numberField / 2) ) BY round(numberField / 2) + testErrorsAndWarnings( + `from a_index | stats ${fnSignatureWithEvalAndBuiltinString} by ${nestedEvalAndBuiltin}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats var0 = ${fnSignatureWithEvalAndBuiltinString} by var1 = ${nestedEvalAndBuiltin}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats avg(numberField), ${fnSignatureWithEvalAndBuiltinString} by ${nestedEvalAndBuiltin}, ipField`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats avg(numberField), var0 = ${fnSignatureWithEvalAndBuiltinString} by var1 = ${nestedEvalAndBuiltin}, ipField`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats avg(numberField), ${fnSignatureWithEvalAndBuiltinString} by ${nestedEvalAndBuiltin}, ${nestedBuiltin}`, + [] + ); + testErrorsAndWarnings( + `from a_index | stats avg(numberField), 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". + // auto_bucket and 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') && + !['auto_bucket', 'to_version'].includes(name) + ) { + // now test nested functions + const fieldMappingWithNestedAggsFunctions = getFieldMapping(params, { + useNestedFunction: true, + useLiterals: false, + }); + const nestedAggsExpectedErrors = params + .filter(({ literalOnly }) => !literalOnly) + .map( + (_) => + `Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]` + ); + testErrorsAndWarnings( + `from a_index | stats var = ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMappingWithNestedAggsFunctions, ...signRest }], + }, + { withTypes: false } + )[0].declaration + }`, + nestedAggsExpectedErrors + ); + testErrorsAndWarnings( + `from a_index | stats ${ + getFunctionSignatures( + { + name, + ...defRest, + signatures: [{ params: fieldMappingWithNestedAggsFunctions, ...signRest }], + }, + { withTypes: false } + )[0].declaration + }`, + nestedAggsExpectedErrors + ); + const { wrongFieldMapping, expectedErrors } = generateWrongMappingForArgs( + name, + signatures, + params, + { + stringField: 'stringField', + numberField: 'numberField', + booleanField: 'booleanField', + } + ); + // and the message is case of wrong argument type is passed + testErrorsAndWarnings( + `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 = '*'; + + testErrorsAndWarnings( + `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`] + ); + } + } + } + } + testErrorsAndWarnings( + `FROM index + | EVAL numberField * 3.281 + | STATS avg_numberField = AVG(\`numberField * 3.281\`)`, + [] + ); + + testErrorsAndWarnings( + `FROM index | STATS AVG(numberField) by round(numberField) + 1 | EVAL \`round(numberField) + 1\` / 2`, + [] + ); + }); + + describe('sort', () => { + testErrorsAndWarnings('from a_index | sort ', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('from a_index | sort "field" ', []); + testErrorsAndWarnings('from a_index | sort wrongField ', ['Unknown column [wrongField]']); + testErrorsAndWarnings('from a_index | sort numberField, ', [ + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + ]); + testErrorsAndWarnings('from a_index | sort numberField, stringField', []); + for (const dir of ['desc', 'asc']) { + testErrorsAndWarnings(`from a_index | sort "field" ${dir} `, []); + testErrorsAndWarnings(`from a_index | sort numberField ${dir} `, []); + testErrorsAndWarnings(`from a_index | sort numberField ${dir} nulls `, [ + "SyntaxError: missing {'first', 'last'} at ''", + ]); + for (const nullDir of ['first', 'last']) { + testErrorsAndWarnings(`from a_index | sort numberField ${dir} nulls ${nullDir}`, []); + testErrorsAndWarnings(`from a_index | sort numberField ${dir} ${nullDir}`, [ + `SyntaxError: extraneous input '${nullDir}' expecting `, + ]); + } + } + for (const nullDir of ['first', 'last']) { + testErrorsAndWarnings(`from a_index | sort numberField nulls ${nullDir}`, []); + testErrorsAndWarnings(`from a_index | sort numberField ${nullDir}`, [ + `SyntaxError: extraneous input '${nullDir}' expecting `, + ]); + } + testErrorsAndWarnings(`row a = 1 | stats COUNT(*) | sort \`COUNT(*)\``, []); + testErrorsAndWarnings(`ROW a = 1 | STATS couNt(*) | SORT \`couNt(*)\``, []); + }); + + describe('enrich', () => { + testErrorsAndWarnings(`from a_index | enrich`, [ + "SyntaxError: missing ENRICH_POLICY_NAME at ''", + ]); + testErrorsAndWarnings(`from a_index | enrich _`, ['Unknown policy [_]']); + testErrorsAndWarnings(`from a_index | enrich _:`, [ + "SyntaxError: token recognition error at: ':'", + 'Unknown policy [_]', + ]); + testErrorsAndWarnings(`from a_index | enrich _:policy`, [ + 'Unrecognized value [_] for ENRICH, mode needs to be one of [_ANY, _COORDINATOR, _REMOTE]', + ]); + testErrorsAndWarnings(`from a_index | enrich :policy`, [ + "SyntaxError: token recognition error at: ':'", + ]); + testErrorsAndWarnings(`from a_index | enrich any:`, [ + "SyntaxError: token recognition error at: ':'", + 'Unknown policy [any]', + ]); + testErrorsAndWarnings(`from a_index | enrich _any:`, [ + "SyntaxError: token recognition error at: ':'", + 'Unknown policy [_any]', + ]); + testErrorsAndWarnings(`from a_index | enrich any:policy`, [ + 'Unrecognized value [any] for ENRICH, mode needs to be one of [_ANY, _COORDINATOR, _REMOTE]', + ]); + testErrorsAndWarnings(`from a_index | enrich policy `, []); + testErrorsAndWarnings('from a_index | enrich `this``is fine`', [ + "SyntaxError: mismatched input '`this``is fine`' expecting ENRICH_POLICY_NAME", + ]); + testErrorsAndWarnings('from a_index | enrich this is fine', [ + "SyntaxError: mismatched input 'is' expecting ", + 'Unknown policy [this]', + ]); + for (const value of ['any', 'coordinator', 'remote']) { + testErrorsAndWarnings(`from a_index | enrich _${value}:policy `, []); + testErrorsAndWarnings(`from a_index | enrich _${value} : policy `, [ + "SyntaxError: token recognition error at: ':'", + "SyntaxError: extraneous input 'policy' expecting ", + `Unknown policy [_${value}]`, + ]); + testErrorsAndWarnings(`from a_index | enrich _${value}: policy `, [ + "SyntaxError: token recognition error at: ':'", + "SyntaxError: extraneous input 'policy' expecting ", + `Unknown policy [_${value}]`, + ]); + testErrorsAndWarnings(`from a_index | enrich _${camelCase(value)}:policy `, []); + testErrorsAndWarnings(`from a_index | enrich _${value.toUpperCase()}:policy `, []); + } + + testErrorsAndWarnings(`from a_index | enrich _unknown:policy`, [ + 'Unrecognized value [_unknown] for ENRICH, mode needs to be one of [_ANY, _COORDINATOR, _REMOTE]', + ]); + testErrorsAndWarnings(`from a_index |enrich missing-policy `, [ + 'Unknown policy [missing-policy]', + ]); + testErrorsAndWarnings(`from a_index |enrich policy on `, [ + "SyntaxError: missing ID_PATTERN at ''", + ]); + testErrorsAndWarnings(`from a_index | enrich policy on b `, ['Unknown column [b]']); + + testErrorsAndWarnings('from a_index | enrich policy on `this``is fine`', [ + 'Unknown column [this`is fine]', + ]); + testErrorsAndWarnings('from a_index | enrich policy on this is fine', [ + "SyntaxError: mismatched input 'is' expecting ", + 'Unknown column [this]', + ]); + testErrorsAndWarnings(`from a_index | enrich policy on stringField with `, [ + "SyntaxError: mismatched input '' expecting ID_PATTERN", + ]); + testErrorsAndWarnings(`from a_index | enrich policy on stringField with var0 `, [ + 'Unknown column [var0]', + ]); + testErrorsAndWarnings(`from a_index |enrich policy on numberField with var0 = `, [ + "SyntaxError: missing ID_PATTERN at ''", + 'Unknown column [var0]', + ]); + testErrorsAndWarnings(`from a_index | enrich policy on stringField with var0 = c `, [ + 'Unknown column [var0]', + `Unknown column [c]`, + ]); + // need to re-enable once the fields/variables become location aware + // testErrorsAndWarnings(`from a_index | enrich policy on stringField with var0 = stringField `, [ + // `Unknown column [stringField]`, + // ]); + testErrorsAndWarnings(`from a_index |enrich policy on numberField with var0 = , `, [ + "SyntaxError: missing ID_PATTERN at ','", + "SyntaxError: mismatched input '' expecting ID_PATTERN", + 'Unknown column [var0]', + ]); + testErrorsAndWarnings( + `from a_index | enrich policy on stringField with var0 = otherField, var1 `, + ['Unknown column [var1]'] + ); + testErrorsAndWarnings( + `from a_index | enrich policy on stringField with var0 = otherField `, + [] + ); + testErrorsAndWarnings( + `from a_index | enrich policy on stringField with var0 = otherField, yetAnotherField `, + [] + ); + testErrorsAndWarnings( + `from a_index |enrich policy on numberField with var0 = otherField, var1 = `, + ["SyntaxError: missing ID_PATTERN at ''", 'Unknown column [var1]'] + ); + + testErrorsAndWarnings( + `from a_index | enrich policy on stringField with var0 = otherField, var1 = yetAnotherField`, + [] + ); + testErrorsAndWarnings( + 'from a_index | enrich policy on stringField with var0 = otherField, `this``is fine` = yetAnotherField', + [] + ); + testErrorsAndWarnings(`from a_index | enrich policy with `, [ + "SyntaxError: mismatched input '' expecting ID_PATTERN", + ]); + testErrorsAndWarnings(`from a_index | enrich policy with otherField`, []); + testErrorsAndWarnings(`from a_index | enrich policy | eval otherField`, []); + testErrorsAndWarnings(`from a_index | enrich policy with var0 = otherField | eval var0`, []); + testErrorsAndWarnings('from a_index | enrich my-pol*', [ + 'Using wildcards (*) in ENRICH is not allowed [my-pol*]', + ]); + }); + + describe('shadowing', () => { + testErrorsAndWarnings( + 'from a_index | eval stringField = 5', + [], + ['Column [stringField] of type string has been overwritten as new type: number'] + ); + testErrorsAndWarnings( + 'from a_index | eval numberField = "5"', + [], + ['Column [numberField] of type number has been overwritten as new type: string'] + ); + }); + + describe('quoting and escaping expressions', () => { + function getTicks(amount: number) { + return Array(amount).fill('`').join(''); + } + /** + * Given an initial quoted expression, build a new quoted expression + * that appends as many +1 to the previous one based on the nesting level + * i.e. given the expression `round(...) + 1` returns + * ```round(...) + 1`` + 1` (for nesting 1) + * ```````round(...) + 1```` + 1`` + 1` (for nesting 2) + * etc... + * Note how backticks double for each level + wrapping quotes + * The general rule follows an exponential curve given a nesting N: + * (`){ (2^N)-1 } ticks expression (`){ 2^N-1 } +1 (`){ 2^N-2 } +1 ... +1 + * + * Mind that nesting arg here is equivalent to N-1 + */ + function buildNestedExpression(expr: string, nesting: number) { + const openingTicks = getTicks(Math.pow(2, nesting + 1) - 1); + const firstClosingBatch = getTicks(Math.pow(2, nesting)); + const additionalPlusOneswithTicks = Array(nesting) + .fill(' + 1') + .reduce((acc, plusOneAppended, i) => { + // workout how many ticks to add: 2^N-i + const ticks = getTicks(Math.pow(2, nesting - 1 - i)); + return `${acc}${plusOneAppended}${ticks}`; + }, ''); + const ret = `${openingTicks}${expr}${firstClosingBatch}${additionalPlusOneswithTicks}`; + return ret; + } + + for (const nesting of NESTED_DEPTHS) { + // start with a quotable expression + const expr = 'round(numberField) + 1'; + const startingQuery = `from a_index | eval ${expr}`; + // now pipe for each nesting level a new eval command that appends a +1 to the previous quoted expression + const finalQuery = `${startingQuery} | ${Array(nesting) + .fill('') + .map((_, i) => { + return `eval ${buildNestedExpression(expr, i)} + 1`; + }) + .join(' | ')} | keep ${buildNestedExpression(expr, nesting)}`; + testErrorsAndWarnings(finalQuery, []); + } + }); + + describe('callbacks', () => { + it(`should not fetch source and fields list when a row command is set`, async () => { + const callbackMocks = getCallbackMocks(); + await validateQuery(`row a = 1 | eval a`, getAstAndSyntaxErrors, undefined, callbackMocks); + expect(callbackMocks.getFieldsFor).not.toHaveBeenCalled(); + expect(callbackMocks.getSources).not.toHaveBeenCalled(); + }); + + it(`should not fetch policies if no enrich command is found`, async () => { + const callbackMocks = getCallbackMocks(); + await validateQuery(`row a = 1 | eval a`, getAstAndSyntaxErrors, undefined, callbackMocks); + expect(callbackMocks.getPolicies).not.toHaveBeenCalled(); + }); + + it(`should not fetch source and fields for empty command`, async () => { + const callbackMocks = getCallbackMocks(); + await validateQuery(` `, getAstAndSyntaxErrors, undefined, callbackMocks); + expect(callbackMocks.getFieldsFor).not.toHaveBeenCalled(); + expect(callbackMocks.getSources).not.toHaveBeenCalled(); + }); + + it(`should skip initial source and fields call but still call fields for enriched policy`, async () => { + const callbackMocks = getCallbackMocks(); + await validateQuery( + `row a = 1 | eval b = a | enrich policy`, + getAstAndSyntaxErrors, + undefined, + callbackMocks + ); + expect(callbackMocks.getSources).not.toHaveBeenCalled(); + expect(callbackMocks.getPolicies).toHaveBeenCalled(); + expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(1); + expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ + query: `from enrich_index | keep otherField, yetAnotherField`, + }); + }); + + it('should call fields callbacks also for meta command', async () => { + const callbackMocks = getCallbackMocks(); + await validateQuery( + `meta functions | keep name`, + getAstAndSyntaxErrors, + undefined, + callbackMocks + ); + expect(callbackMocks.getSources).not.toHaveBeenCalled(); + expect(callbackMocks.getPolicies).not.toHaveBeenCalled(); + expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(1); + expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ + query: 'meta functions', + }); + }); + + it('should call fields callbacks also for show command', async () => { + const callbackMocks = getCallbackMocks(); + await validateQuery( + `show info | keep name`, + getAstAndSyntaxErrors, + undefined, + callbackMocks + ); + expect(callbackMocks.getSources).not.toHaveBeenCalled(); + expect(callbackMocks.getPolicies).not.toHaveBeenCalled(); + expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(1); + expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ + query: 'show info', + }); + }); + + it(`should fetch additional fields if an enrich command is found`, async () => { + const callbackMocks = getCallbackMocks(); + await validateQuery( + `from a_index | eval b = a | enrich policy`, + getAstAndSyntaxErrors, + undefined, + callbackMocks + ); + expect(callbackMocks.getSources).toHaveBeenCalled(); + expect(callbackMocks.getPolicies).toHaveBeenCalled(); + expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(2); + expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ + query: `from enrich_index | keep otherField, yetAnotherField`, + }); + }); + + it(`should not crash if no callbacks are available`, async () => { + try { + await validateQuery( + `from a_index | eval b = a | enrich policy | dissect stringField "%{firstWord}"`, + getAstAndSyntaxErrors, + undefined, + { + getFieldsFor: undefined, + getSources: undefined, + getPolicies: undefined, + getMetaFields: undefined, + } + ); + } catch { + fail('Should not throw'); + } + }); + + it(`should not crash if no callbacks are passed`, async () => { + try { + await validateQuery( + `from a_index | eval b = a | enrich policy | dissect stringField "%{firstWord}"`, + getAstAndSyntaxErrors + ); + } catch { + fail('Should not throw'); + } + }); + }); + }); + + describe('Ignoring errors based on callbacks', () => { + interface Fixtures { + testCases: Array<{ query: string; error: string[] }>; + } + + async function loadFixtures() { + // early exit if the testCases are already defined locally + if (testCases.length) { + return { testCases }; + } + const json = await readFile(join(__dirname, 'esql_validation_meta_tests.json'), 'utf8'); + const esqlPackage = JSON.parse(json); + return esqlPackage as Fixtures; + } + + function excludeErrorsByContent(excludedCallback: Array) { + const contentByCallback = { + getSources: /Unknown index/, + getPolicies: /Unknown policy/, + getFieldsFor: /Unknown column|Argument of|it is unsupported or not indexed/, + getMetaFields: /Metadata field/, + }; + return excludedCallback.map((callback) => contentByCallback[callback]) || []; + } + + function getPartialCallbackMocks(exclude?: string) { + return { + ...getCallbackMocks(), + ...(exclude ? { [exclude]: undefined } : {}), + }; + } + + let fixtures: Fixtures; + + beforeAll(async () => { + fixtures = await loadFixtures(); + }); + + it('should basically work when all callbacks are passed', async () => { + const allErrors = await Promise.all( + fixtures.testCases + .filter(({ query }) => query === 'from index [METADATA _id, _source2]') + .map(({ query }) => + validateQuery( + query, + getAstAndSyntaxErrors, + { ignoreOnMissingCallbacks: true }, + getCallbackMocks() + ) + ) + ); + for (const [index, { errors }] of Object.entries(allErrors)) { + expect(errors.map((e) => ('severity' in e ? e.message : e.text))).toEqual( + fixtures.testCases.filter(({ query }) => query === 'from index [METADATA _id, _source2]')[ + Number(index) + ].error + ); + } + }); + + // test excluding one callback at the time + it.each(['getSources', 'getFieldsFor', 'getPolicies', 'getMetaFields'] as Array< + keyof typeof ignoreErrorsMap + >)(`should not error if %s is missing`, async (excludedCallback) => { + const filteredTestCases = fixtures.testCases.filter((t) => + t.error.some((message) => + excludeErrorsByContent([excludedCallback]).every((regexp) => regexp?.test(message)) + ) + ); + const allErrors = await Promise.all( + filteredTestCases.map(({ query }) => + validateQuery( + query, + getAstAndSyntaxErrors, + { ignoreOnMissingCallbacks: true }, + getPartialCallbackMocks(excludedCallback) + ) + ) + ); + for (const { errors } of allErrors) { + expect( + errors.every(({ code }) => + ignoreErrorsMap[excludedCallback].every((ignoredCode) => ignoredCode !== code) + ) + ).toBe(true); + } + }); + + it('should work if no callback passed', async () => { + const excludedCallbacks = [ + 'getSources', + 'getPolicies', + 'getFieldsFor', + 'getMetaFields', + ] as Array; + for (const testCase of fixtures.testCases.filter((t) => + t.error.some((message) => + excludeErrorsByContent(excludedCallbacks).every((regexp) => regexp?.test(message)) + ) + )) { + const { errors } = await validateQuery(testCase.query, getAstAndSyntaxErrors, { + ignoreOnMissingCallbacks: true, + }); + expect( + errors.every(({ code }) => + Object.values(ignoreErrorsMap) + .filter(nonNullable) + .every((ignoredCode) => ignoredCode.every((i) => i !== code)) + ) + ).toBe(true); + } + }); + }); +}); diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts similarity index 92% rename from packages/kbn-monaco/src/esql/lib/ast/validation/validation.ts rename to packages/kbn-esql-validation-autocomplete/src/validation/validation.ts index 2043b79cf787b..c8e60bf4c7e96 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts @@ -7,6 +7,18 @@ */ import uniqBy from 'lodash/uniqBy'; +import type { + AstProviderFn, + ESQLAstItem, + ESQLColumn, + ESQLCommand, + ESQLCommandMode, + ESQLCommandOption, + ESQLFunction, + ESQLMessage, + ESQLSingleAstItem, + ESQLSource, +} from '@kbn/esql-ast'; import { CommandModeDefinition, CommandOptionsDefinition, @@ -41,20 +53,15 @@ import { isVariable, } from '../shared/helpers'; import { collectVariables } from '../shared/variables'; -import type { - AstProviderFn, - ESQLAstItem, - ESQLColumn, - ESQLCommand, - ESQLCommandMode, - ESQLCommandOption, - ESQLFunction, - ESQLMessage, - ESQLSingleAstItem, - ESQLSource, -} from '../types'; import { getMessageFromId, getUnknownTypeLabel } from './errors'; -import type { ESQLRealField, ESQLVariable, ReferenceMaps, ValidationResult } from './types'; +import type { + ErrorTypes, + ESQLRealField, + ESQLVariable, + ReferenceMaps, + ValidationOptions, + ValidationResult, +} from './types'; import type { ESQLCallbacks } from '../shared/types'; import { retrieveSources, @@ -820,13 +827,71 @@ function validateUnsupportedTypeFields(fields: Map) { return messages; } +export const ignoreErrorsMap: Record = { + getFieldsFor: ['unknownColumn', 'wrongArgumentType', 'unsupportedFieldType'], + getSources: ['unknownIndex'], + getPolicies: ['unknownPolicy'], + getMetaFields: ['unknownMetadataField'], +}; + +/** + * ES|QL validation public API + * It takes a query string and returns a list of messages (errors and warnings) after validate + * The astProvider is optional, but if not provided the default one from '@kbn/esql-validation-autocomplete' will be used. + * This is useful for async loading the ES|QL parser and reduce the bundle size, or to swap grammar version. + * As for the callbacks, while optional, the validation function will selectively ignore some errors types based on each callback missing. + */ +export async function validateQuery( + queryString: string, + astProvider: AstProviderFn, + options: ValidationOptions = {}, + callbacks?: ESQLCallbacks +): Promise { + const result = await validateAst(queryString, astProvider, callbacks); + // early return if we do not want to ignore errors + if (!options.ignoreOnMissingCallbacks) { + return result; + } + const { errors, warnings } = result; + const finalCallbacks = callbacks || {}; + const errorTypoesToIgnore = Object.entries(ignoreErrorsMap).reduce((acc, [key, errorCodes]) => { + if ( + !(key in finalCallbacks) || + (key in finalCallbacks && finalCallbacks[key as keyof ESQLCallbacks] == null) + ) { + for (const e of errorCodes) { + acc[e] = true; + } + } + return acc; + }, {} as Partial>); + const filteredErrors = errors + .filter((error) => { + if ('severity' in error) { + return true; + } + return !errorTypoesToIgnore[error.code as ErrorTypes]; + }) + .map((error) => + 'severity' in error + ? { + text: error.message, + code: error.code!, + type: 'error' as const, + location: { min: error.startColumn, max: error.endColumn }, + } + : error + ); + return { errors: filteredErrors, warnings }; +} + /** * This function will perform an high level validation of the * query AST. An initial syntax validation is already performed by the parser * while here it can detect things like function names, types correctness and potential warnings * @param ast A valid AST data structure */ -export async function validateAst( +async function validateAst( queryString: string, astProvider: AstProviderFn, callbacks?: ESQLCallbacks diff --git a/packages/kbn-esql-validation-autocomplete/tsconfig.json b/packages/kbn-esql-validation-autocomplete/tsconfig.json new file mode 100644 index 0000000000000..eea1faf19fa2d --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "src/**/*", + "**/*.ts", + ], + "kbn_references": [ + "@kbn/i18n", + "@kbn/esql-ast", + ], + "exclude": [ + "target/**/*", + ] +} diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_lexer.interp b/packages/kbn-esql/src/antlr/.antlr/esql_lexer.interp deleted file mode 100644 index 8cd048fa4e8c3..0000000000000 --- a/packages/kbn-esql/src/antlr/.antlr/esql_lexer.interp +++ /dev/null @@ -1,307 +0,0 @@ -token literal names: -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -'by' -null -'and' -null -null -'.' -'(' -null -']' -null -null -null -null -null -null -null -'or' -')' -'_' -'info' -'functions' -null -null -'+' -'-' -'*' -'/' -'%' -'10' -null -'nulls' -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null - -token symbolic names: -null -DISSECT -GROK -EVAL -EXPLAIN -FROM -ROW -STATS -WHERE -SORT -MV_EXPAND -LIMIT -PROJECT -DROP -RENAME -SHOW -ENRICH -KEEP -LINE_COMMENT -MULTILINE_COMMENT -WS -EXPLAIN_WS -EXPLAIN_LINE_COMMENT -EXPLAIN_MULTILINE_COMMENT -PIPE -STRING -INTEGER_LITERAL -DECIMAL_LITERAL -BY -DATE_LITERAL -AND -ASSIGN -COMMA -DOT -LP -OPENING_BRACKET -CLOSING_BRACKET -NOT -LIKE -RLIKE -IN -IS -AS -NULL -OR -RP -UNDERSCORE -INFO -FUNCTIONS -BOOLEAN_VALUE -COMPARISON_OPERATOR -PLUS -MINUS -ASTERISK -SLASH -PERCENT -TEN -ORDERING -NULLS_ORDERING -NULLS_ORDERING_DIRECTION -MATH_FUNCTION -UNARY_FUNCTION -WHERE_FUNCTIONS -UNQUOTED_IDENTIFIER -QUOTED_IDENTIFIER -EXPR_LINE_COMMENT -EXPR_MULTILINE_COMMENT -EXPR_WS -METADATA -SRC_UNQUOTED_IDENTIFIER -SRC_QUOTED_IDENTIFIER -SRC_LINE_COMMENT -SRC_MULTILINE_COMMENT -SRC_WS -ON -WITH -ENR_UNQUOTED_IDENTIFIER -ENR_QUOTED_IDENTIFIER -ENR_LINE_COMMENT -ENR_MULTILINE_COMMENT -ENR_WS -EXPLAIN_PIPE - -rule names: -DISSECT -GROK -EVAL -EXPLAIN -FROM -ROW -STATS -WHERE -SORT -MV_EXPAND -LIMIT -PROJECT -DROP -RENAME -SHOW -ENRICH -KEEP -LINE_COMMENT -MULTILINE_COMMENT -WS -EXPLAIN_OPENING_BRACKET -EXPLAIN_PIPE -EXPLAIN_WS -EXPLAIN_LINE_COMMENT -EXPLAIN_MULTILINE_COMMENT -PIPE -DIGIT -LETTER -ESCAPE_SEQUENCE -UNESCAPED_CHARS -EXPONENT -STRING -INTEGER_LITERAL -DECIMAL_LITERAL -BY -DATE_LITERAL -AND -ASSIGN -COMMA -DOT -LP -OPENING_BRACKET -CLOSING_BRACKET -NOT -LIKE -RLIKE -IN -IS -AS -NULL -OR -RP -UNDERSCORE -INFO -FUNCTIONS -BOOLEAN_VALUE -COMPARISON_OPERATOR -PLUS -MINUS -ASTERISK -SLASH -PERCENT -TEN -ORDERING -NULLS_ORDERING -NULLS_ORDERING_DIRECTION -MATH_FUNCTION -UNARY_FUNCTION -WHERE_FUNCTIONS -UNQUOTED_IDENTIFIER -QUOTED_IDENTIFIER -EXPR_LINE_COMMENT -EXPR_MULTILINE_COMMENT -EXPR_WS -SRC_PIPE -SRC_OPENING_BRACKET -SRC_CLOSING_BRACKET -SRC_COMMA -SRC_ASSIGN -METADATA -SRC_UNQUOTED_IDENTIFIER -SRC_UNQUOTED_IDENTIFIER_PART -SRC_QUOTED_IDENTIFIER -SRC_LINE_COMMENT -SRC_MULTILINE_COMMENT -SRC_WS -ON -WITH -ENR_PIPE -ENR_CLOSING_BRACKET -ENR_COMMA -ENR_ASSIGN -ENR_UNQUOTED_IDENTIFIER -ENR_UNQUOTED_IDENTIFIER_PART -ENR_QUOTED_IDENTIFIER -ENR_LINE_COMMENT -ENR_MULTILINE_COMMENT -ENR_WS -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z - -channel names: -DEFAULT_TOKEN_CHANNEL -HIDDEN - -mode names: -DEFAULT_MODE -EXPLAIN_MODE -EXPRESSION -SOURCE_IDENTIFIERS -ENRICH_IDENTIFIERS - -atn: -[4, 0, 81, 1610, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 397, 8, 17, 10, 17, 12, 17, 400, 9, 17, 1, 17, 3, 17, 403, 8, 17, 1, 17, 3, 17, 406, 8, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 415, 8, 18, 10, 18, 12, 18, 418, 9, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 4, 19, 426, 8, 19, 11, 19, 12, 19, 427, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 469, 8, 30, 1, 30, 4, 30, 472, 8, 30, 11, 30, 12, 30, 473, 1, 31, 1, 31, 1, 31, 5, 31, 479, 8, 31, 10, 31, 12, 31, 482, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 490, 8, 31, 10, 31, 12, 31, 493, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 500, 8, 31, 1, 31, 3, 31, 503, 8, 31, 3, 31, 505, 8, 31, 1, 32, 4, 32, 508, 8, 32, 11, 32, 12, 32, 509, 1, 33, 4, 33, 513, 8, 33, 11, 33, 12, 33, 514, 1, 33, 1, 33, 5, 33, 519, 8, 33, 10, 33, 12, 33, 522, 9, 33, 1, 33, 1, 33, 4, 33, 526, 8, 33, 11, 33, 12, 33, 527, 1, 33, 4, 33, 531, 8, 33, 11, 33, 12, 33, 532, 1, 33, 1, 33, 5, 33, 537, 8, 33, 10, 33, 12, 33, 540, 9, 33, 3, 33, 542, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 4, 33, 548, 8, 33, 11, 33, 12, 33, 549, 1, 33, 1, 33, 3, 33, 554, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 653, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 737, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 749, 8, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 771, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 788, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1232, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1385, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 1403, 8, 69, 10, 69, 12, 69, 1406, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 4, 69, 1413, 8, 69, 11, 69, 12, 69, 1414, 3, 69, 1417, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 1423, 8, 70, 10, 70, 12, 70, 1426, 9, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 4, 80, 1477, 8, 80, 11, 80, 12, 80, 1478, 1, 81, 4, 81, 1482, 8, 81, 11, 81, 12, 81, 1483, 1, 81, 1, 81, 3, 81, 1488, 8, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 4, 92, 1532, 8, 92, 11, 92, 12, 92, 1533, 1, 93, 4, 93, 1537, 8, 93, 11, 93, 12, 93, 1538, 1, 93, 1, 93, 3, 93, 1543, 8, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 2, 416, 491, 0, 124, 5, 1, 7, 2, 9, 3, 11, 4, 13, 5, 15, 6, 17, 7, 19, 8, 21, 9, 23, 10, 25, 11, 27, 12, 29, 13, 31, 14, 33, 15, 35, 16, 37, 17, 39, 18, 41, 19, 43, 20, 45, 0, 47, 81, 49, 21, 51, 22, 53, 23, 55, 24, 57, 0, 59, 0, 61, 0, 63, 0, 65, 0, 67, 25, 69, 26, 71, 27, 73, 28, 75, 29, 77, 30, 79, 31, 81, 32, 83, 33, 85, 34, 87, 35, 89, 36, 91, 37, 93, 38, 95, 39, 97, 40, 99, 41, 101, 42, 103, 43, 105, 44, 107, 45, 109, 46, 111, 47, 113, 48, 115, 49, 117, 50, 119, 51, 121, 52, 123, 53, 125, 54, 127, 55, 129, 56, 131, 57, 133, 58, 135, 59, 137, 60, 139, 61, 141, 62, 143, 63, 145, 64, 147, 65, 149, 66, 151, 67, 153, 0, 155, 0, 157, 0, 159, 0, 161, 0, 163, 68, 165, 69, 167, 0, 169, 70, 171, 71, 173, 72, 175, 73, 177, 74, 179, 75, 181, 0, 183, 0, 185, 0, 187, 0, 189, 76, 191, 0, 193, 77, 195, 78, 197, 79, 199, 80, 201, 0, 203, 0, 205, 0, 207, 0, 209, 0, 211, 0, 213, 0, 215, 0, 217, 0, 219, 0, 221, 0, 223, 0, 225, 0, 227, 0, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 5, 0, 1, 2, 3, 4, 37, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 5, 0, 34, 34, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 2, 0, 64, 64, 95, 95, 1, 0, 96, 96, 10, 0, 9, 10, 13, 13, 32, 32, 44, 44, 47, 47, 61, 61, 91, 91, 93, 93, 96, 96, 124, 124, 2, 0, 42, 42, 47, 47, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 1711, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 1, 45, 1, 0, 0, 0, 1, 47, 1, 0, 0, 0, 1, 49, 1, 0, 0, 0, 1, 51, 1, 0, 0, 0, 1, 53, 1, 0, 0, 0, 2, 55, 1, 0, 0, 0, 2, 67, 1, 0, 0, 0, 2, 69, 1, 0, 0, 0, 2, 71, 1, 0, 0, 0, 2, 73, 1, 0, 0, 0, 2, 75, 1, 0, 0, 0, 2, 77, 1, 0, 0, 0, 2, 79, 1, 0, 0, 0, 2, 81, 1, 0, 0, 0, 2, 83, 1, 0, 0, 0, 2, 85, 1, 0, 0, 0, 2, 87, 1, 0, 0, 0, 2, 89, 1, 0, 0, 0, 2, 91, 1, 0, 0, 0, 2, 93, 1, 0, 0, 0, 2, 95, 1, 0, 0, 0, 2, 97, 1, 0, 0, 0, 2, 99, 1, 0, 0, 0, 2, 101, 1, 0, 0, 0, 2, 103, 1, 0, 0, 0, 2, 105, 1, 0, 0, 0, 2, 107, 1, 0, 0, 0, 2, 109, 1, 0, 0, 0, 2, 111, 1, 0, 0, 0, 2, 113, 1, 0, 0, 0, 2, 115, 1, 0, 0, 0, 2, 117, 1, 0, 0, 0, 2, 119, 1, 0, 0, 0, 2, 121, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 2, 125, 1, 0, 0, 0, 2, 127, 1, 0, 0, 0, 2, 129, 1, 0, 0, 0, 2, 131, 1, 0, 0, 0, 2, 133, 1, 0, 0, 0, 2, 135, 1, 0, 0, 0, 2, 137, 1, 0, 0, 0, 2, 139, 1, 0, 0, 0, 2, 141, 1, 0, 0, 0, 2, 143, 1, 0, 0, 0, 2, 145, 1, 0, 0, 0, 2, 147, 1, 0, 0, 0, 2, 149, 1, 0, 0, 0, 2, 151, 1, 0, 0, 0, 3, 153, 1, 0, 0, 0, 3, 155, 1, 0, 0, 0, 3, 157, 1, 0, 0, 0, 3, 159, 1, 0, 0, 0, 3, 161, 1, 0, 0, 0, 3, 163, 1, 0, 0, 0, 3, 165, 1, 0, 0, 0, 3, 169, 1, 0, 0, 0, 3, 171, 1, 0, 0, 0, 3, 173, 1, 0, 0, 0, 3, 175, 1, 0, 0, 0, 4, 177, 1, 0, 0, 0, 4, 179, 1, 0, 0, 0, 4, 181, 1, 0, 0, 0, 4, 183, 1, 0, 0, 0, 4, 185, 1, 0, 0, 0, 4, 187, 1, 0, 0, 0, 4, 189, 1, 0, 0, 0, 4, 193, 1, 0, 0, 0, 4, 195, 1, 0, 0, 0, 4, 197, 1, 0, 0, 0, 4, 199, 1, 0, 0, 0, 5, 253, 1, 0, 0, 0, 7, 263, 1, 0, 0, 0, 9, 270, 1, 0, 0, 0, 11, 277, 1, 0, 0, 0, 13, 287, 1, 0, 0, 0, 15, 294, 1, 0, 0, 0, 17, 300, 1, 0, 0, 0, 19, 308, 1, 0, 0, 0, 21, 316, 1, 0, 0, 0, 23, 323, 1, 0, 0, 0, 25, 335, 1, 0, 0, 0, 27, 343, 1, 0, 0, 0, 29, 353, 1, 0, 0, 0, 31, 360, 1, 0, 0, 0, 33, 369, 1, 0, 0, 0, 35, 376, 1, 0, 0, 0, 37, 385, 1, 0, 0, 0, 39, 392, 1, 0, 0, 0, 41, 409, 1, 0, 0, 0, 43, 425, 1, 0, 0, 0, 45, 431, 1, 0, 0, 0, 47, 436, 1, 0, 0, 0, 49, 441, 1, 0, 0, 0, 51, 445, 1, 0, 0, 0, 53, 449, 1, 0, 0, 0, 55, 453, 1, 0, 0, 0, 57, 457, 1, 0, 0, 0, 59, 459, 1, 0, 0, 0, 61, 461, 1, 0, 0, 0, 63, 464, 1, 0, 0, 0, 65, 466, 1, 0, 0, 0, 67, 504, 1, 0, 0, 0, 69, 507, 1, 0, 0, 0, 71, 553, 1, 0, 0, 0, 73, 555, 1, 0, 0, 0, 75, 652, 1, 0, 0, 0, 77, 654, 1, 0, 0, 0, 79, 658, 1, 0, 0, 0, 81, 660, 1, 0, 0, 0, 83, 662, 1, 0, 0, 0, 85, 664, 1, 0, 0, 0, 87, 666, 1, 0, 0, 0, 89, 671, 1, 0, 0, 0, 91, 676, 1, 0, 0, 0, 93, 680, 1, 0, 0, 0, 95, 685, 1, 0, 0, 0, 97, 691, 1, 0, 0, 0, 99, 694, 1, 0, 0, 0, 101, 697, 1, 0, 0, 0, 103, 700, 1, 0, 0, 0, 105, 705, 1, 0, 0, 0, 107, 708, 1, 0, 0, 0, 109, 710, 1, 0, 0, 0, 111, 712, 1, 0, 0, 0, 113, 717, 1, 0, 0, 0, 115, 736, 1, 0, 0, 0, 117, 748, 1, 0, 0, 0, 119, 750, 1, 0, 0, 0, 121, 752, 1, 0, 0, 0, 123, 754, 1, 0, 0, 0, 125, 756, 1, 0, 0, 0, 127, 758, 1, 0, 0, 0, 129, 760, 1, 0, 0, 0, 131, 770, 1, 0, 0, 0, 133, 772, 1, 0, 0, 0, 135, 787, 1, 0, 0, 0, 137, 1231, 1, 0, 0, 0, 139, 1384, 1, 0, 0, 0, 141, 1386, 1, 0, 0, 0, 143, 1416, 1, 0, 0, 0, 145, 1418, 1, 0, 0, 0, 147, 1429, 1, 0, 0, 0, 149, 1433, 1, 0, 0, 0, 151, 1437, 1, 0, 0, 0, 153, 1441, 1, 0, 0, 0, 155, 1446, 1, 0, 0, 0, 157, 1452, 1, 0, 0, 0, 159, 1458, 1, 0, 0, 0, 161, 1462, 1, 0, 0, 0, 163, 1466, 1, 0, 0, 0, 165, 1476, 1, 0, 0, 0, 167, 1487, 1, 0, 0, 0, 169, 1489, 1, 0, 0, 0, 171, 1491, 1, 0, 0, 0, 173, 1495, 1, 0, 0, 0, 175, 1499, 1, 0, 0, 0, 177, 1503, 1, 0, 0, 0, 179, 1506, 1, 0, 0, 0, 181, 1511, 1, 0, 0, 0, 183, 1516, 1, 0, 0, 0, 185, 1522, 1, 0, 0, 0, 187, 1526, 1, 0, 0, 0, 189, 1531, 1, 0, 0, 0, 191, 1542, 1, 0, 0, 0, 193, 1544, 1, 0, 0, 0, 195, 1546, 1, 0, 0, 0, 197, 1550, 1, 0, 0, 0, 199, 1554, 1, 0, 0, 0, 201, 1558, 1, 0, 0, 0, 203, 1560, 1, 0, 0, 0, 205, 1562, 1, 0, 0, 0, 207, 1564, 1, 0, 0, 0, 209, 1566, 1, 0, 0, 0, 211, 1568, 1, 0, 0, 0, 213, 1570, 1, 0, 0, 0, 215, 1572, 1, 0, 0, 0, 217, 1574, 1, 0, 0, 0, 219, 1576, 1, 0, 0, 0, 221, 1578, 1, 0, 0, 0, 223, 1580, 1, 0, 0, 0, 225, 1582, 1, 0, 0, 0, 227, 1584, 1, 0, 0, 0, 229, 1586, 1, 0, 0, 0, 231, 1588, 1, 0, 0, 0, 233, 1590, 1, 0, 0, 0, 235, 1592, 1, 0, 0, 0, 237, 1594, 1, 0, 0, 0, 239, 1596, 1, 0, 0, 0, 241, 1598, 1, 0, 0, 0, 243, 1600, 1, 0, 0, 0, 245, 1602, 1, 0, 0, 0, 247, 1604, 1, 0, 0, 0, 249, 1606, 1, 0, 0, 0, 251, 1608, 1, 0, 0, 0, 253, 254, 3, 207, 101, 0, 254, 255, 3, 217, 106, 0, 255, 256, 3, 237, 116, 0, 256, 257, 3, 237, 116, 0, 257, 258, 3, 209, 102, 0, 258, 259, 3, 205, 100, 0, 259, 260, 3, 239, 117, 0, 260, 261, 1, 0, 0, 0, 261, 262, 6, 0, 0, 0, 262, 6, 1, 0, 0, 0, 263, 264, 3, 213, 104, 0, 264, 265, 3, 235, 115, 0, 265, 266, 3, 229, 112, 0, 266, 267, 3, 221, 108, 0, 267, 268, 1, 0, 0, 0, 268, 269, 6, 1, 0, 0, 269, 8, 1, 0, 0, 0, 270, 271, 3, 209, 102, 0, 271, 272, 3, 243, 119, 0, 272, 273, 3, 201, 98, 0, 273, 274, 3, 223, 109, 0, 274, 275, 1, 0, 0, 0, 275, 276, 6, 2, 0, 0, 276, 10, 1, 0, 0, 0, 277, 278, 3, 209, 102, 0, 278, 279, 3, 247, 121, 0, 279, 280, 3, 231, 113, 0, 280, 281, 3, 223, 109, 0, 281, 282, 3, 201, 98, 0, 282, 283, 3, 217, 106, 0, 283, 284, 3, 227, 111, 0, 284, 285, 1, 0, 0, 0, 285, 286, 6, 3, 1, 0, 286, 12, 1, 0, 0, 0, 287, 288, 3, 211, 103, 0, 288, 289, 3, 235, 115, 0, 289, 290, 3, 229, 112, 0, 290, 291, 3, 225, 110, 0, 291, 292, 1, 0, 0, 0, 292, 293, 6, 4, 2, 0, 293, 14, 1, 0, 0, 0, 294, 295, 3, 235, 115, 0, 295, 296, 3, 229, 112, 0, 296, 297, 3, 245, 120, 0, 297, 298, 1, 0, 0, 0, 298, 299, 6, 5, 0, 0, 299, 16, 1, 0, 0, 0, 300, 301, 3, 237, 116, 0, 301, 302, 3, 239, 117, 0, 302, 303, 3, 201, 98, 0, 303, 304, 3, 239, 117, 0, 304, 305, 3, 237, 116, 0, 305, 306, 1, 0, 0, 0, 306, 307, 6, 6, 0, 0, 307, 18, 1, 0, 0, 0, 308, 309, 3, 245, 120, 0, 309, 310, 3, 215, 105, 0, 310, 311, 3, 209, 102, 0, 311, 312, 3, 235, 115, 0, 312, 313, 3, 209, 102, 0, 313, 314, 1, 0, 0, 0, 314, 315, 6, 7, 0, 0, 315, 20, 1, 0, 0, 0, 316, 317, 3, 237, 116, 0, 317, 318, 3, 229, 112, 0, 318, 319, 3, 235, 115, 0, 319, 320, 3, 239, 117, 0, 320, 321, 1, 0, 0, 0, 321, 322, 6, 8, 0, 0, 322, 22, 1, 0, 0, 0, 323, 324, 3, 225, 110, 0, 324, 325, 3, 243, 119, 0, 325, 326, 3, 109, 52, 0, 326, 327, 3, 209, 102, 0, 327, 328, 3, 247, 121, 0, 328, 329, 3, 231, 113, 0, 329, 330, 3, 201, 98, 0, 330, 331, 3, 227, 111, 0, 331, 332, 3, 207, 101, 0, 332, 333, 1, 0, 0, 0, 333, 334, 6, 9, 0, 0, 334, 24, 1, 0, 0, 0, 335, 336, 3, 223, 109, 0, 336, 337, 3, 217, 106, 0, 337, 338, 3, 225, 110, 0, 338, 339, 3, 217, 106, 0, 339, 340, 3, 239, 117, 0, 340, 341, 1, 0, 0, 0, 341, 342, 6, 10, 0, 0, 342, 26, 1, 0, 0, 0, 343, 344, 3, 231, 113, 0, 344, 345, 3, 235, 115, 0, 345, 346, 3, 229, 112, 0, 346, 347, 3, 219, 107, 0, 347, 348, 3, 209, 102, 0, 348, 349, 3, 205, 100, 0, 349, 350, 3, 239, 117, 0, 350, 351, 1, 0, 0, 0, 351, 352, 6, 11, 0, 0, 352, 28, 1, 0, 0, 0, 353, 354, 3, 207, 101, 0, 354, 355, 3, 235, 115, 0, 355, 356, 3, 229, 112, 0, 356, 357, 3, 231, 113, 0, 357, 358, 1, 0, 0, 0, 358, 359, 6, 12, 0, 0, 359, 30, 1, 0, 0, 0, 360, 361, 3, 235, 115, 0, 361, 362, 3, 209, 102, 0, 362, 363, 3, 227, 111, 0, 363, 364, 3, 201, 98, 0, 364, 365, 3, 225, 110, 0, 365, 366, 3, 209, 102, 0, 366, 367, 1, 0, 0, 0, 367, 368, 6, 13, 0, 0, 368, 32, 1, 0, 0, 0, 369, 370, 3, 237, 116, 0, 370, 371, 3, 215, 105, 0, 371, 372, 3, 229, 112, 0, 372, 373, 3, 245, 120, 0, 373, 374, 1, 0, 0, 0, 374, 375, 6, 14, 0, 0, 375, 34, 1, 0, 0, 0, 376, 377, 3, 209, 102, 0, 377, 378, 3, 227, 111, 0, 378, 379, 3, 235, 115, 0, 379, 380, 3, 217, 106, 0, 380, 381, 3, 205, 100, 0, 381, 382, 3, 215, 105, 0, 382, 383, 1, 0, 0, 0, 383, 384, 6, 15, 3, 0, 384, 36, 1, 0, 0, 0, 385, 386, 3, 221, 108, 0, 386, 387, 3, 209, 102, 0, 387, 388, 3, 209, 102, 0, 388, 389, 3, 231, 113, 0, 389, 390, 1, 0, 0, 0, 390, 391, 6, 16, 0, 0, 391, 38, 1, 0, 0, 0, 392, 393, 5, 47, 0, 0, 393, 394, 5, 47, 0, 0, 394, 398, 1, 0, 0, 0, 395, 397, 8, 0, 0, 0, 396, 395, 1, 0, 0, 0, 397, 400, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 402, 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 401, 403, 5, 13, 0, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, 406, 5, 10, 0, 0, 405, 404, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 6, 17, 4, 0, 408, 40, 1, 0, 0, 0, 409, 410, 5, 47, 0, 0, 410, 411, 5, 42, 0, 0, 411, 416, 1, 0, 0, 0, 412, 415, 3, 41, 18, 0, 413, 415, 9, 0, 0, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 418, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 419, 420, 5, 42, 0, 0, 420, 421, 5, 47, 0, 0, 421, 422, 1, 0, 0, 0, 422, 423, 6, 18, 4, 0, 423, 42, 1, 0, 0, 0, 424, 426, 7, 1, 0, 0, 425, 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 425, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 6, 19, 4, 0, 430, 44, 1, 0, 0, 0, 431, 432, 5, 91, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 6, 20, 5, 0, 434, 435, 6, 20, 6, 0, 435, 46, 1, 0, 0, 0, 436, 437, 5, 124, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 6, 21, 7, 0, 439, 440, 6, 21, 8, 0, 440, 48, 1, 0, 0, 0, 441, 442, 3, 43, 19, 0, 442, 443, 1, 0, 0, 0, 443, 444, 6, 22, 4, 0, 444, 50, 1, 0, 0, 0, 445, 446, 3, 39, 17, 0, 446, 447, 1, 0, 0, 0, 447, 448, 6, 23, 4, 0, 448, 52, 1, 0, 0, 0, 449, 450, 3, 41, 18, 0, 450, 451, 1, 0, 0, 0, 451, 452, 6, 24, 4, 0, 452, 54, 1, 0, 0, 0, 453, 454, 5, 124, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 6, 25, 8, 0, 456, 56, 1, 0, 0, 0, 457, 458, 7, 2, 0, 0, 458, 58, 1, 0, 0, 0, 459, 460, 7, 3, 0, 0, 460, 60, 1, 0, 0, 0, 461, 462, 5, 92, 0, 0, 462, 463, 7, 4, 0, 0, 463, 62, 1, 0, 0, 0, 464, 465, 8, 5, 0, 0, 465, 64, 1, 0, 0, 0, 466, 468, 7, 6, 0, 0, 467, 469, 7, 7, 0, 0, 468, 467, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 472, 3, 57, 26, 0, 471, 470, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 66, 1, 0, 0, 0, 475, 480, 5, 34, 0, 0, 476, 479, 3, 61, 28, 0, 477, 479, 3, 63, 29, 0, 478, 476, 1, 0, 0, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 505, 5, 34, 0, 0, 484, 485, 5, 34, 0, 0, 485, 486, 5, 34, 0, 0, 486, 487, 5, 34, 0, 0, 487, 491, 1, 0, 0, 0, 488, 490, 8, 0, 0, 0, 489, 488, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 494, 1, 0, 0, 0, 493, 491, 1, 0, 0, 0, 494, 495, 5, 34, 0, 0, 495, 496, 5, 34, 0, 0, 496, 497, 5, 34, 0, 0, 497, 499, 1, 0, 0, 0, 498, 500, 5, 34, 0, 0, 499, 498, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 502, 1, 0, 0, 0, 501, 503, 5, 34, 0, 0, 502, 501, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 505, 1, 0, 0, 0, 504, 475, 1, 0, 0, 0, 504, 484, 1, 0, 0, 0, 505, 68, 1, 0, 0, 0, 506, 508, 3, 57, 26, 0, 507, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 70, 1, 0, 0, 0, 511, 513, 3, 57, 26, 0, 512, 511, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 512, 1, 0, 0, 0, 514, 515, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 516, 520, 3, 83, 39, 0, 517, 519, 3, 57, 26, 0, 518, 517, 1, 0, 0, 0, 519, 522, 1, 0, 0, 0, 520, 518, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 554, 1, 0, 0, 0, 522, 520, 1, 0, 0, 0, 523, 525, 3, 83, 39, 0, 524, 526, 3, 57, 26, 0, 525, 524, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 554, 1, 0, 0, 0, 529, 531, 3, 57, 26, 0, 530, 529, 1, 0, 0, 0, 531, 532, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 541, 1, 0, 0, 0, 534, 538, 3, 83, 39, 0, 535, 537, 3, 57, 26, 0, 536, 535, 1, 0, 0, 0, 537, 540, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 542, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 541, 534, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 544, 3, 65, 30, 0, 544, 554, 1, 0, 0, 0, 545, 547, 3, 83, 39, 0, 546, 548, 3, 57, 26, 0, 547, 546, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 552, 3, 65, 30, 0, 552, 554, 1, 0, 0, 0, 553, 512, 1, 0, 0, 0, 553, 523, 1, 0, 0, 0, 553, 530, 1, 0, 0, 0, 553, 545, 1, 0, 0, 0, 554, 72, 1, 0, 0, 0, 555, 556, 5, 98, 0, 0, 556, 557, 5, 121, 0, 0, 557, 74, 1, 0, 0, 0, 558, 559, 5, 121, 0, 0, 559, 560, 5, 101, 0, 0, 560, 561, 5, 97, 0, 0, 561, 653, 5, 114, 0, 0, 562, 563, 5, 109, 0, 0, 563, 564, 5, 111, 0, 0, 564, 565, 5, 110, 0, 0, 565, 566, 5, 116, 0, 0, 566, 653, 5, 104, 0, 0, 567, 568, 5, 100, 0, 0, 568, 569, 5, 97, 0, 0, 569, 653, 5, 121, 0, 0, 570, 571, 5, 115, 0, 0, 571, 572, 5, 101, 0, 0, 572, 573, 5, 99, 0, 0, 573, 574, 5, 111, 0, 0, 574, 575, 5, 110, 0, 0, 575, 653, 5, 100, 0, 0, 576, 577, 5, 109, 0, 0, 577, 578, 5, 105, 0, 0, 578, 579, 5, 110, 0, 0, 579, 580, 5, 117, 0, 0, 580, 581, 5, 116, 0, 0, 581, 653, 5, 101, 0, 0, 582, 583, 5, 104, 0, 0, 583, 584, 5, 111, 0, 0, 584, 585, 5, 117, 0, 0, 585, 653, 5, 114, 0, 0, 586, 587, 5, 119, 0, 0, 587, 588, 5, 101, 0, 0, 588, 589, 5, 101, 0, 0, 589, 653, 5, 107, 0, 0, 590, 591, 5, 109, 0, 0, 591, 592, 5, 105, 0, 0, 592, 593, 5, 108, 0, 0, 593, 594, 5, 108, 0, 0, 594, 595, 5, 105, 0, 0, 595, 596, 5, 115, 0, 0, 596, 597, 5, 101, 0, 0, 597, 598, 5, 99, 0, 0, 598, 599, 5, 111, 0, 0, 599, 600, 5, 110, 0, 0, 600, 653, 5, 100, 0, 0, 601, 602, 5, 121, 0, 0, 602, 603, 5, 101, 0, 0, 603, 604, 5, 97, 0, 0, 604, 605, 5, 114, 0, 0, 605, 653, 5, 115, 0, 0, 606, 607, 5, 109, 0, 0, 607, 608, 5, 111, 0, 0, 608, 609, 5, 110, 0, 0, 609, 610, 5, 116, 0, 0, 610, 611, 5, 104, 0, 0, 611, 653, 5, 115, 0, 0, 612, 613, 5, 100, 0, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 121, 0, 0, 615, 653, 5, 115, 0, 0, 616, 617, 5, 115, 0, 0, 617, 618, 5, 101, 0, 0, 618, 619, 5, 99, 0, 0, 619, 620, 5, 111, 0, 0, 620, 621, 5, 110, 0, 0, 621, 622, 5, 100, 0, 0, 622, 653, 5, 115, 0, 0, 623, 624, 5, 109, 0, 0, 624, 625, 5, 105, 0, 0, 625, 626, 5, 110, 0, 0, 626, 627, 5, 117, 0, 0, 627, 628, 5, 116, 0, 0, 628, 629, 5, 101, 0, 0, 629, 653, 5, 115, 0, 0, 630, 631, 5, 104, 0, 0, 631, 632, 5, 111, 0, 0, 632, 633, 5, 117, 0, 0, 633, 634, 5, 114, 0, 0, 634, 653, 5, 115, 0, 0, 635, 636, 5, 119, 0, 0, 636, 637, 5, 101, 0, 0, 637, 638, 5, 101, 0, 0, 638, 639, 5, 107, 0, 0, 639, 653, 5, 115, 0, 0, 640, 641, 5, 109, 0, 0, 641, 642, 5, 105, 0, 0, 642, 643, 5, 108, 0, 0, 643, 644, 5, 108, 0, 0, 644, 645, 5, 105, 0, 0, 645, 646, 5, 115, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 99, 0, 0, 648, 649, 5, 111, 0, 0, 649, 650, 5, 110, 0, 0, 650, 651, 5, 100, 0, 0, 651, 653, 5, 115, 0, 0, 652, 558, 1, 0, 0, 0, 652, 562, 1, 0, 0, 0, 652, 567, 1, 0, 0, 0, 652, 570, 1, 0, 0, 0, 652, 576, 1, 0, 0, 0, 652, 582, 1, 0, 0, 0, 652, 586, 1, 0, 0, 0, 652, 590, 1, 0, 0, 0, 652, 601, 1, 0, 0, 0, 652, 606, 1, 0, 0, 0, 652, 612, 1, 0, 0, 0, 652, 616, 1, 0, 0, 0, 652, 623, 1, 0, 0, 0, 652, 630, 1, 0, 0, 0, 652, 635, 1, 0, 0, 0, 652, 640, 1, 0, 0, 0, 653, 76, 1, 0, 0, 0, 654, 655, 5, 97, 0, 0, 655, 656, 5, 110, 0, 0, 656, 657, 5, 100, 0, 0, 657, 78, 1, 0, 0, 0, 658, 659, 5, 61, 0, 0, 659, 80, 1, 0, 0, 0, 660, 661, 5, 44, 0, 0, 661, 82, 1, 0, 0, 0, 662, 663, 5, 46, 0, 0, 663, 84, 1, 0, 0, 0, 664, 665, 5, 40, 0, 0, 665, 86, 1, 0, 0, 0, 666, 667, 5, 91, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 6, 41, 0, 0, 669, 670, 6, 41, 0, 0, 670, 88, 1, 0, 0, 0, 671, 672, 5, 93, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 6, 42, 8, 0, 674, 675, 6, 42, 8, 0, 675, 90, 1, 0, 0, 0, 676, 677, 3, 227, 111, 0, 677, 678, 3, 229, 112, 0, 678, 679, 3, 239, 117, 0, 679, 92, 1, 0, 0, 0, 680, 681, 3, 223, 109, 0, 681, 682, 3, 217, 106, 0, 682, 683, 3, 221, 108, 0, 683, 684, 3, 209, 102, 0, 684, 94, 1, 0, 0, 0, 685, 686, 3, 235, 115, 0, 686, 687, 3, 223, 109, 0, 687, 688, 3, 217, 106, 0, 688, 689, 3, 221, 108, 0, 689, 690, 3, 209, 102, 0, 690, 96, 1, 0, 0, 0, 691, 692, 3, 217, 106, 0, 692, 693, 3, 227, 111, 0, 693, 98, 1, 0, 0, 0, 694, 695, 3, 217, 106, 0, 695, 696, 3, 237, 116, 0, 696, 100, 1, 0, 0, 0, 697, 698, 3, 201, 98, 0, 698, 699, 3, 237, 116, 0, 699, 102, 1, 0, 0, 0, 700, 701, 3, 227, 111, 0, 701, 702, 3, 241, 118, 0, 702, 703, 3, 223, 109, 0, 703, 704, 3, 223, 109, 0, 704, 104, 1, 0, 0, 0, 705, 706, 5, 111, 0, 0, 706, 707, 5, 114, 0, 0, 707, 106, 1, 0, 0, 0, 708, 709, 5, 41, 0, 0, 709, 108, 1, 0, 0, 0, 710, 711, 5, 95, 0, 0, 711, 110, 1, 0, 0, 0, 712, 713, 5, 105, 0, 0, 713, 714, 5, 110, 0, 0, 714, 715, 5, 102, 0, 0, 715, 716, 5, 111, 0, 0, 716, 112, 1, 0, 0, 0, 717, 718, 5, 102, 0, 0, 718, 719, 5, 117, 0, 0, 719, 720, 5, 110, 0, 0, 720, 721, 5, 99, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 105, 0, 0, 723, 724, 5, 111, 0, 0, 724, 725, 5, 110, 0, 0, 725, 726, 5, 115, 0, 0, 726, 114, 1, 0, 0, 0, 727, 728, 5, 116, 0, 0, 728, 729, 5, 114, 0, 0, 729, 730, 5, 117, 0, 0, 730, 737, 5, 101, 0, 0, 731, 732, 5, 102, 0, 0, 732, 733, 5, 97, 0, 0, 733, 734, 5, 108, 0, 0, 734, 735, 5, 115, 0, 0, 735, 737, 5, 101, 0, 0, 736, 727, 1, 0, 0, 0, 736, 731, 1, 0, 0, 0, 737, 116, 1, 0, 0, 0, 738, 739, 5, 61, 0, 0, 739, 749, 5, 61, 0, 0, 740, 741, 5, 33, 0, 0, 741, 749, 5, 61, 0, 0, 742, 749, 5, 60, 0, 0, 743, 744, 5, 60, 0, 0, 744, 749, 5, 61, 0, 0, 745, 749, 5, 62, 0, 0, 746, 747, 5, 62, 0, 0, 747, 749, 5, 61, 0, 0, 748, 738, 1, 0, 0, 0, 748, 740, 1, 0, 0, 0, 748, 742, 1, 0, 0, 0, 748, 743, 1, 0, 0, 0, 748, 745, 1, 0, 0, 0, 748, 746, 1, 0, 0, 0, 749, 118, 1, 0, 0, 0, 750, 751, 5, 43, 0, 0, 751, 120, 1, 0, 0, 0, 752, 753, 5, 45, 0, 0, 753, 122, 1, 0, 0, 0, 754, 755, 5, 42, 0, 0, 755, 124, 1, 0, 0, 0, 756, 757, 5, 47, 0, 0, 757, 126, 1, 0, 0, 0, 758, 759, 5, 37, 0, 0, 759, 128, 1, 0, 0, 0, 760, 761, 5, 49, 0, 0, 761, 762, 5, 48, 0, 0, 762, 130, 1, 0, 0, 0, 763, 764, 5, 97, 0, 0, 764, 765, 5, 115, 0, 0, 765, 771, 5, 99, 0, 0, 766, 767, 5, 100, 0, 0, 767, 768, 5, 101, 0, 0, 768, 769, 5, 115, 0, 0, 769, 771, 5, 99, 0, 0, 770, 763, 1, 0, 0, 0, 770, 766, 1, 0, 0, 0, 771, 132, 1, 0, 0, 0, 772, 773, 5, 110, 0, 0, 773, 774, 5, 117, 0, 0, 774, 775, 5, 108, 0, 0, 775, 776, 5, 108, 0, 0, 776, 777, 5, 115, 0, 0, 777, 134, 1, 0, 0, 0, 778, 779, 5, 102, 0, 0, 779, 780, 5, 105, 0, 0, 780, 781, 5, 114, 0, 0, 781, 782, 5, 115, 0, 0, 782, 788, 5, 116, 0, 0, 783, 784, 5, 108, 0, 0, 784, 785, 5, 97, 0, 0, 785, 786, 5, 115, 0, 0, 786, 788, 5, 116, 0, 0, 787, 778, 1, 0, 0, 0, 787, 783, 1, 0, 0, 0, 788, 136, 1, 0, 0, 0, 789, 790, 3, 235, 115, 0, 790, 791, 3, 229, 112, 0, 791, 792, 3, 241, 118, 0, 792, 793, 3, 227, 111, 0, 793, 794, 3, 207, 101, 0, 794, 1232, 1, 0, 0, 0, 795, 796, 3, 201, 98, 0, 796, 797, 3, 203, 99, 0, 797, 798, 3, 237, 116, 0, 798, 1232, 1, 0, 0, 0, 799, 800, 3, 231, 113, 0, 800, 801, 3, 229, 112, 0, 801, 802, 3, 245, 120, 0, 802, 1232, 1, 0, 0, 0, 803, 804, 3, 223, 109, 0, 804, 805, 3, 229, 112, 0, 805, 806, 3, 213, 104, 0, 806, 807, 3, 129, 62, 0, 807, 1232, 1, 0, 0, 0, 808, 809, 3, 231, 113, 0, 809, 810, 3, 217, 106, 0, 810, 1232, 1, 0, 0, 0, 811, 812, 3, 239, 117, 0, 812, 813, 3, 201, 98, 0, 813, 814, 3, 241, 118, 0, 814, 1232, 1, 0, 0, 0, 815, 1232, 3, 209, 102, 0, 816, 817, 3, 237, 116, 0, 817, 818, 3, 241, 118, 0, 818, 819, 3, 203, 99, 0, 819, 820, 3, 237, 116, 0, 820, 821, 3, 239, 117, 0, 821, 822, 3, 235, 115, 0, 822, 823, 3, 217, 106, 0, 823, 824, 3, 227, 111, 0, 824, 825, 3, 213, 104, 0, 825, 1232, 1, 0, 0, 0, 826, 827, 3, 239, 117, 0, 827, 828, 3, 235, 115, 0, 828, 829, 3, 217, 106, 0, 829, 830, 3, 225, 110, 0, 830, 1232, 1, 0, 0, 0, 831, 832, 3, 205, 100, 0, 832, 833, 3, 229, 112, 0, 833, 834, 3, 227, 111, 0, 834, 835, 3, 205, 100, 0, 835, 836, 3, 201, 98, 0, 836, 837, 3, 239, 117, 0, 837, 1232, 1, 0, 0, 0, 838, 839, 3, 205, 100, 0, 839, 840, 3, 229, 112, 0, 840, 841, 3, 201, 98, 0, 841, 842, 3, 223, 109, 0, 842, 843, 3, 209, 102, 0, 843, 844, 3, 237, 116, 0, 844, 845, 3, 205, 100, 0, 845, 846, 3, 209, 102, 0, 846, 1232, 1, 0, 0, 0, 847, 848, 3, 213, 104, 0, 848, 849, 3, 235, 115, 0, 849, 850, 3, 209, 102, 0, 850, 851, 3, 201, 98, 0, 851, 852, 3, 239, 117, 0, 852, 853, 3, 209, 102, 0, 853, 854, 3, 237, 116, 0, 854, 855, 3, 239, 117, 0, 855, 1232, 1, 0, 0, 0, 856, 857, 3, 223, 109, 0, 857, 858, 3, 209, 102, 0, 858, 859, 3, 211, 103, 0, 859, 860, 3, 239, 117, 0, 860, 1232, 1, 0, 0, 0, 861, 862, 3, 227, 111, 0, 862, 863, 3, 229, 112, 0, 863, 864, 3, 245, 120, 0, 864, 1232, 1, 0, 0, 0, 865, 866, 3, 235, 115, 0, 866, 867, 3, 217, 106, 0, 867, 868, 3, 213, 104, 0, 868, 869, 3, 215, 105, 0, 869, 870, 3, 239, 117, 0, 870, 1232, 1, 0, 0, 0, 871, 872, 3, 237, 116, 0, 872, 873, 3, 239, 117, 0, 873, 874, 3, 201, 98, 0, 874, 875, 3, 235, 115, 0, 875, 876, 3, 239, 117, 0, 876, 877, 3, 237, 116, 0, 877, 878, 3, 109, 52, 0, 878, 879, 3, 245, 120, 0, 879, 880, 3, 217, 106, 0, 880, 881, 3, 239, 117, 0, 881, 882, 3, 215, 105, 0, 882, 1232, 1, 0, 0, 0, 883, 884, 3, 207, 101, 0, 884, 885, 3, 201, 98, 0, 885, 886, 3, 239, 117, 0, 886, 887, 3, 209, 102, 0, 887, 888, 3, 109, 52, 0, 888, 889, 3, 211, 103, 0, 889, 890, 3, 229, 112, 0, 890, 891, 3, 235, 115, 0, 891, 892, 3, 225, 110, 0, 892, 893, 3, 201, 98, 0, 893, 894, 3, 239, 117, 0, 894, 1232, 1, 0, 0, 0, 895, 896, 3, 207, 101, 0, 896, 897, 3, 201, 98, 0, 897, 898, 3, 239, 117, 0, 898, 899, 3, 209, 102, 0, 899, 900, 3, 109, 52, 0, 900, 901, 3, 239, 117, 0, 901, 902, 3, 235, 115, 0, 902, 903, 3, 241, 118, 0, 903, 904, 3, 227, 111, 0, 904, 905, 3, 205, 100, 0, 905, 1232, 1, 0, 0, 0, 906, 907, 3, 207, 101, 0, 907, 908, 3, 201, 98, 0, 908, 909, 3, 239, 117, 0, 909, 910, 3, 209, 102, 0, 910, 911, 3, 109, 52, 0, 911, 912, 3, 231, 113, 0, 912, 913, 3, 201, 98, 0, 913, 914, 3, 235, 115, 0, 914, 915, 3, 237, 116, 0, 915, 916, 3, 209, 102, 0, 916, 1232, 1, 0, 0, 0, 917, 918, 3, 201, 98, 0, 918, 919, 3, 241, 118, 0, 919, 920, 3, 239, 117, 0, 920, 921, 3, 229, 112, 0, 921, 922, 3, 109, 52, 0, 922, 923, 3, 203, 99, 0, 923, 924, 3, 241, 118, 0, 924, 925, 3, 205, 100, 0, 925, 926, 3, 221, 108, 0, 926, 927, 3, 209, 102, 0, 927, 928, 3, 239, 117, 0, 928, 1232, 1, 0, 0, 0, 929, 930, 3, 207, 101, 0, 930, 931, 3, 201, 98, 0, 931, 932, 3, 239, 117, 0, 932, 933, 3, 209, 102, 0, 933, 934, 3, 109, 52, 0, 934, 935, 3, 209, 102, 0, 935, 936, 3, 247, 121, 0, 936, 937, 3, 239, 117, 0, 937, 938, 3, 235, 115, 0, 938, 939, 3, 201, 98, 0, 939, 940, 3, 205, 100, 0, 940, 941, 3, 239, 117, 0, 941, 1232, 1, 0, 0, 0, 942, 943, 3, 217, 106, 0, 943, 944, 3, 237, 116, 0, 944, 945, 3, 109, 52, 0, 945, 946, 3, 211, 103, 0, 946, 947, 3, 217, 106, 0, 947, 948, 3, 227, 111, 0, 948, 949, 3, 217, 106, 0, 949, 950, 3, 239, 117, 0, 950, 951, 3, 209, 102, 0, 951, 1232, 1, 0, 0, 0, 952, 953, 3, 217, 106, 0, 953, 954, 3, 237, 116, 0, 954, 955, 3, 109, 52, 0, 955, 956, 3, 217, 106, 0, 956, 957, 3, 227, 111, 0, 957, 958, 3, 211, 103, 0, 958, 959, 3, 217, 106, 0, 959, 960, 3, 227, 111, 0, 960, 961, 3, 217, 106, 0, 961, 962, 3, 239, 117, 0, 962, 963, 3, 209, 102, 0, 963, 1232, 1, 0, 0, 0, 964, 965, 3, 205, 100, 0, 965, 966, 3, 201, 98, 0, 966, 967, 3, 237, 116, 0, 967, 968, 3, 209, 102, 0, 968, 1232, 1, 0, 0, 0, 969, 970, 3, 223, 109, 0, 970, 971, 3, 209, 102, 0, 971, 972, 3, 227, 111, 0, 972, 973, 3, 213, 104, 0, 973, 974, 3, 239, 117, 0, 974, 975, 3, 215, 105, 0, 975, 1232, 1, 0, 0, 0, 976, 977, 3, 225, 110, 0, 977, 978, 3, 243, 119, 0, 978, 979, 3, 109, 52, 0, 979, 980, 3, 225, 110, 0, 980, 981, 3, 201, 98, 0, 981, 982, 3, 247, 121, 0, 982, 1232, 1, 0, 0, 0, 983, 984, 3, 225, 110, 0, 984, 985, 3, 243, 119, 0, 985, 986, 3, 109, 52, 0, 986, 987, 3, 225, 110, 0, 987, 988, 3, 217, 106, 0, 988, 989, 3, 227, 111, 0, 989, 1232, 1, 0, 0, 0, 990, 991, 3, 225, 110, 0, 991, 992, 3, 243, 119, 0, 992, 993, 3, 109, 52, 0, 993, 994, 3, 201, 98, 0, 994, 995, 3, 243, 119, 0, 995, 996, 3, 213, 104, 0, 996, 1232, 1, 0, 0, 0, 997, 998, 3, 225, 110, 0, 998, 999, 3, 243, 119, 0, 999, 1000, 3, 109, 52, 0, 1000, 1001, 3, 237, 116, 0, 1001, 1002, 3, 241, 118, 0, 1002, 1003, 3, 225, 110, 0, 1003, 1232, 1, 0, 0, 0, 1004, 1005, 3, 225, 110, 0, 1005, 1006, 3, 243, 119, 0, 1006, 1007, 3, 109, 52, 0, 1007, 1008, 3, 205, 100, 0, 1008, 1009, 3, 229, 112, 0, 1009, 1010, 3, 241, 118, 0, 1010, 1011, 3, 227, 111, 0, 1011, 1012, 3, 239, 117, 0, 1012, 1232, 1, 0, 0, 0, 1013, 1014, 3, 225, 110, 0, 1014, 1015, 3, 243, 119, 0, 1015, 1016, 3, 109, 52, 0, 1016, 1017, 3, 205, 100, 0, 1017, 1018, 3, 229, 112, 0, 1018, 1019, 3, 227, 111, 0, 1019, 1020, 3, 205, 100, 0, 1020, 1021, 3, 201, 98, 0, 1021, 1022, 3, 239, 117, 0, 1022, 1232, 1, 0, 0, 0, 1023, 1024, 3, 225, 110, 0, 1024, 1025, 3, 243, 119, 0, 1025, 1026, 3, 109, 52, 0, 1026, 1027, 3, 219, 107, 0, 1027, 1028, 3, 229, 112, 0, 1028, 1029, 3, 217, 106, 0, 1029, 1030, 3, 227, 111, 0, 1030, 1232, 1, 0, 0, 0, 1031, 1032, 3, 225, 110, 0, 1032, 1033, 3, 243, 119, 0, 1033, 1034, 3, 109, 52, 0, 1034, 1035, 3, 225, 110, 0, 1035, 1036, 3, 209, 102, 0, 1036, 1037, 3, 207, 101, 0, 1037, 1038, 3, 217, 106, 0, 1038, 1039, 3, 201, 98, 0, 1039, 1040, 3, 227, 111, 0, 1040, 1232, 1, 0, 0, 0, 1041, 1042, 3, 225, 110, 0, 1042, 1043, 3, 243, 119, 0, 1043, 1044, 3, 109, 52, 0, 1044, 1045, 3, 207, 101, 0, 1045, 1046, 3, 209, 102, 0, 1046, 1047, 3, 207, 101, 0, 1047, 1048, 3, 241, 118, 0, 1048, 1049, 3, 231, 113, 0, 1049, 1050, 3, 209, 102, 0, 1050, 1232, 1, 0, 0, 0, 1051, 1052, 3, 225, 110, 0, 1052, 1053, 3, 209, 102, 0, 1053, 1054, 3, 239, 117, 0, 1054, 1055, 3, 201, 98, 0, 1055, 1056, 3, 207, 101, 0, 1056, 1057, 3, 201, 98, 0, 1057, 1058, 3, 239, 117, 0, 1058, 1059, 3, 201, 98, 0, 1059, 1232, 1, 0, 0, 0, 1060, 1061, 3, 237, 116, 0, 1061, 1062, 3, 231, 113, 0, 1062, 1063, 3, 223, 109, 0, 1063, 1064, 3, 217, 106, 0, 1064, 1065, 3, 239, 117, 0, 1065, 1232, 1, 0, 0, 0, 1066, 1067, 3, 239, 117, 0, 1067, 1068, 3, 229, 112, 0, 1068, 1069, 3, 109, 52, 0, 1069, 1070, 3, 237, 116, 0, 1070, 1071, 3, 239, 117, 0, 1071, 1072, 3, 235, 115, 0, 1072, 1073, 3, 217, 106, 0, 1073, 1074, 3, 227, 111, 0, 1074, 1075, 3, 213, 104, 0, 1075, 1232, 1, 0, 0, 0, 1076, 1077, 3, 239, 117, 0, 1077, 1078, 3, 229, 112, 0, 1078, 1079, 3, 109, 52, 0, 1079, 1080, 3, 237, 116, 0, 1080, 1081, 3, 239, 117, 0, 1081, 1082, 3, 235, 115, 0, 1082, 1232, 1, 0, 0, 0, 1083, 1084, 3, 239, 117, 0, 1084, 1085, 3, 229, 112, 0, 1085, 1086, 3, 109, 52, 0, 1086, 1087, 3, 203, 99, 0, 1087, 1088, 3, 229, 112, 0, 1088, 1089, 3, 229, 112, 0, 1089, 1090, 3, 223, 109, 0, 1090, 1232, 1, 0, 0, 0, 1091, 1092, 3, 239, 117, 0, 1092, 1093, 3, 229, 112, 0, 1093, 1094, 3, 109, 52, 0, 1094, 1095, 3, 203, 99, 0, 1095, 1096, 3, 229, 112, 0, 1096, 1097, 3, 229, 112, 0, 1097, 1098, 3, 223, 109, 0, 1098, 1099, 3, 209, 102, 0, 1099, 1100, 3, 201, 98, 0, 1100, 1101, 3, 227, 111, 0, 1101, 1232, 1, 0, 0, 0, 1102, 1103, 3, 239, 117, 0, 1103, 1104, 3, 229, 112, 0, 1104, 1105, 3, 109, 52, 0, 1105, 1106, 3, 207, 101, 0, 1106, 1107, 3, 201, 98, 0, 1107, 1108, 3, 239, 117, 0, 1108, 1109, 3, 209, 102, 0, 1109, 1110, 3, 239, 117, 0, 1110, 1111, 3, 217, 106, 0, 1111, 1112, 3, 225, 110, 0, 1112, 1113, 3, 209, 102, 0, 1113, 1232, 1, 0, 0, 0, 1114, 1115, 3, 239, 117, 0, 1115, 1116, 3, 229, 112, 0, 1116, 1117, 3, 109, 52, 0, 1117, 1118, 3, 207, 101, 0, 1118, 1119, 3, 239, 117, 0, 1119, 1232, 1, 0, 0, 0, 1120, 1121, 3, 239, 117, 0, 1121, 1122, 3, 229, 112, 0, 1122, 1123, 3, 109, 52, 0, 1123, 1124, 3, 207, 101, 0, 1124, 1125, 3, 203, 99, 0, 1125, 1126, 3, 223, 109, 0, 1126, 1232, 1, 0, 0, 0, 1127, 1128, 3, 239, 117, 0, 1128, 1129, 3, 229, 112, 0, 1129, 1130, 3, 109, 52, 0, 1130, 1131, 3, 207, 101, 0, 1131, 1132, 3, 229, 112, 0, 1132, 1133, 3, 241, 118, 0, 1133, 1134, 3, 203, 99, 0, 1134, 1135, 3, 223, 109, 0, 1135, 1136, 3, 209, 102, 0, 1136, 1232, 1, 0, 0, 0, 1137, 1138, 3, 239, 117, 0, 1138, 1139, 3, 229, 112, 0, 1139, 1140, 3, 109, 52, 0, 1140, 1141, 3, 207, 101, 0, 1141, 1142, 3, 209, 102, 0, 1142, 1143, 3, 213, 104, 0, 1143, 1144, 3, 235, 115, 0, 1144, 1145, 3, 209, 102, 0, 1145, 1146, 3, 209, 102, 0, 1146, 1147, 3, 237, 116, 0, 1147, 1232, 1, 0, 0, 0, 1148, 1149, 3, 239, 117, 0, 1149, 1150, 3, 229, 112, 0, 1150, 1151, 3, 109, 52, 0, 1151, 1152, 3, 217, 106, 0, 1152, 1153, 3, 227, 111, 0, 1153, 1154, 3, 239, 117, 0, 1154, 1232, 1, 0, 0, 0, 1155, 1156, 3, 239, 117, 0, 1156, 1157, 3, 229, 112, 0, 1157, 1158, 3, 109, 52, 0, 1158, 1159, 3, 217, 106, 0, 1159, 1160, 3, 227, 111, 0, 1160, 1161, 3, 239, 117, 0, 1161, 1162, 3, 209, 102, 0, 1162, 1163, 3, 213, 104, 0, 1163, 1164, 3, 209, 102, 0, 1164, 1165, 3, 235, 115, 0, 1165, 1232, 1, 0, 0, 0, 1166, 1167, 3, 239, 117, 0, 1167, 1168, 3, 229, 112, 0, 1168, 1169, 3, 109, 52, 0, 1169, 1170, 3, 217, 106, 0, 1170, 1171, 3, 231, 113, 0, 1171, 1232, 1, 0, 0, 0, 1172, 1173, 3, 239, 117, 0, 1173, 1174, 3, 229, 112, 0, 1174, 1175, 3, 109, 52, 0, 1175, 1176, 3, 223, 109, 0, 1176, 1177, 3, 229, 112, 0, 1177, 1178, 3, 227, 111, 0, 1178, 1179, 3, 213, 104, 0, 1179, 1232, 1, 0, 0, 0, 1180, 1181, 3, 239, 117, 0, 1181, 1182, 3, 229, 112, 0, 1182, 1183, 3, 109, 52, 0, 1183, 1184, 3, 235, 115, 0, 1184, 1185, 3, 201, 98, 0, 1185, 1186, 3, 207, 101, 0, 1186, 1187, 3, 217, 106, 0, 1187, 1188, 3, 201, 98, 0, 1188, 1189, 3, 227, 111, 0, 1189, 1190, 3, 237, 116, 0, 1190, 1232, 1, 0, 0, 0, 1191, 1192, 3, 239, 117, 0, 1192, 1193, 3, 229, 112, 0, 1193, 1194, 3, 109, 52, 0, 1194, 1195, 3, 243, 119, 0, 1195, 1196, 3, 209, 102, 0, 1196, 1197, 3, 235, 115, 0, 1197, 1198, 3, 237, 116, 0, 1198, 1199, 3, 217, 106, 0, 1199, 1200, 3, 229, 112, 0, 1200, 1201, 3, 227, 111, 0, 1201, 1232, 1, 0, 0, 0, 1202, 1203, 3, 239, 117, 0, 1203, 1204, 3, 229, 112, 0, 1204, 1205, 3, 109, 52, 0, 1205, 1206, 3, 241, 118, 0, 1206, 1207, 3, 227, 111, 0, 1207, 1208, 3, 237, 116, 0, 1208, 1209, 3, 217, 106, 0, 1209, 1210, 3, 213, 104, 0, 1210, 1211, 3, 227, 111, 0, 1211, 1212, 3, 209, 102, 0, 1212, 1213, 3, 207, 101, 0, 1213, 1214, 3, 109, 52, 0, 1214, 1215, 3, 223, 109, 0, 1215, 1216, 3, 229, 112, 0, 1216, 1217, 3, 227, 111, 0, 1217, 1218, 3, 213, 104, 0, 1218, 1232, 1, 0, 0, 0, 1219, 1220, 3, 239, 117, 0, 1220, 1221, 3, 229, 112, 0, 1221, 1222, 3, 109, 52, 0, 1222, 1223, 3, 213, 104, 0, 1223, 1224, 3, 209, 102, 0, 1224, 1225, 3, 229, 112, 0, 1225, 1226, 3, 231, 113, 0, 1226, 1227, 3, 229, 112, 0, 1227, 1228, 3, 217, 106, 0, 1228, 1229, 3, 227, 111, 0, 1229, 1230, 3, 239, 117, 0, 1230, 1232, 1, 0, 0, 0, 1231, 789, 1, 0, 0, 0, 1231, 795, 1, 0, 0, 0, 1231, 799, 1, 0, 0, 0, 1231, 803, 1, 0, 0, 0, 1231, 808, 1, 0, 0, 0, 1231, 811, 1, 0, 0, 0, 1231, 815, 1, 0, 0, 0, 1231, 816, 1, 0, 0, 0, 1231, 826, 1, 0, 0, 0, 1231, 831, 1, 0, 0, 0, 1231, 838, 1, 0, 0, 0, 1231, 847, 1, 0, 0, 0, 1231, 856, 1, 0, 0, 0, 1231, 861, 1, 0, 0, 0, 1231, 865, 1, 0, 0, 0, 1231, 871, 1, 0, 0, 0, 1231, 883, 1, 0, 0, 0, 1231, 895, 1, 0, 0, 0, 1231, 906, 1, 0, 0, 0, 1231, 917, 1, 0, 0, 0, 1231, 929, 1, 0, 0, 0, 1231, 942, 1, 0, 0, 0, 1231, 952, 1, 0, 0, 0, 1231, 964, 1, 0, 0, 0, 1231, 969, 1, 0, 0, 0, 1231, 976, 1, 0, 0, 0, 1231, 983, 1, 0, 0, 0, 1231, 990, 1, 0, 0, 0, 1231, 997, 1, 0, 0, 0, 1231, 1004, 1, 0, 0, 0, 1231, 1013, 1, 0, 0, 0, 1231, 1023, 1, 0, 0, 0, 1231, 1031, 1, 0, 0, 0, 1231, 1041, 1, 0, 0, 0, 1231, 1051, 1, 0, 0, 0, 1231, 1060, 1, 0, 0, 0, 1231, 1066, 1, 0, 0, 0, 1231, 1076, 1, 0, 0, 0, 1231, 1083, 1, 0, 0, 0, 1231, 1091, 1, 0, 0, 0, 1231, 1102, 1, 0, 0, 0, 1231, 1114, 1, 0, 0, 0, 1231, 1120, 1, 0, 0, 0, 1231, 1127, 1, 0, 0, 0, 1231, 1137, 1, 0, 0, 0, 1231, 1148, 1, 0, 0, 0, 1231, 1155, 1, 0, 0, 0, 1231, 1166, 1, 0, 0, 0, 1231, 1172, 1, 0, 0, 0, 1231, 1180, 1, 0, 0, 0, 1231, 1191, 1, 0, 0, 0, 1231, 1202, 1, 0, 0, 0, 1231, 1219, 1, 0, 0, 0, 1232, 138, 1, 0, 0, 0, 1233, 1234, 3, 201, 98, 0, 1234, 1235, 3, 243, 119, 0, 1235, 1236, 3, 213, 104, 0, 1236, 1385, 1, 0, 0, 0, 1237, 1238, 3, 225, 110, 0, 1238, 1239, 3, 217, 106, 0, 1239, 1240, 3, 227, 111, 0, 1240, 1385, 1, 0, 0, 0, 1241, 1242, 3, 225, 110, 0, 1242, 1243, 3, 201, 98, 0, 1243, 1244, 3, 247, 121, 0, 1244, 1385, 1, 0, 0, 0, 1245, 1246, 3, 237, 116, 0, 1246, 1247, 3, 241, 118, 0, 1247, 1248, 3, 225, 110, 0, 1248, 1385, 1, 0, 0, 0, 1249, 1250, 3, 205, 100, 0, 1250, 1251, 3, 229, 112, 0, 1251, 1252, 3, 241, 118, 0, 1252, 1253, 3, 227, 111, 0, 1253, 1254, 3, 239, 117, 0, 1254, 1385, 1, 0, 0, 0, 1255, 1256, 3, 205, 100, 0, 1256, 1257, 3, 229, 112, 0, 1257, 1258, 3, 241, 118, 0, 1258, 1259, 3, 227, 111, 0, 1259, 1260, 3, 239, 117, 0, 1260, 1261, 3, 109, 52, 0, 1261, 1262, 3, 207, 101, 0, 1262, 1263, 3, 217, 106, 0, 1263, 1264, 3, 237, 116, 0, 1264, 1265, 3, 239, 117, 0, 1265, 1266, 3, 217, 106, 0, 1266, 1267, 3, 227, 111, 0, 1267, 1268, 3, 205, 100, 0, 1268, 1269, 3, 239, 117, 0, 1269, 1385, 1, 0, 0, 0, 1270, 1271, 3, 231, 113, 0, 1271, 1272, 3, 209, 102, 0, 1272, 1273, 3, 235, 115, 0, 1273, 1274, 3, 205, 100, 0, 1274, 1275, 3, 209, 102, 0, 1275, 1276, 3, 227, 111, 0, 1276, 1277, 3, 239, 117, 0, 1277, 1278, 3, 217, 106, 0, 1278, 1279, 3, 223, 109, 0, 1279, 1280, 3, 209, 102, 0, 1280, 1385, 1, 0, 0, 0, 1281, 1282, 3, 225, 110, 0, 1282, 1283, 3, 209, 102, 0, 1283, 1284, 3, 207, 101, 0, 1284, 1285, 3, 217, 106, 0, 1285, 1286, 3, 201, 98, 0, 1286, 1287, 3, 227, 111, 0, 1287, 1385, 1, 0, 0, 0, 1288, 1289, 3, 225, 110, 0, 1289, 1290, 3, 209, 102, 0, 1290, 1291, 3, 207, 101, 0, 1291, 1292, 3, 217, 106, 0, 1292, 1293, 3, 201, 98, 0, 1293, 1294, 3, 227, 111, 0, 1294, 1295, 3, 109, 52, 0, 1295, 1296, 3, 201, 98, 0, 1296, 1297, 3, 203, 99, 0, 1297, 1298, 3, 237, 116, 0, 1298, 1299, 3, 229, 112, 0, 1299, 1300, 3, 223, 109, 0, 1300, 1301, 3, 241, 118, 0, 1301, 1302, 3, 239, 117, 0, 1302, 1303, 3, 209, 102, 0, 1303, 1304, 3, 109, 52, 0, 1304, 1305, 3, 207, 101, 0, 1305, 1306, 3, 209, 102, 0, 1306, 1307, 3, 243, 119, 0, 1307, 1308, 3, 217, 106, 0, 1308, 1309, 3, 201, 98, 0, 1309, 1310, 3, 239, 117, 0, 1310, 1311, 3, 217, 106, 0, 1311, 1312, 3, 229, 112, 0, 1312, 1313, 3, 227, 111, 0, 1313, 1385, 1, 0, 0, 0, 1314, 1315, 3, 201, 98, 0, 1315, 1316, 3, 205, 100, 0, 1316, 1317, 3, 229, 112, 0, 1317, 1318, 3, 237, 116, 0, 1318, 1385, 1, 0, 0, 0, 1319, 1320, 3, 201, 98, 0, 1320, 1321, 3, 237, 116, 0, 1321, 1322, 3, 217, 106, 0, 1322, 1323, 3, 227, 111, 0, 1323, 1385, 1, 0, 0, 0, 1324, 1325, 3, 201, 98, 0, 1325, 1326, 3, 239, 117, 0, 1326, 1327, 3, 201, 98, 0, 1327, 1328, 3, 227, 111, 0, 1328, 1385, 1, 0, 0, 0, 1329, 1330, 3, 201, 98, 0, 1330, 1331, 3, 239, 117, 0, 1331, 1332, 3, 201, 98, 0, 1332, 1333, 3, 227, 111, 0, 1333, 1334, 5, 50, 0, 0, 1334, 1385, 1, 0, 0, 0, 1335, 1336, 3, 205, 100, 0, 1336, 1337, 3, 209, 102, 0, 1337, 1338, 3, 217, 106, 0, 1338, 1339, 3, 223, 109, 0, 1339, 1385, 1, 0, 0, 0, 1340, 1341, 3, 205, 100, 0, 1341, 1342, 3, 229, 112, 0, 1342, 1343, 3, 237, 116, 0, 1343, 1385, 1, 0, 0, 0, 1344, 1345, 3, 205, 100, 0, 1345, 1346, 3, 229, 112, 0, 1346, 1347, 3, 237, 116, 0, 1347, 1348, 3, 215, 105, 0, 1348, 1385, 1, 0, 0, 0, 1349, 1350, 3, 211, 103, 0, 1350, 1351, 3, 223, 109, 0, 1351, 1352, 3, 229, 112, 0, 1352, 1353, 3, 229, 112, 0, 1353, 1354, 3, 235, 115, 0, 1354, 1385, 1, 0, 0, 0, 1355, 1356, 3, 223, 109, 0, 1356, 1357, 3, 239, 117, 0, 1357, 1358, 3, 235, 115, 0, 1358, 1359, 3, 217, 106, 0, 1359, 1360, 3, 225, 110, 0, 1360, 1385, 1, 0, 0, 0, 1361, 1362, 3, 237, 116, 0, 1362, 1363, 3, 217, 106, 0, 1363, 1364, 3, 227, 111, 0, 1364, 1385, 1, 0, 0, 0, 1365, 1366, 3, 237, 116, 0, 1366, 1367, 3, 217, 106, 0, 1367, 1368, 3, 227, 111, 0, 1368, 1369, 3, 215, 105, 0, 1369, 1385, 1, 0, 0, 0, 1370, 1371, 3, 237, 116, 0, 1371, 1372, 3, 233, 114, 0, 1372, 1373, 3, 235, 115, 0, 1373, 1374, 3, 239, 117, 0, 1374, 1385, 1, 0, 0, 0, 1375, 1376, 3, 239, 117, 0, 1376, 1377, 3, 201, 98, 0, 1377, 1378, 3, 227, 111, 0, 1378, 1385, 1, 0, 0, 0, 1379, 1380, 3, 239, 117, 0, 1380, 1381, 3, 201, 98, 0, 1381, 1382, 3, 227, 111, 0, 1382, 1383, 3, 215, 105, 0, 1383, 1385, 1, 0, 0, 0, 1384, 1233, 1, 0, 0, 0, 1384, 1237, 1, 0, 0, 0, 1384, 1241, 1, 0, 0, 0, 1384, 1245, 1, 0, 0, 0, 1384, 1249, 1, 0, 0, 0, 1384, 1255, 1, 0, 0, 0, 1384, 1270, 1, 0, 0, 0, 1384, 1281, 1, 0, 0, 0, 1384, 1288, 1, 0, 0, 0, 1384, 1314, 1, 0, 0, 0, 1384, 1319, 1, 0, 0, 0, 1384, 1324, 1, 0, 0, 0, 1384, 1329, 1, 0, 0, 0, 1384, 1335, 1, 0, 0, 0, 1384, 1340, 1, 0, 0, 0, 1384, 1344, 1, 0, 0, 0, 1384, 1349, 1, 0, 0, 0, 1384, 1355, 1, 0, 0, 0, 1384, 1361, 1, 0, 0, 0, 1384, 1365, 1, 0, 0, 0, 1384, 1370, 1, 0, 0, 0, 1384, 1375, 1, 0, 0, 0, 1384, 1379, 1, 0, 0, 0, 1385, 140, 1, 0, 0, 0, 1386, 1387, 3, 205, 100, 0, 1387, 1388, 3, 217, 106, 0, 1388, 1389, 3, 207, 101, 0, 1389, 1390, 3, 235, 115, 0, 1390, 1391, 3, 109, 52, 0, 1391, 1392, 3, 225, 110, 0, 1392, 1393, 3, 201, 98, 0, 1393, 1394, 3, 239, 117, 0, 1394, 1395, 3, 205, 100, 0, 1395, 1396, 3, 215, 105, 0, 1396, 142, 1, 0, 0, 0, 1397, 1404, 3, 59, 27, 0, 1398, 1403, 3, 59, 27, 0, 1399, 1403, 3, 57, 26, 0, 1400, 1403, 5, 95, 0, 0, 1401, 1403, 3, 123, 59, 0, 1402, 1398, 1, 0, 0, 0, 1402, 1399, 1, 0, 0, 0, 1402, 1400, 1, 0, 0, 0, 1402, 1401, 1, 0, 0, 0, 1403, 1406, 1, 0, 0, 0, 1404, 1402, 1, 0, 0, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1417, 1, 0, 0, 0, 1406, 1404, 1, 0, 0, 0, 1407, 1412, 7, 8, 0, 0, 1408, 1413, 3, 59, 27, 0, 1409, 1413, 3, 57, 26, 0, 1410, 1413, 5, 95, 0, 0, 1411, 1413, 3, 123, 59, 0, 1412, 1408, 1, 0, 0, 0, 1412, 1409, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1417, 1, 0, 0, 0, 1416, 1397, 1, 0, 0, 0, 1416, 1407, 1, 0, 0, 0, 1417, 144, 1, 0, 0, 0, 1418, 1424, 5, 96, 0, 0, 1419, 1423, 8, 9, 0, 0, 1420, 1421, 5, 96, 0, 0, 1421, 1423, 5, 96, 0, 0, 1422, 1419, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1423, 1426, 1, 0, 0, 0, 1424, 1422, 1, 0, 0, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1427, 1, 0, 0, 0, 1426, 1424, 1, 0, 0, 0, 1427, 1428, 5, 96, 0, 0, 1428, 146, 1, 0, 0, 0, 1429, 1430, 3, 39, 17, 0, 1430, 1431, 1, 0, 0, 0, 1431, 1432, 6, 71, 4, 0, 1432, 148, 1, 0, 0, 0, 1433, 1434, 3, 41, 18, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 72, 4, 0, 1436, 150, 1, 0, 0, 0, 1437, 1438, 3, 43, 19, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1440, 6, 73, 4, 0, 1440, 152, 1, 0, 0, 0, 1441, 1442, 5, 124, 0, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1444, 6, 74, 7, 0, 1444, 1445, 6, 74, 8, 0, 1445, 154, 1, 0, 0, 0, 1446, 1447, 5, 91, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1449, 6, 75, 5, 0, 1449, 1450, 6, 75, 2, 0, 1450, 1451, 6, 75, 2, 0, 1451, 156, 1, 0, 0, 0, 1452, 1453, 5, 93, 0, 0, 1453, 1454, 1, 0, 0, 0, 1454, 1455, 6, 76, 8, 0, 1455, 1456, 6, 76, 8, 0, 1456, 1457, 6, 76, 9, 0, 1457, 158, 1, 0, 0, 0, 1458, 1459, 5, 44, 0, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 6, 77, 10, 0, 1461, 160, 1, 0, 0, 0, 1462, 1463, 5, 61, 0, 0, 1463, 1464, 1, 0, 0, 0, 1464, 1465, 6, 78, 11, 0, 1465, 162, 1, 0, 0, 0, 1466, 1467, 3, 225, 110, 0, 1467, 1468, 3, 209, 102, 0, 1468, 1469, 3, 239, 117, 0, 1469, 1470, 3, 201, 98, 0, 1470, 1471, 3, 207, 101, 0, 1471, 1472, 3, 201, 98, 0, 1472, 1473, 3, 239, 117, 0, 1473, 1474, 3, 201, 98, 0, 1474, 164, 1, 0, 0, 0, 1475, 1477, 3, 167, 81, 0, 1476, 1475, 1, 0, 0, 0, 1477, 1478, 1, 0, 0, 0, 1478, 1476, 1, 0, 0, 0, 1478, 1479, 1, 0, 0, 0, 1479, 166, 1, 0, 0, 0, 1480, 1482, 8, 10, 0, 0, 1481, 1480, 1, 0, 0, 0, 1482, 1483, 1, 0, 0, 0, 1483, 1481, 1, 0, 0, 0, 1483, 1484, 1, 0, 0, 0, 1484, 1488, 1, 0, 0, 0, 1485, 1486, 5, 47, 0, 0, 1486, 1488, 8, 11, 0, 0, 1487, 1481, 1, 0, 0, 0, 1487, 1485, 1, 0, 0, 0, 1488, 168, 1, 0, 0, 0, 1489, 1490, 3, 145, 70, 0, 1490, 170, 1, 0, 0, 0, 1491, 1492, 3, 39, 17, 0, 1492, 1493, 1, 0, 0, 0, 1493, 1494, 6, 83, 4, 0, 1494, 172, 1, 0, 0, 0, 1495, 1496, 3, 41, 18, 0, 1496, 1497, 1, 0, 0, 0, 1497, 1498, 6, 84, 4, 0, 1498, 174, 1, 0, 0, 0, 1499, 1500, 3, 43, 19, 0, 1500, 1501, 1, 0, 0, 0, 1501, 1502, 6, 85, 4, 0, 1502, 176, 1, 0, 0, 0, 1503, 1504, 3, 229, 112, 0, 1504, 1505, 3, 227, 111, 0, 1505, 178, 1, 0, 0, 0, 1506, 1507, 3, 245, 120, 0, 1507, 1508, 3, 217, 106, 0, 1508, 1509, 3, 239, 117, 0, 1509, 1510, 3, 215, 105, 0, 1510, 180, 1, 0, 0, 0, 1511, 1512, 5, 124, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1514, 6, 88, 7, 0, 1514, 1515, 6, 88, 8, 0, 1515, 182, 1, 0, 0, 0, 1516, 1517, 5, 93, 0, 0, 1517, 1518, 1, 0, 0, 0, 1518, 1519, 6, 89, 8, 0, 1519, 1520, 6, 89, 8, 0, 1520, 1521, 6, 89, 9, 0, 1521, 184, 1, 0, 0, 0, 1522, 1523, 5, 44, 0, 0, 1523, 1524, 1, 0, 0, 0, 1524, 1525, 6, 90, 10, 0, 1525, 186, 1, 0, 0, 0, 1526, 1527, 5, 61, 0, 0, 1527, 1528, 1, 0, 0, 0, 1528, 1529, 6, 91, 11, 0, 1529, 188, 1, 0, 0, 0, 1530, 1532, 3, 191, 93, 0, 1531, 1530, 1, 0, 0, 0, 1532, 1533, 1, 0, 0, 0, 1533, 1531, 1, 0, 0, 0, 1533, 1534, 1, 0, 0, 0, 1534, 190, 1, 0, 0, 0, 1535, 1537, 8, 10, 0, 0, 1536, 1535, 1, 0, 0, 0, 1537, 1538, 1, 0, 0, 0, 1538, 1536, 1, 0, 0, 0, 1538, 1539, 1, 0, 0, 0, 1539, 1543, 1, 0, 0, 0, 1540, 1541, 5, 47, 0, 0, 1541, 1543, 8, 11, 0, 0, 1542, 1536, 1, 0, 0, 0, 1542, 1540, 1, 0, 0, 0, 1543, 192, 1, 0, 0, 0, 1544, 1545, 3, 145, 70, 0, 1545, 194, 1, 0, 0, 0, 1546, 1547, 3, 39, 17, 0, 1547, 1548, 1, 0, 0, 0, 1548, 1549, 6, 95, 4, 0, 1549, 196, 1, 0, 0, 0, 1550, 1551, 3, 41, 18, 0, 1551, 1552, 1, 0, 0, 0, 1552, 1553, 6, 96, 4, 0, 1553, 198, 1, 0, 0, 0, 1554, 1555, 3, 43, 19, 0, 1555, 1556, 1, 0, 0, 0, 1556, 1557, 6, 97, 4, 0, 1557, 200, 1, 0, 0, 0, 1558, 1559, 7, 12, 0, 0, 1559, 202, 1, 0, 0, 0, 1560, 1561, 7, 13, 0, 0, 1561, 204, 1, 0, 0, 0, 1562, 1563, 7, 14, 0, 0, 1563, 206, 1, 0, 0, 0, 1564, 1565, 7, 15, 0, 0, 1565, 208, 1, 0, 0, 0, 1566, 1567, 7, 6, 0, 0, 1567, 210, 1, 0, 0, 0, 1568, 1569, 7, 16, 0, 0, 1569, 212, 1, 0, 0, 0, 1570, 1571, 7, 17, 0, 0, 1571, 214, 1, 0, 0, 0, 1572, 1573, 7, 18, 0, 0, 1573, 216, 1, 0, 0, 0, 1574, 1575, 7, 19, 0, 0, 1575, 218, 1, 0, 0, 0, 1576, 1577, 7, 20, 0, 0, 1577, 220, 1, 0, 0, 0, 1578, 1579, 7, 21, 0, 0, 1579, 222, 1, 0, 0, 0, 1580, 1581, 7, 22, 0, 0, 1581, 224, 1, 0, 0, 0, 1582, 1583, 7, 23, 0, 0, 1583, 226, 1, 0, 0, 0, 1584, 1585, 7, 24, 0, 0, 1585, 228, 1, 0, 0, 0, 1586, 1587, 7, 25, 0, 0, 1587, 230, 1, 0, 0, 0, 1588, 1589, 7, 26, 0, 0, 1589, 232, 1, 0, 0, 0, 1590, 1591, 7, 27, 0, 0, 1591, 234, 1, 0, 0, 0, 1592, 1593, 7, 28, 0, 0, 1593, 236, 1, 0, 0, 0, 1594, 1595, 7, 29, 0, 0, 1595, 238, 1, 0, 0, 0, 1596, 1597, 7, 30, 0, 0, 1597, 240, 1, 0, 0, 0, 1598, 1599, 7, 31, 0, 0, 1599, 242, 1, 0, 0, 0, 1600, 1601, 7, 32, 0, 0, 1601, 244, 1, 0, 0, 0, 1602, 1603, 7, 33, 0, 0, 1603, 246, 1, 0, 0, 0, 1604, 1605, 7, 34, 0, 0, 1605, 248, 1, 0, 0, 0, 1606, 1607, 7, 35, 0, 0, 1607, 250, 1, 0, 0, 0, 1608, 1609, 7, 36, 0, 0, 1609, 252, 1, 0, 0, 0, 48, 0, 1, 2, 3, 4, 398, 402, 405, 414, 416, 427, 468, 473, 478, 480, 491, 499, 502, 504, 509, 514, 520, 527, 532, 538, 541, 549, 553, 652, 736, 748, 770, 787, 1231, 1384, 1402, 1404, 1412, 1414, 1416, 1422, 1424, 1478, 1483, 1487, 1533, 1538, 1542, 12, 5, 2, 0, 5, 1, 0, 5, 3, 0, 5, 4, 0, 0, 1, 0, 7, 35, 0, 5, 0, 0, 7, 24, 0, 4, 0, 0, 7, 36, 0, 7, 32, 0, 7, 31, 0] \ No newline at end of file diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_lexer.java b/packages/kbn-esql/src/antlr/.antlr/esql_lexer.java deleted file mode 100644 index ac37718a22bcc..0000000000000 --- a/packages/kbn-esql/src/antlr/.antlr/esql_lexer.java +++ /dev/null @@ -1,1150 +0,0 @@ -// Generated from /Users/marcoliberati/Work/kibana/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 by ANTLR 4.13.1 -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) -public class esql_lexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - DISSECT=1, GROK=2, EVAL=3, EXPLAIN=4, FROM=5, ROW=6, STATS=7, WHERE=8, - SORT=9, MV_EXPAND=10, LIMIT=11, PROJECT=12, DROP=13, RENAME=14, SHOW=15, - ENRICH=16, KEEP=17, LINE_COMMENT=18, MULTILINE_COMMENT=19, WS=20, EXPLAIN_WS=21, - EXPLAIN_LINE_COMMENT=22, EXPLAIN_MULTILINE_COMMENT=23, PIPE=24, STRING=25, - INTEGER_LITERAL=26, DECIMAL_LITERAL=27, BY=28, DATE_LITERAL=29, AND=30, - ASSIGN=31, COMMA=32, DOT=33, LP=34, OPENING_BRACKET=35, CLOSING_BRACKET=36, - NOT=37, LIKE=38, RLIKE=39, IN=40, IS=41, AS=42, NULL=43, OR=44, RP=45, - UNDERSCORE=46, INFO=47, FUNCTIONS=48, BOOLEAN_VALUE=49, COMPARISON_OPERATOR=50, - PLUS=51, MINUS=52, ASTERISK=53, SLASH=54, PERCENT=55, TEN=56, ORDERING=57, - NULLS_ORDERING=58, NULLS_ORDERING_DIRECTION=59, MATH_FUNCTION=60, UNARY_FUNCTION=61, - WHERE_FUNCTIONS=62, UNQUOTED_IDENTIFIER=63, QUOTED_IDENTIFIER=64, EXPR_LINE_COMMENT=65, - EXPR_MULTILINE_COMMENT=66, EXPR_WS=67, METADATA=68, SRC_UNQUOTED_IDENTIFIER=69, - SRC_QUOTED_IDENTIFIER=70, SRC_LINE_COMMENT=71, SRC_MULTILINE_COMMENT=72, - SRC_WS=73, ON=74, WITH=75, ENR_UNQUOTED_IDENTIFIER=76, ENR_QUOTED_IDENTIFIER=77, - ENR_LINE_COMMENT=78, ENR_MULTILINE_COMMENT=79, ENR_WS=80, EXPLAIN_PIPE=81; - public static final int - EXPLAIN_MODE=1, EXPRESSION=2, SOURCE_IDENTIFIERS=3, ENRICH_IDENTIFIERS=4; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN" - }; - - public static String[] modeNames = { - "DEFAULT_MODE", "EXPLAIN_MODE", "EXPRESSION", "SOURCE_IDENTIFIERS", "ENRICH_IDENTIFIERS" - }; - - private static String[] makeRuleNames() { - return new String[] { - "DISSECT", "GROK", "EVAL", "EXPLAIN", "FROM", "ROW", "STATS", "WHERE", - "SORT", "MV_EXPAND", "LIMIT", "PROJECT", "DROP", "RENAME", "SHOW", "ENRICH", - "KEEP", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "EXPLAIN_OPENING_BRACKET", - "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", - "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "DATE_LITERAL", - "AND", "ASSIGN", "COMMA", "DOT", "LP", "OPENING_BRACKET", "CLOSING_BRACKET", - "NOT", "LIKE", "RLIKE", "IN", "IS", "AS", "NULL", "OR", "RP", "UNDERSCORE", - "INFO", "FUNCTIONS", "BOOLEAN_VALUE", "COMPARISON_OPERATOR", "PLUS", - "MINUS", "ASTERISK", "SLASH", "PERCENT", "TEN", "ORDERING", "NULLS_ORDERING", - "NULLS_ORDERING_DIRECTION", "MATH_FUNCTION", "UNARY_FUNCTION", "WHERE_FUNCTIONS", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "SRC_PIPE", "SRC_OPENING_BRACKET", "SRC_CLOSING_BRACKET", - "SRC_COMMA", "SRC_ASSIGN", "METADATA", "SRC_UNQUOTED_IDENTIFIER", "SRC_UNQUOTED_IDENTIFIER_PART", - "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", - "SRC_WS", "ON", "WITH", "ENR_PIPE", "ENR_CLOSING_BRACKET", "ENR_COMMA", - "ENR_ASSIGN", "ENR_UNQUOTED_IDENTIFIER", "ENR_UNQUOTED_IDENTIFIER_PART", - "ENR_QUOTED_IDENTIFIER", "ENR_LINE_COMMENT", "ENR_MULTILINE_COMMENT", - "ENR_WS", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", - "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, "'by'", null, "'and'", null, null, "'.'", "'('", - null, "']'", null, null, null, null, null, null, null, "'or'", "')'", - "'_'", "'info'", "'functions'", null, null, "'+'", "'-'", "'*'", "'/'", - "'%'", "'10'", null, "'nulls'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "DISSECT", "GROK", "EVAL", "EXPLAIN", "FROM", "ROW", "STATS", "WHERE", - "SORT", "MV_EXPAND", "LIMIT", "PROJECT", "DROP", "RENAME", "SHOW", "ENRICH", - "KEEP", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", - "EXPLAIN_MULTILINE_COMMENT", "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", - "BY", "DATE_LITERAL", "AND", "ASSIGN", "COMMA", "DOT", "LP", "OPENING_BRACKET", - "CLOSING_BRACKET", "NOT", "LIKE", "RLIKE", "IN", "IS", "AS", "NULL", - "OR", "RP", "UNDERSCORE", "INFO", "FUNCTIONS", "BOOLEAN_VALUE", "COMPARISON_OPERATOR", - "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "TEN", "ORDERING", "NULLS_ORDERING", - "NULLS_ORDERING_DIRECTION", "MATH_FUNCTION", "UNARY_FUNCTION", "WHERE_FUNCTIONS", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "METADATA", "SRC_UNQUOTED_IDENTIFIER", "SRC_QUOTED_IDENTIFIER", - "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", "SRC_WS", "ON", "WITH", - "ENR_UNQUOTED_IDENTIFIER", "ENR_QUOTED_IDENTIFIER", "ENR_LINE_COMMENT", - "ENR_MULTILINE_COMMENT", "ENR_WS", "EXPLAIN_PIPE" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - public esql_lexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "esql_lexer.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - public static final String _serializedATN = - "\u0004\u0000Q\u064a\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ - "\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ - "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ - "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ - "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ - "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ - "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ - "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ - "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ - "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ - "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ - "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ - "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ - "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ - "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ - "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ - "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ - ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ - "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ - "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ - "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ - "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ - "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ - "X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007"+ - "]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007"+ - "b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007"+ - "g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007"+ - "l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007"+ - "q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002v\u0007"+ - "v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002{\u0007"+ - "{\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+ - "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0005\u0011\u018d\b\u0011\n\u0011\f\u0011"+ - "\u0190\t\u0011\u0001\u0011\u0003\u0011\u0193\b\u0011\u0001\u0011\u0003"+ - "\u0011\u0196\b\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0005\u0012\u019f\b\u0012\n\u0012\f\u0012"+ - "\u01a2\t\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0013\u0004\u0013\u01aa\b\u0013\u000b\u0013\f\u0013\u01ab\u0001"+ - "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001"+ - "\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001"+ - "\u001d\u0001\u001e\u0001\u001e\u0003\u001e\u01d5\b\u001e\u0001\u001e\u0004"+ - "\u001e\u01d8\b\u001e\u000b\u001e\f\u001e\u01d9\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0005\u001f\u01df\b\u001f\n\u001f\f\u001f\u01e2\t\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005"+ - "\u001f\u01ea\b\u001f\n\u001f\f\u001f\u01ed\t\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u01f4\b\u001f\u0001\u001f"+ - "\u0003\u001f\u01f7\b\u001f\u0003\u001f\u01f9\b\u001f\u0001 \u0004 \u01fc"+ - "\b \u000b \f \u01fd\u0001!\u0004!\u0201\b!\u000b!\f!\u0202\u0001!\u0001"+ - "!\u0005!\u0207\b!\n!\f!\u020a\t!\u0001!\u0001!\u0004!\u020e\b!\u000b!"+ - "\f!\u020f\u0001!\u0004!\u0213\b!\u000b!\f!\u0214\u0001!\u0001!\u0005!"+ - "\u0219\b!\n!\f!\u021c\t!\u0003!\u021e\b!\u0001!\u0001!\u0001!\u0001!\u0004"+ - "!\u0224\b!\u000b!\f!\u0225\u0001!\u0001!\u0003!\u022a\b!\u0001\"\u0001"+ - "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0003#\u028d\b#\u0001$\u0001$\u0001"+ - "$\u0001$\u0001%\u0001%\u0001&\u0001&\u0001\'\u0001\'\u0001(\u0001(\u0001"+ - ")\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ - "+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ - "/\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ - "2\u00012\u00013\u00013\u00014\u00014\u00015\u00015\u00015\u00015\u0001"+ - "5\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ - "6\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0003"+ - "7\u02e1\b7\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ - "8\u00018\u00038\u02ed\b8\u00019\u00019\u0001:\u0001:\u0001;\u0001;\u0001"+ - "<\u0001<\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001"+ - "?\u0001?\u0001?\u0001?\u0003?\u0303\b?\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ - "A\u0003A\u0314\bA\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0003B\u04d0\bB\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0003C\u0569\bC\u0001"+ - "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "D\u0001E\u0001E\u0001E\u0001E\u0001E\u0005E\u057b\bE\nE\fE\u057e\tE\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0004E\u0585\bE\u000bE\fE\u0586\u0003E\u0589"+ - "\bE\u0001F\u0001F\u0001F\u0001F\u0005F\u058f\bF\nF\fF\u0592\tF\u0001F"+ - "\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ - "I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ - "K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ - "O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0004P\u05c5"+ - "\bP\u000bP\fP\u05c6\u0001Q\u0004Q\u05ca\bQ\u000bQ\fQ\u05cb\u0001Q\u0001"+ - "Q\u0003Q\u05d0\bQ\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001T\u0001"+ - "T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001"+ - "W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "[\u0001[\u0001[\u0001[\u0001\\\u0004\\\u05fc\b\\\u000b\\\f\\\u05fd\u0001"+ - "]\u0004]\u0601\b]\u000b]\f]\u0602\u0001]\u0001]\u0003]\u0607\b]\u0001"+ - "^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001"+ - "a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001c\u0001c\u0001d\u0001d\u0001"+ - "e\u0001e\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001"+ - "j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001n\u0001n\u0001"+ - "o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001r\u0001r\u0001s\u0001s\u0001"+ - "t\u0001t\u0001u\u0001u\u0001v\u0001v\u0001w\u0001w\u0001x\u0001x\u0001"+ - "y\u0001y\u0001z\u0001z\u0001{\u0001{\u0002\u01a0\u01eb\u0000|\u0005\u0001"+ - "\u0007\u0002\t\u0003\u000b\u0004\r\u0005\u000f\u0006\u0011\u0007\u0013"+ - "\b\u0015\t\u0017\n\u0019\u000b\u001b\f\u001d\r\u001f\u000e!\u000f#\u0010"+ - "%\u0011\'\u0012)\u0013+\u0014-\u0000/Q1\u00153\u00165\u00177\u00189\u0000"+ - ";\u0000=\u0000?\u0000A\u0000C\u0019E\u001aG\u001bI\u001cK\u001dM\u001e"+ - "O\u001fQ S!U\"W#Y$[%]&_\'a(c)e*g+i,k-m.o/q0s1u2w3y4{5}6\u007f7\u00818"+ - "\u00839\u0085:\u0087;\u0089<\u008b=\u008d>\u008f?\u0091@\u0093A\u0095"+ - "B\u0097C\u0099\u0000\u009b\u0000\u009d\u0000\u009f\u0000\u00a1\u0000\u00a3"+ - "D\u00a5E\u00a7\u0000\u00a9F\u00abG\u00adH\u00afI\u00b1J\u00b3K\u00b5\u0000"+ - "\u00b7\u0000\u00b9\u0000\u00bb\u0000\u00bdL\u00bf\u0000\u00c1M\u00c3N"+ - "\u00c5O\u00c7P\u00c9\u0000\u00cb\u0000\u00cd\u0000\u00cf\u0000\u00d1\u0000"+ - "\u00d3\u0000\u00d5\u0000\u00d7\u0000\u00d9\u0000\u00db\u0000\u00dd\u0000"+ - "\u00df\u0000\u00e1\u0000\u00e3\u0000\u00e5\u0000\u00e7\u0000\u00e9\u0000"+ - "\u00eb\u0000\u00ed\u0000\u00ef\u0000\u00f1\u0000\u00f3\u0000\u00f5\u0000"+ - "\u00f7\u0000\u00f9\u0000\u00fb\u0000\u0005\u0000\u0001\u0002\u0003\u0004"+ - "%\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0001\u000009\u0002\u0000"+ - "AZaz\u0005\u0000\"\"\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000"+ - "EEee\u0002\u0000++--\u0002\u0000@@__\u0001\u0000``\n\u0000\t\n\r\r ,"+ - ",//==[[]]``||\u0002\u0000**//\u0002\u0000AAaa\u0002\u0000BBbb\u0002\u0000"+ - "CCcc\u0002\u0000DDdd\u0002\u0000FFff\u0002\u0000GGgg\u0002\u0000HHhh\u0002"+ - "\u0000IIii\u0002\u0000JJjj\u0002\u0000KKkk\u0002\u0000LLll\u0002\u0000"+ - "MMmm\u0002\u0000NNnn\u0002\u0000OOoo\u0002\u0000PPpp\u0002\u0000QQqq\u0002"+ - "\u0000RRrr\u0002\u0000SSss\u0002\u0000TTtt\u0002\u0000UUuu\u0002\u0000"+ - "VVvv\u0002\u0000WWww\u0002\u0000XXxx\u0002\u0000YYyy\u0002\u0000ZZzz\u06af"+ - "\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000"+ - "\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000"+ - "\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011"+ - "\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015"+ - "\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019"+ - "\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d"+ - "\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001"+ - "\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000"+ - "\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000"+ - "\u0000+\u0001\u0000\u0000\u0000\u0001-\u0001\u0000\u0000\u0000\u0001/"+ - "\u0001\u0000\u0000\u0000\u00011\u0001\u0000\u0000\u0000\u00013\u0001\u0000"+ - "\u0000\u0000\u00015\u0001\u0000\u0000\u0000\u00027\u0001\u0000\u0000\u0000"+ - "\u0002C\u0001\u0000\u0000\u0000\u0002E\u0001\u0000\u0000\u0000\u0002G"+ - "\u0001\u0000\u0000\u0000\u0002I\u0001\u0000\u0000\u0000\u0002K\u0001\u0000"+ - "\u0000\u0000\u0002M\u0001\u0000\u0000\u0000\u0002O\u0001\u0000\u0000\u0000"+ - "\u0002Q\u0001\u0000\u0000\u0000\u0002S\u0001\u0000\u0000\u0000\u0002U"+ - "\u0001\u0000\u0000\u0000\u0002W\u0001\u0000\u0000\u0000\u0002Y\u0001\u0000"+ - "\u0000\u0000\u0002[\u0001\u0000\u0000\u0000\u0002]\u0001\u0000\u0000\u0000"+ - "\u0002_\u0001\u0000\u0000\u0000\u0002a\u0001\u0000\u0000\u0000\u0002c"+ - "\u0001\u0000\u0000\u0000\u0002e\u0001\u0000\u0000\u0000\u0002g\u0001\u0000"+ - "\u0000\u0000\u0002i\u0001\u0000\u0000\u0000\u0002k\u0001\u0000\u0000\u0000"+ - "\u0002m\u0001\u0000\u0000\u0000\u0002o\u0001\u0000\u0000\u0000\u0002q"+ - "\u0001\u0000\u0000\u0000\u0002s\u0001\u0000\u0000\u0000\u0002u\u0001\u0000"+ - "\u0000\u0000\u0002w\u0001\u0000\u0000\u0000\u0002y\u0001\u0000\u0000\u0000"+ - "\u0002{\u0001\u0000\u0000\u0000\u0002}\u0001\u0000\u0000\u0000\u0002\u007f"+ - "\u0001\u0000\u0000\u0000\u0002\u0081\u0001\u0000\u0000\u0000\u0002\u0083"+ - "\u0001\u0000\u0000\u0000\u0002\u0085\u0001\u0000\u0000\u0000\u0002\u0087"+ - "\u0001\u0000\u0000\u0000\u0002\u0089\u0001\u0000\u0000\u0000\u0002\u008b"+ - "\u0001\u0000\u0000\u0000\u0002\u008d\u0001\u0000\u0000\u0000\u0002\u008f"+ - "\u0001\u0000\u0000\u0000\u0002\u0091\u0001\u0000\u0000\u0000\u0002\u0093"+ - "\u0001\u0000\u0000\u0000\u0002\u0095\u0001\u0000\u0000\u0000\u0002\u0097"+ - "\u0001\u0000\u0000\u0000\u0003\u0099\u0001\u0000\u0000\u0000\u0003\u009b"+ - "\u0001\u0000\u0000\u0000\u0003\u009d\u0001\u0000\u0000\u0000\u0003\u009f"+ - "\u0001\u0000\u0000\u0000\u0003\u00a1\u0001\u0000\u0000\u0000\u0003\u00a3"+ - "\u0001\u0000\u0000\u0000\u0003\u00a5\u0001\u0000\u0000\u0000\u0003\u00a9"+ - "\u0001\u0000\u0000\u0000\u0003\u00ab\u0001\u0000\u0000\u0000\u0003\u00ad"+ - "\u0001\u0000\u0000\u0000\u0003\u00af\u0001\u0000\u0000\u0000\u0004\u00b1"+ - "\u0001\u0000\u0000\u0000\u0004\u00b3\u0001\u0000\u0000\u0000\u0004\u00b5"+ - "\u0001\u0000\u0000\u0000\u0004\u00b7\u0001\u0000\u0000\u0000\u0004\u00b9"+ - "\u0001\u0000\u0000\u0000\u0004\u00bb\u0001\u0000\u0000\u0000\u0004\u00bd"+ - "\u0001\u0000\u0000\u0000\u0004\u00c1\u0001\u0000\u0000\u0000\u0004\u00c3"+ - "\u0001\u0000\u0000\u0000\u0004\u00c5\u0001\u0000\u0000\u0000\u0004\u00c7"+ - "\u0001\u0000\u0000\u0000\u0005\u00fd\u0001\u0000\u0000\u0000\u0007\u0107"+ - "\u0001\u0000\u0000\u0000\t\u010e\u0001\u0000\u0000\u0000\u000b\u0115\u0001"+ - "\u0000\u0000\u0000\r\u011f\u0001\u0000\u0000\u0000\u000f\u0126\u0001\u0000"+ - "\u0000\u0000\u0011\u012c\u0001\u0000\u0000\u0000\u0013\u0134\u0001\u0000"+ - "\u0000\u0000\u0015\u013c\u0001\u0000\u0000\u0000\u0017\u0143\u0001\u0000"+ - "\u0000\u0000\u0019\u014f\u0001\u0000\u0000\u0000\u001b\u0157\u0001\u0000"+ - "\u0000\u0000\u001d\u0161\u0001\u0000\u0000\u0000\u001f\u0168\u0001\u0000"+ - "\u0000\u0000!\u0171\u0001\u0000\u0000\u0000#\u0178\u0001\u0000\u0000\u0000"+ - "%\u0181\u0001\u0000\u0000\u0000\'\u0188\u0001\u0000\u0000\u0000)\u0199"+ - "\u0001\u0000\u0000\u0000+\u01a9\u0001\u0000\u0000\u0000-\u01af\u0001\u0000"+ - "\u0000\u0000/\u01b4\u0001\u0000\u0000\u00001\u01b9\u0001\u0000\u0000\u0000"+ - "3\u01bd\u0001\u0000\u0000\u00005\u01c1\u0001\u0000\u0000\u00007\u01c5"+ - "\u0001\u0000\u0000\u00009\u01c9\u0001\u0000\u0000\u0000;\u01cb\u0001\u0000"+ - "\u0000\u0000=\u01cd\u0001\u0000\u0000\u0000?\u01d0\u0001\u0000\u0000\u0000"+ - "A\u01d2\u0001\u0000\u0000\u0000C\u01f8\u0001\u0000\u0000\u0000E\u01fb"+ - "\u0001\u0000\u0000\u0000G\u0229\u0001\u0000\u0000\u0000I\u022b\u0001\u0000"+ - "\u0000\u0000K\u028c\u0001\u0000\u0000\u0000M\u028e\u0001\u0000\u0000\u0000"+ - "O\u0292\u0001\u0000\u0000\u0000Q\u0294\u0001\u0000\u0000\u0000S\u0296"+ - "\u0001\u0000\u0000\u0000U\u0298\u0001\u0000\u0000\u0000W\u029a\u0001\u0000"+ - "\u0000\u0000Y\u029f\u0001\u0000\u0000\u0000[\u02a4\u0001\u0000\u0000\u0000"+ - "]\u02a8\u0001\u0000\u0000\u0000_\u02ad\u0001\u0000\u0000\u0000a\u02b3"+ - "\u0001\u0000\u0000\u0000c\u02b6\u0001\u0000\u0000\u0000e\u02b9\u0001\u0000"+ - "\u0000\u0000g\u02bc\u0001\u0000\u0000\u0000i\u02c1\u0001\u0000\u0000\u0000"+ - "k\u02c4\u0001\u0000\u0000\u0000m\u02c6\u0001\u0000\u0000\u0000o\u02c8"+ - "\u0001\u0000\u0000\u0000q\u02cd\u0001\u0000\u0000\u0000s\u02e0\u0001\u0000"+ - "\u0000\u0000u\u02ec\u0001\u0000\u0000\u0000w\u02ee\u0001\u0000\u0000\u0000"+ - "y\u02f0\u0001\u0000\u0000\u0000{\u02f2\u0001\u0000\u0000\u0000}\u02f4"+ - "\u0001\u0000\u0000\u0000\u007f\u02f6\u0001\u0000\u0000\u0000\u0081\u02f8"+ - "\u0001\u0000\u0000\u0000\u0083\u0302\u0001\u0000\u0000\u0000\u0085\u0304"+ - "\u0001\u0000\u0000\u0000\u0087\u0313\u0001\u0000\u0000\u0000\u0089\u04cf"+ - "\u0001\u0000\u0000\u0000\u008b\u0568\u0001\u0000\u0000\u0000\u008d\u056a"+ - "\u0001\u0000\u0000\u0000\u008f\u0588\u0001\u0000\u0000\u0000\u0091\u058a"+ - "\u0001\u0000\u0000\u0000\u0093\u0595\u0001\u0000\u0000\u0000\u0095\u0599"+ - "\u0001\u0000\u0000\u0000\u0097\u059d\u0001\u0000\u0000\u0000\u0099\u05a1"+ - "\u0001\u0000\u0000\u0000\u009b\u05a6\u0001\u0000\u0000\u0000\u009d\u05ac"+ - "\u0001\u0000\u0000\u0000\u009f\u05b2\u0001\u0000\u0000\u0000\u00a1\u05b6"+ - "\u0001\u0000\u0000\u0000\u00a3\u05ba\u0001\u0000\u0000\u0000\u00a5\u05c4"+ - "\u0001\u0000\u0000\u0000\u00a7\u05cf\u0001\u0000\u0000\u0000\u00a9\u05d1"+ - "\u0001\u0000\u0000\u0000\u00ab\u05d3\u0001\u0000\u0000\u0000\u00ad\u05d7"+ - "\u0001\u0000\u0000\u0000\u00af\u05db\u0001\u0000\u0000\u0000\u00b1\u05df"+ - "\u0001\u0000\u0000\u0000\u00b3\u05e2\u0001\u0000\u0000\u0000\u00b5\u05e7"+ - "\u0001\u0000\u0000\u0000\u00b7\u05ec\u0001\u0000\u0000\u0000\u00b9\u05f2"+ - "\u0001\u0000\u0000\u0000\u00bb\u05f6\u0001\u0000\u0000\u0000\u00bd\u05fb"+ - "\u0001\u0000\u0000\u0000\u00bf\u0606\u0001\u0000\u0000\u0000\u00c1\u0608"+ - "\u0001\u0000\u0000\u0000\u00c3\u060a\u0001\u0000\u0000\u0000\u00c5\u060e"+ - "\u0001\u0000\u0000\u0000\u00c7\u0612\u0001\u0000\u0000\u0000\u00c9\u0616"+ - "\u0001\u0000\u0000\u0000\u00cb\u0618\u0001\u0000\u0000\u0000\u00cd\u061a"+ - "\u0001\u0000\u0000\u0000\u00cf\u061c\u0001\u0000\u0000\u0000\u00d1\u061e"+ - "\u0001\u0000\u0000\u0000\u00d3\u0620\u0001\u0000\u0000\u0000\u00d5\u0622"+ - "\u0001\u0000\u0000\u0000\u00d7\u0624\u0001\u0000\u0000\u0000\u00d9\u0626"+ - "\u0001\u0000\u0000\u0000\u00db\u0628\u0001\u0000\u0000\u0000\u00dd\u062a"+ - "\u0001\u0000\u0000\u0000\u00df\u062c\u0001\u0000\u0000\u0000\u00e1\u062e"+ - "\u0001\u0000\u0000\u0000\u00e3\u0630\u0001\u0000\u0000\u0000\u00e5\u0632"+ - "\u0001\u0000\u0000\u0000\u00e7\u0634\u0001\u0000\u0000\u0000\u00e9\u0636"+ - "\u0001\u0000\u0000\u0000\u00eb\u0638\u0001\u0000\u0000\u0000\u00ed\u063a"+ - "\u0001\u0000\u0000\u0000\u00ef\u063c\u0001\u0000\u0000\u0000\u00f1\u063e"+ - "\u0001\u0000\u0000\u0000\u00f3\u0640\u0001\u0000\u0000\u0000\u00f5\u0642"+ - "\u0001\u0000\u0000\u0000\u00f7\u0644\u0001\u0000\u0000\u0000\u00f9\u0646"+ - "\u0001\u0000\u0000\u0000\u00fb\u0648\u0001\u0000\u0000\u0000\u00fd\u00fe"+ - "\u0003\u00cfe\u0000\u00fe\u00ff\u0003\u00d9j\u0000\u00ff\u0100\u0003\u00ed"+ - "t\u0000\u0100\u0101\u0003\u00edt\u0000\u0101\u0102\u0003\u00d1f\u0000"+ - "\u0102\u0103\u0003\u00cdd\u0000\u0103\u0104\u0003\u00efu\u0000\u0104\u0105"+ - "\u0001\u0000\u0000\u0000\u0105\u0106\u0006\u0000\u0000\u0000\u0106\u0006"+ - "\u0001\u0000\u0000\u0000\u0107\u0108\u0003\u00d5h\u0000\u0108\u0109\u0003"+ - "\u00ebs\u0000\u0109\u010a\u0003\u00e5p\u0000\u010a\u010b\u0003\u00ddl"+ - "\u0000\u010b\u010c\u0001\u0000\u0000\u0000\u010c\u010d\u0006\u0001\u0000"+ - "\u0000\u010d\b\u0001\u0000\u0000\u0000\u010e\u010f\u0003\u00d1f\u0000"+ - "\u010f\u0110\u0003\u00f3w\u0000\u0110\u0111\u0003\u00c9b\u0000\u0111\u0112"+ - "\u0003\u00dfm\u0000\u0112\u0113\u0001\u0000\u0000\u0000\u0113\u0114\u0006"+ - "\u0002\u0000\u0000\u0114\n\u0001\u0000\u0000\u0000\u0115\u0116\u0003\u00d1"+ - "f\u0000\u0116\u0117\u0003\u00f7y\u0000\u0117\u0118\u0003\u00e7q\u0000"+ - "\u0118\u0119\u0003\u00dfm\u0000\u0119\u011a\u0003\u00c9b\u0000\u011a\u011b"+ - "\u0003\u00d9j\u0000\u011b\u011c\u0003\u00e3o\u0000\u011c\u011d\u0001\u0000"+ - "\u0000\u0000\u011d\u011e\u0006\u0003\u0001\u0000\u011e\f\u0001\u0000\u0000"+ - "\u0000\u011f\u0120\u0003\u00d3g\u0000\u0120\u0121\u0003\u00ebs\u0000\u0121"+ - "\u0122\u0003\u00e5p\u0000\u0122\u0123\u0003\u00e1n\u0000\u0123\u0124\u0001"+ - "\u0000\u0000\u0000\u0124\u0125\u0006\u0004\u0002\u0000\u0125\u000e\u0001"+ - "\u0000\u0000\u0000\u0126\u0127\u0003\u00ebs\u0000\u0127\u0128\u0003\u00e5"+ - "p\u0000\u0128\u0129\u0003\u00f5x\u0000\u0129\u012a\u0001\u0000\u0000\u0000"+ - "\u012a\u012b\u0006\u0005\u0000\u0000\u012b\u0010\u0001\u0000\u0000\u0000"+ - "\u012c\u012d\u0003\u00edt\u0000\u012d\u012e\u0003\u00efu\u0000\u012e\u012f"+ - "\u0003\u00c9b\u0000\u012f\u0130\u0003\u00efu\u0000\u0130\u0131\u0003\u00ed"+ - "t\u0000\u0131\u0132\u0001\u0000\u0000\u0000\u0132\u0133\u0006\u0006\u0000"+ - "\u0000\u0133\u0012\u0001\u0000\u0000\u0000\u0134\u0135\u0003\u00f5x\u0000"+ - "\u0135\u0136\u0003\u00d7i\u0000\u0136\u0137\u0003\u00d1f\u0000\u0137\u0138"+ - "\u0003\u00ebs\u0000\u0138\u0139\u0003\u00d1f\u0000\u0139\u013a\u0001\u0000"+ - "\u0000\u0000\u013a\u013b\u0006\u0007\u0000\u0000\u013b\u0014\u0001\u0000"+ - "\u0000\u0000\u013c\u013d\u0003\u00edt\u0000\u013d\u013e\u0003\u00e5p\u0000"+ - "\u013e\u013f\u0003\u00ebs\u0000\u013f\u0140\u0003\u00efu\u0000\u0140\u0141"+ - "\u0001\u0000\u0000\u0000\u0141\u0142\u0006\b\u0000\u0000\u0142\u0016\u0001"+ - "\u0000\u0000\u0000\u0143\u0144\u0003\u00e1n\u0000\u0144\u0145\u0003\u00f3"+ - "w\u0000\u0145\u0146\u0003m4\u0000\u0146\u0147\u0003\u00d1f\u0000\u0147"+ - "\u0148\u0003\u00f7y\u0000\u0148\u0149\u0003\u00e7q\u0000\u0149\u014a\u0003"+ - "\u00c9b\u0000\u014a\u014b\u0003\u00e3o\u0000\u014b\u014c\u0003\u00cfe"+ - "\u0000\u014c\u014d\u0001\u0000\u0000\u0000\u014d\u014e\u0006\t\u0000\u0000"+ - "\u014e\u0018\u0001\u0000\u0000\u0000\u014f\u0150\u0003\u00dfm\u0000\u0150"+ - "\u0151\u0003\u00d9j\u0000\u0151\u0152\u0003\u00e1n\u0000\u0152\u0153\u0003"+ - "\u00d9j\u0000\u0153\u0154\u0003\u00efu\u0000\u0154\u0155\u0001\u0000\u0000"+ - "\u0000\u0155\u0156\u0006\n\u0000\u0000\u0156\u001a\u0001\u0000\u0000\u0000"+ - "\u0157\u0158\u0003\u00e7q\u0000\u0158\u0159\u0003\u00ebs\u0000\u0159\u015a"+ - "\u0003\u00e5p\u0000\u015a\u015b\u0003\u00dbk\u0000\u015b\u015c\u0003\u00d1"+ - "f\u0000\u015c\u015d\u0003\u00cdd\u0000\u015d\u015e\u0003\u00efu\u0000"+ - "\u015e\u015f\u0001\u0000\u0000\u0000\u015f\u0160\u0006\u000b\u0000\u0000"+ - "\u0160\u001c\u0001\u0000\u0000\u0000\u0161\u0162\u0003\u00cfe\u0000\u0162"+ - "\u0163\u0003\u00ebs\u0000\u0163\u0164\u0003\u00e5p\u0000\u0164\u0165\u0003"+ - "\u00e7q\u0000\u0165\u0166\u0001\u0000\u0000\u0000\u0166\u0167\u0006\f"+ - "\u0000\u0000\u0167\u001e\u0001\u0000\u0000\u0000\u0168\u0169\u0003\u00eb"+ - "s\u0000\u0169\u016a\u0003\u00d1f\u0000\u016a\u016b\u0003\u00e3o\u0000"+ - "\u016b\u016c\u0003\u00c9b\u0000\u016c\u016d\u0003\u00e1n\u0000\u016d\u016e"+ - "\u0003\u00d1f\u0000\u016e\u016f\u0001\u0000\u0000\u0000\u016f\u0170\u0006"+ - "\r\u0000\u0000\u0170 \u0001\u0000\u0000\u0000\u0171\u0172\u0003\u00ed"+ - "t\u0000\u0172\u0173\u0003\u00d7i\u0000\u0173\u0174\u0003\u00e5p\u0000"+ - "\u0174\u0175\u0003\u00f5x\u0000\u0175\u0176\u0001\u0000\u0000\u0000\u0176"+ - "\u0177\u0006\u000e\u0000\u0000\u0177\"\u0001\u0000\u0000\u0000\u0178\u0179"+ - "\u0003\u00d1f\u0000\u0179\u017a\u0003\u00e3o\u0000\u017a\u017b\u0003\u00eb"+ - "s\u0000\u017b\u017c\u0003\u00d9j\u0000\u017c\u017d\u0003\u00cdd\u0000"+ - "\u017d\u017e\u0003\u00d7i\u0000\u017e\u017f\u0001\u0000\u0000\u0000\u017f"+ - "\u0180\u0006\u000f\u0003\u0000\u0180$\u0001\u0000\u0000\u0000\u0181\u0182"+ - "\u0003\u00ddl\u0000\u0182\u0183\u0003\u00d1f\u0000\u0183\u0184\u0003\u00d1"+ - "f\u0000\u0184\u0185\u0003\u00e7q\u0000\u0185\u0186\u0001\u0000\u0000\u0000"+ - "\u0186\u0187\u0006\u0010\u0000\u0000\u0187&\u0001\u0000\u0000\u0000\u0188"+ - "\u0189\u0005/\u0000\u0000\u0189\u018a\u0005/\u0000\u0000\u018a\u018e\u0001"+ - "\u0000\u0000\u0000\u018b\u018d\b\u0000\u0000\u0000\u018c\u018b\u0001\u0000"+ - "\u0000\u0000\u018d\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000"+ - "\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f\u0192\u0001\u0000"+ - "\u0000\u0000\u0190\u018e\u0001\u0000\u0000\u0000\u0191\u0193\u0005\r\u0000"+ - "\u0000\u0192\u0191\u0001\u0000\u0000\u0000\u0192\u0193\u0001\u0000\u0000"+ - "\u0000\u0193\u0195\u0001\u0000\u0000\u0000\u0194\u0196\u0005\n\u0000\u0000"+ - "\u0195\u0194\u0001\u0000\u0000\u0000\u0195\u0196\u0001\u0000\u0000\u0000"+ - "\u0196\u0197\u0001\u0000\u0000\u0000\u0197\u0198\u0006\u0011\u0004\u0000"+ - "\u0198(\u0001\u0000\u0000\u0000\u0199\u019a\u0005/\u0000\u0000\u019a\u019b"+ - "\u0005*\u0000\u0000\u019b\u01a0\u0001\u0000\u0000\u0000\u019c\u019f\u0003"+ - ")\u0012\u0000\u019d\u019f\t\u0000\u0000\u0000\u019e\u019c\u0001\u0000"+ - "\u0000\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019f\u01a2\u0001\u0000"+ - "\u0000\u0000\u01a0\u01a1\u0001\u0000\u0000\u0000\u01a0\u019e\u0001\u0000"+ - "\u0000\u0000\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000"+ - "\u0000\u0000\u01a3\u01a4\u0005*\u0000\u0000\u01a4\u01a5\u0005/\u0000\u0000"+ - "\u01a5\u01a6\u0001\u0000\u0000\u0000\u01a6\u01a7\u0006\u0012\u0004\u0000"+ - "\u01a7*\u0001\u0000\u0000\u0000\u01a8\u01aa\u0007\u0001\u0000\u0000\u01a9"+ - "\u01a8\u0001\u0000\u0000\u0000\u01aa\u01ab\u0001\u0000\u0000\u0000\u01ab"+ - "\u01a9\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000\u01ac"+ - "\u01ad\u0001\u0000\u0000\u0000\u01ad\u01ae\u0006\u0013\u0004\u0000\u01ae"+ - ",\u0001\u0000\u0000\u0000\u01af\u01b0\u0005[\u0000\u0000\u01b0\u01b1\u0001"+ - "\u0000\u0000\u0000\u01b1\u01b2\u0006\u0014\u0005\u0000\u01b2\u01b3\u0006"+ - "\u0014\u0006\u0000\u01b3.\u0001\u0000\u0000\u0000\u01b4\u01b5\u0005|\u0000"+ - "\u0000\u01b5\u01b6\u0001\u0000\u0000\u0000\u01b6\u01b7\u0006\u0015\u0007"+ - "\u0000\u01b7\u01b8\u0006\u0015\b\u0000\u01b80\u0001\u0000\u0000\u0000"+ - "\u01b9\u01ba\u0003+\u0013\u0000\u01ba\u01bb\u0001\u0000\u0000\u0000\u01bb"+ - "\u01bc\u0006\u0016\u0004\u0000\u01bc2\u0001\u0000\u0000\u0000\u01bd\u01be"+ - "\u0003\'\u0011\u0000\u01be\u01bf\u0001\u0000\u0000\u0000\u01bf\u01c0\u0006"+ - "\u0017\u0004\u0000\u01c04\u0001\u0000\u0000\u0000\u01c1\u01c2\u0003)\u0012"+ - "\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c4\u0006\u0018\u0004"+ - "\u0000\u01c46\u0001\u0000\u0000\u0000\u01c5\u01c6\u0005|\u0000\u0000\u01c6"+ - "\u01c7\u0001\u0000\u0000\u0000\u01c7\u01c8\u0006\u0019\b\u0000\u01c88"+ - "\u0001\u0000\u0000\u0000\u01c9\u01ca\u0007\u0002\u0000\u0000\u01ca:\u0001"+ - "\u0000\u0000\u0000\u01cb\u01cc\u0007\u0003\u0000\u0000\u01cc<\u0001\u0000"+ - "\u0000\u0000\u01cd\u01ce\u0005\\\u0000\u0000\u01ce\u01cf\u0007\u0004\u0000"+ - "\u0000\u01cf>\u0001\u0000\u0000\u0000\u01d0\u01d1\b\u0005\u0000\u0000"+ - "\u01d1@\u0001\u0000\u0000\u0000\u01d2\u01d4\u0007\u0006\u0000\u0000\u01d3"+ - "\u01d5\u0007\u0007\u0000\u0000\u01d4\u01d3\u0001\u0000\u0000\u0000\u01d4"+ - "\u01d5\u0001\u0000\u0000\u0000\u01d5\u01d7\u0001\u0000\u0000\u0000\u01d6"+ - "\u01d8\u00039\u001a\u0000\u01d7\u01d6\u0001\u0000\u0000\u0000\u01d8\u01d9"+ - "\u0001\u0000\u0000\u0000\u01d9\u01d7\u0001\u0000\u0000\u0000\u01d9\u01da"+ - "\u0001\u0000\u0000\u0000\u01daB\u0001\u0000\u0000\u0000\u01db\u01e0\u0005"+ - "\"\u0000\u0000\u01dc\u01df\u0003=\u001c\u0000\u01dd\u01df\u0003?\u001d"+ - "\u0000\u01de\u01dc\u0001\u0000\u0000\u0000\u01de\u01dd\u0001\u0000\u0000"+ - "\u0000\u01df\u01e2\u0001\u0000\u0000\u0000\u01e0\u01de\u0001\u0000\u0000"+ - "\u0000\u01e0\u01e1\u0001\u0000\u0000\u0000\u01e1\u01e3\u0001\u0000\u0000"+ - "\u0000\u01e2\u01e0\u0001\u0000\u0000\u0000\u01e3\u01f9\u0005\"\u0000\u0000"+ - "\u01e4\u01e5\u0005\"\u0000\u0000\u01e5\u01e6\u0005\"\u0000\u0000\u01e6"+ - "\u01e7\u0005\"\u0000\u0000\u01e7\u01eb\u0001\u0000\u0000\u0000\u01e8\u01ea"+ - "\b\u0000\u0000\u0000\u01e9\u01e8\u0001\u0000\u0000\u0000\u01ea\u01ed\u0001"+ - "\u0000\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000\u01eb\u01e9\u0001"+ - "\u0000\u0000\u0000\u01ec\u01ee\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001"+ - "\u0000\u0000\u0000\u01ee\u01ef\u0005\"\u0000\u0000\u01ef\u01f0\u0005\""+ - "\u0000\u0000\u01f0\u01f1\u0005\"\u0000\u0000\u01f1\u01f3\u0001\u0000\u0000"+ - "\u0000\u01f2\u01f4\u0005\"\u0000\u0000\u01f3\u01f2\u0001\u0000\u0000\u0000"+ - "\u01f3\u01f4\u0001\u0000\u0000\u0000\u01f4\u01f6\u0001\u0000\u0000\u0000"+ - "\u01f5\u01f7\u0005\"\u0000\u0000\u01f6\u01f5\u0001\u0000\u0000\u0000\u01f6"+ - "\u01f7\u0001\u0000\u0000\u0000\u01f7\u01f9\u0001\u0000\u0000\u0000\u01f8"+ - "\u01db\u0001\u0000\u0000\u0000\u01f8\u01e4\u0001\u0000\u0000\u0000\u01f9"+ - "D\u0001\u0000\u0000\u0000\u01fa\u01fc\u00039\u001a\u0000\u01fb\u01fa\u0001"+ - "\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u01fb\u0001"+ - "\u0000\u0000\u0000\u01fd\u01fe\u0001\u0000\u0000\u0000\u01feF\u0001\u0000"+ - "\u0000\u0000\u01ff\u0201\u00039\u001a\u0000\u0200\u01ff\u0001\u0000\u0000"+ - "\u0000\u0201\u0202\u0001\u0000\u0000\u0000\u0202\u0200\u0001\u0000\u0000"+ - "\u0000\u0202\u0203\u0001\u0000\u0000\u0000\u0203\u0204\u0001\u0000\u0000"+ - "\u0000\u0204\u0208\u0003S\'\u0000\u0205\u0207\u00039\u001a\u0000\u0206"+ - "\u0205\u0001\u0000\u0000\u0000\u0207\u020a\u0001\u0000\u0000\u0000\u0208"+ - "\u0206\u0001\u0000\u0000\u0000\u0208\u0209\u0001\u0000\u0000\u0000\u0209"+ - "\u022a\u0001\u0000\u0000\u0000\u020a\u0208\u0001\u0000\u0000\u0000\u020b"+ - "\u020d\u0003S\'\u0000\u020c\u020e\u00039\u001a\u0000\u020d\u020c\u0001"+ - "\u0000\u0000\u0000\u020e\u020f\u0001\u0000\u0000\u0000\u020f\u020d\u0001"+ - "\u0000\u0000\u0000\u020f\u0210\u0001\u0000\u0000\u0000\u0210\u022a\u0001"+ - "\u0000\u0000\u0000\u0211\u0213\u00039\u001a\u0000\u0212\u0211\u0001\u0000"+ - "\u0000\u0000\u0213\u0214\u0001\u0000\u0000\u0000\u0214\u0212\u0001\u0000"+ - "\u0000\u0000\u0214\u0215\u0001\u0000\u0000\u0000\u0215\u021d\u0001\u0000"+ - "\u0000\u0000\u0216\u021a\u0003S\'\u0000\u0217\u0219\u00039\u001a\u0000"+ - "\u0218\u0217\u0001\u0000\u0000\u0000\u0219\u021c\u0001\u0000\u0000\u0000"+ - "\u021a\u0218\u0001\u0000\u0000\u0000\u021a\u021b\u0001\u0000\u0000\u0000"+ - "\u021b\u021e\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000\u0000"+ - "\u021d\u0216\u0001\u0000\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000"+ - "\u021e\u021f\u0001\u0000\u0000\u0000\u021f\u0220\u0003A\u001e\u0000\u0220"+ - "\u022a\u0001\u0000\u0000\u0000\u0221\u0223\u0003S\'\u0000\u0222\u0224"+ - "\u00039\u001a\u0000\u0223\u0222\u0001\u0000\u0000\u0000\u0224\u0225\u0001"+ - "\u0000\u0000\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0225\u0226\u0001"+ - "\u0000\u0000\u0000\u0226\u0227\u0001\u0000\u0000\u0000\u0227\u0228\u0003"+ - "A\u001e\u0000\u0228\u022a\u0001\u0000\u0000\u0000\u0229\u0200\u0001\u0000"+ - "\u0000\u0000\u0229\u020b\u0001\u0000\u0000\u0000\u0229\u0212\u0001\u0000"+ - "\u0000\u0000\u0229\u0221\u0001\u0000\u0000\u0000\u022aH\u0001\u0000\u0000"+ - "\u0000\u022b\u022c\u0005b\u0000\u0000\u022c\u022d\u0005y\u0000\u0000\u022d"+ - "J\u0001\u0000\u0000\u0000\u022e\u022f\u0005y\u0000\u0000\u022f\u0230\u0005"+ - "e\u0000\u0000\u0230\u0231\u0005a\u0000\u0000\u0231\u028d\u0005r\u0000"+ - "\u0000\u0232\u0233\u0005m\u0000\u0000\u0233\u0234\u0005o\u0000\u0000\u0234"+ - "\u0235\u0005n\u0000\u0000\u0235\u0236\u0005t\u0000\u0000\u0236\u028d\u0005"+ - "h\u0000\u0000\u0237\u0238\u0005d\u0000\u0000\u0238\u0239\u0005a\u0000"+ - "\u0000\u0239\u028d\u0005y\u0000\u0000\u023a\u023b\u0005s\u0000\u0000\u023b"+ - "\u023c\u0005e\u0000\u0000\u023c\u023d\u0005c\u0000\u0000\u023d\u023e\u0005"+ - "o\u0000\u0000\u023e\u023f\u0005n\u0000\u0000\u023f\u028d\u0005d\u0000"+ - "\u0000\u0240\u0241\u0005m\u0000\u0000\u0241\u0242\u0005i\u0000\u0000\u0242"+ - "\u0243\u0005n\u0000\u0000\u0243\u0244\u0005u\u0000\u0000\u0244\u0245\u0005"+ - "t\u0000\u0000\u0245\u028d\u0005e\u0000\u0000\u0246\u0247\u0005h\u0000"+ - "\u0000\u0247\u0248\u0005o\u0000\u0000\u0248\u0249\u0005u\u0000\u0000\u0249"+ - "\u028d\u0005r\u0000\u0000\u024a\u024b\u0005w\u0000\u0000\u024b\u024c\u0005"+ - "e\u0000\u0000\u024c\u024d\u0005e\u0000\u0000\u024d\u028d\u0005k\u0000"+ - "\u0000\u024e\u024f\u0005m\u0000\u0000\u024f\u0250\u0005i\u0000\u0000\u0250"+ - "\u0251\u0005l\u0000\u0000\u0251\u0252\u0005l\u0000\u0000\u0252\u0253\u0005"+ - "i\u0000\u0000\u0253\u0254\u0005s\u0000\u0000\u0254\u0255\u0005e\u0000"+ - "\u0000\u0255\u0256\u0005c\u0000\u0000\u0256\u0257\u0005o\u0000\u0000\u0257"+ - "\u0258\u0005n\u0000\u0000\u0258\u028d\u0005d\u0000\u0000\u0259\u025a\u0005"+ - "y\u0000\u0000\u025a\u025b\u0005e\u0000\u0000\u025b\u025c\u0005a\u0000"+ - "\u0000\u025c\u025d\u0005r\u0000\u0000\u025d\u028d\u0005s\u0000\u0000\u025e"+ - "\u025f\u0005m\u0000\u0000\u025f\u0260\u0005o\u0000\u0000\u0260\u0261\u0005"+ - "n\u0000\u0000\u0261\u0262\u0005t\u0000\u0000\u0262\u0263\u0005h\u0000"+ - "\u0000\u0263\u028d\u0005s\u0000\u0000\u0264\u0265\u0005d\u0000\u0000\u0265"+ - "\u0266\u0005a\u0000\u0000\u0266\u0267\u0005y\u0000\u0000\u0267\u028d\u0005"+ - "s\u0000\u0000\u0268\u0269\u0005s\u0000\u0000\u0269\u026a\u0005e\u0000"+ - "\u0000\u026a\u026b\u0005c\u0000\u0000\u026b\u026c\u0005o\u0000\u0000\u026c"+ - "\u026d\u0005n\u0000\u0000\u026d\u026e\u0005d\u0000\u0000\u026e\u028d\u0005"+ - "s\u0000\u0000\u026f\u0270\u0005m\u0000\u0000\u0270\u0271\u0005i\u0000"+ - "\u0000\u0271\u0272\u0005n\u0000\u0000\u0272\u0273\u0005u\u0000\u0000\u0273"+ - "\u0274\u0005t\u0000\u0000\u0274\u0275\u0005e\u0000\u0000\u0275\u028d\u0005"+ - "s\u0000\u0000\u0276\u0277\u0005h\u0000\u0000\u0277\u0278\u0005o\u0000"+ - "\u0000\u0278\u0279\u0005u\u0000\u0000\u0279\u027a\u0005r\u0000\u0000\u027a"+ - "\u028d\u0005s\u0000\u0000\u027b\u027c\u0005w\u0000\u0000\u027c\u027d\u0005"+ - "e\u0000\u0000\u027d\u027e\u0005e\u0000\u0000\u027e\u027f\u0005k\u0000"+ - "\u0000\u027f\u028d\u0005s\u0000\u0000\u0280\u0281\u0005m\u0000\u0000\u0281"+ - "\u0282\u0005i\u0000\u0000\u0282\u0283\u0005l\u0000\u0000\u0283\u0284\u0005"+ - "l\u0000\u0000\u0284\u0285\u0005i\u0000\u0000\u0285\u0286\u0005s\u0000"+ - "\u0000\u0286\u0287\u0005e\u0000\u0000\u0287\u0288\u0005c\u0000\u0000\u0288"+ - "\u0289\u0005o\u0000\u0000\u0289\u028a\u0005n\u0000\u0000\u028a\u028b\u0005"+ - "d\u0000\u0000\u028b\u028d\u0005s\u0000\u0000\u028c\u022e\u0001\u0000\u0000"+ - "\u0000\u028c\u0232\u0001\u0000\u0000\u0000\u028c\u0237\u0001\u0000\u0000"+ - "\u0000\u028c\u023a\u0001\u0000\u0000\u0000\u028c\u0240\u0001\u0000\u0000"+ - "\u0000\u028c\u0246\u0001\u0000\u0000\u0000\u028c\u024a\u0001\u0000\u0000"+ - "\u0000\u028c\u024e\u0001\u0000\u0000\u0000\u028c\u0259\u0001\u0000\u0000"+ - "\u0000\u028c\u025e\u0001\u0000\u0000\u0000\u028c\u0264\u0001\u0000\u0000"+ - "\u0000\u028c\u0268\u0001\u0000\u0000\u0000\u028c\u026f\u0001\u0000\u0000"+ - "\u0000\u028c\u0276\u0001\u0000\u0000\u0000\u028c\u027b\u0001\u0000\u0000"+ - "\u0000\u028c\u0280\u0001\u0000\u0000\u0000\u028dL\u0001\u0000\u0000\u0000"+ - "\u028e\u028f\u0005a\u0000\u0000\u028f\u0290\u0005n\u0000\u0000\u0290\u0291"+ - "\u0005d\u0000\u0000\u0291N\u0001\u0000\u0000\u0000\u0292\u0293\u0005="+ - "\u0000\u0000\u0293P\u0001\u0000\u0000\u0000\u0294\u0295\u0005,\u0000\u0000"+ - "\u0295R\u0001\u0000\u0000\u0000\u0296\u0297\u0005.\u0000\u0000\u0297T"+ - "\u0001\u0000\u0000\u0000\u0298\u0299\u0005(\u0000\u0000\u0299V\u0001\u0000"+ - "\u0000\u0000\u029a\u029b\u0005[\u0000\u0000\u029b\u029c\u0001\u0000\u0000"+ - "\u0000\u029c\u029d\u0006)\u0000\u0000\u029d\u029e\u0006)\u0000\u0000\u029e"+ - "X\u0001\u0000\u0000\u0000\u029f\u02a0\u0005]\u0000\u0000\u02a0\u02a1\u0001"+ - "\u0000\u0000\u0000\u02a1\u02a2\u0006*\b\u0000\u02a2\u02a3\u0006*\b\u0000"+ - "\u02a3Z\u0001\u0000\u0000\u0000\u02a4\u02a5\u0003\u00e3o\u0000\u02a5\u02a6"+ - "\u0003\u00e5p\u0000\u02a6\u02a7\u0003\u00efu\u0000\u02a7\\\u0001\u0000"+ - "\u0000\u0000\u02a8\u02a9\u0003\u00dfm\u0000\u02a9\u02aa\u0003\u00d9j\u0000"+ - "\u02aa\u02ab\u0003\u00ddl\u0000\u02ab\u02ac\u0003\u00d1f\u0000\u02ac^"+ - "\u0001\u0000\u0000\u0000\u02ad\u02ae\u0003\u00ebs\u0000\u02ae\u02af\u0003"+ - "\u00dfm\u0000\u02af\u02b0\u0003\u00d9j\u0000\u02b0\u02b1\u0003\u00ddl"+ - "\u0000\u02b1\u02b2\u0003\u00d1f\u0000\u02b2`\u0001\u0000\u0000\u0000\u02b3"+ - "\u02b4\u0003\u00d9j\u0000\u02b4\u02b5\u0003\u00e3o\u0000\u02b5b\u0001"+ - "\u0000\u0000\u0000\u02b6\u02b7\u0003\u00d9j\u0000\u02b7\u02b8\u0003\u00ed"+ - "t\u0000\u02b8d\u0001\u0000\u0000\u0000\u02b9\u02ba\u0003\u00c9b\u0000"+ - "\u02ba\u02bb\u0003\u00edt\u0000\u02bbf\u0001\u0000\u0000\u0000\u02bc\u02bd"+ - "\u0003\u00e3o\u0000\u02bd\u02be\u0003\u00f1v\u0000\u02be\u02bf\u0003\u00df"+ - "m\u0000\u02bf\u02c0\u0003\u00dfm\u0000\u02c0h\u0001\u0000\u0000\u0000"+ - "\u02c1\u02c2\u0005o\u0000\u0000\u02c2\u02c3\u0005r\u0000\u0000\u02c3j"+ - "\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005)\u0000\u0000\u02c5l\u0001\u0000"+ - "\u0000\u0000\u02c6\u02c7\u0005_\u0000\u0000\u02c7n\u0001\u0000\u0000\u0000"+ - "\u02c8\u02c9\u0005i\u0000\u0000\u02c9\u02ca\u0005n\u0000\u0000\u02ca\u02cb"+ - "\u0005f\u0000\u0000\u02cb\u02cc\u0005o\u0000\u0000\u02ccp\u0001\u0000"+ - "\u0000\u0000\u02cd\u02ce\u0005f\u0000\u0000\u02ce\u02cf\u0005u\u0000\u0000"+ - "\u02cf\u02d0\u0005n\u0000\u0000\u02d0\u02d1\u0005c\u0000\u0000\u02d1\u02d2"+ - "\u0005t\u0000\u0000\u02d2\u02d3\u0005i\u0000\u0000\u02d3\u02d4\u0005o"+ - "\u0000\u0000\u02d4\u02d5\u0005n\u0000\u0000\u02d5\u02d6\u0005s\u0000\u0000"+ - "\u02d6r\u0001\u0000\u0000\u0000\u02d7\u02d8\u0005t\u0000\u0000\u02d8\u02d9"+ - "\u0005r\u0000\u0000\u02d9\u02da\u0005u\u0000\u0000\u02da\u02e1\u0005e"+ - "\u0000\u0000\u02db\u02dc\u0005f\u0000\u0000\u02dc\u02dd\u0005a\u0000\u0000"+ - "\u02dd\u02de\u0005l\u0000\u0000\u02de\u02df\u0005s\u0000\u0000\u02df\u02e1"+ - "\u0005e\u0000\u0000\u02e0\u02d7\u0001\u0000\u0000\u0000\u02e0\u02db\u0001"+ - "\u0000\u0000\u0000\u02e1t\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005=\u0000"+ - "\u0000\u02e3\u02ed\u0005=\u0000\u0000\u02e4\u02e5\u0005!\u0000\u0000\u02e5"+ - "\u02ed\u0005=\u0000\u0000\u02e6\u02ed\u0005<\u0000\u0000\u02e7\u02e8\u0005"+ - "<\u0000\u0000\u02e8\u02ed\u0005=\u0000\u0000\u02e9\u02ed\u0005>\u0000"+ - "\u0000\u02ea\u02eb\u0005>\u0000\u0000\u02eb\u02ed\u0005=\u0000\u0000\u02ec"+ - "\u02e2\u0001\u0000\u0000\u0000\u02ec\u02e4\u0001\u0000\u0000\u0000\u02ec"+ - "\u02e6\u0001\u0000\u0000\u0000\u02ec\u02e7\u0001\u0000\u0000\u0000\u02ec"+ - "\u02e9\u0001\u0000\u0000\u0000\u02ec\u02ea\u0001\u0000\u0000\u0000\u02ed"+ - "v\u0001\u0000\u0000\u0000\u02ee\u02ef\u0005+\u0000\u0000\u02efx\u0001"+ - "\u0000\u0000\u0000\u02f0\u02f1\u0005-\u0000\u0000\u02f1z\u0001\u0000\u0000"+ - "\u0000\u02f2\u02f3\u0005*\u0000\u0000\u02f3|\u0001\u0000\u0000\u0000\u02f4"+ - "\u02f5\u0005/\u0000\u0000\u02f5~\u0001\u0000\u0000\u0000\u02f6\u02f7\u0005"+ - "%\u0000\u0000\u02f7\u0080\u0001\u0000\u0000\u0000\u02f8\u02f9\u00051\u0000"+ - "\u0000\u02f9\u02fa\u00050\u0000\u0000\u02fa\u0082\u0001\u0000\u0000\u0000"+ - "\u02fb\u02fc\u0005a\u0000\u0000\u02fc\u02fd\u0005s\u0000\u0000\u02fd\u0303"+ - "\u0005c\u0000\u0000\u02fe\u02ff\u0005d\u0000\u0000\u02ff\u0300\u0005e"+ - "\u0000\u0000\u0300\u0301\u0005s\u0000\u0000\u0301\u0303\u0005c\u0000\u0000"+ - "\u0302\u02fb\u0001\u0000\u0000\u0000\u0302\u02fe\u0001\u0000\u0000\u0000"+ - "\u0303\u0084\u0001\u0000\u0000\u0000\u0304\u0305\u0005n\u0000\u0000\u0305"+ - "\u0306\u0005u\u0000\u0000\u0306\u0307\u0005l\u0000\u0000\u0307\u0308\u0005"+ - "l\u0000\u0000\u0308\u0309\u0005s\u0000\u0000\u0309\u0086\u0001\u0000\u0000"+ - "\u0000\u030a\u030b\u0005f\u0000\u0000\u030b\u030c\u0005i\u0000\u0000\u030c"+ - "\u030d\u0005r\u0000\u0000\u030d\u030e\u0005s\u0000\u0000\u030e\u0314\u0005"+ - "t\u0000\u0000\u030f\u0310\u0005l\u0000\u0000\u0310\u0311\u0005a\u0000"+ - "\u0000\u0311\u0312\u0005s\u0000\u0000\u0312\u0314\u0005t\u0000\u0000\u0313"+ - "\u030a\u0001\u0000\u0000\u0000\u0313\u030f\u0001\u0000\u0000\u0000\u0314"+ - "\u0088\u0001\u0000\u0000\u0000\u0315\u0316\u0003\u00ebs\u0000\u0316\u0317"+ - "\u0003\u00e5p\u0000\u0317\u0318\u0003\u00f1v\u0000\u0318\u0319\u0003\u00e3"+ - "o\u0000\u0319\u031a\u0003\u00cfe\u0000\u031a\u04d0\u0001\u0000\u0000\u0000"+ - "\u031b\u031c\u0003\u00c9b\u0000\u031c\u031d\u0003\u00cbc\u0000\u031d\u031e"+ - "\u0003\u00edt\u0000\u031e\u04d0\u0001\u0000\u0000\u0000\u031f\u0320\u0003"+ - "\u00e7q\u0000\u0320\u0321\u0003\u00e5p\u0000\u0321\u0322\u0003\u00f5x"+ - "\u0000\u0322\u04d0\u0001\u0000\u0000\u0000\u0323\u0324\u0003\u00dfm\u0000"+ - "\u0324\u0325\u0003\u00e5p\u0000\u0325\u0326\u0003\u00d5h\u0000\u0326\u0327"+ - "\u0003\u0081>\u0000\u0327\u04d0\u0001\u0000\u0000\u0000\u0328\u0329\u0003"+ - "\u00e7q\u0000\u0329\u032a\u0003\u00d9j\u0000\u032a\u04d0\u0001\u0000\u0000"+ - "\u0000\u032b\u032c\u0003\u00efu\u0000\u032c\u032d\u0003\u00c9b\u0000\u032d"+ - "\u032e\u0003\u00f1v\u0000\u032e\u04d0\u0001\u0000\u0000\u0000\u032f\u04d0"+ - "\u0003\u00d1f\u0000\u0330\u0331\u0003\u00edt\u0000\u0331\u0332\u0003\u00f1"+ - "v\u0000\u0332\u0333\u0003\u00cbc\u0000\u0333\u0334\u0003\u00edt\u0000"+ - "\u0334\u0335\u0003\u00efu\u0000\u0335\u0336\u0003\u00ebs\u0000\u0336\u0337"+ - "\u0003\u00d9j\u0000\u0337\u0338\u0003\u00e3o\u0000\u0338\u0339\u0003\u00d5"+ - "h\u0000\u0339\u04d0\u0001\u0000\u0000\u0000\u033a\u033b\u0003\u00efu\u0000"+ - "\u033b\u033c\u0003\u00ebs\u0000\u033c\u033d\u0003\u00d9j\u0000\u033d\u033e"+ - "\u0003\u00e1n\u0000\u033e\u04d0\u0001\u0000\u0000\u0000\u033f\u0340\u0003"+ - "\u00cdd\u0000\u0340\u0341\u0003\u00e5p\u0000\u0341\u0342\u0003\u00e3o"+ - "\u0000\u0342\u0343\u0003\u00cdd\u0000\u0343\u0344\u0003\u00c9b\u0000\u0344"+ - "\u0345\u0003\u00efu\u0000\u0345\u04d0\u0001\u0000\u0000\u0000\u0346\u0347"+ - "\u0003\u00cdd\u0000\u0347\u0348\u0003\u00e5p\u0000\u0348\u0349\u0003\u00c9"+ - "b\u0000\u0349\u034a\u0003\u00dfm\u0000\u034a\u034b\u0003\u00d1f\u0000"+ - "\u034b\u034c\u0003\u00edt\u0000\u034c\u034d\u0003\u00cdd\u0000\u034d\u034e"+ - "\u0003\u00d1f\u0000\u034e\u04d0\u0001\u0000\u0000\u0000\u034f\u0350\u0003"+ - "\u00d5h\u0000\u0350\u0351\u0003\u00ebs\u0000\u0351\u0352\u0003\u00d1f"+ - "\u0000\u0352\u0353\u0003\u00c9b\u0000\u0353\u0354\u0003\u00efu\u0000\u0354"+ - "\u0355\u0003\u00d1f\u0000\u0355\u0356\u0003\u00edt\u0000\u0356\u0357\u0003"+ - "\u00efu\u0000\u0357\u04d0\u0001\u0000\u0000\u0000\u0358\u0359\u0003\u00df"+ - "m\u0000\u0359\u035a\u0003\u00d1f\u0000\u035a\u035b\u0003\u00d3g\u0000"+ - "\u035b\u035c\u0003\u00efu\u0000\u035c\u04d0\u0001\u0000\u0000\u0000\u035d"+ - "\u035e\u0003\u00e3o\u0000\u035e\u035f\u0003\u00e5p\u0000\u035f\u0360\u0003"+ - "\u00f5x\u0000\u0360\u04d0\u0001\u0000\u0000\u0000\u0361\u0362\u0003\u00eb"+ - "s\u0000\u0362\u0363\u0003\u00d9j\u0000\u0363\u0364\u0003\u00d5h\u0000"+ - "\u0364\u0365\u0003\u00d7i\u0000\u0365\u0366\u0003\u00efu\u0000\u0366\u04d0"+ - "\u0001\u0000\u0000\u0000\u0367\u0368\u0003\u00edt\u0000\u0368\u0369\u0003"+ - "\u00efu\u0000\u0369\u036a\u0003\u00c9b\u0000\u036a\u036b\u0003\u00ebs"+ - "\u0000\u036b\u036c\u0003\u00efu\u0000\u036c\u036d\u0003\u00edt\u0000\u036d"+ - "\u036e\u0003m4\u0000\u036e\u036f\u0003\u00f5x\u0000\u036f\u0370\u0003"+ - "\u00d9j\u0000\u0370\u0371\u0003\u00efu\u0000\u0371\u0372\u0003\u00d7i"+ - "\u0000\u0372\u04d0\u0001\u0000\u0000\u0000\u0373\u0374\u0003\u00cfe\u0000"+ - "\u0374\u0375\u0003\u00c9b\u0000\u0375\u0376\u0003\u00efu\u0000\u0376\u0377"+ - "\u0003\u00d1f\u0000\u0377\u0378\u0003m4\u0000\u0378\u0379\u0003\u00d3"+ - "g\u0000\u0379\u037a\u0003\u00e5p\u0000\u037a\u037b\u0003\u00ebs\u0000"+ - "\u037b\u037c\u0003\u00e1n\u0000\u037c\u037d\u0003\u00c9b\u0000\u037d\u037e"+ - "\u0003\u00efu\u0000\u037e\u04d0\u0001\u0000\u0000\u0000\u037f\u0380\u0003"+ - "\u00cfe\u0000\u0380\u0381\u0003\u00c9b\u0000\u0381\u0382\u0003\u00efu"+ - "\u0000\u0382\u0383\u0003\u00d1f\u0000\u0383\u0384\u0003m4\u0000\u0384"+ - "\u0385\u0003\u00efu\u0000\u0385\u0386\u0003\u00ebs\u0000\u0386\u0387\u0003"+ - "\u00f1v\u0000\u0387\u0388\u0003\u00e3o\u0000\u0388\u0389\u0003\u00cdd"+ - "\u0000\u0389\u04d0\u0001\u0000\u0000\u0000\u038a\u038b\u0003\u00cfe\u0000"+ - "\u038b\u038c\u0003\u00c9b\u0000\u038c\u038d\u0003\u00efu\u0000\u038d\u038e"+ - "\u0003\u00d1f\u0000\u038e\u038f\u0003m4\u0000\u038f\u0390\u0003\u00e7"+ - "q\u0000\u0390\u0391\u0003\u00c9b\u0000\u0391\u0392\u0003\u00ebs\u0000"+ - "\u0392\u0393\u0003\u00edt\u0000\u0393\u0394\u0003\u00d1f\u0000\u0394\u04d0"+ - "\u0001\u0000\u0000\u0000\u0395\u0396\u0003\u00c9b\u0000\u0396\u0397\u0003"+ - "\u00f1v\u0000\u0397\u0398\u0003\u00efu\u0000\u0398\u0399\u0003\u00e5p"+ - "\u0000\u0399\u039a\u0003m4\u0000\u039a\u039b\u0003\u00cbc\u0000\u039b"+ - "\u039c\u0003\u00f1v\u0000\u039c\u039d\u0003\u00cdd\u0000\u039d\u039e\u0003"+ - "\u00ddl\u0000\u039e\u039f\u0003\u00d1f\u0000\u039f\u03a0\u0003\u00efu"+ - "\u0000\u03a0\u04d0\u0001\u0000\u0000\u0000\u03a1\u03a2\u0003\u00cfe\u0000"+ - "\u03a2\u03a3\u0003\u00c9b\u0000\u03a3\u03a4\u0003\u00efu\u0000\u03a4\u03a5"+ - "\u0003\u00d1f\u0000\u03a5\u03a6\u0003m4\u0000\u03a6\u03a7\u0003\u00d1"+ - "f\u0000\u03a7\u03a8\u0003\u00f7y\u0000\u03a8\u03a9\u0003\u00efu\u0000"+ - "\u03a9\u03aa\u0003\u00ebs\u0000\u03aa\u03ab\u0003\u00c9b\u0000\u03ab\u03ac"+ - "\u0003\u00cdd\u0000\u03ac\u03ad\u0003\u00efu\u0000\u03ad\u04d0\u0001\u0000"+ - "\u0000\u0000\u03ae\u03af\u0003\u00d9j\u0000\u03af\u03b0\u0003\u00edt\u0000"+ - "\u03b0\u03b1\u0003m4\u0000\u03b1\u03b2\u0003\u00d3g\u0000\u03b2\u03b3"+ - "\u0003\u00d9j\u0000\u03b3\u03b4\u0003\u00e3o\u0000\u03b4\u03b5\u0003\u00d9"+ - "j\u0000\u03b5\u03b6\u0003\u00efu\u0000\u03b6\u03b7\u0003\u00d1f\u0000"+ - "\u03b7\u04d0\u0001\u0000\u0000\u0000\u03b8\u03b9\u0003\u00d9j\u0000\u03b9"+ - "\u03ba\u0003\u00edt\u0000\u03ba\u03bb\u0003m4\u0000\u03bb\u03bc\u0003"+ - "\u00d9j\u0000\u03bc\u03bd\u0003\u00e3o\u0000\u03bd\u03be\u0003\u00d3g"+ - "\u0000\u03be\u03bf\u0003\u00d9j\u0000\u03bf\u03c0\u0003\u00e3o\u0000\u03c0"+ - "\u03c1\u0003\u00d9j\u0000\u03c1\u03c2\u0003\u00efu\u0000\u03c2\u03c3\u0003"+ - "\u00d1f\u0000\u03c3\u04d0\u0001\u0000\u0000\u0000\u03c4\u03c5\u0003\u00cd"+ - "d\u0000\u03c5\u03c6\u0003\u00c9b\u0000\u03c6\u03c7\u0003\u00edt\u0000"+ - "\u03c7\u03c8\u0003\u00d1f\u0000\u03c8\u04d0\u0001\u0000\u0000\u0000\u03c9"+ - "\u03ca\u0003\u00dfm\u0000\u03ca\u03cb\u0003\u00d1f\u0000\u03cb\u03cc\u0003"+ - "\u00e3o\u0000\u03cc\u03cd\u0003\u00d5h\u0000\u03cd\u03ce\u0003\u00efu"+ - "\u0000\u03ce\u03cf\u0003\u00d7i\u0000\u03cf\u04d0\u0001\u0000\u0000\u0000"+ - "\u03d0\u03d1\u0003\u00e1n\u0000\u03d1\u03d2\u0003\u00f3w\u0000\u03d2\u03d3"+ - "\u0003m4\u0000\u03d3\u03d4\u0003\u00e1n\u0000\u03d4\u03d5\u0003\u00c9"+ - "b\u0000\u03d5\u03d6\u0003\u00f7y\u0000\u03d6\u04d0\u0001\u0000\u0000\u0000"+ - "\u03d7\u03d8\u0003\u00e1n\u0000\u03d8\u03d9\u0003\u00f3w\u0000\u03d9\u03da"+ - "\u0003m4\u0000\u03da\u03db\u0003\u00e1n\u0000\u03db\u03dc\u0003\u00d9"+ - "j\u0000\u03dc\u03dd\u0003\u00e3o\u0000\u03dd\u04d0\u0001\u0000\u0000\u0000"+ - "\u03de\u03df\u0003\u00e1n\u0000\u03df\u03e0\u0003\u00f3w\u0000\u03e0\u03e1"+ - "\u0003m4\u0000\u03e1\u03e2\u0003\u00c9b\u0000\u03e2\u03e3\u0003\u00f3"+ - "w\u0000\u03e3\u03e4\u0003\u00d5h\u0000\u03e4\u04d0\u0001\u0000\u0000\u0000"+ - "\u03e5\u03e6\u0003\u00e1n\u0000\u03e6\u03e7\u0003\u00f3w\u0000\u03e7\u03e8"+ - "\u0003m4\u0000\u03e8\u03e9\u0003\u00edt\u0000\u03e9\u03ea\u0003\u00f1"+ - "v\u0000\u03ea\u03eb\u0003\u00e1n\u0000\u03eb\u04d0\u0001\u0000\u0000\u0000"+ - "\u03ec\u03ed\u0003\u00e1n\u0000\u03ed\u03ee\u0003\u00f3w\u0000\u03ee\u03ef"+ - "\u0003m4\u0000\u03ef\u03f0\u0003\u00cdd\u0000\u03f0\u03f1\u0003\u00e5"+ - "p\u0000\u03f1\u03f2\u0003\u00f1v\u0000\u03f2\u03f3\u0003\u00e3o\u0000"+ - "\u03f3\u03f4\u0003\u00efu\u0000\u03f4\u04d0\u0001\u0000\u0000\u0000\u03f5"+ - "\u03f6\u0003\u00e1n\u0000\u03f6\u03f7\u0003\u00f3w\u0000\u03f7\u03f8\u0003"+ - "m4\u0000\u03f8\u03f9\u0003\u00cdd\u0000\u03f9\u03fa\u0003\u00e5p\u0000"+ - "\u03fa\u03fb\u0003\u00e3o\u0000\u03fb\u03fc\u0003\u00cdd\u0000\u03fc\u03fd"+ - "\u0003\u00c9b\u0000\u03fd\u03fe\u0003\u00efu\u0000\u03fe\u04d0\u0001\u0000"+ - "\u0000\u0000\u03ff\u0400\u0003\u00e1n\u0000\u0400\u0401\u0003\u00f3w\u0000"+ - "\u0401\u0402\u0003m4\u0000\u0402\u0403\u0003\u00dbk\u0000\u0403\u0404"+ - "\u0003\u00e5p\u0000\u0404\u0405\u0003\u00d9j\u0000\u0405\u0406\u0003\u00e3"+ - "o\u0000\u0406\u04d0\u0001\u0000\u0000\u0000\u0407\u0408\u0003\u00e1n\u0000"+ - "\u0408\u0409\u0003\u00f3w\u0000\u0409\u040a\u0003m4\u0000\u040a\u040b"+ - "\u0003\u00e1n\u0000\u040b\u040c\u0003\u00d1f\u0000\u040c\u040d\u0003\u00cf"+ - "e\u0000\u040d\u040e\u0003\u00d9j\u0000\u040e\u040f\u0003\u00c9b\u0000"+ - "\u040f\u0410\u0003\u00e3o\u0000\u0410\u04d0\u0001\u0000\u0000\u0000\u0411"+ - "\u0412\u0003\u00e1n\u0000\u0412\u0413\u0003\u00f3w\u0000\u0413\u0414\u0003"+ - "m4\u0000\u0414\u0415\u0003\u00cfe\u0000\u0415\u0416\u0003\u00d1f\u0000"+ - "\u0416\u0417\u0003\u00cfe\u0000\u0417\u0418\u0003\u00f1v\u0000\u0418\u0419"+ - "\u0003\u00e7q\u0000\u0419\u041a\u0003\u00d1f\u0000\u041a\u04d0\u0001\u0000"+ - "\u0000\u0000\u041b\u041c\u0003\u00e1n\u0000\u041c\u041d\u0003\u00d1f\u0000"+ - "\u041d\u041e\u0003\u00efu\u0000\u041e\u041f\u0003\u00c9b\u0000\u041f\u0420"+ - "\u0003\u00cfe\u0000\u0420\u0421\u0003\u00c9b\u0000\u0421\u0422\u0003\u00ef"+ - "u\u0000\u0422\u0423\u0003\u00c9b\u0000\u0423\u04d0\u0001\u0000\u0000\u0000"+ - "\u0424\u0425\u0003\u00edt\u0000\u0425\u0426\u0003\u00e7q\u0000\u0426\u0427"+ - "\u0003\u00dfm\u0000\u0427\u0428\u0003\u00d9j\u0000\u0428\u0429\u0003\u00ef"+ - "u\u0000\u0429\u04d0\u0001\u0000\u0000\u0000\u042a\u042b\u0003\u00efu\u0000"+ - "\u042b\u042c\u0003\u00e5p\u0000\u042c\u042d\u0003m4\u0000\u042d\u042e"+ - "\u0003\u00edt\u0000\u042e\u042f\u0003\u00efu\u0000\u042f\u0430\u0003\u00eb"+ - "s\u0000\u0430\u0431\u0003\u00d9j\u0000\u0431\u0432\u0003\u00e3o\u0000"+ - "\u0432\u0433\u0003\u00d5h\u0000\u0433\u04d0\u0001\u0000\u0000\u0000\u0434"+ - "\u0435\u0003\u00efu\u0000\u0435\u0436\u0003\u00e5p\u0000\u0436\u0437\u0003"+ - "m4\u0000\u0437\u0438\u0003\u00edt\u0000\u0438\u0439\u0003\u00efu\u0000"+ - "\u0439\u043a\u0003\u00ebs\u0000\u043a\u04d0\u0001\u0000\u0000\u0000\u043b"+ - "\u043c\u0003\u00efu\u0000\u043c\u043d\u0003\u00e5p\u0000\u043d\u043e\u0003"+ - "m4\u0000\u043e\u043f\u0003\u00cbc\u0000\u043f\u0440\u0003\u00e5p\u0000"+ - "\u0440\u0441\u0003\u00e5p\u0000\u0441\u0442\u0003\u00dfm\u0000\u0442\u04d0"+ - "\u0001\u0000\u0000\u0000\u0443\u0444\u0003\u00efu\u0000\u0444\u0445\u0003"+ - "\u00e5p\u0000\u0445\u0446\u0003m4\u0000\u0446\u0447\u0003\u00cbc\u0000"+ - "\u0447\u0448\u0003\u00e5p\u0000\u0448\u0449\u0003\u00e5p\u0000\u0449\u044a"+ - "\u0003\u00dfm\u0000\u044a\u044b\u0003\u00d1f\u0000\u044b\u044c\u0003\u00c9"+ - "b\u0000\u044c\u044d\u0003\u00e3o\u0000\u044d\u04d0\u0001\u0000\u0000\u0000"+ - "\u044e\u044f\u0003\u00efu\u0000\u044f\u0450\u0003\u00e5p\u0000\u0450\u0451"+ - "\u0003m4\u0000\u0451\u0452\u0003\u00cfe\u0000\u0452\u0453\u0003\u00c9"+ - "b\u0000\u0453\u0454\u0003\u00efu\u0000\u0454\u0455\u0003\u00d1f\u0000"+ - "\u0455\u0456\u0003\u00efu\u0000\u0456\u0457\u0003\u00d9j\u0000\u0457\u0458"+ - "\u0003\u00e1n\u0000\u0458\u0459\u0003\u00d1f\u0000\u0459\u04d0\u0001\u0000"+ - "\u0000\u0000\u045a\u045b\u0003\u00efu\u0000\u045b\u045c\u0003\u00e5p\u0000"+ - "\u045c\u045d\u0003m4\u0000\u045d\u045e\u0003\u00cfe\u0000\u045e\u045f"+ - "\u0003\u00efu\u0000\u045f\u04d0\u0001\u0000\u0000\u0000\u0460\u0461\u0003"+ - "\u00efu\u0000\u0461\u0462\u0003\u00e5p\u0000\u0462\u0463\u0003m4\u0000"+ - "\u0463\u0464\u0003\u00cfe\u0000\u0464\u0465\u0003\u00cbc\u0000\u0465\u0466"+ - "\u0003\u00dfm\u0000\u0466\u04d0\u0001\u0000\u0000\u0000\u0467\u0468\u0003"+ - "\u00efu\u0000\u0468\u0469\u0003\u00e5p\u0000\u0469\u046a\u0003m4\u0000"+ - "\u046a\u046b\u0003\u00cfe\u0000\u046b\u046c\u0003\u00e5p\u0000\u046c\u046d"+ - "\u0003\u00f1v\u0000\u046d\u046e\u0003\u00cbc\u0000\u046e\u046f\u0003\u00df"+ - "m\u0000\u046f\u0470\u0003\u00d1f\u0000\u0470\u04d0\u0001\u0000\u0000\u0000"+ - "\u0471\u0472\u0003\u00efu\u0000\u0472\u0473\u0003\u00e5p\u0000\u0473\u0474"+ - "\u0003m4\u0000\u0474\u0475\u0003\u00cfe\u0000\u0475\u0476\u0003\u00d1"+ - "f\u0000\u0476\u0477\u0003\u00d5h\u0000\u0477\u0478\u0003\u00ebs\u0000"+ - "\u0478\u0479\u0003\u00d1f\u0000\u0479\u047a\u0003\u00d1f\u0000\u047a\u047b"+ - "\u0003\u00edt\u0000\u047b\u04d0\u0001\u0000\u0000\u0000\u047c\u047d\u0003"+ - "\u00efu\u0000\u047d\u047e\u0003\u00e5p\u0000\u047e\u047f\u0003m4\u0000"+ - "\u047f\u0480\u0003\u00d9j\u0000\u0480\u0481\u0003\u00e3o\u0000\u0481\u0482"+ - "\u0003\u00efu\u0000\u0482\u04d0\u0001\u0000\u0000\u0000\u0483\u0484\u0003"+ - "\u00efu\u0000\u0484\u0485\u0003\u00e5p\u0000\u0485\u0486\u0003m4\u0000"+ - "\u0486\u0487\u0003\u00d9j\u0000\u0487\u0488\u0003\u00e3o\u0000\u0488\u0489"+ - "\u0003\u00efu\u0000\u0489\u048a\u0003\u00d1f\u0000\u048a\u048b\u0003\u00d5"+ - "h\u0000\u048b\u048c\u0003\u00d1f\u0000\u048c\u048d\u0003\u00ebs\u0000"+ - "\u048d\u04d0\u0001\u0000\u0000\u0000\u048e\u048f\u0003\u00efu\u0000\u048f"+ - "\u0490\u0003\u00e5p\u0000\u0490\u0491\u0003m4\u0000\u0491\u0492\u0003"+ - "\u00d9j\u0000\u0492\u0493\u0003\u00e7q\u0000\u0493\u04d0\u0001\u0000\u0000"+ - "\u0000\u0494\u0495\u0003\u00efu\u0000\u0495\u0496\u0003\u00e5p\u0000\u0496"+ - "\u0497\u0003m4\u0000\u0497\u0498\u0003\u00dfm\u0000\u0498\u0499\u0003"+ - "\u00e5p\u0000\u0499\u049a\u0003\u00e3o\u0000\u049a\u049b\u0003\u00d5h"+ - "\u0000\u049b\u04d0\u0001\u0000\u0000\u0000\u049c\u049d\u0003\u00efu\u0000"+ - "\u049d\u049e\u0003\u00e5p\u0000\u049e\u049f\u0003m4\u0000\u049f\u04a0"+ - "\u0003\u00ebs\u0000\u04a0\u04a1\u0003\u00c9b\u0000\u04a1\u04a2\u0003\u00cf"+ - "e\u0000\u04a2\u04a3\u0003\u00d9j\u0000\u04a3\u04a4\u0003\u00c9b\u0000"+ - "\u04a4\u04a5\u0003\u00e3o\u0000\u04a5\u04a6\u0003\u00edt\u0000\u04a6\u04d0"+ - "\u0001\u0000\u0000\u0000\u04a7\u04a8\u0003\u00efu\u0000\u04a8\u04a9\u0003"+ - "\u00e5p\u0000\u04a9\u04aa\u0003m4\u0000\u04aa\u04ab\u0003\u00f3w\u0000"+ - "\u04ab\u04ac\u0003\u00d1f\u0000\u04ac\u04ad\u0003\u00ebs\u0000\u04ad\u04ae"+ - "\u0003\u00edt\u0000\u04ae\u04af\u0003\u00d9j\u0000\u04af\u04b0\u0003\u00e5"+ - "p\u0000\u04b0\u04b1\u0003\u00e3o\u0000\u04b1\u04d0\u0001\u0000\u0000\u0000"+ - "\u04b2\u04b3\u0003\u00efu\u0000\u04b3\u04b4\u0003\u00e5p\u0000\u04b4\u04b5"+ - "\u0003m4\u0000\u04b5\u04b6\u0003\u00f1v\u0000\u04b6\u04b7\u0003\u00e3"+ - "o\u0000\u04b7\u04b8\u0003\u00edt\u0000\u04b8\u04b9\u0003\u00d9j\u0000"+ - "\u04b9\u04ba\u0003\u00d5h\u0000\u04ba\u04bb\u0003\u00e3o\u0000\u04bb\u04bc"+ - "\u0003\u00d1f\u0000\u04bc\u04bd\u0003\u00cfe\u0000\u04bd\u04be\u0003m"+ - "4\u0000\u04be\u04bf\u0003\u00dfm\u0000\u04bf\u04c0\u0003\u00e5p\u0000"+ - "\u04c0\u04c1\u0003\u00e3o\u0000\u04c1\u04c2\u0003\u00d5h\u0000\u04c2\u04d0"+ - "\u0001\u0000\u0000\u0000\u04c3\u04c4\u0003\u00efu\u0000\u04c4\u04c5\u0003"+ - "\u00e5p\u0000\u04c5\u04c6\u0003m4\u0000\u04c6\u04c7\u0003\u00d5h\u0000"+ - "\u04c7\u04c8\u0003\u00d1f\u0000\u04c8\u04c9\u0003\u00e5p\u0000\u04c9\u04ca"+ - "\u0003\u00e7q\u0000\u04ca\u04cb\u0003\u00e5p\u0000\u04cb\u04cc\u0003\u00d9"+ - "j\u0000\u04cc\u04cd\u0003\u00e3o\u0000\u04cd\u04ce\u0003\u00efu\u0000"+ - "\u04ce\u04d0\u0001\u0000\u0000\u0000\u04cf\u0315\u0001\u0000\u0000\u0000"+ - "\u04cf\u031b\u0001\u0000\u0000\u0000\u04cf\u031f\u0001\u0000\u0000\u0000"+ - "\u04cf\u0323\u0001\u0000\u0000\u0000\u04cf\u0328\u0001\u0000\u0000\u0000"+ - "\u04cf\u032b\u0001\u0000\u0000\u0000\u04cf\u032f\u0001\u0000\u0000\u0000"+ - "\u04cf\u0330\u0001\u0000\u0000\u0000\u04cf\u033a\u0001\u0000\u0000\u0000"+ - "\u04cf\u033f\u0001\u0000\u0000\u0000\u04cf\u0346\u0001\u0000\u0000\u0000"+ - "\u04cf\u034f\u0001\u0000\u0000\u0000\u04cf\u0358\u0001\u0000\u0000\u0000"+ - "\u04cf\u035d\u0001\u0000\u0000\u0000\u04cf\u0361\u0001\u0000\u0000\u0000"+ - "\u04cf\u0367\u0001\u0000\u0000\u0000\u04cf\u0373\u0001\u0000\u0000\u0000"+ - "\u04cf\u037f\u0001\u0000\u0000\u0000\u04cf\u038a\u0001\u0000\u0000\u0000"+ - "\u04cf\u0395\u0001\u0000\u0000\u0000\u04cf\u03a1\u0001\u0000\u0000\u0000"+ - "\u04cf\u03ae\u0001\u0000\u0000\u0000\u04cf\u03b8\u0001\u0000\u0000\u0000"+ - "\u04cf\u03c4\u0001\u0000\u0000\u0000\u04cf\u03c9\u0001\u0000\u0000\u0000"+ - "\u04cf\u03d0\u0001\u0000\u0000\u0000\u04cf\u03d7\u0001\u0000\u0000\u0000"+ - "\u04cf\u03de\u0001\u0000\u0000\u0000\u04cf\u03e5\u0001\u0000\u0000\u0000"+ - "\u04cf\u03ec\u0001\u0000\u0000\u0000\u04cf\u03f5\u0001\u0000\u0000\u0000"+ - "\u04cf\u03ff\u0001\u0000\u0000\u0000\u04cf\u0407\u0001\u0000\u0000\u0000"+ - "\u04cf\u0411\u0001\u0000\u0000\u0000\u04cf\u041b\u0001\u0000\u0000\u0000"+ - "\u04cf\u0424\u0001\u0000\u0000\u0000\u04cf\u042a\u0001\u0000\u0000\u0000"+ - "\u04cf\u0434\u0001\u0000\u0000\u0000\u04cf\u043b\u0001\u0000\u0000\u0000"+ - "\u04cf\u0443\u0001\u0000\u0000\u0000\u04cf\u044e\u0001\u0000\u0000\u0000"+ - "\u04cf\u045a\u0001\u0000\u0000\u0000\u04cf\u0460\u0001\u0000\u0000\u0000"+ - "\u04cf\u0467\u0001\u0000\u0000\u0000\u04cf\u0471\u0001\u0000\u0000\u0000"+ - "\u04cf\u047c\u0001\u0000\u0000\u0000\u04cf\u0483\u0001\u0000\u0000\u0000"+ - "\u04cf\u048e\u0001\u0000\u0000\u0000\u04cf\u0494\u0001\u0000\u0000\u0000"+ - "\u04cf\u049c\u0001\u0000\u0000\u0000\u04cf\u04a7\u0001\u0000\u0000\u0000"+ - "\u04cf\u04b2\u0001\u0000\u0000\u0000\u04cf\u04c3\u0001\u0000\u0000\u0000"+ - "\u04d0\u008a\u0001\u0000\u0000\u0000\u04d1\u04d2\u0003\u00c9b\u0000\u04d2"+ - "\u04d3\u0003\u00f3w\u0000\u04d3\u04d4\u0003\u00d5h\u0000\u04d4\u0569\u0001"+ - "\u0000\u0000\u0000\u04d5\u04d6\u0003\u00e1n\u0000\u04d6\u04d7\u0003\u00d9"+ - "j\u0000\u04d7\u04d8\u0003\u00e3o\u0000\u04d8\u0569\u0001\u0000\u0000\u0000"+ - "\u04d9\u04da\u0003\u00e1n\u0000\u04da\u04db\u0003\u00c9b\u0000\u04db\u04dc"+ - "\u0003\u00f7y\u0000\u04dc\u0569\u0001\u0000\u0000\u0000\u04dd\u04de\u0003"+ - "\u00edt\u0000\u04de\u04df\u0003\u00f1v\u0000\u04df\u04e0\u0003\u00e1n"+ - "\u0000\u04e0\u0569\u0001\u0000\u0000\u0000\u04e1\u04e2\u0003\u00cdd\u0000"+ - "\u04e2\u04e3\u0003\u00e5p\u0000\u04e3\u04e4\u0003\u00f1v\u0000\u04e4\u04e5"+ - "\u0003\u00e3o\u0000\u04e5\u04e6\u0003\u00efu\u0000\u04e6\u0569\u0001\u0000"+ - "\u0000\u0000\u04e7\u04e8\u0003\u00cdd\u0000\u04e8\u04e9\u0003\u00e5p\u0000"+ - "\u04e9\u04ea\u0003\u00f1v\u0000\u04ea\u04eb\u0003\u00e3o\u0000\u04eb\u04ec"+ - "\u0003\u00efu\u0000\u04ec\u04ed\u0003m4\u0000\u04ed\u04ee\u0003\u00cf"+ - "e\u0000\u04ee\u04ef\u0003\u00d9j\u0000\u04ef\u04f0\u0003\u00edt\u0000"+ - "\u04f0\u04f1\u0003\u00efu\u0000\u04f1\u04f2\u0003\u00d9j\u0000\u04f2\u04f3"+ - "\u0003\u00e3o\u0000\u04f3\u04f4\u0003\u00cdd\u0000\u04f4\u04f5\u0003\u00ef"+ - "u\u0000\u04f5\u0569\u0001\u0000\u0000\u0000\u04f6\u04f7\u0003\u00e7q\u0000"+ - "\u04f7\u04f8\u0003\u00d1f\u0000\u04f8\u04f9\u0003\u00ebs\u0000\u04f9\u04fa"+ - "\u0003\u00cdd\u0000\u04fa\u04fb\u0003\u00d1f\u0000\u04fb\u04fc\u0003\u00e3"+ - "o\u0000\u04fc\u04fd\u0003\u00efu\u0000\u04fd\u04fe\u0003\u00d9j\u0000"+ - "\u04fe\u04ff\u0003\u00dfm\u0000\u04ff\u0500\u0003\u00d1f\u0000\u0500\u0569"+ - "\u0001\u0000\u0000\u0000\u0501\u0502\u0003\u00e1n\u0000\u0502\u0503\u0003"+ - "\u00d1f\u0000\u0503\u0504\u0003\u00cfe\u0000\u0504\u0505\u0003\u00d9j"+ - "\u0000\u0505\u0506\u0003\u00c9b\u0000\u0506\u0507\u0003\u00e3o\u0000\u0507"+ - "\u0569\u0001\u0000\u0000\u0000\u0508\u0509\u0003\u00e1n\u0000\u0509\u050a"+ - "\u0003\u00d1f\u0000\u050a\u050b\u0003\u00cfe\u0000\u050b\u050c\u0003\u00d9"+ - "j\u0000\u050c\u050d\u0003\u00c9b\u0000\u050d\u050e\u0003\u00e3o\u0000"+ - "\u050e\u050f\u0003m4\u0000\u050f\u0510\u0003\u00c9b\u0000\u0510\u0511"+ - "\u0003\u00cbc\u0000\u0511\u0512\u0003\u00edt\u0000\u0512\u0513\u0003\u00e5"+ - "p\u0000\u0513\u0514\u0003\u00dfm\u0000\u0514\u0515\u0003\u00f1v\u0000"+ - "\u0515\u0516\u0003\u00efu\u0000\u0516\u0517\u0003\u00d1f\u0000\u0517\u0518"+ - "\u0003m4\u0000\u0518\u0519\u0003\u00cfe\u0000\u0519\u051a\u0003\u00d1"+ - "f\u0000\u051a\u051b\u0003\u00f3w\u0000\u051b\u051c\u0003\u00d9j\u0000"+ - "\u051c\u051d\u0003\u00c9b\u0000\u051d\u051e\u0003\u00efu\u0000\u051e\u051f"+ - "\u0003\u00d9j\u0000\u051f\u0520\u0003\u00e5p\u0000\u0520\u0521\u0003\u00e3"+ - "o\u0000\u0521\u0569\u0001\u0000\u0000\u0000\u0522\u0523\u0003\u00c9b\u0000"+ - "\u0523\u0524\u0003\u00cdd\u0000\u0524\u0525\u0003\u00e5p\u0000\u0525\u0526"+ - "\u0003\u00edt\u0000\u0526\u0569\u0001\u0000\u0000\u0000\u0527\u0528\u0003"+ - "\u00c9b\u0000\u0528\u0529\u0003\u00edt\u0000\u0529\u052a\u0003\u00d9j"+ - "\u0000\u052a\u052b\u0003\u00e3o\u0000\u052b\u0569\u0001\u0000\u0000\u0000"+ - "\u052c\u052d\u0003\u00c9b\u0000\u052d\u052e\u0003\u00efu\u0000\u052e\u052f"+ - "\u0003\u00c9b\u0000\u052f\u0530\u0003\u00e3o\u0000\u0530\u0569\u0001\u0000"+ - "\u0000\u0000\u0531\u0532\u0003\u00c9b\u0000\u0532\u0533\u0003\u00efu\u0000"+ - "\u0533\u0534\u0003\u00c9b\u0000\u0534\u0535\u0003\u00e3o\u0000\u0535\u0536"+ - "\u00052\u0000\u0000\u0536\u0569\u0001\u0000\u0000\u0000\u0537\u0538\u0003"+ - "\u00cdd\u0000\u0538\u0539\u0003\u00d1f\u0000\u0539\u053a\u0003\u00d9j"+ - "\u0000\u053a\u053b\u0003\u00dfm\u0000\u053b\u0569\u0001\u0000\u0000\u0000"+ - "\u053c\u053d\u0003\u00cdd\u0000\u053d\u053e\u0003\u00e5p\u0000\u053e\u053f"+ - "\u0003\u00edt\u0000\u053f\u0569\u0001\u0000\u0000\u0000\u0540\u0541\u0003"+ - "\u00cdd\u0000\u0541\u0542\u0003\u00e5p\u0000\u0542\u0543\u0003\u00edt"+ - "\u0000\u0543\u0544\u0003\u00d7i\u0000\u0544\u0569\u0001\u0000\u0000\u0000"+ - "\u0545\u0546\u0003\u00d3g\u0000\u0546\u0547\u0003\u00dfm\u0000\u0547\u0548"+ - "\u0003\u00e5p\u0000\u0548\u0549\u0003\u00e5p\u0000\u0549\u054a\u0003\u00eb"+ - "s\u0000\u054a\u0569\u0001\u0000\u0000\u0000\u054b\u054c\u0003\u00dfm\u0000"+ - "\u054c\u054d\u0003\u00efu\u0000\u054d\u054e\u0003\u00ebs\u0000\u054e\u054f"+ - "\u0003\u00d9j\u0000\u054f\u0550\u0003\u00e1n\u0000\u0550\u0569\u0001\u0000"+ - "\u0000\u0000\u0551\u0552\u0003\u00edt\u0000\u0552\u0553\u0003\u00d9j\u0000"+ - "\u0553\u0554\u0003\u00e3o\u0000\u0554\u0569\u0001\u0000\u0000\u0000\u0555"+ - "\u0556\u0003\u00edt\u0000\u0556\u0557\u0003\u00d9j\u0000\u0557\u0558\u0003"+ - "\u00e3o\u0000\u0558\u0559\u0003\u00d7i\u0000\u0559\u0569\u0001\u0000\u0000"+ - "\u0000\u055a\u055b\u0003\u00edt\u0000\u055b\u055c\u0003\u00e9r\u0000\u055c"+ - "\u055d\u0003\u00ebs\u0000\u055d\u055e\u0003\u00efu\u0000\u055e\u0569\u0001"+ - "\u0000\u0000\u0000\u055f\u0560\u0003\u00efu\u0000\u0560\u0561\u0003\u00c9"+ - "b\u0000\u0561\u0562\u0003\u00e3o\u0000\u0562\u0569\u0001\u0000\u0000\u0000"+ - "\u0563\u0564\u0003\u00efu\u0000\u0564\u0565\u0003\u00c9b\u0000\u0565\u0566"+ - "\u0003\u00e3o\u0000\u0566\u0567\u0003\u00d7i\u0000\u0567\u0569\u0001\u0000"+ - "\u0000\u0000\u0568\u04d1\u0001\u0000\u0000\u0000\u0568\u04d5\u0001\u0000"+ - "\u0000\u0000\u0568\u04d9\u0001\u0000\u0000\u0000\u0568\u04dd\u0001\u0000"+ - "\u0000\u0000\u0568\u04e1\u0001\u0000\u0000\u0000\u0568\u04e7\u0001\u0000"+ - "\u0000\u0000\u0568\u04f6\u0001\u0000\u0000\u0000\u0568\u0501\u0001\u0000"+ - "\u0000\u0000\u0568\u0508\u0001\u0000\u0000\u0000\u0568\u0522\u0001\u0000"+ - "\u0000\u0000\u0568\u0527\u0001\u0000\u0000\u0000\u0568\u052c\u0001\u0000"+ - "\u0000\u0000\u0568\u0531\u0001\u0000\u0000\u0000\u0568\u0537\u0001\u0000"+ - "\u0000\u0000\u0568\u053c\u0001\u0000\u0000\u0000\u0568\u0540\u0001\u0000"+ - "\u0000\u0000\u0568\u0545\u0001\u0000\u0000\u0000\u0568\u054b\u0001\u0000"+ - "\u0000\u0000\u0568\u0551\u0001\u0000\u0000\u0000\u0568\u0555\u0001\u0000"+ - "\u0000\u0000\u0568\u055a\u0001\u0000\u0000\u0000\u0568\u055f\u0001\u0000"+ - "\u0000\u0000\u0568\u0563\u0001\u0000\u0000\u0000\u0569\u008c\u0001\u0000"+ - "\u0000\u0000\u056a\u056b\u0003\u00cdd\u0000\u056b\u056c\u0003\u00d9j\u0000"+ - "\u056c\u056d\u0003\u00cfe\u0000\u056d\u056e\u0003\u00ebs\u0000\u056e\u056f"+ - "\u0003m4\u0000\u056f\u0570\u0003\u00e1n\u0000\u0570\u0571\u0003\u00c9"+ - "b\u0000\u0571\u0572\u0003\u00efu\u0000\u0572\u0573\u0003\u00cdd\u0000"+ - "\u0573\u0574\u0003\u00d7i\u0000\u0574\u008e\u0001\u0000\u0000\u0000\u0575"+ - "\u057c\u0003;\u001b\u0000\u0576\u057b\u0003;\u001b\u0000\u0577\u057b\u0003"+ - "9\u001a\u0000\u0578\u057b\u0005_\u0000\u0000\u0579\u057b\u0003{;\u0000"+ - "\u057a\u0576\u0001\u0000\u0000\u0000\u057a\u0577\u0001\u0000\u0000\u0000"+ - "\u057a\u0578\u0001\u0000\u0000\u0000\u057a\u0579\u0001\u0000\u0000\u0000"+ - "\u057b\u057e\u0001\u0000\u0000\u0000\u057c\u057a\u0001\u0000\u0000\u0000"+ - "\u057c\u057d\u0001\u0000\u0000\u0000\u057d\u0589\u0001\u0000\u0000\u0000"+ - "\u057e\u057c\u0001\u0000\u0000\u0000\u057f\u0584\u0007\b\u0000\u0000\u0580"+ - "\u0585\u0003;\u001b\u0000\u0581\u0585\u00039\u001a\u0000\u0582\u0585\u0005"+ - "_\u0000\u0000\u0583\u0585\u0003{;\u0000\u0584\u0580\u0001\u0000\u0000"+ - "\u0000\u0584\u0581\u0001\u0000\u0000\u0000\u0584\u0582\u0001\u0000\u0000"+ - "\u0000\u0584\u0583\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000\u0000"+ - "\u0000\u0586\u0584\u0001\u0000\u0000\u0000\u0586\u0587\u0001\u0000\u0000"+ - "\u0000\u0587\u0589\u0001\u0000\u0000\u0000\u0588\u0575\u0001\u0000\u0000"+ - "\u0000\u0588\u057f\u0001\u0000\u0000\u0000\u0589\u0090\u0001\u0000\u0000"+ - "\u0000\u058a\u0590\u0005`\u0000\u0000\u058b\u058f\b\t\u0000\u0000\u058c"+ - "\u058d\u0005`\u0000\u0000\u058d\u058f\u0005`\u0000\u0000\u058e\u058b\u0001"+ - "\u0000\u0000\u0000\u058e\u058c\u0001\u0000\u0000\u0000\u058f\u0592\u0001"+ - "\u0000\u0000\u0000\u0590\u058e\u0001\u0000\u0000\u0000\u0590\u0591\u0001"+ - "\u0000\u0000\u0000\u0591\u0593\u0001\u0000\u0000\u0000\u0592\u0590\u0001"+ - "\u0000\u0000\u0000\u0593\u0594\u0005`\u0000\u0000\u0594\u0092\u0001\u0000"+ - "\u0000\u0000\u0595\u0596\u0003\'\u0011\u0000\u0596\u0597\u0001\u0000\u0000"+ - "\u0000\u0597\u0598\u0006G\u0004\u0000\u0598\u0094\u0001\u0000\u0000\u0000"+ - "\u0599\u059a\u0003)\u0012\u0000\u059a\u059b\u0001\u0000\u0000\u0000\u059b"+ - "\u059c\u0006H\u0004\u0000\u059c\u0096\u0001\u0000\u0000\u0000\u059d\u059e"+ - "\u0003+\u0013\u0000\u059e\u059f\u0001\u0000\u0000\u0000\u059f\u05a0\u0006"+ - "I\u0004\u0000\u05a0\u0098\u0001\u0000\u0000\u0000\u05a1\u05a2\u0005|\u0000"+ - "\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000\u05a3\u05a4\u0006J\u0007\u0000"+ - "\u05a4\u05a5\u0006J\b\u0000\u05a5\u009a\u0001\u0000\u0000\u0000\u05a6"+ - "\u05a7\u0005[\u0000\u0000\u05a7\u05a8\u0001\u0000\u0000\u0000\u05a8\u05a9"+ - "\u0006K\u0005\u0000\u05a9\u05aa\u0006K\u0002\u0000\u05aa\u05ab\u0006K"+ - "\u0002\u0000\u05ab\u009c\u0001\u0000\u0000\u0000\u05ac\u05ad\u0005]\u0000"+ - "\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ae\u05af\u0006L\b\u0000"+ - "\u05af\u05b0\u0006L\b\u0000\u05b0\u05b1\u0006L\t\u0000\u05b1\u009e\u0001"+ - "\u0000\u0000\u0000\u05b2\u05b3\u0005,\u0000\u0000\u05b3\u05b4\u0001\u0000"+ - "\u0000\u0000\u05b4\u05b5\u0006M\n\u0000\u05b5\u00a0\u0001\u0000\u0000"+ - "\u0000\u05b6\u05b7\u0005=\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000"+ - "\u05b8\u05b9\u0006N\u000b\u0000\u05b9\u00a2\u0001\u0000\u0000\u0000\u05ba"+ - "\u05bb\u0003\u00e1n\u0000\u05bb\u05bc\u0003\u00d1f\u0000\u05bc\u05bd\u0003"+ - "\u00efu\u0000\u05bd\u05be\u0003\u00c9b\u0000\u05be\u05bf\u0003\u00cfe"+ - "\u0000\u05bf\u05c0\u0003\u00c9b\u0000\u05c0\u05c1\u0003\u00efu\u0000\u05c1"+ - "\u05c2\u0003\u00c9b\u0000\u05c2\u00a4\u0001\u0000\u0000\u0000\u05c3\u05c5"+ - "\u0003\u00a7Q\u0000\u05c4\u05c3\u0001\u0000\u0000\u0000\u05c5\u05c6\u0001"+ - "\u0000\u0000\u0000\u05c6\u05c4\u0001\u0000\u0000\u0000\u05c6\u05c7\u0001"+ - "\u0000\u0000\u0000\u05c7\u00a6\u0001\u0000\u0000\u0000\u05c8\u05ca\b\n"+ - "\u0000\u0000\u05c9\u05c8\u0001\u0000\u0000\u0000\u05ca\u05cb\u0001\u0000"+ - "\u0000\u0000\u05cb\u05c9\u0001\u0000\u0000\u0000\u05cb\u05cc\u0001\u0000"+ - "\u0000\u0000\u05cc\u05d0\u0001\u0000\u0000\u0000\u05cd\u05ce\u0005/\u0000"+ - "\u0000\u05ce\u05d0\b\u000b\u0000\u0000\u05cf\u05c9\u0001\u0000\u0000\u0000"+ - "\u05cf\u05cd\u0001\u0000\u0000\u0000\u05d0\u00a8\u0001\u0000\u0000\u0000"+ - "\u05d1\u05d2\u0003\u0091F\u0000\u05d2\u00aa\u0001\u0000\u0000\u0000\u05d3"+ - "\u05d4\u0003\'\u0011\u0000\u05d4\u05d5\u0001\u0000\u0000\u0000\u05d5\u05d6"+ - "\u0006S\u0004\u0000\u05d6\u00ac\u0001\u0000\u0000\u0000\u05d7\u05d8\u0003"+ - ")\u0012\u0000\u05d8\u05d9\u0001\u0000\u0000\u0000\u05d9\u05da\u0006T\u0004"+ - "\u0000\u05da\u00ae\u0001\u0000\u0000\u0000\u05db\u05dc\u0003+\u0013\u0000"+ - "\u05dc\u05dd\u0001\u0000\u0000\u0000\u05dd\u05de\u0006U\u0004\u0000\u05de"+ - "\u00b0\u0001\u0000\u0000\u0000\u05df\u05e0\u0003\u00e5p\u0000\u05e0\u05e1"+ - "\u0003\u00e3o\u0000\u05e1\u00b2\u0001\u0000\u0000\u0000\u05e2\u05e3\u0003"+ - "\u00f5x\u0000\u05e3\u05e4\u0003\u00d9j\u0000\u05e4\u05e5\u0003\u00efu"+ - "\u0000\u05e5\u05e6\u0003\u00d7i\u0000\u05e6\u00b4\u0001\u0000\u0000\u0000"+ - "\u05e7\u05e8\u0005|\u0000\u0000\u05e8\u05e9\u0001\u0000\u0000\u0000\u05e9"+ - "\u05ea\u0006X\u0007\u0000\u05ea\u05eb\u0006X\b\u0000\u05eb\u00b6\u0001"+ - "\u0000\u0000\u0000\u05ec\u05ed\u0005]\u0000\u0000\u05ed\u05ee\u0001\u0000"+ - "\u0000\u0000\u05ee\u05ef\u0006Y\b\u0000\u05ef\u05f0\u0006Y\b\u0000\u05f0"+ - "\u05f1\u0006Y\t\u0000\u05f1\u00b8\u0001\u0000\u0000\u0000\u05f2\u05f3"+ - "\u0005,\u0000\u0000\u05f3\u05f4\u0001\u0000\u0000\u0000\u05f4\u05f5\u0006"+ - "Z\n\u0000\u05f5\u00ba\u0001\u0000\u0000\u0000\u05f6\u05f7\u0005=\u0000"+ - "\u0000\u05f7\u05f8\u0001\u0000\u0000\u0000\u05f8\u05f9\u0006[\u000b\u0000"+ - "\u05f9\u00bc\u0001\u0000\u0000\u0000\u05fa\u05fc\u0003\u00bf]\u0000\u05fb"+ - "\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000\u0000\u05fd"+ - "\u05fb\u0001\u0000\u0000\u0000\u05fd\u05fe\u0001\u0000\u0000\u0000\u05fe"+ - "\u00be\u0001\u0000\u0000\u0000\u05ff\u0601\b\n\u0000\u0000\u0600\u05ff"+ - "\u0001\u0000\u0000\u0000\u0601\u0602\u0001\u0000\u0000\u0000\u0602\u0600"+ - "\u0001\u0000\u0000\u0000\u0602\u0603\u0001\u0000\u0000\u0000\u0603\u0607"+ - "\u0001\u0000\u0000\u0000\u0604\u0605\u0005/\u0000\u0000\u0605\u0607\b"+ - "\u000b\u0000\u0000\u0606\u0600\u0001\u0000\u0000\u0000\u0606\u0604\u0001"+ - "\u0000\u0000\u0000\u0607\u00c0\u0001\u0000\u0000\u0000\u0608\u0609\u0003"+ - "\u0091F\u0000\u0609\u00c2\u0001\u0000\u0000\u0000\u060a\u060b\u0003\'"+ - "\u0011\u0000\u060b\u060c\u0001\u0000\u0000\u0000\u060c\u060d\u0006_\u0004"+ - "\u0000\u060d\u00c4\u0001\u0000\u0000\u0000\u060e\u060f\u0003)\u0012\u0000"+ - "\u060f\u0610\u0001\u0000\u0000\u0000\u0610\u0611\u0006`\u0004\u0000\u0611"+ - "\u00c6\u0001\u0000\u0000\u0000\u0612\u0613\u0003+\u0013\u0000\u0613\u0614"+ - "\u0001\u0000\u0000\u0000\u0614\u0615\u0006a\u0004\u0000\u0615\u00c8\u0001"+ - "\u0000\u0000\u0000\u0616\u0617\u0007\f\u0000\u0000\u0617\u00ca\u0001\u0000"+ - "\u0000\u0000\u0618\u0619\u0007\r\u0000\u0000\u0619\u00cc\u0001\u0000\u0000"+ - "\u0000\u061a\u061b\u0007\u000e\u0000\u0000\u061b\u00ce\u0001\u0000\u0000"+ - "\u0000\u061c\u061d\u0007\u000f\u0000\u0000\u061d\u00d0\u0001\u0000\u0000"+ - "\u0000\u061e\u061f\u0007\u0006\u0000\u0000\u061f\u00d2\u0001\u0000\u0000"+ - "\u0000\u0620\u0621\u0007\u0010\u0000\u0000\u0621\u00d4\u0001\u0000\u0000"+ - "\u0000\u0622\u0623\u0007\u0011\u0000\u0000\u0623\u00d6\u0001\u0000\u0000"+ - "\u0000\u0624\u0625\u0007\u0012\u0000\u0000\u0625\u00d8\u0001\u0000\u0000"+ - "\u0000\u0626\u0627\u0007\u0013\u0000\u0000\u0627\u00da\u0001\u0000\u0000"+ - "\u0000\u0628\u0629\u0007\u0014\u0000\u0000\u0629\u00dc\u0001\u0000\u0000"+ - "\u0000\u062a\u062b\u0007\u0015\u0000\u0000\u062b\u00de\u0001\u0000\u0000"+ - "\u0000\u062c\u062d\u0007\u0016\u0000\u0000\u062d\u00e0\u0001\u0000\u0000"+ - "\u0000\u062e\u062f\u0007\u0017\u0000\u0000\u062f\u00e2\u0001\u0000\u0000"+ - "\u0000\u0630\u0631\u0007\u0018\u0000\u0000\u0631\u00e4\u0001\u0000\u0000"+ - "\u0000\u0632\u0633\u0007\u0019\u0000\u0000\u0633\u00e6\u0001\u0000\u0000"+ - "\u0000\u0634\u0635\u0007\u001a\u0000\u0000\u0635\u00e8\u0001\u0000\u0000"+ - "\u0000\u0636\u0637\u0007\u001b\u0000\u0000\u0637\u00ea\u0001\u0000\u0000"+ - "\u0000\u0638\u0639\u0007\u001c\u0000\u0000\u0639\u00ec\u0001\u0000\u0000"+ - "\u0000\u063a\u063b\u0007\u001d\u0000\u0000\u063b\u00ee\u0001\u0000\u0000"+ - "\u0000\u063c\u063d\u0007\u001e\u0000\u0000\u063d\u00f0\u0001\u0000\u0000"+ - "\u0000\u063e\u063f\u0007\u001f\u0000\u0000\u063f\u00f2\u0001\u0000\u0000"+ - "\u0000\u0640\u0641\u0007 \u0000\u0000\u0641\u00f4\u0001\u0000\u0000\u0000"+ - "\u0642\u0643\u0007!\u0000\u0000\u0643\u00f6\u0001\u0000\u0000\u0000\u0644"+ - "\u0645\u0007\"\u0000\u0000\u0645\u00f8\u0001\u0000\u0000\u0000\u0646\u0647"+ - "\u0007#\u0000\u0000\u0647\u00fa\u0001\u0000\u0000\u0000\u0648\u0649\u0007"+ - "$\u0000\u0000\u0649\u00fc\u0001\u0000\u0000\u00000\u0000\u0001\u0002\u0003"+ - "\u0004\u018e\u0192\u0195\u019e\u01a0\u01ab\u01d4\u01d9\u01de\u01e0\u01eb"+ - "\u01f3\u01f6\u01f8\u01fd\u0202\u0208\u020f\u0214\u021a\u021d\u0225\u0229"+ - "\u028c\u02e0\u02ec\u0302\u0313\u04cf\u0568\u057a\u057c\u0584\u0586\u0588"+ - "\u058e\u0590\u05c6\u05cb\u05cf\u05fd\u0602\u0606\f\u0005\u0002\u0000\u0005"+ - "\u0001\u0000\u0005\u0003\u0000\u0005\u0004\u0000\u0000\u0001\u0000\u0007"+ - "#\u0000\u0005\u0000\u0000\u0007\u0018\u0000\u0004\u0000\u0000\u0007$\u0000"+ - "\u0007 \u0000\u0007\u001f\u0000"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_lexer.tokens b/packages/kbn-esql/src/antlr/.antlr/esql_lexer.tokens deleted file mode 100644 index b72e97b9a2961..0000000000000 --- a/packages/kbn-esql/src/antlr/.antlr/esql_lexer.tokens +++ /dev/null @@ -1,98 +0,0 @@ -DISSECT=1 -GROK=2 -EVAL=3 -EXPLAIN=4 -FROM=5 -ROW=6 -STATS=7 -WHERE=8 -SORT=9 -MV_EXPAND=10 -LIMIT=11 -PROJECT=12 -DROP=13 -RENAME=14 -SHOW=15 -ENRICH=16 -KEEP=17 -LINE_COMMENT=18 -MULTILINE_COMMENT=19 -WS=20 -EXPLAIN_WS=21 -EXPLAIN_LINE_COMMENT=22 -EXPLAIN_MULTILINE_COMMENT=23 -PIPE=24 -STRING=25 -INTEGER_LITERAL=26 -DECIMAL_LITERAL=27 -BY=28 -DATE_LITERAL=29 -AND=30 -ASSIGN=31 -COMMA=32 -DOT=33 -LP=34 -OPENING_BRACKET=35 -CLOSING_BRACKET=36 -NOT=37 -LIKE=38 -RLIKE=39 -IN=40 -IS=41 -AS=42 -NULL=43 -OR=44 -RP=45 -UNDERSCORE=46 -INFO=47 -FUNCTIONS=48 -BOOLEAN_VALUE=49 -COMPARISON_OPERATOR=50 -PLUS=51 -MINUS=52 -ASTERISK=53 -SLASH=54 -PERCENT=55 -TEN=56 -ORDERING=57 -NULLS_ORDERING=58 -NULLS_ORDERING_DIRECTION=59 -MATH_FUNCTION=60 -UNARY_FUNCTION=61 -WHERE_FUNCTIONS=62 -UNQUOTED_IDENTIFIER=63 -QUOTED_IDENTIFIER=64 -EXPR_LINE_COMMENT=65 -EXPR_MULTILINE_COMMENT=66 -EXPR_WS=67 -METADATA=68 -SRC_UNQUOTED_IDENTIFIER=69 -SRC_QUOTED_IDENTIFIER=70 -SRC_LINE_COMMENT=71 -SRC_MULTILINE_COMMENT=72 -SRC_WS=73 -ON=74 -WITH=75 -ENR_UNQUOTED_IDENTIFIER=76 -ENR_QUOTED_IDENTIFIER=77 -ENR_LINE_COMMENT=78 -ENR_MULTILINE_COMMENT=79 -ENR_WS=80 -EXPLAIN_PIPE=81 -'by'=28 -'and'=30 -'.'=33 -'('=34 -']'=36 -'or'=44 -')'=45 -'_'=46 -'info'=47 -'functions'=48 -'+'=51 -'-'=52 -'*'=53 -'/'=54 -'%'=55 -'10'=56 -'nulls'=58 diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_parser.interp b/packages/kbn-esql/src/antlr/.antlr/esql_parser.interp deleted file mode 100644 index 72a8d73c77d6d..0000000000000 --- a/packages/kbn-esql/src/antlr/.antlr/esql_parser.interp +++ /dev/null @@ -1,256 +0,0 @@ -token literal names: -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -'|' -null -null -null -null -null -null -'=' -',' -null -'.' -null -null -null -'(' -null -null -null -null -null -null -null -'?' -null -')' -null -'==' -'!=' -'<' -'<=' -'>' -'>=' -'+' -'-' -'*' -'/' -'%' -null -']' -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null - -token symbolic names: -null -DISSECT -DROP -ENRICH -EVAL -EXPLAIN -FROM -GROK -INLINESTATS -KEEP -LIMIT -MV_EXPAND -PROJECT -RENAME -ROW -SHOW -SORT -STATS -WHERE -UNKNOWN_CMD -LINE_COMMENT -MULTILINE_COMMENT -WS -EXPLAIN_WS -EXPLAIN_LINE_COMMENT -EXPLAIN_MULTILINE_COMMENT -PIPE -STRING -INTEGER_LITERAL -DECIMAL_LITERAL -BY -AND -ASC -ASSIGN -COMMA -DESC -DOT -FALSE -FIRST -LAST -LP -IN -IS -LIKE -NOT -NULL -NULLS -OR -PARAM -RLIKE -RP -TRUE -EQ -NEQ -LT -LTE -GT -GTE -PLUS -MINUS -ASTERISK -SLASH -PERCENT -OPENING_BRACKET -CLOSING_BRACKET -UNQUOTED_IDENTIFIER -QUOTED_IDENTIFIER -EXPR_LINE_COMMENT -EXPR_MULTILINE_COMMENT -EXPR_WS -METADATA -FROM_UNQUOTED_IDENTIFIER -FROM_LINE_COMMENT -FROM_MULTILINE_COMMENT -FROM_WS -PROJECT_UNQUOTED_IDENTIFIER -PROJECT_LINE_COMMENT -PROJECT_MULTILINE_COMMENT -PROJECT_WS -AS -RENAME_LINE_COMMENT -RENAME_MULTILINE_COMMENT -RENAME_WS -ON -WITH -ENRICH_LINE_COMMENT -ENRICH_MULTILINE_COMMENT -ENRICH_WS -ENRICH_FIELD_LINE_COMMENT -ENRICH_FIELD_MULTILINE_COMMENT -ENRICH_FIELD_WS -MVEXPAND_LINE_COMMENT -MVEXPAND_MULTILINE_COMMENT -MVEXPAND_WS -INFO -FUNCTIONS -SHOW_LINE_COMMENT -SHOW_MULTILINE_COMMENT -SHOW_WS - -rule names: -singleStatement -query -sourceCommand -processingCommand -whereCommand -booleanExpression -regexBooleanExpression -valueExpression -operatorExpression -primaryExpression -functionExpression -rowCommand -fields -field -fromCommand -metadata -evalCommand -statsCommand -inlinestatsCommand -grouping -fromIdentifier -qualifiedName -qualifiedNamePattern -identifier -identifierPattern -constant -limitCommand -sortCommand -orderExpression -keepCommand -dropCommand -renameCommand -renameClause -dissectCommand -grokCommand -mvExpandCommand -commandOptions -commandOption -booleanValue -numericValue -decimalValue -integerValue -string -comparisonOperator -explainCommand -subqueryExpression -showCommand -enrichCommand -enrichWithClause - - -atn: -[4, 1, 98, 519, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 108, 8, 1, 10, 1, 12, 1, 111, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 117, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 132, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 144, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 151, 8, 5, 10, 5, 12, 5, 154, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 161, 8, 5, 1, 5, 1, 5, 3, 5, 165, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 173, 8, 5, 10, 5, 12, 5, 176, 9, 5, 1, 6, 1, 6, 3, 6, 180, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 187, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 192, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 199, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 205, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 213, 8, 8, 10, 8, 12, 8, 216, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 225, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 233, 8, 10, 10, 10, 12, 10, 236, 9, 10, 3, 10, 238, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 5, 12, 248, 8, 12, 10, 12, 12, 12, 251, 9, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 258, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 264, 8, 14, 10, 14, 12, 14, 267, 9, 14, 1, 14, 3, 14, 270, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 277, 8, 15, 10, 15, 12, 15, 280, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 3, 17, 289, 8, 17, 1, 17, 1, 17, 3, 17, 293, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 299, 8, 18, 1, 19, 1, 19, 1, 19, 5, 19, 304, 8, 19, 10, 19, 12, 19, 307, 9, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 5, 21, 314, 8, 21, 10, 21, 12, 21, 317, 9, 21, 1, 22, 1, 22, 1, 22, 5, 22, 322, 8, 22, 10, 22, 12, 22, 325, 9, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 344, 8, 25, 10, 25, 12, 25, 347, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 355, 8, 25, 10, 25, 12, 25, 358, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 366, 8, 25, 10, 25, 12, 25, 369, 9, 25, 1, 25, 1, 25, 3, 25, 373, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 382, 8, 27, 10, 27, 12, 27, 385, 9, 27, 1, 28, 1, 28, 3, 28, 389, 8, 28, 1, 28, 1, 28, 3, 28, 393, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 399, 8, 29, 10, 29, 12, 29, 402, 9, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 408, 8, 29, 10, 29, 12, 29, 411, 9, 29, 3, 29, 413, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 419, 8, 30, 10, 30, 12, 30, 422, 9, 30, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 428, 8, 31, 10, 31, 12, 31, 431, 9, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 441, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 5, 36, 453, 8, 36, 10, 36, 12, 36, 456, 9, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 3, 39, 466, 8, 39, 1, 40, 3, 40, 469, 8, 40, 1, 40, 1, 40, 1, 41, 3, 41, 474, 8, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 493, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 499, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 505, 8, 47, 10, 47, 12, 47, 508, 9, 47, 3, 47, 510, 8, 47, 1, 48, 1, 48, 1, 48, 3, 48, 515, 8, 48, 1, 48, 1, 48, 1, 48, 0, 3, 2, 10, 16, 49, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 0, 9, 1, 0, 58, 59, 1, 0, 60, 62, 2, 0, 66, 66, 71, 71, 1, 0, 65, 66, 2, 0, 66, 66, 75, 75, 2, 0, 32, 32, 35, 35, 1, 0, 38, 39, 2, 0, 37, 37, 51, 51, 1, 0, 52, 57, 548, 0, 98, 1, 0, 0, 0, 2, 101, 1, 0, 0, 0, 4, 116, 1, 0, 0, 0, 6, 131, 1, 0, 0, 0, 8, 133, 1, 0, 0, 0, 10, 164, 1, 0, 0, 0, 12, 191, 1, 0, 0, 0, 14, 198, 1, 0, 0, 0, 16, 204, 1, 0, 0, 0, 18, 224, 1, 0, 0, 0, 20, 226, 1, 0, 0, 0, 22, 241, 1, 0, 0, 0, 24, 244, 1, 0, 0, 0, 26, 257, 1, 0, 0, 0, 28, 259, 1, 0, 0, 0, 30, 271, 1, 0, 0, 0, 32, 283, 1, 0, 0, 0, 34, 286, 1, 0, 0, 0, 36, 294, 1, 0, 0, 0, 38, 300, 1, 0, 0, 0, 40, 308, 1, 0, 0, 0, 42, 310, 1, 0, 0, 0, 44, 318, 1, 0, 0, 0, 46, 326, 1, 0, 0, 0, 48, 328, 1, 0, 0, 0, 50, 372, 1, 0, 0, 0, 52, 374, 1, 0, 0, 0, 54, 377, 1, 0, 0, 0, 56, 386, 1, 0, 0, 0, 58, 412, 1, 0, 0, 0, 60, 414, 1, 0, 0, 0, 62, 423, 1, 0, 0, 0, 64, 432, 1, 0, 0, 0, 66, 436, 1, 0, 0, 0, 68, 442, 1, 0, 0, 0, 70, 446, 1, 0, 0, 0, 72, 449, 1, 0, 0, 0, 74, 457, 1, 0, 0, 0, 76, 461, 1, 0, 0, 0, 78, 465, 1, 0, 0, 0, 80, 468, 1, 0, 0, 0, 82, 473, 1, 0, 0, 0, 84, 477, 1, 0, 0, 0, 86, 479, 1, 0, 0, 0, 88, 481, 1, 0, 0, 0, 90, 484, 1, 0, 0, 0, 92, 492, 1, 0, 0, 0, 94, 494, 1, 0, 0, 0, 96, 514, 1, 0, 0, 0, 98, 99, 3, 2, 1, 0, 99, 100, 5, 0, 0, 1, 100, 1, 1, 0, 0, 0, 101, 102, 6, 1, -1, 0, 102, 103, 3, 4, 2, 0, 103, 109, 1, 0, 0, 0, 104, 105, 10, 1, 0, 0, 105, 106, 5, 26, 0, 0, 106, 108, 3, 6, 3, 0, 107, 104, 1, 0, 0, 0, 108, 111, 1, 0, 0, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 3, 1, 0, 0, 0, 111, 109, 1, 0, 0, 0, 112, 117, 3, 88, 44, 0, 113, 117, 3, 28, 14, 0, 114, 117, 3, 22, 11, 0, 115, 117, 3, 92, 46, 0, 116, 112, 1, 0, 0, 0, 116, 113, 1, 0, 0, 0, 116, 114, 1, 0, 0, 0, 116, 115, 1, 0, 0, 0, 117, 5, 1, 0, 0, 0, 118, 132, 3, 32, 16, 0, 119, 132, 3, 36, 18, 0, 120, 132, 3, 52, 26, 0, 121, 132, 3, 58, 29, 0, 122, 132, 3, 54, 27, 0, 123, 132, 3, 34, 17, 0, 124, 132, 3, 8, 4, 0, 125, 132, 3, 60, 30, 0, 126, 132, 3, 62, 31, 0, 127, 132, 3, 66, 33, 0, 128, 132, 3, 68, 34, 0, 129, 132, 3, 94, 47, 0, 130, 132, 3, 70, 35, 0, 131, 118, 1, 0, 0, 0, 131, 119, 1, 0, 0, 0, 131, 120, 1, 0, 0, 0, 131, 121, 1, 0, 0, 0, 131, 122, 1, 0, 0, 0, 131, 123, 1, 0, 0, 0, 131, 124, 1, 0, 0, 0, 131, 125, 1, 0, 0, 0, 131, 126, 1, 0, 0, 0, 131, 127, 1, 0, 0, 0, 131, 128, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 131, 130, 1, 0, 0, 0, 132, 7, 1, 0, 0, 0, 133, 134, 5, 18, 0, 0, 134, 135, 3, 10, 5, 0, 135, 9, 1, 0, 0, 0, 136, 137, 6, 5, -1, 0, 137, 138, 5, 44, 0, 0, 138, 165, 3, 10, 5, 7, 139, 165, 3, 14, 7, 0, 140, 165, 3, 12, 6, 0, 141, 143, 3, 14, 7, 0, 142, 144, 5, 44, 0, 0, 143, 142, 1, 0, 0, 0, 143, 144, 1, 0, 0, 0, 144, 145, 1, 0, 0, 0, 145, 146, 5, 41, 0, 0, 146, 147, 5, 40, 0, 0, 147, 152, 3, 14, 7, 0, 148, 149, 5, 34, 0, 0, 149, 151, 3, 14, 7, 0, 150, 148, 1, 0, 0, 0, 151, 154, 1, 0, 0, 0, 152, 150, 1, 0, 0, 0, 152, 153, 1, 0, 0, 0, 153, 155, 1, 0, 0, 0, 154, 152, 1, 0, 0, 0, 155, 156, 5, 50, 0, 0, 156, 165, 1, 0, 0, 0, 157, 158, 3, 14, 7, 0, 158, 160, 5, 42, 0, 0, 159, 161, 5, 44, 0, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 5, 45, 0, 0, 163, 165, 1, 0, 0, 0, 164, 136, 1, 0, 0, 0, 164, 139, 1, 0, 0, 0, 164, 140, 1, 0, 0, 0, 164, 141, 1, 0, 0, 0, 164, 157, 1, 0, 0, 0, 165, 174, 1, 0, 0, 0, 166, 167, 10, 4, 0, 0, 167, 168, 5, 31, 0, 0, 168, 173, 3, 10, 5, 5, 169, 170, 10, 3, 0, 0, 170, 171, 5, 47, 0, 0, 171, 173, 3, 10, 5, 4, 172, 166, 1, 0, 0, 0, 172, 169, 1, 0, 0, 0, 173, 176, 1, 0, 0, 0, 174, 172, 1, 0, 0, 0, 174, 175, 1, 0, 0, 0, 175, 11, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 177, 179, 3, 14, 7, 0, 178, 180, 5, 44, 0, 0, 179, 178, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 182, 5, 43, 0, 0, 182, 183, 3, 84, 42, 0, 183, 192, 1, 0, 0, 0, 184, 186, 3, 14, 7, 0, 185, 187, 5, 44, 0, 0, 186, 185, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 189, 5, 49, 0, 0, 189, 190, 3, 84, 42, 0, 190, 192, 1, 0, 0, 0, 191, 177, 1, 0, 0, 0, 191, 184, 1, 0, 0, 0, 192, 13, 1, 0, 0, 0, 193, 199, 3, 16, 8, 0, 194, 195, 3, 16, 8, 0, 195, 196, 3, 86, 43, 0, 196, 197, 3, 16, 8, 0, 197, 199, 1, 0, 0, 0, 198, 193, 1, 0, 0, 0, 198, 194, 1, 0, 0, 0, 199, 15, 1, 0, 0, 0, 200, 201, 6, 8, -1, 0, 201, 205, 3, 18, 9, 0, 202, 203, 7, 0, 0, 0, 203, 205, 3, 16, 8, 3, 204, 200, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 205, 214, 1, 0, 0, 0, 206, 207, 10, 2, 0, 0, 207, 208, 7, 1, 0, 0, 208, 213, 3, 16, 8, 3, 209, 210, 10, 1, 0, 0, 210, 211, 7, 0, 0, 0, 211, 213, 3, 16, 8, 2, 212, 206, 1, 0, 0, 0, 212, 209, 1, 0, 0, 0, 213, 216, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 17, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 217, 225, 3, 50, 25, 0, 218, 225, 3, 42, 21, 0, 219, 225, 3, 20, 10, 0, 220, 221, 5, 40, 0, 0, 221, 222, 3, 10, 5, 0, 222, 223, 5, 50, 0, 0, 223, 225, 1, 0, 0, 0, 224, 217, 1, 0, 0, 0, 224, 218, 1, 0, 0, 0, 224, 219, 1, 0, 0, 0, 224, 220, 1, 0, 0, 0, 225, 19, 1, 0, 0, 0, 226, 227, 3, 46, 23, 0, 227, 237, 5, 40, 0, 0, 228, 238, 5, 60, 0, 0, 229, 234, 3, 10, 5, 0, 230, 231, 5, 34, 0, 0, 231, 233, 3, 10, 5, 0, 232, 230, 1, 0, 0, 0, 233, 236, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 238, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 237, 228, 1, 0, 0, 0, 237, 229, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 240, 5, 50, 0, 0, 240, 21, 1, 0, 0, 0, 241, 242, 5, 14, 0, 0, 242, 243, 3, 24, 12, 0, 243, 23, 1, 0, 0, 0, 244, 249, 3, 26, 13, 0, 245, 246, 5, 34, 0, 0, 246, 248, 3, 26, 13, 0, 247, 245, 1, 0, 0, 0, 248, 251, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 25, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 252, 258, 3, 10, 5, 0, 253, 254, 3, 42, 21, 0, 254, 255, 5, 33, 0, 0, 255, 256, 3, 10, 5, 0, 256, 258, 1, 0, 0, 0, 257, 252, 1, 0, 0, 0, 257, 253, 1, 0, 0, 0, 258, 27, 1, 0, 0, 0, 259, 260, 5, 6, 0, 0, 260, 265, 3, 40, 20, 0, 261, 262, 5, 34, 0, 0, 262, 264, 3, 40, 20, 0, 263, 261, 1, 0, 0, 0, 264, 267, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 268, 270, 3, 30, 15, 0, 269, 268, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 29, 1, 0, 0, 0, 271, 272, 5, 63, 0, 0, 272, 273, 5, 70, 0, 0, 273, 278, 3, 40, 20, 0, 274, 275, 5, 34, 0, 0, 275, 277, 3, 40, 20, 0, 276, 274, 1, 0, 0, 0, 277, 280, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 281, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 281, 282, 5, 64, 0, 0, 282, 31, 1, 0, 0, 0, 283, 284, 5, 4, 0, 0, 284, 285, 3, 24, 12, 0, 285, 33, 1, 0, 0, 0, 286, 288, 5, 17, 0, 0, 287, 289, 3, 24, 12, 0, 288, 287, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 291, 5, 30, 0, 0, 291, 293, 3, 38, 19, 0, 292, 290, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 35, 1, 0, 0, 0, 294, 295, 5, 8, 0, 0, 295, 298, 3, 24, 12, 0, 296, 297, 5, 30, 0, 0, 297, 299, 3, 38, 19, 0, 298, 296, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 37, 1, 0, 0, 0, 300, 305, 3, 42, 21, 0, 301, 302, 5, 34, 0, 0, 302, 304, 3, 42, 21, 0, 303, 301, 1, 0, 0, 0, 304, 307, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 39, 1, 0, 0, 0, 307, 305, 1, 0, 0, 0, 308, 309, 7, 2, 0, 0, 309, 41, 1, 0, 0, 0, 310, 315, 3, 46, 23, 0, 311, 312, 5, 36, 0, 0, 312, 314, 3, 46, 23, 0, 313, 311, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 43, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 323, 3, 48, 24, 0, 319, 320, 5, 36, 0, 0, 320, 322, 3, 48, 24, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 45, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 327, 7, 3, 0, 0, 327, 47, 1, 0, 0, 0, 328, 329, 7, 4, 0, 0, 329, 49, 1, 0, 0, 0, 330, 373, 5, 45, 0, 0, 331, 332, 3, 82, 41, 0, 332, 333, 5, 65, 0, 0, 333, 373, 1, 0, 0, 0, 334, 373, 3, 80, 40, 0, 335, 373, 3, 82, 41, 0, 336, 373, 3, 76, 38, 0, 337, 373, 5, 48, 0, 0, 338, 373, 3, 84, 42, 0, 339, 340, 5, 63, 0, 0, 340, 345, 3, 78, 39, 0, 341, 342, 5, 34, 0, 0, 342, 344, 3, 78, 39, 0, 343, 341, 1, 0, 0, 0, 344, 347, 1, 0, 0, 0, 345, 343, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 348, 1, 0, 0, 0, 347, 345, 1, 0, 0, 0, 348, 349, 5, 64, 0, 0, 349, 373, 1, 0, 0, 0, 350, 351, 5, 63, 0, 0, 351, 356, 3, 76, 38, 0, 352, 353, 5, 34, 0, 0, 353, 355, 3, 76, 38, 0, 354, 352, 1, 0, 0, 0, 355, 358, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 359, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 359, 360, 5, 64, 0, 0, 360, 373, 1, 0, 0, 0, 361, 362, 5, 63, 0, 0, 362, 367, 3, 84, 42, 0, 363, 364, 5, 34, 0, 0, 364, 366, 3, 84, 42, 0, 365, 363, 1, 0, 0, 0, 366, 369, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 370, 1, 0, 0, 0, 369, 367, 1, 0, 0, 0, 370, 371, 5, 64, 0, 0, 371, 373, 1, 0, 0, 0, 372, 330, 1, 0, 0, 0, 372, 331, 1, 0, 0, 0, 372, 334, 1, 0, 0, 0, 372, 335, 1, 0, 0, 0, 372, 336, 1, 0, 0, 0, 372, 337, 1, 0, 0, 0, 372, 338, 1, 0, 0, 0, 372, 339, 1, 0, 0, 0, 372, 350, 1, 0, 0, 0, 372, 361, 1, 0, 0, 0, 373, 51, 1, 0, 0, 0, 374, 375, 5, 10, 0, 0, 375, 376, 5, 28, 0, 0, 376, 53, 1, 0, 0, 0, 377, 378, 5, 16, 0, 0, 378, 383, 3, 56, 28, 0, 379, 380, 5, 34, 0, 0, 380, 382, 3, 56, 28, 0, 381, 379, 1, 0, 0, 0, 382, 385, 1, 0, 0, 0, 383, 381, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 55, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 386, 388, 3, 10, 5, 0, 387, 389, 7, 5, 0, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 391, 5, 46, 0, 0, 391, 393, 7, 6, 0, 0, 392, 390, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 57, 1, 0, 0, 0, 394, 395, 5, 9, 0, 0, 395, 400, 3, 44, 22, 0, 396, 397, 5, 34, 0, 0, 397, 399, 3, 44, 22, 0, 398, 396, 1, 0, 0, 0, 399, 402, 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 413, 1, 0, 0, 0, 402, 400, 1, 0, 0, 0, 403, 404, 5, 12, 0, 0, 404, 409, 3, 44, 22, 0, 405, 406, 5, 34, 0, 0, 406, 408, 3, 44, 22, 0, 407, 405, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 412, 394, 1, 0, 0, 0, 412, 403, 1, 0, 0, 0, 413, 59, 1, 0, 0, 0, 414, 415, 5, 2, 0, 0, 415, 420, 3, 44, 22, 0, 416, 417, 5, 34, 0, 0, 417, 419, 3, 44, 22, 0, 418, 416, 1, 0, 0, 0, 419, 422, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 61, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 423, 424, 5, 13, 0, 0, 424, 429, 3, 64, 32, 0, 425, 426, 5, 34, 0, 0, 426, 428, 3, 64, 32, 0, 427, 425, 1, 0, 0, 0, 428, 431, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 63, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 432, 433, 3, 44, 22, 0, 433, 434, 5, 79, 0, 0, 434, 435, 3, 44, 22, 0, 435, 65, 1, 0, 0, 0, 436, 437, 5, 1, 0, 0, 437, 438, 3, 18, 9, 0, 438, 440, 3, 84, 42, 0, 439, 441, 3, 72, 36, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 67, 1, 0, 0, 0, 442, 443, 5, 7, 0, 0, 443, 444, 3, 18, 9, 0, 444, 445, 3, 84, 42, 0, 445, 69, 1, 0, 0, 0, 446, 447, 5, 11, 0, 0, 447, 448, 3, 42, 21, 0, 448, 71, 1, 0, 0, 0, 449, 454, 3, 74, 37, 0, 450, 451, 5, 34, 0, 0, 451, 453, 3, 74, 37, 0, 452, 450, 1, 0, 0, 0, 453, 456, 1, 0, 0, 0, 454, 452, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 73, 1, 0, 0, 0, 456, 454, 1, 0, 0, 0, 457, 458, 3, 46, 23, 0, 458, 459, 5, 33, 0, 0, 459, 460, 3, 50, 25, 0, 460, 75, 1, 0, 0, 0, 461, 462, 7, 7, 0, 0, 462, 77, 1, 0, 0, 0, 463, 466, 3, 80, 40, 0, 464, 466, 3, 82, 41, 0, 465, 463, 1, 0, 0, 0, 465, 464, 1, 0, 0, 0, 466, 79, 1, 0, 0, 0, 467, 469, 7, 0, 0, 0, 468, 467, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 5, 29, 0, 0, 471, 81, 1, 0, 0, 0, 472, 474, 7, 0, 0, 0, 473, 472, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 5, 28, 0, 0, 476, 83, 1, 0, 0, 0, 477, 478, 5, 27, 0, 0, 478, 85, 1, 0, 0, 0, 479, 480, 7, 8, 0, 0, 480, 87, 1, 0, 0, 0, 481, 482, 5, 5, 0, 0, 482, 483, 3, 90, 45, 0, 483, 89, 1, 0, 0, 0, 484, 485, 5, 63, 0, 0, 485, 486, 3, 2, 1, 0, 486, 487, 5, 64, 0, 0, 487, 91, 1, 0, 0, 0, 488, 489, 5, 15, 0, 0, 489, 493, 5, 94, 0, 0, 490, 491, 5, 15, 0, 0, 491, 493, 5, 95, 0, 0, 492, 488, 1, 0, 0, 0, 492, 490, 1, 0, 0, 0, 493, 93, 1, 0, 0, 0, 494, 495, 5, 3, 0, 0, 495, 498, 3, 40, 20, 0, 496, 497, 5, 83, 0, 0, 497, 499, 3, 44, 22, 0, 498, 496, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 509, 1, 0, 0, 0, 500, 501, 5, 84, 0, 0, 501, 506, 3, 96, 48, 0, 502, 503, 5, 34, 0, 0, 503, 505, 3, 96, 48, 0, 504, 502, 1, 0, 0, 0, 505, 508, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 509, 500, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 95, 1, 0, 0, 0, 511, 512, 3, 44, 22, 0, 512, 513, 5, 33, 0, 0, 513, 515, 1, 0, 0, 0, 514, 511, 1, 0, 0, 0, 514, 515, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 516, 517, 3, 44, 22, 0, 517, 97, 1, 0, 0, 0, 52, 109, 116, 131, 143, 152, 160, 164, 172, 174, 179, 186, 191, 198, 204, 212, 214, 224, 234, 237, 249, 257, 265, 269, 278, 288, 292, 298, 305, 315, 323, 345, 356, 367, 372, 383, 388, 392, 400, 409, 412, 420, 429, 440, 454, 465, 468, 473, 492, 498, 506, 509, 514] \ No newline at end of file diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_parser.java b/packages/kbn-esql/src/antlr/.antlr/esql_parser.java deleted file mode 100644 index c784cc891d6a0..0000000000000 --- a/packages/kbn-esql/src/antlr/.antlr/esql_parser.java +++ /dev/null @@ -1,3914 +0,0 @@ -// Generated from /Users/marcoliberati/Work/kibana/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 by ANTLR 4.13.1 -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.misc.*; -import org.antlr.v4.runtime.tree.*; -import java.util.List; -import java.util.Iterator; -import java.util.ArrayList; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class esql_parser extends Parser { - static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, INLINESTATS=8, - KEEP=9, LIMIT=10, MV_EXPAND=11, PROJECT=12, RENAME=13, ROW=14, SHOW=15, - SORT=16, STATS=17, WHERE=18, UNKNOWN_CMD=19, LINE_COMMENT=20, MULTILINE_COMMENT=21, - WS=22, EXPLAIN_WS=23, EXPLAIN_LINE_COMMENT=24, EXPLAIN_MULTILINE_COMMENT=25, - PIPE=26, STRING=27, INTEGER_LITERAL=28, DECIMAL_LITERAL=29, BY=30, AND=31, - ASC=32, ASSIGN=33, COMMA=34, DESC=35, DOT=36, FALSE=37, FIRST=38, LAST=39, - LP=40, IN=41, IS=42, LIKE=43, NOT=44, NULL=45, NULLS=46, OR=47, PARAM=48, - RLIKE=49, RP=50, TRUE=51, EQ=52, NEQ=53, LT=54, LTE=55, GT=56, GTE=57, - PLUS=58, MINUS=59, ASTERISK=60, SLASH=61, PERCENT=62, OPENING_BRACKET=63, - CLOSING_BRACKET=64, UNQUOTED_IDENTIFIER=65, QUOTED_IDENTIFIER=66, EXPR_LINE_COMMENT=67, - EXPR_MULTILINE_COMMENT=68, EXPR_WS=69, METADATA=70, FROM_UNQUOTED_IDENTIFIER=71, - FROM_LINE_COMMENT=72, FROM_MULTILINE_COMMENT=73, FROM_WS=74, PROJECT_UNQUOTED_IDENTIFIER=75, - PROJECT_LINE_COMMENT=76, PROJECT_MULTILINE_COMMENT=77, PROJECT_WS=78, - AS=79, RENAME_LINE_COMMENT=80, RENAME_MULTILINE_COMMENT=81, RENAME_WS=82, - ON=83, WITH=84, ENRICH_LINE_COMMENT=85, ENRICH_MULTILINE_COMMENT=86, ENRICH_WS=87, - ENRICH_FIELD_LINE_COMMENT=88, ENRICH_FIELD_MULTILINE_COMMENT=89, ENRICH_FIELD_WS=90, - MVEXPAND_LINE_COMMENT=91, MVEXPAND_MULTILINE_COMMENT=92, MVEXPAND_WS=93, - INFO=94, FUNCTIONS=95, SHOW_LINE_COMMENT=96, SHOW_MULTILINE_COMMENT=97, - SHOW_WS=98; - public static final int - RULE_singleStatement = 0, RULE_query = 1, RULE_sourceCommand = 2, RULE_processingCommand = 3, - RULE_whereCommand = 4, RULE_booleanExpression = 5, RULE_regexBooleanExpression = 6, - RULE_valueExpression = 7, RULE_operatorExpression = 8, RULE_primaryExpression = 9, - RULE_functionExpression = 10, RULE_rowCommand = 11, RULE_fields = 12, - RULE_field = 13, RULE_fromCommand = 14, RULE_metadata = 15, RULE_evalCommand = 16, - RULE_statsCommand = 17, RULE_inlinestatsCommand = 18, RULE_grouping = 19, - RULE_fromIdentifier = 20, RULE_qualifiedName = 21, RULE_qualifiedNamePattern = 22, - RULE_identifier = 23, RULE_identifierPattern = 24, RULE_constant = 25, - RULE_limitCommand = 26, RULE_sortCommand = 27, RULE_orderExpression = 28, - RULE_keepCommand = 29, RULE_dropCommand = 30, RULE_renameCommand = 31, - RULE_renameClause = 32, RULE_dissectCommand = 33, RULE_grokCommand = 34, - RULE_mvExpandCommand = 35, RULE_commandOptions = 36, RULE_commandOption = 37, - RULE_booleanValue = 38, RULE_numericValue = 39, RULE_decimalValue = 40, - RULE_integerValue = 41, RULE_string = 42, RULE_comparisonOperator = 43, - RULE_explainCommand = 44, RULE_subqueryExpression = 45, RULE_showCommand = 46, - RULE_enrichCommand = 47, RULE_enrichWithClause = 48; - private static String[] makeRuleNames() { - return new String[] { - "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", - "booleanExpression", "regexBooleanExpression", "valueExpression", "operatorExpression", - "primaryExpression", "functionExpression", "rowCommand", "fields", "field", - "fromCommand", "metadata", "evalCommand", "statsCommand", "inlinestatsCommand", - "grouping", "fromIdentifier", "qualifiedName", "qualifiedNamePattern", - "identifier", "identifierPattern", "constant", "limitCommand", "sortCommand", - "orderExpression", "keepCommand", "dropCommand", "renameCommand", "renameClause", - "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", - "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", - "string", "comparisonOperator", "explainCommand", "subqueryExpression", - "showCommand", "enrichCommand", "enrichWithClause" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, "'|'", null, null, null, null, null, null, "'='", "','", - null, "'.'", null, null, null, "'('", null, null, null, null, null, null, - null, "'?'", null, "')'", null, "'=='", "'!='", "'<'", "'<='", "'>'", - "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, "']'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", - "INLINESTATS", "KEEP", "LIMIT", "MV_EXPAND", "PROJECT", "RENAME", "ROW", - "SHOW", "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", - "WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", - "ASC", "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", - "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", - "TRUE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", - "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", - "METADATA", "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "PROJECT_UNQUOTED_IDENTIFIER", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ON", "WITH", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", - "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", - "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", "INFO", "FUNCTIONS", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", - "SHOW_WS" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - @Override - public String getGrammarFileName() { return "esql_parser.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public ATN getATN() { return _ATN; } - - public esql_parser(TokenStream input) { - super(input); - _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @SuppressWarnings("CheckReturnValue") - public static class SingleStatementContext extends ParserRuleContext { - public QueryContext query() { - return getRuleContext(QueryContext.class,0); - } - public TerminalNode EOF() { return getToken(esql_parser.EOF, 0); } - public SingleStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_singleStatement; } - } - - public final SingleStatementContext singleStatement() throws RecognitionException { - SingleStatementContext _localctx = new SingleStatementContext(_ctx, getState()); - enterRule(_localctx, 0, RULE_singleStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(98); - query(0); - setState(99); - match(EOF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class QueryContext extends ParserRuleContext { - public QueryContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_query; } - - public QueryContext() { } - public void copyFrom(QueryContext ctx) { - super.copyFrom(ctx); - } - } - @SuppressWarnings("CheckReturnValue") - public static class CompositeQueryContext extends QueryContext { - public QueryContext query() { - return getRuleContext(QueryContext.class,0); - } - public TerminalNode PIPE() { return getToken(esql_parser.PIPE, 0); } - public ProcessingCommandContext processingCommand() { - return getRuleContext(ProcessingCommandContext.class,0); - } - public CompositeQueryContext(QueryContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class SingleCommandQueryContext extends QueryContext { - public SourceCommandContext sourceCommand() { - return getRuleContext(SourceCommandContext.class,0); - } - public SingleCommandQueryContext(QueryContext ctx) { copyFrom(ctx); } - } - - public final QueryContext query() throws RecognitionException { - return query(0); - } - - private QueryContext query(int _p) throws RecognitionException { - ParserRuleContext _parentctx = _ctx; - int _parentState = getState(); - QueryContext _localctx = new QueryContext(_ctx, _parentState); - QueryContext _prevctx = _localctx; - int _startState = 2; - enterRecursionRule(_localctx, 2, RULE_query, _p); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - { - _localctx = new SingleCommandQueryContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - - setState(102); - sourceCommand(); - } - _ctx.stop = _input.LT(-1); - setState(109); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,0,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - if ( _parseListeners!=null ) triggerExitRuleEvent(); - _prevctx = _localctx; - { - { - _localctx = new CompositeQueryContext(new QueryContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_query); - setState(104); - if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(105); - match(PIPE); - setState(106); - processingCommand(); - } - } - } - setState(111); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,0,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - unrollRecursionContexts(_parentctx); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class SourceCommandContext extends ParserRuleContext { - public ExplainCommandContext explainCommand() { - return getRuleContext(ExplainCommandContext.class,0); - } - public FromCommandContext fromCommand() { - return getRuleContext(FromCommandContext.class,0); - } - public RowCommandContext rowCommand() { - return getRuleContext(RowCommandContext.class,0); - } - public ShowCommandContext showCommand() { - return getRuleContext(ShowCommandContext.class,0); - } - public SourceCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_sourceCommand; } - } - - public final SourceCommandContext sourceCommand() throws RecognitionException { - SourceCommandContext _localctx = new SourceCommandContext(_ctx, getState()); - enterRule(_localctx, 4, RULE_sourceCommand); - try { - setState(116); - _errHandler.sync(this); - switch (_input.LA(1)) { - case EXPLAIN: - enterOuterAlt(_localctx, 1); - { - setState(112); - explainCommand(); - } - break; - case FROM: - enterOuterAlt(_localctx, 2); - { - setState(113); - fromCommand(); - } - break; - case ROW: - enterOuterAlt(_localctx, 3); - { - setState(114); - rowCommand(); - } - break; - case SHOW: - enterOuterAlt(_localctx, 4); - { - setState(115); - showCommand(); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ProcessingCommandContext extends ParserRuleContext { - public EvalCommandContext evalCommand() { - return getRuleContext(EvalCommandContext.class,0); - } - public InlinestatsCommandContext inlinestatsCommand() { - return getRuleContext(InlinestatsCommandContext.class,0); - } - public LimitCommandContext limitCommand() { - return getRuleContext(LimitCommandContext.class,0); - } - public KeepCommandContext keepCommand() { - return getRuleContext(KeepCommandContext.class,0); - } - public SortCommandContext sortCommand() { - return getRuleContext(SortCommandContext.class,0); - } - public StatsCommandContext statsCommand() { - return getRuleContext(StatsCommandContext.class,0); - } - public WhereCommandContext whereCommand() { - return getRuleContext(WhereCommandContext.class,0); - } - public DropCommandContext dropCommand() { - return getRuleContext(DropCommandContext.class,0); - } - public RenameCommandContext renameCommand() { - return getRuleContext(RenameCommandContext.class,0); - } - public DissectCommandContext dissectCommand() { - return getRuleContext(DissectCommandContext.class,0); - } - public GrokCommandContext grokCommand() { - return getRuleContext(GrokCommandContext.class,0); - } - public EnrichCommandContext enrichCommand() { - return getRuleContext(EnrichCommandContext.class,0); - } - public MvExpandCommandContext mvExpandCommand() { - return getRuleContext(MvExpandCommandContext.class,0); - } - public ProcessingCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_processingCommand; } - } - - public final ProcessingCommandContext processingCommand() throws RecognitionException { - ProcessingCommandContext _localctx = new ProcessingCommandContext(_ctx, getState()); - enterRule(_localctx, 6, RULE_processingCommand); - try { - setState(131); - _errHandler.sync(this); - switch (_input.LA(1)) { - case EVAL: - enterOuterAlt(_localctx, 1); - { - setState(118); - evalCommand(); - } - break; - case INLINESTATS: - enterOuterAlt(_localctx, 2); - { - setState(119); - inlinestatsCommand(); - } - break; - case LIMIT: - enterOuterAlt(_localctx, 3); - { - setState(120); - limitCommand(); - } - break; - case KEEP: - case PROJECT: - enterOuterAlt(_localctx, 4); - { - setState(121); - keepCommand(); - } - break; - case SORT: - enterOuterAlt(_localctx, 5); - { - setState(122); - sortCommand(); - } - break; - case STATS: - enterOuterAlt(_localctx, 6); - { - setState(123); - statsCommand(); - } - break; - case WHERE: - enterOuterAlt(_localctx, 7); - { - setState(124); - whereCommand(); - } - break; - case DROP: - enterOuterAlt(_localctx, 8); - { - setState(125); - dropCommand(); - } - break; - case RENAME: - enterOuterAlt(_localctx, 9); - { - setState(126); - renameCommand(); - } - break; - case DISSECT: - enterOuterAlt(_localctx, 10); - { - setState(127); - dissectCommand(); - } - break; - case GROK: - enterOuterAlt(_localctx, 11); - { - setState(128); - grokCommand(); - } - break; - case ENRICH: - enterOuterAlt(_localctx, 12); - { - setState(129); - enrichCommand(); - } - break; - case MV_EXPAND: - enterOuterAlt(_localctx, 13); - { - setState(130); - mvExpandCommand(); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class WhereCommandContext extends ParserRuleContext { - public TerminalNode WHERE() { return getToken(esql_parser.WHERE, 0); } - public BooleanExpressionContext booleanExpression() { - return getRuleContext(BooleanExpressionContext.class,0); - } - public WhereCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_whereCommand; } - } - - public final WhereCommandContext whereCommand() throws RecognitionException { - WhereCommandContext _localctx = new WhereCommandContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_whereCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(133); - match(WHERE); - setState(134); - booleanExpression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class BooleanExpressionContext extends ParserRuleContext { - public BooleanExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_booleanExpression; } - - public BooleanExpressionContext() { } - public void copyFrom(BooleanExpressionContext ctx) { - super.copyFrom(ctx); - } - } - @SuppressWarnings("CheckReturnValue") - public static class LogicalNotContext extends BooleanExpressionContext { - public TerminalNode NOT() { return getToken(esql_parser.NOT, 0); } - public BooleanExpressionContext booleanExpression() { - return getRuleContext(BooleanExpressionContext.class,0); - } - public LogicalNotContext(BooleanExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class BooleanDefaultContext extends BooleanExpressionContext { - public ValueExpressionContext valueExpression() { - return getRuleContext(ValueExpressionContext.class,0); - } - public BooleanDefaultContext(BooleanExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class IsNullContext extends BooleanExpressionContext { - public ValueExpressionContext valueExpression() { - return getRuleContext(ValueExpressionContext.class,0); - } - public TerminalNode IS() { return getToken(esql_parser.IS, 0); } - public TerminalNode NULL() { return getToken(esql_parser.NULL, 0); } - public TerminalNode NOT() { return getToken(esql_parser.NOT, 0); } - public IsNullContext(BooleanExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class RegexExpressionContext extends BooleanExpressionContext { - public RegexBooleanExpressionContext regexBooleanExpression() { - return getRuleContext(RegexBooleanExpressionContext.class,0); - } - public RegexExpressionContext(BooleanExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class LogicalInContext extends BooleanExpressionContext { - public List valueExpression() { - return getRuleContexts(ValueExpressionContext.class); - } - public ValueExpressionContext valueExpression(int i) { - return getRuleContext(ValueExpressionContext.class,i); - } - public TerminalNode IN() { return getToken(esql_parser.IN, 0); } - public TerminalNode LP() { return getToken(esql_parser.LP, 0); } - public TerminalNode RP() { return getToken(esql_parser.RP, 0); } - public TerminalNode NOT() { return getToken(esql_parser.NOT, 0); } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public LogicalInContext(BooleanExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class LogicalBinaryContext extends BooleanExpressionContext { - public BooleanExpressionContext left; - public Token operator; - public BooleanExpressionContext right; - public List booleanExpression() { - return getRuleContexts(BooleanExpressionContext.class); - } - public BooleanExpressionContext booleanExpression(int i) { - return getRuleContext(BooleanExpressionContext.class,i); - } - public TerminalNode AND() { return getToken(esql_parser.AND, 0); } - public TerminalNode OR() { return getToken(esql_parser.OR, 0); } - public LogicalBinaryContext(BooleanExpressionContext ctx) { copyFrom(ctx); } - } - - public final BooleanExpressionContext booleanExpression() throws RecognitionException { - return booleanExpression(0); - } - - private BooleanExpressionContext booleanExpression(int _p) throws RecognitionException { - ParserRuleContext _parentctx = _ctx; - int _parentState = getState(); - BooleanExpressionContext _localctx = new BooleanExpressionContext(_ctx, _parentState); - BooleanExpressionContext _prevctx = _localctx; - int _startState = 10; - enterRecursionRule(_localctx, 10, RULE_booleanExpression, _p); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(164); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { - case 1: - { - _localctx = new LogicalNotContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - - setState(137); - match(NOT); - setState(138); - booleanExpression(7); - } - break; - case 2: - { - _localctx = new BooleanDefaultContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - setState(139); - valueExpression(); - } - break; - case 3: - { - _localctx = new RegexExpressionContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - setState(140); - regexBooleanExpression(); - } - break; - case 4: - { - _localctx = new LogicalInContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - setState(141); - valueExpression(); - setState(143); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==NOT) { - { - setState(142); - match(NOT); - } - } - - setState(145); - match(IN); - setState(146); - match(LP); - setState(147); - valueExpression(); - setState(152); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(148); - match(COMMA); - setState(149); - valueExpression(); - } - } - setState(154); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(155); - match(RP); - } - break; - case 5: - { - _localctx = new IsNullContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - setState(157); - valueExpression(); - setState(158); - match(IS); - setState(160); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==NOT) { - { - setState(159); - match(NOT); - } - } - - setState(162); - match(NULL); - } - break; - } - _ctx.stop = _input.LT(-1); - setState(174); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,8,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - if ( _parseListeners!=null ) triggerExitRuleEvent(); - _prevctx = _localctx; - { - setState(172); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { - case 1: - { - _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); - ((LogicalBinaryContext)_localctx).left = _prevctx; - pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(166); - if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(167); - ((LogicalBinaryContext)_localctx).operator = match(AND); - setState(168); - ((LogicalBinaryContext)_localctx).right = booleanExpression(5); - } - break; - case 2: - { - _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); - ((LogicalBinaryContext)_localctx).left = _prevctx; - pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(169); - if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(170); - ((LogicalBinaryContext)_localctx).operator = match(OR); - setState(171); - ((LogicalBinaryContext)_localctx).right = booleanExpression(4); - } - break; - } - } - } - setState(176); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,8,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - unrollRecursionContexts(_parentctx); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class RegexBooleanExpressionContext extends ParserRuleContext { - public Token kind; - public StringContext pattern; - public ValueExpressionContext valueExpression() { - return getRuleContext(ValueExpressionContext.class,0); - } - public TerminalNode LIKE() { return getToken(esql_parser.LIKE, 0); } - public StringContext string() { - return getRuleContext(StringContext.class,0); - } - public TerminalNode NOT() { return getToken(esql_parser.NOT, 0); } - public TerminalNode RLIKE() { return getToken(esql_parser.RLIKE, 0); } - public RegexBooleanExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_regexBooleanExpression; } - } - - public final RegexBooleanExpressionContext regexBooleanExpression() throws RecognitionException { - RegexBooleanExpressionContext _localctx = new RegexBooleanExpressionContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_regexBooleanExpression); - int _la; - try { - setState(191); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(177); - valueExpression(); - setState(179); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==NOT) { - { - setState(178); - match(NOT); - } - } - - setState(181); - ((RegexBooleanExpressionContext)_localctx).kind = match(LIKE); - setState(182); - ((RegexBooleanExpressionContext)_localctx).pattern = string(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(184); - valueExpression(); - setState(186); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==NOT) { - { - setState(185); - match(NOT); - } - } - - setState(188); - ((RegexBooleanExpressionContext)_localctx).kind = match(RLIKE); - setState(189); - ((RegexBooleanExpressionContext)_localctx).pattern = string(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ValueExpressionContext extends ParserRuleContext { - public ValueExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_valueExpression; } - - public ValueExpressionContext() { } - public void copyFrom(ValueExpressionContext ctx) { - super.copyFrom(ctx); - } - } - @SuppressWarnings("CheckReturnValue") - public static class ValueExpressionDefaultContext extends ValueExpressionContext { - public OperatorExpressionContext operatorExpression() { - return getRuleContext(OperatorExpressionContext.class,0); - } - public ValueExpressionDefaultContext(ValueExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class ComparisonContext extends ValueExpressionContext { - public OperatorExpressionContext left; - public OperatorExpressionContext right; - public ComparisonOperatorContext comparisonOperator() { - return getRuleContext(ComparisonOperatorContext.class,0); - } - public List operatorExpression() { - return getRuleContexts(OperatorExpressionContext.class); - } - public OperatorExpressionContext operatorExpression(int i) { - return getRuleContext(OperatorExpressionContext.class,i); - } - public ComparisonContext(ValueExpressionContext ctx) { copyFrom(ctx); } - } - - public final ValueExpressionContext valueExpression() throws RecognitionException { - ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_valueExpression); - try { - setState(198); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { - case 1: - _localctx = new ValueExpressionDefaultContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(193); - operatorExpression(0); - } - break; - case 2: - _localctx = new ComparisonContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(194); - ((ComparisonContext)_localctx).left = operatorExpression(0); - setState(195); - comparisonOperator(); - setState(196); - ((ComparisonContext)_localctx).right = operatorExpression(0); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class OperatorExpressionContext extends ParserRuleContext { - public OperatorExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_operatorExpression; } - - public OperatorExpressionContext() { } - public void copyFrom(OperatorExpressionContext ctx) { - super.copyFrom(ctx); - } - } - @SuppressWarnings("CheckReturnValue") - public static class OperatorExpressionDefaultContext extends OperatorExpressionContext { - public PrimaryExpressionContext primaryExpression() { - return getRuleContext(PrimaryExpressionContext.class,0); - } - public OperatorExpressionDefaultContext(OperatorExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class ArithmeticBinaryContext extends OperatorExpressionContext { - public OperatorExpressionContext left; - public Token operator; - public OperatorExpressionContext right; - public List operatorExpression() { - return getRuleContexts(OperatorExpressionContext.class); - } - public OperatorExpressionContext operatorExpression(int i) { - return getRuleContext(OperatorExpressionContext.class,i); - } - public TerminalNode ASTERISK() { return getToken(esql_parser.ASTERISK, 0); } - public TerminalNode SLASH() { return getToken(esql_parser.SLASH, 0); } - public TerminalNode PERCENT() { return getToken(esql_parser.PERCENT, 0); } - public TerminalNode PLUS() { return getToken(esql_parser.PLUS, 0); } - public TerminalNode MINUS() { return getToken(esql_parser.MINUS, 0); } - public ArithmeticBinaryContext(OperatorExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class ArithmeticUnaryContext extends OperatorExpressionContext { - public Token operator; - public OperatorExpressionContext operatorExpression() { - return getRuleContext(OperatorExpressionContext.class,0); - } - public TerminalNode MINUS() { return getToken(esql_parser.MINUS, 0); } - public TerminalNode PLUS() { return getToken(esql_parser.PLUS, 0); } - public ArithmeticUnaryContext(OperatorExpressionContext ctx) { copyFrom(ctx); } - } - - public final OperatorExpressionContext operatorExpression() throws RecognitionException { - return operatorExpression(0); - } - - private OperatorExpressionContext operatorExpression(int _p) throws RecognitionException { - ParserRuleContext _parentctx = _ctx; - int _parentState = getState(); - OperatorExpressionContext _localctx = new OperatorExpressionContext(_ctx, _parentState); - OperatorExpressionContext _prevctx = _localctx; - int _startState = 16; - enterRecursionRule(_localctx, 16, RULE_operatorExpression, _p); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(204); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { - case 1: - { - _localctx = new OperatorExpressionDefaultContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - - setState(201); - primaryExpression(); - } - break; - case 2: - { - _localctx = new ArithmeticUnaryContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - setState(202); - ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); - _la = _input.LA(1); - if ( !(_la==PLUS || _la==MINUS) ) { - ((ArithmeticUnaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(203); - operatorExpression(3); - } - break; - } - _ctx.stop = _input.LT(-1); - setState(214); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,15,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - if ( _parseListeners!=null ) triggerExitRuleEvent(); - _prevctx = _localctx; - { - setState(212); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { - case 1: - { - _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); - ((ArithmeticBinaryContext)_localctx).left = _prevctx; - pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(206); - if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(207); - ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 8070450532247928832L) != 0)) ) { - ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(208); - ((ArithmeticBinaryContext)_localctx).right = operatorExpression(3); - } - break; - case 2: - { - _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); - ((ArithmeticBinaryContext)_localctx).left = _prevctx; - pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(209); - if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(210); - ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); - _la = _input.LA(1); - if ( !(_la==PLUS || _la==MINUS) ) { - ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(211); - ((ArithmeticBinaryContext)_localctx).right = operatorExpression(2); - } - break; - } - } - } - setState(216); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,15,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - unrollRecursionContexts(_parentctx); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class PrimaryExpressionContext extends ParserRuleContext { - public PrimaryExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_primaryExpression; } - - public PrimaryExpressionContext() { } - public void copyFrom(PrimaryExpressionContext ctx) { - super.copyFrom(ctx); - } - } - @SuppressWarnings("CheckReturnValue") - public static class DereferenceContext extends PrimaryExpressionContext { - public QualifiedNameContext qualifiedName() { - return getRuleContext(QualifiedNameContext.class,0); - } - public DereferenceContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class ConstantDefaultContext extends PrimaryExpressionContext { - public ConstantContext constant() { - return getRuleContext(ConstantContext.class,0); - } - public ConstantDefaultContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class ParenthesizedExpressionContext extends PrimaryExpressionContext { - public TerminalNode LP() { return getToken(esql_parser.LP, 0); } - public BooleanExpressionContext booleanExpression() { - return getRuleContext(BooleanExpressionContext.class,0); - } - public TerminalNode RP() { return getToken(esql_parser.RP, 0); } - public ParenthesizedExpressionContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class FunctionContext extends PrimaryExpressionContext { - public FunctionExpressionContext functionExpression() { - return getRuleContext(FunctionExpressionContext.class,0); - } - public FunctionContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } - } - - public final PrimaryExpressionContext primaryExpression() throws RecognitionException { - PrimaryExpressionContext _localctx = new PrimaryExpressionContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_primaryExpression); - try { - setState(224); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { - case 1: - _localctx = new ConstantDefaultContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(217); - constant(); - } - break; - case 2: - _localctx = new DereferenceContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(218); - qualifiedName(); - } - break; - case 3: - _localctx = new FunctionContext(_localctx); - enterOuterAlt(_localctx, 3); - { - setState(219); - functionExpression(); - } - break; - case 4: - _localctx = new ParenthesizedExpressionContext(_localctx); - enterOuterAlt(_localctx, 4); - { - setState(220); - match(LP); - setState(221); - booleanExpression(0); - setState(222); - match(RP); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FunctionExpressionContext extends ParserRuleContext { - public IdentifierContext identifier() { - return getRuleContext(IdentifierContext.class,0); - } - public TerminalNode LP() { return getToken(esql_parser.LP, 0); } - public TerminalNode RP() { return getToken(esql_parser.RP, 0); } - public TerminalNode ASTERISK() { return getToken(esql_parser.ASTERISK, 0); } - public List booleanExpression() { - return getRuleContexts(BooleanExpressionContext.class); - } - public BooleanExpressionContext booleanExpression(int i) { - return getRuleContext(BooleanExpressionContext.class,i); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public FunctionExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionExpression; } - } - - public final FunctionExpressionContext functionExpression() throws RecognitionException { - FunctionExpressionContext _localctx = new FunctionExpressionContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_functionExpression); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(226); - identifier(); - setState(227); - match(LP); - setState(237); - _errHandler.sync(this); - switch (_input.LA(1)) { - case ASTERISK: - { - setState(228); - match(ASTERISK); - } - break; - case STRING: - case INTEGER_LITERAL: - case DECIMAL_LITERAL: - case FALSE: - case LP: - case NOT: - case NULL: - case PARAM: - case TRUE: - case PLUS: - case MINUS: - case OPENING_BRACKET: - case UNQUOTED_IDENTIFIER: - case QUOTED_IDENTIFIER: - { - { - setState(229); - booleanExpression(0); - setState(234); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(230); - match(COMMA); - setState(231); - booleanExpression(0); - } - } - setState(236); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - break; - case RP: - break; - default: - break; - } - setState(239); - match(RP); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class RowCommandContext extends ParserRuleContext { - public TerminalNode ROW() { return getToken(esql_parser.ROW, 0); } - public FieldsContext fields() { - return getRuleContext(FieldsContext.class,0); - } - public RowCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_rowCommand; } - } - - public final RowCommandContext rowCommand() throws RecognitionException { - RowCommandContext _localctx = new RowCommandContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_rowCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(241); - match(ROW); - setState(242); - fields(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FieldsContext extends ParserRuleContext { - public List field() { - return getRuleContexts(FieldContext.class); - } - public FieldContext field(int i) { - return getRuleContext(FieldContext.class,i); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public FieldsContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_fields; } - } - - public final FieldsContext fields() throws RecognitionException { - FieldsContext _localctx = new FieldsContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_fields); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(244); - field(); - setState(249); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,19,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(245); - match(COMMA); - setState(246); - field(); - } - } - } - setState(251); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,19,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FieldContext extends ParserRuleContext { - public BooleanExpressionContext booleanExpression() { - return getRuleContext(BooleanExpressionContext.class,0); - } - public QualifiedNameContext qualifiedName() { - return getRuleContext(QualifiedNameContext.class,0); - } - public TerminalNode ASSIGN() { return getToken(esql_parser.ASSIGN, 0); } - public FieldContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_field; } - } - - public final FieldContext field() throws RecognitionException { - FieldContext _localctx = new FieldContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_field); - try { - setState(257); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(252); - booleanExpression(0); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(253); - qualifiedName(); - setState(254); - match(ASSIGN); - setState(255); - booleanExpression(0); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FromCommandContext extends ParserRuleContext { - public TerminalNode FROM() { return getToken(esql_parser.FROM, 0); } - public List fromIdentifier() { - return getRuleContexts(FromIdentifierContext.class); - } - public FromIdentifierContext fromIdentifier(int i) { - return getRuleContext(FromIdentifierContext.class,i); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public MetadataContext metadata() { - return getRuleContext(MetadataContext.class,0); - } - public FromCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_fromCommand; } - } - - public final FromCommandContext fromCommand() throws RecognitionException { - FromCommandContext _localctx = new FromCommandContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_fromCommand); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(259); - match(FROM); - setState(260); - fromIdentifier(); - setState(265); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,21,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(261); - match(COMMA); - setState(262); - fromIdentifier(); - } - } - } - setState(267); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,21,_ctx); - } - setState(269); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { - case 1: - { - setState(268); - metadata(); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class MetadataContext extends ParserRuleContext { - public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } - public TerminalNode METADATA() { return getToken(esql_parser.METADATA, 0); } - public List fromIdentifier() { - return getRuleContexts(FromIdentifierContext.class); - } - public FromIdentifierContext fromIdentifier(int i) { - return getRuleContext(FromIdentifierContext.class,i); - } - public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public MetadataContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_metadata; } - } - - public final MetadataContext metadata() throws RecognitionException { - MetadataContext _localctx = new MetadataContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_metadata); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(271); - match(OPENING_BRACKET); - setState(272); - match(METADATA); - setState(273); - fromIdentifier(); - setState(278); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(274); - match(COMMA); - setState(275); - fromIdentifier(); - } - } - setState(280); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(281); - match(CLOSING_BRACKET); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class EvalCommandContext extends ParserRuleContext { - public TerminalNode EVAL() { return getToken(esql_parser.EVAL, 0); } - public FieldsContext fields() { - return getRuleContext(FieldsContext.class,0); - } - public EvalCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_evalCommand; } - } - - public final EvalCommandContext evalCommand() throws RecognitionException { - EvalCommandContext _localctx = new EvalCommandContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_evalCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(283); - match(EVAL); - setState(284); - fields(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StatsCommandContext extends ParserRuleContext { - public TerminalNode STATS() { return getToken(esql_parser.STATS, 0); } - public FieldsContext fields() { - return getRuleContext(FieldsContext.class,0); - } - public TerminalNode BY() { return getToken(esql_parser.BY, 0); } - public GroupingContext grouping() { - return getRuleContext(GroupingContext.class,0); - } - public StatsCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_statsCommand; } - } - - public final StatsCommandContext statsCommand() throws RecognitionException { - StatsCommandContext _localctx = new StatsCommandContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_statsCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(286); - match(STATS); - setState(288); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { - case 1: - { - setState(287); - fields(); - } - break; - } - setState(292); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { - case 1: - { - setState(290); - match(BY); - setState(291); - grouping(); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class InlinestatsCommandContext extends ParserRuleContext { - public TerminalNode INLINESTATS() { return getToken(esql_parser.INLINESTATS, 0); } - public FieldsContext fields() { - return getRuleContext(FieldsContext.class,0); - } - public TerminalNode BY() { return getToken(esql_parser.BY, 0); } - public GroupingContext grouping() { - return getRuleContext(GroupingContext.class,0); - } - public InlinestatsCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_inlinestatsCommand; } - } - - public final InlinestatsCommandContext inlinestatsCommand() throws RecognitionException { - InlinestatsCommandContext _localctx = new InlinestatsCommandContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_inlinestatsCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(294); - match(INLINESTATS); - setState(295); - fields(); - setState(298); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { - case 1: - { - setState(296); - match(BY); - setState(297); - grouping(); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class GroupingContext extends ParserRuleContext { - public List qualifiedName() { - return getRuleContexts(QualifiedNameContext.class); - } - public QualifiedNameContext qualifiedName(int i) { - return getRuleContext(QualifiedNameContext.class,i); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public GroupingContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_grouping; } - } - - public final GroupingContext grouping() throws RecognitionException { - GroupingContext _localctx = new GroupingContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_grouping); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(300); - qualifiedName(); - setState(305); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,27,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(301); - match(COMMA); - setState(302); - qualifiedName(); - } - } - } - setState(307); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,27,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FromIdentifierContext extends ParserRuleContext { - public TerminalNode FROM_UNQUOTED_IDENTIFIER() { return getToken(esql_parser.FROM_UNQUOTED_IDENTIFIER, 0); } - public TerminalNode QUOTED_IDENTIFIER() { return getToken(esql_parser.QUOTED_IDENTIFIER, 0); } - public FromIdentifierContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_fromIdentifier; } - } - - public final FromIdentifierContext fromIdentifier() throws RecognitionException { - FromIdentifierContext _localctx = new FromIdentifierContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_fromIdentifier); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(308); - _la = _input.LA(1); - if ( !(_la==QUOTED_IDENTIFIER || _la==FROM_UNQUOTED_IDENTIFIER) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class QualifiedNameContext extends ParserRuleContext { - public List identifier() { - return getRuleContexts(IdentifierContext.class); - } - public IdentifierContext identifier(int i) { - return getRuleContext(IdentifierContext.class,i); - } - public List DOT() { return getTokens(esql_parser.DOT); } - public TerminalNode DOT(int i) { - return getToken(esql_parser.DOT, i); - } - public QualifiedNameContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_qualifiedName; } - } - - public final QualifiedNameContext qualifiedName() throws RecognitionException { - QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_qualifiedName); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(310); - identifier(); - setState(315); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,28,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(311); - match(DOT); - setState(312); - identifier(); - } - } - } - setState(317); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,28,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class QualifiedNamePatternContext extends ParserRuleContext { - public List identifierPattern() { - return getRuleContexts(IdentifierPatternContext.class); - } - public IdentifierPatternContext identifierPattern(int i) { - return getRuleContext(IdentifierPatternContext.class,i); - } - public List DOT() { return getTokens(esql_parser.DOT); } - public TerminalNode DOT(int i) { - return getToken(esql_parser.DOT, i); - } - public QualifiedNamePatternContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_qualifiedNamePattern; } - } - - public final QualifiedNamePatternContext qualifiedNamePattern() throws RecognitionException { - QualifiedNamePatternContext _localctx = new QualifiedNamePatternContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_qualifiedNamePattern); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(318); - identifierPattern(); - setState(323); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,29,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(319); - match(DOT); - setState(320); - identifierPattern(); - } - } - } - setState(325); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,29,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IdentifierContext extends ParserRuleContext { - public TerminalNode UNQUOTED_IDENTIFIER() { return getToken(esql_parser.UNQUOTED_IDENTIFIER, 0); } - public TerminalNode QUOTED_IDENTIFIER() { return getToken(esql_parser.QUOTED_IDENTIFIER, 0); } - public IdentifierContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_identifier; } - } - - public final IdentifierContext identifier() throws RecognitionException { - IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_identifier); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(326); - _la = _input.LA(1); - if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IdentifierPatternContext extends ParserRuleContext { - public TerminalNode PROJECT_UNQUOTED_IDENTIFIER() { return getToken(esql_parser.PROJECT_UNQUOTED_IDENTIFIER, 0); } - public TerminalNode QUOTED_IDENTIFIER() { return getToken(esql_parser.QUOTED_IDENTIFIER, 0); } - public IdentifierPatternContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_identifierPattern; } - } - - public final IdentifierPatternContext identifierPattern() throws RecognitionException { - IdentifierPatternContext _localctx = new IdentifierPatternContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_identifierPattern); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(328); - _la = _input.LA(1); - if ( !(_la==QUOTED_IDENTIFIER || _la==PROJECT_UNQUOTED_IDENTIFIER) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ConstantContext extends ParserRuleContext { - public ConstantContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_constant; } - - public ConstantContext() { } - public void copyFrom(ConstantContext ctx) { - super.copyFrom(ctx); - } - } - @SuppressWarnings("CheckReturnValue") - public static class BooleanArrayLiteralContext extends ConstantContext { - public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } - public List booleanValue() { - return getRuleContexts(BooleanValueContext.class); - } - public BooleanValueContext booleanValue(int i) { - return getRuleContext(BooleanValueContext.class,i); - } - public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public BooleanArrayLiteralContext(ConstantContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class DecimalLiteralContext extends ConstantContext { - public DecimalValueContext decimalValue() { - return getRuleContext(DecimalValueContext.class,0); - } - public DecimalLiteralContext(ConstantContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class NullLiteralContext extends ConstantContext { - public TerminalNode NULL() { return getToken(esql_parser.NULL, 0); } - public NullLiteralContext(ConstantContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class QualifiedIntegerLiteralContext extends ConstantContext { - public IntegerValueContext integerValue() { - return getRuleContext(IntegerValueContext.class,0); - } - public TerminalNode UNQUOTED_IDENTIFIER() { return getToken(esql_parser.UNQUOTED_IDENTIFIER, 0); } - public QualifiedIntegerLiteralContext(ConstantContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class StringArrayLiteralContext extends ConstantContext { - public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } - public List string() { - return getRuleContexts(StringContext.class); - } - public StringContext string(int i) { - return getRuleContext(StringContext.class,i); - } - public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public StringArrayLiteralContext(ConstantContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class StringLiteralContext extends ConstantContext { - public StringContext string() { - return getRuleContext(StringContext.class,0); - } - public StringLiteralContext(ConstantContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class NumericArrayLiteralContext extends ConstantContext { - public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } - public List numericValue() { - return getRuleContexts(NumericValueContext.class); - } - public NumericValueContext numericValue(int i) { - return getRuleContext(NumericValueContext.class,i); - } - public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public NumericArrayLiteralContext(ConstantContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class InputParamContext extends ConstantContext { - public TerminalNode PARAM() { return getToken(esql_parser.PARAM, 0); } - public InputParamContext(ConstantContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class IntegerLiteralContext extends ConstantContext { - public IntegerValueContext integerValue() { - return getRuleContext(IntegerValueContext.class,0); - } - public IntegerLiteralContext(ConstantContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class BooleanLiteralContext extends ConstantContext { - public BooleanValueContext booleanValue() { - return getRuleContext(BooleanValueContext.class,0); - } - public BooleanLiteralContext(ConstantContext ctx) { copyFrom(ctx); } - } - - public final ConstantContext constant() throws RecognitionException { - ConstantContext _localctx = new ConstantContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_constant); - int _la; - try { - setState(372); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { - case 1: - _localctx = new NullLiteralContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(330); - match(NULL); - } - break; - case 2: - _localctx = new QualifiedIntegerLiteralContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(331); - integerValue(); - setState(332); - match(UNQUOTED_IDENTIFIER); - } - break; - case 3: - _localctx = new DecimalLiteralContext(_localctx); - enterOuterAlt(_localctx, 3); - { - setState(334); - decimalValue(); - } - break; - case 4: - _localctx = new IntegerLiteralContext(_localctx); - enterOuterAlt(_localctx, 4); - { - setState(335); - integerValue(); - } - break; - case 5: - _localctx = new BooleanLiteralContext(_localctx); - enterOuterAlt(_localctx, 5); - { - setState(336); - booleanValue(); - } - break; - case 6: - _localctx = new InputParamContext(_localctx); - enterOuterAlt(_localctx, 6); - { - setState(337); - match(PARAM); - } - break; - case 7: - _localctx = new StringLiteralContext(_localctx); - enterOuterAlt(_localctx, 7); - { - setState(338); - string(); - } - break; - case 8: - _localctx = new NumericArrayLiteralContext(_localctx); - enterOuterAlt(_localctx, 8); - { - setState(339); - match(OPENING_BRACKET); - setState(340); - numericValue(); - setState(345); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(341); - match(COMMA); - setState(342); - numericValue(); - } - } - setState(347); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(348); - match(CLOSING_BRACKET); - } - break; - case 9: - _localctx = new BooleanArrayLiteralContext(_localctx); - enterOuterAlt(_localctx, 9); - { - setState(350); - match(OPENING_BRACKET); - setState(351); - booleanValue(); - setState(356); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(352); - match(COMMA); - setState(353); - booleanValue(); - } - } - setState(358); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(359); - match(CLOSING_BRACKET); - } - break; - case 10: - _localctx = new StringArrayLiteralContext(_localctx); - enterOuterAlt(_localctx, 10); - { - setState(361); - match(OPENING_BRACKET); - setState(362); - string(); - setState(367); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(363); - match(COMMA); - setState(364); - string(); - } - } - setState(369); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(370); - match(CLOSING_BRACKET); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class LimitCommandContext extends ParserRuleContext { - public TerminalNode LIMIT() { return getToken(esql_parser.LIMIT, 0); } - public TerminalNode INTEGER_LITERAL() { return getToken(esql_parser.INTEGER_LITERAL, 0); } - public LimitCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_limitCommand; } - } - - public final LimitCommandContext limitCommand() throws RecognitionException { - LimitCommandContext _localctx = new LimitCommandContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_limitCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(374); - match(LIMIT); - setState(375); - match(INTEGER_LITERAL); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class SortCommandContext extends ParserRuleContext { - public TerminalNode SORT() { return getToken(esql_parser.SORT, 0); } - public List orderExpression() { - return getRuleContexts(OrderExpressionContext.class); - } - public OrderExpressionContext orderExpression(int i) { - return getRuleContext(OrderExpressionContext.class,i); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public SortCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_sortCommand; } - } - - public final SortCommandContext sortCommand() throws RecognitionException { - SortCommandContext _localctx = new SortCommandContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_sortCommand); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(377); - match(SORT); - setState(378); - orderExpression(); - setState(383); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(379); - match(COMMA); - setState(380); - orderExpression(); - } - } - } - setState(385); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class OrderExpressionContext extends ParserRuleContext { - public Token ordering; - public Token nullOrdering; - public BooleanExpressionContext booleanExpression() { - return getRuleContext(BooleanExpressionContext.class,0); - } - public TerminalNode NULLS() { return getToken(esql_parser.NULLS, 0); } - public TerminalNode ASC() { return getToken(esql_parser.ASC, 0); } - public TerminalNode DESC() { return getToken(esql_parser.DESC, 0); } - public TerminalNode FIRST() { return getToken(esql_parser.FIRST, 0); } - public TerminalNode LAST() { return getToken(esql_parser.LAST, 0); } - public OrderExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_orderExpression; } - } - - public final OrderExpressionContext orderExpression() throws RecognitionException { - OrderExpressionContext _localctx = new OrderExpressionContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_orderExpression); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(386); - booleanExpression(0); - setState(388); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { - case 1: - { - setState(387); - ((OrderExpressionContext)_localctx).ordering = _input.LT(1); - _la = _input.LA(1); - if ( !(_la==ASC || _la==DESC) ) { - ((OrderExpressionContext)_localctx).ordering = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - break; - } - setState(392); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { - case 1: - { - setState(390); - match(NULLS); - setState(391); - ((OrderExpressionContext)_localctx).nullOrdering = _input.LT(1); - _la = _input.LA(1); - if ( !(_la==FIRST || _la==LAST) ) { - ((OrderExpressionContext)_localctx).nullOrdering = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class KeepCommandContext extends ParserRuleContext { - public TerminalNode KEEP() { return getToken(esql_parser.KEEP, 0); } - public List qualifiedNamePattern() { - return getRuleContexts(QualifiedNamePatternContext.class); - } - public QualifiedNamePatternContext qualifiedNamePattern(int i) { - return getRuleContext(QualifiedNamePatternContext.class,i); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public TerminalNode PROJECT() { return getToken(esql_parser.PROJECT, 0); } - public KeepCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_keepCommand; } - } - - public final KeepCommandContext keepCommand() throws RecognitionException { - KeepCommandContext _localctx = new KeepCommandContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_keepCommand); - try { - int _alt; - setState(412); - _errHandler.sync(this); - switch (_input.LA(1)) { - case KEEP: - enterOuterAlt(_localctx, 1); - { - setState(394); - match(KEEP); - setState(395); - qualifiedNamePattern(); - setState(400); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,37,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(396); - match(COMMA); - setState(397); - qualifiedNamePattern(); - } - } - } - setState(402); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,37,_ctx); - } - } - break; - case PROJECT: - enterOuterAlt(_localctx, 2); - { - setState(403); - match(PROJECT); - setState(404); - qualifiedNamePattern(); - setState(409); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,38,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(405); - match(COMMA); - setState(406); - qualifiedNamePattern(); - } - } - } - setState(411); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,38,_ctx); - } - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class DropCommandContext extends ParserRuleContext { - public TerminalNode DROP() { return getToken(esql_parser.DROP, 0); } - public List qualifiedNamePattern() { - return getRuleContexts(QualifiedNamePatternContext.class); - } - public QualifiedNamePatternContext qualifiedNamePattern(int i) { - return getRuleContext(QualifiedNamePatternContext.class,i); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public DropCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_dropCommand; } - } - - public final DropCommandContext dropCommand() throws RecognitionException { - DropCommandContext _localctx = new DropCommandContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_dropCommand); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(414); - match(DROP); - setState(415); - qualifiedNamePattern(); - setState(420); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,40,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(416); - match(COMMA); - setState(417); - qualifiedNamePattern(); - } - } - } - setState(422); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,40,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class RenameCommandContext extends ParserRuleContext { - public TerminalNode RENAME() { return getToken(esql_parser.RENAME, 0); } - public List renameClause() { - return getRuleContexts(RenameClauseContext.class); - } - public RenameClauseContext renameClause(int i) { - return getRuleContext(RenameClauseContext.class,i); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public RenameCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_renameCommand; } - } - - public final RenameCommandContext renameCommand() throws RecognitionException { - RenameCommandContext _localctx = new RenameCommandContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_renameCommand); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(423); - match(RENAME); - setState(424); - renameClause(); - setState(429); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,41,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(425); - match(COMMA); - setState(426); - renameClause(); - } - } - } - setState(431); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,41,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class RenameClauseContext extends ParserRuleContext { - public QualifiedNamePatternContext oldName; - public QualifiedNamePatternContext newName; - public TerminalNode AS() { return getToken(esql_parser.AS, 0); } - public List qualifiedNamePattern() { - return getRuleContexts(QualifiedNamePatternContext.class); - } - public QualifiedNamePatternContext qualifiedNamePattern(int i) { - return getRuleContext(QualifiedNamePatternContext.class,i); - } - public RenameClauseContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_renameClause; } - } - - public final RenameClauseContext renameClause() throws RecognitionException { - RenameClauseContext _localctx = new RenameClauseContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_renameClause); - try { - enterOuterAlt(_localctx, 1); - { - setState(432); - ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); - setState(433); - match(AS); - setState(434); - ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class DissectCommandContext extends ParserRuleContext { - public TerminalNode DISSECT() { return getToken(esql_parser.DISSECT, 0); } - public PrimaryExpressionContext primaryExpression() { - return getRuleContext(PrimaryExpressionContext.class,0); - } - public StringContext string() { - return getRuleContext(StringContext.class,0); - } - public CommandOptionsContext commandOptions() { - return getRuleContext(CommandOptionsContext.class,0); - } - public DissectCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_dissectCommand; } - } - - public final DissectCommandContext dissectCommand() throws RecognitionException { - DissectCommandContext _localctx = new DissectCommandContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_dissectCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(436); - match(DISSECT); - setState(437); - primaryExpression(); - setState(438); - string(); - setState(440); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { - case 1: - { - setState(439); - commandOptions(); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class GrokCommandContext extends ParserRuleContext { - public TerminalNode GROK() { return getToken(esql_parser.GROK, 0); } - public PrimaryExpressionContext primaryExpression() { - return getRuleContext(PrimaryExpressionContext.class,0); - } - public StringContext string() { - return getRuleContext(StringContext.class,0); - } - public GrokCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_grokCommand; } - } - - public final GrokCommandContext grokCommand() throws RecognitionException { - GrokCommandContext _localctx = new GrokCommandContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_grokCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(442); - match(GROK); - setState(443); - primaryExpression(); - setState(444); - string(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class MvExpandCommandContext extends ParserRuleContext { - public TerminalNode MV_EXPAND() { return getToken(esql_parser.MV_EXPAND, 0); } - public QualifiedNameContext qualifiedName() { - return getRuleContext(QualifiedNameContext.class,0); - } - public MvExpandCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_mvExpandCommand; } - } - - public final MvExpandCommandContext mvExpandCommand() throws RecognitionException { - MvExpandCommandContext _localctx = new MvExpandCommandContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_mvExpandCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(446); - match(MV_EXPAND); - setState(447); - qualifiedName(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class CommandOptionsContext extends ParserRuleContext { - public List commandOption() { - return getRuleContexts(CommandOptionContext.class); - } - public CommandOptionContext commandOption(int i) { - return getRuleContext(CommandOptionContext.class,i); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public CommandOptionsContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_commandOptions; } - } - - public final CommandOptionsContext commandOptions() throws RecognitionException { - CommandOptionsContext _localctx = new CommandOptionsContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_commandOptions); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(449); - commandOption(); - setState(454); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(450); - match(COMMA); - setState(451); - commandOption(); - } - } - } - setState(456); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class CommandOptionContext extends ParserRuleContext { - public IdentifierContext identifier() { - return getRuleContext(IdentifierContext.class,0); - } - public TerminalNode ASSIGN() { return getToken(esql_parser.ASSIGN, 0); } - public ConstantContext constant() { - return getRuleContext(ConstantContext.class,0); - } - public CommandOptionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_commandOption; } - } - - public final CommandOptionContext commandOption() throws RecognitionException { - CommandOptionContext _localctx = new CommandOptionContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_commandOption); - try { - enterOuterAlt(_localctx, 1); - { - setState(457); - identifier(); - setState(458); - match(ASSIGN); - setState(459); - constant(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class BooleanValueContext extends ParserRuleContext { - public TerminalNode TRUE() { return getToken(esql_parser.TRUE, 0); } - public TerminalNode FALSE() { return getToken(esql_parser.FALSE, 0); } - public BooleanValueContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_booleanValue; } - } - - public final BooleanValueContext booleanValue() throws RecognitionException { - BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_booleanValue); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(461); - _la = _input.LA(1); - if ( !(_la==FALSE || _la==TRUE) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class NumericValueContext extends ParserRuleContext { - public DecimalValueContext decimalValue() { - return getRuleContext(DecimalValueContext.class,0); - } - public IntegerValueContext integerValue() { - return getRuleContext(IntegerValueContext.class,0); - } - public NumericValueContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_numericValue; } - } - - public final NumericValueContext numericValue() throws RecognitionException { - NumericValueContext _localctx = new NumericValueContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_numericValue); - try { - setState(465); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(463); - decimalValue(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(464); - integerValue(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class DecimalValueContext extends ParserRuleContext { - public TerminalNode DECIMAL_LITERAL() { return getToken(esql_parser.DECIMAL_LITERAL, 0); } - public TerminalNode PLUS() { return getToken(esql_parser.PLUS, 0); } - public TerminalNode MINUS() { return getToken(esql_parser.MINUS, 0); } - public DecimalValueContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_decimalValue; } - } - - public final DecimalValueContext decimalValue() throws RecognitionException { - DecimalValueContext _localctx = new DecimalValueContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_decimalValue); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(468); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==PLUS || _la==MINUS) { - { - setState(467); - _la = _input.LA(1); - if ( !(_la==PLUS || _la==MINUS) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - - setState(470); - match(DECIMAL_LITERAL); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IntegerValueContext extends ParserRuleContext { - public TerminalNode INTEGER_LITERAL() { return getToken(esql_parser.INTEGER_LITERAL, 0); } - public TerminalNode PLUS() { return getToken(esql_parser.PLUS, 0); } - public TerminalNode MINUS() { return getToken(esql_parser.MINUS, 0); } - public IntegerValueContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_integerValue; } - } - - public final IntegerValueContext integerValue() throws RecognitionException { - IntegerValueContext _localctx = new IntegerValueContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_integerValue); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(473); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==PLUS || _la==MINUS) { - { - setState(472); - _la = _input.LA(1); - if ( !(_la==PLUS || _la==MINUS) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - - setState(475); - match(INTEGER_LITERAL); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StringContext extends ParserRuleContext { - public TerminalNode STRING() { return getToken(esql_parser.STRING, 0); } - public StringContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_string; } - } - - public final StringContext string() throws RecognitionException { - StringContext _localctx = new StringContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_string); - try { - enterOuterAlt(_localctx, 1); - { - setState(477); - match(STRING); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ComparisonOperatorContext extends ParserRuleContext { - public TerminalNode EQ() { return getToken(esql_parser.EQ, 0); } - public TerminalNode NEQ() { return getToken(esql_parser.NEQ, 0); } - public TerminalNode LT() { return getToken(esql_parser.LT, 0); } - public TerminalNode LTE() { return getToken(esql_parser.LTE, 0); } - public TerminalNode GT() { return getToken(esql_parser.GT, 0); } - public TerminalNode GTE() { return getToken(esql_parser.GTE, 0); } - public ComparisonOperatorContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_comparisonOperator; } - } - - public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { - ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_comparisonOperator); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(479); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 283726776524341248L) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ExplainCommandContext extends ParserRuleContext { - public TerminalNode EXPLAIN() { return getToken(esql_parser.EXPLAIN, 0); } - public SubqueryExpressionContext subqueryExpression() { - return getRuleContext(SubqueryExpressionContext.class,0); - } - public ExplainCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_explainCommand; } - } - - public final ExplainCommandContext explainCommand() throws RecognitionException { - ExplainCommandContext _localctx = new ExplainCommandContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_explainCommand); - try { - enterOuterAlt(_localctx, 1); - { - setState(481); - match(EXPLAIN); - setState(482); - subqueryExpression(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class SubqueryExpressionContext extends ParserRuleContext { - public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } - public QueryContext query() { - return getRuleContext(QueryContext.class,0); - } - public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } - public SubqueryExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_subqueryExpression; } - } - - public final SubqueryExpressionContext subqueryExpression() throws RecognitionException { - SubqueryExpressionContext _localctx = new SubqueryExpressionContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_subqueryExpression); - try { - enterOuterAlt(_localctx, 1); - { - setState(484); - match(OPENING_BRACKET); - setState(485); - query(0); - setState(486); - match(CLOSING_BRACKET); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ShowCommandContext extends ParserRuleContext { - public ShowCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_showCommand; } - - public ShowCommandContext() { } - public void copyFrom(ShowCommandContext ctx) { - super.copyFrom(ctx); - } - } - @SuppressWarnings("CheckReturnValue") - public static class ShowInfoContext extends ShowCommandContext { - public TerminalNode SHOW() { return getToken(esql_parser.SHOW, 0); } - public TerminalNode INFO() { return getToken(esql_parser.INFO, 0); } - public ShowInfoContext(ShowCommandContext ctx) { copyFrom(ctx); } - } - @SuppressWarnings("CheckReturnValue") - public static class ShowFunctionsContext extends ShowCommandContext { - public TerminalNode SHOW() { return getToken(esql_parser.SHOW, 0); } - public TerminalNode FUNCTIONS() { return getToken(esql_parser.FUNCTIONS, 0); } - public ShowFunctionsContext(ShowCommandContext ctx) { copyFrom(ctx); } - } - - public final ShowCommandContext showCommand() throws RecognitionException { - ShowCommandContext _localctx = new ShowCommandContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_showCommand); - try { - setState(492); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { - case 1: - _localctx = new ShowInfoContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(488); - match(SHOW); - setState(489); - match(INFO); - } - break; - case 2: - _localctx = new ShowFunctionsContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(490); - match(SHOW); - setState(491); - match(FUNCTIONS); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class EnrichCommandContext extends ParserRuleContext { - public FromIdentifierContext policyName; - public QualifiedNamePatternContext matchField; - public TerminalNode ENRICH() { return getToken(esql_parser.ENRICH, 0); } - public FromIdentifierContext fromIdentifier() { - return getRuleContext(FromIdentifierContext.class,0); - } - public TerminalNode ON() { return getToken(esql_parser.ON, 0); } - public TerminalNode WITH() { return getToken(esql_parser.WITH, 0); } - public List enrichWithClause() { - return getRuleContexts(EnrichWithClauseContext.class); - } - public EnrichWithClauseContext enrichWithClause(int i) { - return getRuleContext(EnrichWithClauseContext.class,i); - } - public QualifiedNamePatternContext qualifiedNamePattern() { - return getRuleContext(QualifiedNamePatternContext.class,0); - } - public List COMMA() { return getTokens(esql_parser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(esql_parser.COMMA, i); - } - public EnrichCommandContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_enrichCommand; } - } - - public final EnrichCommandContext enrichCommand() throws RecognitionException { - EnrichCommandContext _localctx = new EnrichCommandContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_enrichCommand); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(494); - match(ENRICH); - setState(495); - ((EnrichCommandContext)_localctx).policyName = fromIdentifier(); - setState(498); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { - case 1: - { - setState(496); - match(ON); - setState(497); - ((EnrichCommandContext)_localctx).matchField = qualifiedNamePattern(); - } - break; - } - setState(509); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { - case 1: - { - setState(500); - match(WITH); - setState(501); - enrichWithClause(); - setState(506); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,49,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(502); - match(COMMA); - setState(503); - enrichWithClause(); - } - } - } - setState(508); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,49,_ctx); - } - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class EnrichWithClauseContext extends ParserRuleContext { - public QualifiedNamePatternContext newName; - public QualifiedNamePatternContext enrichField; - public List qualifiedNamePattern() { - return getRuleContexts(QualifiedNamePatternContext.class); - } - public QualifiedNamePatternContext qualifiedNamePattern(int i) { - return getRuleContext(QualifiedNamePatternContext.class,i); - } - public TerminalNode ASSIGN() { return getToken(esql_parser.ASSIGN, 0); } - public EnrichWithClauseContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_enrichWithClause; } - } - - public final EnrichWithClauseContext enrichWithClause() throws RecognitionException { - EnrichWithClauseContext _localctx = new EnrichWithClauseContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_enrichWithClause); - try { - enterOuterAlt(_localctx, 1); - { - setState(514); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { - case 1: - { - setState(511); - ((EnrichWithClauseContext)_localctx).newName = qualifiedNamePattern(); - setState(512); - match(ASSIGN); - } - break; - } - setState(516); - ((EnrichWithClauseContext)_localctx).enrichField = qualifiedNamePattern(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 1: - return query_sempred((QueryContext)_localctx, predIndex); - case 5: - return booleanExpression_sempred((BooleanExpressionContext)_localctx, predIndex); - case 8: - return operatorExpression_sempred((OperatorExpressionContext)_localctx, predIndex); - } - return true; - } - private boolean query_sempred(QueryContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return precpred(_ctx, 1); - } - return true; - } - private boolean booleanExpression_sempred(BooleanExpressionContext _localctx, int predIndex) { - switch (predIndex) { - case 1: - return precpred(_ctx, 4); - case 2: - return precpred(_ctx, 3); - } - return true; - } - private boolean operatorExpression_sempred(OperatorExpressionContext _localctx, int predIndex) { - switch (predIndex) { - case 3: - return precpred(_ctx, 2); - case 4: - return precpred(_ctx, 1); - } - return true; - } - - public static final String _serializedATN = - "\u0004\u0001b\u0207\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ - "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ - "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ - "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ - "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ - "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ - "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ - "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ - "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ - "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ - "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ - "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ - "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ - "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u0001\u0000\u0001\u0000"+ - "\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0005\u0001l\b\u0001\n\u0001\f\u0001o\t\u0001\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002u\b\u0002\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0003\u0003\u0084\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0003\u0005\u0090\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0005\u0005\u0097\b\u0005\n\u0005\f\u0005\u009a\t\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00a1"+ - "\b\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00a5\b\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005"+ - "\u00ad\b\u0005\n\u0005\f\u0005\u00b0\t\u0005\u0001\u0006\u0001\u0006\u0003"+ - "\u0006\u00b4\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0003\u0006\u00bb\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ - "\u0006\u00c0\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0003\u0007\u00c7\b\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0003"+ - "\b\u00cd\b\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0005\b\u00d5"+ - "\b\b\n\b\f\b\u00d8\t\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t"+ - "\u0001\t\u0003\t\u00e1\b\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0005\n\u00e9\b\n\n\n\f\n\u00ec\t\n\u0003\n\u00ee\b\n\u0001\n\u0001"+ - "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0005\f"+ - "\u00f8\b\f\n\f\f\f\u00fb\t\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003"+ - "\r\u0102\b\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0005\u000e"+ - "\u0108\b\u000e\n\u000e\f\u000e\u010b\t\u000e\u0001\u000e\u0003\u000e\u010e"+ - "\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0005"+ - "\u000f\u0115\b\u000f\n\u000f\f\u000f\u0118\t\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0003\u0011"+ - "\u0121\b\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u0125\b\u0011\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u012b\b\u0012\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u0130\b\u0013\n\u0013\f\u0013"+ - "\u0133\t\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015"+ - "\u0005\u0015\u013a\b\u0015\n\u0015\f\u0015\u013d\t\u0015\u0001\u0016\u0001"+ - "\u0016\u0001\u0016\u0005\u0016\u0142\b\u0016\n\u0016\f\u0016\u0145\t\u0016"+ - "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019"+ - "\u0158\b\u0019\n\u0019\f\u0019\u015b\t\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0163\b\u0019\n"+ - "\u0019\f\u0019\u0166\t\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u016e\b\u0019\n\u0019\f\u0019"+ - "\u0171\t\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u0175\b\u0019\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0005\u001b\u017e\b\u001b\n\u001b\f\u001b\u0181\t\u001b\u0001\u001c"+ - "\u0001\u001c\u0003\u001c\u0185\b\u001c\u0001\u001c\u0001\u001c\u0003\u001c"+ - "\u0189\b\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0005\u001d"+ - "\u018f\b\u001d\n\u001d\f\u001d\u0192\t\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0005\u001d\u0198\b\u001d\n\u001d\f\u001d\u019b\t\u001d"+ - "\u0003\u001d\u019d\b\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ - "\u0005\u001e\u01a3\b\u001e\n\u001e\f\u001e\u01a6\t\u001e\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u01ac\b\u001f\n\u001f\f\u001f"+ - "\u01af\t\u001f\u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+ - "!\u0003!\u01b9\b!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001"+ - "#\u0001$\u0001$\u0001$\u0005$\u01c5\b$\n$\f$\u01c8\t$\u0001%\u0001%\u0001"+ - "%\u0001%\u0001&\u0001&\u0001\'\u0001\'\u0003\'\u01d2\b\'\u0001(\u0003"+ - "(\u01d5\b(\u0001(\u0001(\u0001)\u0003)\u01da\b)\u0001)\u0001)\u0001*\u0001"+ - "*\u0001+\u0001+\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ - ".\u0001.\u0001.\u0001.\u0003.\u01ed\b.\u0001/\u0001/\u0001/\u0001/\u0003"+ - "/\u01f3\b/\u0001/\u0001/\u0001/\u0001/\u0005/\u01f9\b/\n/\f/\u01fc\t/"+ - "\u0003/\u01fe\b/\u00010\u00010\u00010\u00030\u0203\b0\u00010\u00010\u0001"+ - "0\u0000\u0003\u0002\n\u00101\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ - "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPR"+ - "TVXZ\\^`\u0000\t\u0001\u0000:;\u0001\u0000<>\u0002\u0000BBGG\u0001\u0000"+ - "AB\u0002\u0000BBKK\u0002\u0000 ##\u0001\u0000&\'\u0002\u0000%%33\u0001"+ - "\u000049\u0224\u0000b\u0001\u0000\u0000\u0000\u0002e\u0001\u0000\u0000"+ - "\u0000\u0004t\u0001\u0000\u0000\u0000\u0006\u0083\u0001\u0000\u0000\u0000"+ - "\b\u0085\u0001\u0000\u0000\u0000\n\u00a4\u0001\u0000\u0000\u0000\f\u00bf"+ - "\u0001\u0000\u0000\u0000\u000e\u00c6\u0001\u0000\u0000\u0000\u0010\u00cc"+ - "\u0001\u0000\u0000\u0000\u0012\u00e0\u0001\u0000\u0000\u0000\u0014\u00e2"+ - "\u0001\u0000\u0000\u0000\u0016\u00f1\u0001\u0000\u0000\u0000\u0018\u00f4"+ - "\u0001\u0000\u0000\u0000\u001a\u0101\u0001\u0000\u0000\u0000\u001c\u0103"+ - "\u0001\u0000\u0000\u0000\u001e\u010f\u0001\u0000\u0000\u0000 \u011b\u0001"+ - "\u0000\u0000\u0000\"\u011e\u0001\u0000\u0000\u0000$\u0126\u0001\u0000"+ - "\u0000\u0000&\u012c\u0001\u0000\u0000\u0000(\u0134\u0001\u0000\u0000\u0000"+ - "*\u0136\u0001\u0000\u0000\u0000,\u013e\u0001\u0000\u0000\u0000.\u0146"+ - "\u0001\u0000\u0000\u00000\u0148\u0001\u0000\u0000\u00002\u0174\u0001\u0000"+ - "\u0000\u00004\u0176\u0001\u0000\u0000\u00006\u0179\u0001\u0000\u0000\u0000"+ - "8\u0182\u0001\u0000\u0000\u0000:\u019c\u0001\u0000\u0000\u0000<\u019e"+ - "\u0001\u0000\u0000\u0000>\u01a7\u0001\u0000\u0000\u0000@\u01b0\u0001\u0000"+ - "\u0000\u0000B\u01b4\u0001\u0000\u0000\u0000D\u01ba\u0001\u0000\u0000\u0000"+ - "F\u01be\u0001\u0000\u0000\u0000H\u01c1\u0001\u0000\u0000\u0000J\u01c9"+ - "\u0001\u0000\u0000\u0000L\u01cd\u0001\u0000\u0000\u0000N\u01d1\u0001\u0000"+ - "\u0000\u0000P\u01d4\u0001\u0000\u0000\u0000R\u01d9\u0001\u0000\u0000\u0000"+ - "T\u01dd\u0001\u0000\u0000\u0000V\u01df\u0001\u0000\u0000\u0000X\u01e1"+ - "\u0001\u0000\u0000\u0000Z\u01e4\u0001\u0000\u0000\u0000\\\u01ec\u0001"+ - "\u0000\u0000\u0000^\u01ee\u0001\u0000\u0000\u0000`\u0202\u0001\u0000\u0000"+ - "\u0000bc\u0003\u0002\u0001\u0000cd\u0005\u0000\u0000\u0001d\u0001\u0001"+ - "\u0000\u0000\u0000ef\u0006\u0001\uffff\uffff\u0000fg\u0003\u0004\u0002"+ - "\u0000gm\u0001\u0000\u0000\u0000hi\n\u0001\u0000\u0000ij\u0005\u001a\u0000"+ - "\u0000jl\u0003\u0006\u0003\u0000kh\u0001\u0000\u0000\u0000lo\u0001\u0000"+ - "\u0000\u0000mk\u0001\u0000\u0000\u0000mn\u0001\u0000\u0000\u0000n\u0003"+ - "\u0001\u0000\u0000\u0000om\u0001\u0000\u0000\u0000pu\u0003X,\u0000qu\u0003"+ - "\u001c\u000e\u0000ru\u0003\u0016\u000b\u0000su\u0003\\.\u0000tp\u0001"+ - "\u0000\u0000\u0000tq\u0001\u0000\u0000\u0000tr\u0001\u0000\u0000\u0000"+ - "ts\u0001\u0000\u0000\u0000u\u0005\u0001\u0000\u0000\u0000v\u0084\u0003"+ - " \u0010\u0000w\u0084\u0003$\u0012\u0000x\u0084\u00034\u001a\u0000y\u0084"+ - "\u0003:\u001d\u0000z\u0084\u00036\u001b\u0000{\u0084\u0003\"\u0011\u0000"+ - "|\u0084\u0003\b\u0004\u0000}\u0084\u0003<\u001e\u0000~\u0084\u0003>\u001f"+ - "\u0000\u007f\u0084\u0003B!\u0000\u0080\u0084\u0003D\"\u0000\u0081\u0084"+ - "\u0003^/\u0000\u0082\u0084\u0003F#\u0000\u0083v\u0001\u0000\u0000\u0000"+ - "\u0083w\u0001\u0000\u0000\u0000\u0083x\u0001\u0000\u0000\u0000\u0083y"+ - "\u0001\u0000\u0000\u0000\u0083z\u0001\u0000\u0000\u0000\u0083{\u0001\u0000"+ - "\u0000\u0000\u0083|\u0001\u0000\u0000\u0000\u0083}\u0001\u0000\u0000\u0000"+ - "\u0083~\u0001\u0000\u0000\u0000\u0083\u007f\u0001\u0000\u0000\u0000\u0083"+ - "\u0080\u0001\u0000\u0000\u0000\u0083\u0081\u0001\u0000\u0000\u0000\u0083"+ - "\u0082\u0001\u0000\u0000\u0000\u0084\u0007\u0001\u0000\u0000\u0000\u0085"+ - "\u0086\u0005\u0012\u0000\u0000\u0086\u0087\u0003\n\u0005\u0000\u0087\t"+ - "\u0001\u0000\u0000\u0000\u0088\u0089\u0006\u0005\uffff\uffff\u0000\u0089"+ - "\u008a\u0005,\u0000\u0000\u008a\u00a5\u0003\n\u0005\u0007\u008b\u00a5"+ - "\u0003\u000e\u0007\u0000\u008c\u00a5\u0003\f\u0006\u0000\u008d\u008f\u0003"+ - "\u000e\u0007\u0000\u008e\u0090\u0005,\u0000\u0000\u008f\u008e\u0001\u0000"+ - "\u0000\u0000\u008f\u0090\u0001\u0000\u0000\u0000\u0090\u0091\u0001\u0000"+ - "\u0000\u0000\u0091\u0092\u0005)\u0000\u0000\u0092\u0093\u0005(\u0000\u0000"+ - "\u0093\u0098\u0003\u000e\u0007\u0000\u0094\u0095\u0005\"\u0000\u0000\u0095"+ - "\u0097\u0003\u000e\u0007\u0000\u0096\u0094\u0001\u0000\u0000\u0000\u0097"+ - "\u009a\u0001\u0000\u0000\u0000\u0098\u0096\u0001\u0000\u0000\u0000\u0098"+ - "\u0099\u0001\u0000\u0000\u0000\u0099\u009b\u0001\u0000\u0000\u0000\u009a"+ - "\u0098\u0001\u0000\u0000\u0000\u009b\u009c\u00052\u0000\u0000\u009c\u00a5"+ - "\u0001\u0000\u0000\u0000\u009d\u009e\u0003\u000e\u0007\u0000\u009e\u00a0"+ - "\u0005*\u0000\u0000\u009f\u00a1\u0005,\u0000\u0000\u00a0\u009f\u0001\u0000"+ - "\u0000\u0000\u00a0\u00a1\u0001\u0000\u0000\u0000\u00a1\u00a2\u0001\u0000"+ - "\u0000\u0000\u00a2\u00a3\u0005-\u0000\u0000\u00a3\u00a5\u0001\u0000\u0000"+ - "\u0000\u00a4\u0088\u0001\u0000\u0000\u0000\u00a4\u008b\u0001\u0000\u0000"+ - "\u0000\u00a4\u008c\u0001\u0000\u0000\u0000\u00a4\u008d\u0001\u0000\u0000"+ - "\u0000\u00a4\u009d\u0001\u0000\u0000\u0000\u00a5\u00ae\u0001\u0000\u0000"+ - "\u0000\u00a6\u00a7\n\u0004\u0000\u0000\u00a7\u00a8\u0005\u001f\u0000\u0000"+ - "\u00a8\u00ad\u0003\n\u0005\u0005\u00a9\u00aa\n\u0003\u0000\u0000\u00aa"+ - "\u00ab\u0005/\u0000\u0000\u00ab\u00ad\u0003\n\u0005\u0004\u00ac\u00a6"+ - "\u0001\u0000\u0000\u0000\u00ac\u00a9\u0001\u0000\u0000\u0000\u00ad\u00b0"+ - "\u0001\u0000\u0000\u0000\u00ae\u00ac\u0001\u0000\u0000\u0000\u00ae\u00af"+ - "\u0001\u0000\u0000\u0000\u00af\u000b\u0001\u0000\u0000\u0000\u00b0\u00ae"+ - "\u0001\u0000\u0000\u0000\u00b1\u00b3\u0003\u000e\u0007\u0000\u00b2\u00b4"+ - "\u0005,\u0000\u0000\u00b3\u00b2\u0001\u0000\u0000\u0000\u00b3\u00b4\u0001"+ - "\u0000\u0000\u0000\u00b4\u00b5\u0001\u0000\u0000\u0000\u00b5\u00b6\u0005"+ - "+\u0000\u0000\u00b6\u00b7\u0003T*\u0000\u00b7\u00c0\u0001\u0000\u0000"+ - "\u0000\u00b8\u00ba\u0003\u000e\u0007\u0000\u00b9\u00bb\u0005,\u0000\u0000"+ - "\u00ba\u00b9\u0001\u0000\u0000\u0000\u00ba\u00bb\u0001\u0000\u0000\u0000"+ - "\u00bb\u00bc\u0001\u0000\u0000\u0000\u00bc\u00bd\u00051\u0000\u0000\u00bd"+ - "\u00be\u0003T*\u0000\u00be\u00c0\u0001\u0000\u0000\u0000\u00bf\u00b1\u0001"+ - "\u0000\u0000\u0000\u00bf\u00b8\u0001\u0000\u0000\u0000\u00c0\r\u0001\u0000"+ - "\u0000\u0000\u00c1\u00c7\u0003\u0010\b\u0000\u00c2\u00c3\u0003\u0010\b"+ - "\u0000\u00c3\u00c4\u0003V+\u0000\u00c4\u00c5\u0003\u0010\b\u0000\u00c5"+ - "\u00c7\u0001\u0000\u0000\u0000\u00c6\u00c1\u0001\u0000\u0000\u0000\u00c6"+ - "\u00c2\u0001\u0000\u0000\u0000\u00c7\u000f\u0001\u0000\u0000\u0000\u00c8"+ - "\u00c9\u0006\b\uffff\uffff\u0000\u00c9\u00cd\u0003\u0012\t\u0000\u00ca"+ - "\u00cb\u0007\u0000\u0000\u0000\u00cb\u00cd\u0003\u0010\b\u0003\u00cc\u00c8"+ - "\u0001\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000\u00cd\u00d6"+ - "\u0001\u0000\u0000\u0000\u00ce\u00cf\n\u0002\u0000\u0000\u00cf\u00d0\u0007"+ - "\u0001\u0000\u0000\u00d0\u00d5\u0003\u0010\b\u0003\u00d1\u00d2\n\u0001"+ - "\u0000\u0000\u00d2\u00d3\u0007\u0000\u0000\u0000\u00d3\u00d5\u0003\u0010"+ - "\b\u0002\u00d4\u00ce\u0001\u0000\u0000\u0000\u00d4\u00d1\u0001\u0000\u0000"+ - "\u0000\u00d5\u00d8\u0001\u0000\u0000\u0000\u00d6\u00d4\u0001\u0000\u0000"+ - "\u0000\u00d6\u00d7\u0001\u0000\u0000\u0000\u00d7\u0011\u0001\u0000\u0000"+ - "\u0000\u00d8\u00d6\u0001\u0000\u0000\u0000\u00d9\u00e1\u00032\u0019\u0000"+ - "\u00da\u00e1\u0003*\u0015\u0000\u00db\u00e1\u0003\u0014\n\u0000\u00dc"+ - "\u00dd\u0005(\u0000\u0000\u00dd\u00de\u0003\n\u0005\u0000\u00de\u00df"+ - "\u00052\u0000\u0000\u00df\u00e1\u0001\u0000\u0000\u0000\u00e0\u00d9\u0001"+ - "\u0000\u0000\u0000\u00e0\u00da\u0001\u0000\u0000\u0000\u00e0\u00db\u0001"+ - "\u0000\u0000\u0000\u00e0\u00dc\u0001\u0000\u0000\u0000\u00e1\u0013\u0001"+ - "\u0000\u0000\u0000\u00e2\u00e3\u0003.\u0017\u0000\u00e3\u00ed\u0005(\u0000"+ - "\u0000\u00e4\u00ee\u0005<\u0000\u0000\u00e5\u00ea\u0003\n\u0005\u0000"+ - "\u00e6\u00e7\u0005\"\u0000\u0000\u00e7\u00e9\u0003\n\u0005\u0000\u00e8"+ - "\u00e6\u0001\u0000\u0000\u0000\u00e9\u00ec\u0001\u0000\u0000\u0000\u00ea"+ - "\u00e8\u0001\u0000\u0000\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb"+ - "\u00ee\u0001\u0000\u0000\u0000\u00ec\u00ea\u0001\u0000\u0000\u0000\u00ed"+ - "\u00e4\u0001\u0000\u0000\u0000\u00ed\u00e5\u0001\u0000\u0000\u0000\u00ed"+ - "\u00ee\u0001\u0000\u0000\u0000\u00ee\u00ef\u0001\u0000\u0000\u0000\u00ef"+ - "\u00f0\u00052\u0000\u0000\u00f0\u0015\u0001\u0000\u0000\u0000\u00f1\u00f2"+ - "\u0005\u000e\u0000\u0000\u00f2\u00f3\u0003\u0018\f\u0000\u00f3\u0017\u0001"+ - "\u0000\u0000\u0000\u00f4\u00f9\u0003\u001a\r\u0000\u00f5\u00f6\u0005\""+ - "\u0000\u0000\u00f6\u00f8\u0003\u001a\r\u0000\u00f7\u00f5\u0001\u0000\u0000"+ - "\u0000\u00f8\u00fb\u0001\u0000\u0000\u0000\u00f9\u00f7\u0001\u0000\u0000"+ - "\u0000\u00f9\u00fa\u0001\u0000\u0000\u0000\u00fa\u0019\u0001\u0000\u0000"+ - "\u0000\u00fb\u00f9\u0001\u0000\u0000\u0000\u00fc\u0102\u0003\n\u0005\u0000"+ - "\u00fd\u00fe\u0003*\u0015\u0000\u00fe\u00ff\u0005!\u0000\u0000\u00ff\u0100"+ - "\u0003\n\u0005\u0000\u0100\u0102\u0001\u0000\u0000\u0000\u0101\u00fc\u0001"+ - "\u0000\u0000\u0000\u0101\u00fd\u0001\u0000\u0000\u0000\u0102\u001b\u0001"+ - "\u0000\u0000\u0000\u0103\u0104\u0005\u0006\u0000\u0000\u0104\u0109\u0003"+ - "(\u0014\u0000\u0105\u0106\u0005\"\u0000\u0000\u0106\u0108\u0003(\u0014"+ - "\u0000\u0107\u0105\u0001\u0000\u0000\u0000\u0108\u010b\u0001\u0000\u0000"+ - "\u0000\u0109\u0107\u0001\u0000\u0000\u0000\u0109\u010a\u0001\u0000\u0000"+ - "\u0000\u010a\u010d\u0001\u0000\u0000\u0000\u010b\u0109\u0001\u0000\u0000"+ - "\u0000\u010c\u010e\u0003\u001e\u000f\u0000\u010d\u010c\u0001\u0000\u0000"+ - "\u0000\u010d\u010e\u0001\u0000\u0000\u0000\u010e\u001d\u0001\u0000\u0000"+ - "\u0000\u010f\u0110\u0005?\u0000\u0000\u0110\u0111\u0005F\u0000\u0000\u0111"+ - "\u0116\u0003(\u0014\u0000\u0112\u0113\u0005\"\u0000\u0000\u0113\u0115"+ - "\u0003(\u0014\u0000\u0114\u0112\u0001\u0000\u0000\u0000\u0115\u0118\u0001"+ - "\u0000\u0000\u0000\u0116\u0114\u0001\u0000\u0000\u0000\u0116\u0117\u0001"+ - "\u0000\u0000\u0000\u0117\u0119\u0001\u0000\u0000\u0000\u0118\u0116\u0001"+ - "\u0000\u0000\u0000\u0119\u011a\u0005@\u0000\u0000\u011a\u001f\u0001\u0000"+ - "\u0000\u0000\u011b\u011c\u0005\u0004\u0000\u0000\u011c\u011d\u0003\u0018"+ - "\f\u0000\u011d!\u0001\u0000\u0000\u0000\u011e\u0120\u0005\u0011\u0000"+ - "\u0000\u011f\u0121\u0003\u0018\f\u0000\u0120\u011f\u0001\u0000\u0000\u0000"+ - "\u0120\u0121\u0001\u0000\u0000\u0000\u0121\u0124\u0001\u0000\u0000\u0000"+ - "\u0122\u0123\u0005\u001e\u0000\u0000\u0123\u0125\u0003&\u0013\u0000\u0124"+ - "\u0122\u0001\u0000\u0000\u0000\u0124\u0125\u0001\u0000\u0000\u0000\u0125"+ - "#\u0001\u0000\u0000\u0000\u0126\u0127\u0005\b\u0000\u0000\u0127\u012a"+ - "\u0003\u0018\f\u0000\u0128\u0129\u0005\u001e\u0000\u0000\u0129\u012b\u0003"+ - "&\u0013\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012a\u012b\u0001\u0000"+ - "\u0000\u0000\u012b%\u0001\u0000\u0000\u0000\u012c\u0131\u0003*\u0015\u0000"+ - "\u012d\u012e\u0005\"\u0000\u0000\u012e\u0130\u0003*\u0015\u0000\u012f"+ - "\u012d\u0001\u0000\u0000\u0000\u0130\u0133\u0001\u0000\u0000\u0000\u0131"+ - "\u012f\u0001\u0000\u0000\u0000\u0131\u0132\u0001\u0000\u0000\u0000\u0132"+ - "\'\u0001\u0000\u0000\u0000\u0133\u0131\u0001\u0000\u0000\u0000\u0134\u0135"+ - "\u0007\u0002\u0000\u0000\u0135)\u0001\u0000\u0000\u0000\u0136\u013b\u0003"+ - ".\u0017\u0000\u0137\u0138\u0005$\u0000\u0000\u0138\u013a\u0003.\u0017"+ - "\u0000\u0139\u0137\u0001\u0000\u0000\u0000\u013a\u013d\u0001\u0000\u0000"+ - "\u0000\u013b\u0139\u0001\u0000\u0000\u0000\u013b\u013c\u0001\u0000\u0000"+ - "\u0000\u013c+\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000"+ - "\u013e\u0143\u00030\u0018\u0000\u013f\u0140\u0005$\u0000\u0000\u0140\u0142"+ - "\u00030\u0018\u0000\u0141\u013f\u0001\u0000\u0000\u0000\u0142\u0145\u0001"+ - "\u0000\u0000\u0000\u0143\u0141\u0001\u0000\u0000\u0000\u0143\u0144\u0001"+ - "\u0000\u0000\u0000\u0144-\u0001\u0000\u0000\u0000\u0145\u0143\u0001\u0000"+ - "\u0000\u0000\u0146\u0147\u0007\u0003\u0000\u0000\u0147/\u0001\u0000\u0000"+ - "\u0000\u0148\u0149\u0007\u0004\u0000\u0000\u01491\u0001\u0000\u0000\u0000"+ - "\u014a\u0175\u0005-\u0000\u0000\u014b\u014c\u0003R)\u0000\u014c\u014d"+ - "\u0005A\u0000\u0000\u014d\u0175\u0001\u0000\u0000\u0000\u014e\u0175\u0003"+ - "P(\u0000\u014f\u0175\u0003R)\u0000\u0150\u0175\u0003L&\u0000\u0151\u0175"+ - "\u00050\u0000\u0000\u0152\u0175\u0003T*\u0000\u0153\u0154\u0005?\u0000"+ - "\u0000\u0154\u0159\u0003N\'\u0000\u0155\u0156\u0005\"\u0000\u0000\u0156"+ - "\u0158\u0003N\'\u0000\u0157\u0155\u0001\u0000\u0000\u0000\u0158\u015b"+ - "\u0001\u0000\u0000\u0000\u0159\u0157\u0001\u0000\u0000\u0000\u0159\u015a"+ - "\u0001\u0000\u0000\u0000\u015a\u015c\u0001\u0000\u0000\u0000\u015b\u0159"+ - "\u0001\u0000\u0000\u0000\u015c\u015d\u0005@\u0000\u0000\u015d\u0175\u0001"+ - "\u0000\u0000\u0000\u015e\u015f\u0005?\u0000\u0000\u015f\u0164\u0003L&"+ - "\u0000\u0160\u0161\u0005\"\u0000\u0000\u0161\u0163\u0003L&\u0000\u0162"+ - "\u0160\u0001\u0000\u0000\u0000\u0163\u0166\u0001\u0000\u0000\u0000\u0164"+ - "\u0162\u0001\u0000\u0000\u0000\u0164\u0165\u0001\u0000\u0000\u0000\u0165"+ - "\u0167\u0001\u0000\u0000\u0000\u0166\u0164\u0001\u0000\u0000\u0000\u0167"+ - "\u0168\u0005@\u0000\u0000\u0168\u0175\u0001\u0000\u0000\u0000\u0169\u016a"+ - "\u0005?\u0000\u0000\u016a\u016f\u0003T*\u0000\u016b\u016c\u0005\"\u0000"+ - "\u0000\u016c\u016e\u0003T*\u0000\u016d\u016b\u0001\u0000\u0000\u0000\u016e"+ - "\u0171\u0001\u0000\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u016f"+ - "\u0170\u0001\u0000\u0000\u0000\u0170\u0172\u0001\u0000\u0000\u0000\u0171"+ - "\u016f\u0001\u0000\u0000\u0000\u0172\u0173\u0005@\u0000\u0000\u0173\u0175"+ - "\u0001\u0000\u0000\u0000\u0174\u014a\u0001\u0000\u0000\u0000\u0174\u014b"+ - "\u0001\u0000\u0000\u0000\u0174\u014e\u0001\u0000\u0000\u0000\u0174\u014f"+ - "\u0001\u0000\u0000\u0000\u0174\u0150\u0001\u0000\u0000\u0000\u0174\u0151"+ - "\u0001\u0000\u0000\u0000\u0174\u0152\u0001\u0000\u0000\u0000\u0174\u0153"+ - "\u0001\u0000\u0000\u0000\u0174\u015e\u0001\u0000\u0000\u0000\u0174\u0169"+ - "\u0001\u0000\u0000\u0000\u01753\u0001\u0000\u0000\u0000\u0176\u0177\u0005"+ - "\n\u0000\u0000\u0177\u0178\u0005\u001c\u0000\u0000\u01785\u0001\u0000"+ - "\u0000\u0000\u0179\u017a\u0005\u0010\u0000\u0000\u017a\u017f\u00038\u001c"+ - "\u0000\u017b\u017c\u0005\"\u0000\u0000\u017c\u017e\u00038\u001c\u0000"+ - "\u017d\u017b\u0001\u0000\u0000\u0000\u017e\u0181\u0001\u0000\u0000\u0000"+ - "\u017f\u017d\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000\u0000\u0000"+ - "\u01807\u0001\u0000\u0000\u0000\u0181\u017f\u0001\u0000\u0000\u0000\u0182"+ - "\u0184\u0003\n\u0005\u0000\u0183\u0185\u0007\u0005\u0000\u0000\u0184\u0183"+ - "\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0188"+ - "\u0001\u0000\u0000\u0000\u0186\u0187\u0005.\u0000\u0000\u0187\u0189\u0007"+ - "\u0006\u0000\u0000\u0188\u0186\u0001\u0000\u0000\u0000\u0188\u0189\u0001"+ - "\u0000\u0000\u0000\u01899\u0001\u0000\u0000\u0000\u018a\u018b\u0005\t"+ - "\u0000\u0000\u018b\u0190\u0003,\u0016\u0000\u018c\u018d\u0005\"\u0000"+ - "\u0000\u018d\u018f\u0003,\u0016\u0000\u018e\u018c\u0001\u0000\u0000\u0000"+ - "\u018f\u0192\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000\u0000\u0000"+ - "\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u019d\u0001\u0000\u0000\u0000"+ - "\u0192\u0190\u0001\u0000\u0000\u0000\u0193\u0194\u0005\f\u0000\u0000\u0194"+ - "\u0199\u0003,\u0016\u0000\u0195\u0196\u0005\"\u0000\u0000\u0196\u0198"+ - "\u0003,\u0016\u0000\u0197\u0195\u0001\u0000\u0000\u0000\u0198\u019b\u0001"+ - "\u0000\u0000\u0000\u0199\u0197\u0001\u0000\u0000\u0000\u0199\u019a\u0001"+ - "\u0000\u0000\u0000\u019a\u019d\u0001\u0000\u0000\u0000\u019b\u0199\u0001"+ - "\u0000\u0000\u0000\u019c\u018a\u0001\u0000\u0000\u0000\u019c\u0193\u0001"+ - "\u0000\u0000\u0000\u019d;\u0001\u0000\u0000\u0000\u019e\u019f\u0005\u0002"+ - "\u0000\u0000\u019f\u01a4\u0003,\u0016\u0000\u01a0\u01a1\u0005\"\u0000"+ - "\u0000\u01a1\u01a3\u0003,\u0016\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000"+ - "\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000"+ - "\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5=\u0001\u0000\u0000\u0000\u01a6"+ - "\u01a4\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005\r\u0000\u0000\u01a8\u01ad"+ - "\u0003@ \u0000\u01a9\u01aa\u0005\"\u0000\u0000\u01aa\u01ac\u0003@ \u0000"+ - "\u01ab\u01a9\u0001\u0000\u0000\u0000\u01ac\u01af\u0001\u0000\u0000\u0000"+ - "\u01ad\u01ab\u0001\u0000\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000"+ - "\u01ae?\u0001\u0000\u0000\u0000\u01af\u01ad\u0001\u0000\u0000\u0000\u01b0"+ - "\u01b1\u0003,\u0016\u0000\u01b1\u01b2\u0005O\u0000\u0000\u01b2\u01b3\u0003"+ - ",\u0016\u0000\u01b3A\u0001\u0000\u0000\u0000\u01b4\u01b5\u0005\u0001\u0000"+ - "\u0000\u01b5\u01b6\u0003\u0012\t\u0000\u01b6\u01b8\u0003T*\u0000\u01b7"+ - "\u01b9\u0003H$\u0000\u01b8\u01b7\u0001\u0000\u0000\u0000\u01b8\u01b9\u0001"+ - "\u0000\u0000\u0000\u01b9C\u0001\u0000\u0000\u0000\u01ba\u01bb\u0005\u0007"+ - "\u0000\u0000\u01bb\u01bc\u0003\u0012\t\u0000\u01bc\u01bd\u0003T*\u0000"+ - "\u01bdE\u0001\u0000\u0000\u0000\u01be\u01bf\u0005\u000b\u0000\u0000\u01bf"+ - "\u01c0\u0003*\u0015\u0000\u01c0G\u0001\u0000\u0000\u0000\u01c1\u01c6\u0003"+ - "J%\u0000\u01c2\u01c3\u0005\"\u0000\u0000\u01c3\u01c5\u0003J%\u0000\u01c4"+ - "\u01c2\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6"+ - "\u01c4\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7"+ - "I\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01ca"+ - "\u0003.\u0017\u0000\u01ca\u01cb\u0005!\u0000\u0000\u01cb\u01cc\u00032"+ - "\u0019\u0000\u01ccK\u0001\u0000\u0000\u0000\u01cd\u01ce\u0007\u0007\u0000"+ - "\u0000\u01ceM\u0001\u0000\u0000\u0000\u01cf\u01d2\u0003P(\u0000\u01d0"+ - "\u01d2\u0003R)\u0000\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1\u01d0\u0001"+ - "\u0000\u0000\u0000\u01d2O\u0001\u0000\u0000\u0000\u01d3\u01d5\u0007\u0000"+ - "\u0000\u0000\u01d4\u01d3\u0001\u0000\u0000\u0000\u01d4\u01d5\u0001\u0000"+ - "\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0005\u001d"+ - "\u0000\u0000\u01d7Q\u0001\u0000\u0000\u0000\u01d8\u01da\u0007\u0000\u0000"+ - "\u0000\u01d9\u01d8\u0001\u0000\u0000\u0000\u01d9\u01da\u0001\u0000\u0000"+ - "\u0000\u01da\u01db\u0001\u0000\u0000\u0000\u01db\u01dc\u0005\u001c\u0000"+ - "\u0000\u01dcS\u0001\u0000\u0000\u0000\u01dd\u01de\u0005\u001b\u0000\u0000"+ - "\u01deU\u0001\u0000\u0000\u0000\u01df\u01e0\u0007\b\u0000\u0000\u01e0"+ - "W\u0001\u0000\u0000\u0000\u01e1\u01e2\u0005\u0005\u0000\u0000\u01e2\u01e3"+ - "\u0003Z-\u0000\u01e3Y\u0001\u0000\u0000\u0000\u01e4\u01e5\u0005?\u0000"+ - "\u0000\u01e5\u01e6\u0003\u0002\u0001\u0000\u01e6\u01e7\u0005@\u0000\u0000"+ - "\u01e7[\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005\u000f\u0000\u0000\u01e9"+ - "\u01ed\u0005^\u0000\u0000\u01ea\u01eb\u0005\u000f\u0000\u0000\u01eb\u01ed"+ - "\u0005_\u0000\u0000\u01ec\u01e8\u0001\u0000\u0000\u0000\u01ec\u01ea\u0001"+ - "\u0000\u0000\u0000\u01ed]\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005\u0003"+ - "\u0000\u0000\u01ef\u01f2\u0003(\u0014\u0000\u01f0\u01f1\u0005S\u0000\u0000"+ - "\u01f1\u01f3\u0003,\u0016\u0000\u01f2\u01f0\u0001\u0000\u0000\u0000\u01f2"+ - "\u01f3\u0001\u0000\u0000\u0000\u01f3\u01fd\u0001\u0000\u0000\u0000\u01f4"+ - "\u01f5\u0005T\u0000\u0000\u01f5\u01fa\u0003`0\u0000\u01f6\u01f7\u0005"+ - "\"\u0000\u0000\u01f7\u01f9\u0003`0\u0000\u01f8\u01f6\u0001\u0000\u0000"+ - "\u0000\u01f9\u01fc\u0001\u0000\u0000\u0000\u01fa\u01f8\u0001\u0000\u0000"+ - "\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb\u01fe\u0001\u0000\u0000"+ - "\u0000\u01fc\u01fa\u0001\u0000\u0000\u0000\u01fd\u01f4\u0001\u0000\u0000"+ - "\u0000\u01fd\u01fe\u0001\u0000\u0000\u0000\u01fe_\u0001\u0000\u0000\u0000"+ - "\u01ff\u0200\u0003,\u0016\u0000\u0200\u0201\u0005!\u0000\u0000\u0201\u0203"+ - "\u0001\u0000\u0000\u0000\u0202\u01ff\u0001\u0000\u0000\u0000\u0202\u0203"+ - "\u0001\u0000\u0000\u0000\u0203\u0204\u0001\u0000\u0000\u0000\u0204\u0205"+ - "\u0003,\u0016\u0000\u0205a\u0001\u0000\u0000\u00004mt\u0083\u008f\u0098"+ - "\u00a0\u00a4\u00ac\u00ae\u00b3\u00ba\u00bf\u00c6\u00cc\u00d4\u00d6\u00e0"+ - "\u00ea\u00ed\u00f9\u0101\u0109\u010d\u0116\u0120\u0124\u012a\u0131\u013b"+ - "\u0143\u0159\u0164\u016f\u0174\u017f\u0184\u0188\u0190\u0199\u019c\u01a4"+ - "\u01ad\u01b8\u01c6\u01d1\u01d4\u01d9\u01ec\u01f2\u01fa\u01fd\u0202"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_parser.tokens b/packages/kbn-esql/src/antlr/.antlr/esql_parser.tokens deleted file mode 100644 index 85a98c3a6d268..0000000000000 --- a/packages/kbn-esql/src/antlr/.antlr/esql_parser.tokens +++ /dev/null @@ -1,117 +0,0 @@ -DISSECT=1 -DROP=2 -ENRICH=3 -EVAL=4 -EXPLAIN=5 -FROM=6 -GROK=7 -INLINESTATS=8 -KEEP=9 -LIMIT=10 -MV_EXPAND=11 -PROJECT=12 -RENAME=13 -ROW=14 -SHOW=15 -SORT=16 -STATS=17 -WHERE=18 -UNKNOWN_CMD=19 -LINE_COMMENT=20 -MULTILINE_COMMENT=21 -WS=22 -EXPLAIN_WS=23 -EXPLAIN_LINE_COMMENT=24 -EXPLAIN_MULTILINE_COMMENT=25 -PIPE=26 -STRING=27 -INTEGER_LITERAL=28 -DECIMAL_LITERAL=29 -BY=30 -AND=31 -ASC=32 -ASSIGN=33 -COMMA=34 -DESC=35 -DOT=36 -FALSE=37 -FIRST=38 -LAST=39 -LP=40 -IN=41 -IS=42 -LIKE=43 -NOT=44 -NULL=45 -NULLS=46 -OR=47 -PARAM=48 -RLIKE=49 -RP=50 -TRUE=51 -EQ=52 -NEQ=53 -LT=54 -LTE=55 -GT=56 -GTE=57 -PLUS=58 -MINUS=59 -ASTERISK=60 -SLASH=61 -PERCENT=62 -OPENING_BRACKET=63 -CLOSING_BRACKET=64 -UNQUOTED_IDENTIFIER=65 -QUOTED_IDENTIFIER=66 -EXPR_LINE_COMMENT=67 -EXPR_MULTILINE_COMMENT=68 -EXPR_WS=69 -METADATA=70 -FROM_UNQUOTED_IDENTIFIER=71 -FROM_LINE_COMMENT=72 -FROM_MULTILINE_COMMENT=73 -FROM_WS=74 -PROJECT_UNQUOTED_IDENTIFIER=75 -PROJECT_LINE_COMMENT=76 -PROJECT_MULTILINE_COMMENT=77 -PROJECT_WS=78 -AS=79 -RENAME_LINE_COMMENT=80 -RENAME_MULTILINE_COMMENT=81 -RENAME_WS=82 -ON=83 -WITH=84 -ENRICH_LINE_COMMENT=85 -ENRICH_MULTILINE_COMMENT=86 -ENRICH_WS=87 -ENRICH_FIELD_LINE_COMMENT=88 -ENRICH_FIELD_MULTILINE_COMMENT=89 -ENRICH_FIELD_WS=90 -MVEXPAND_LINE_COMMENT=91 -MVEXPAND_MULTILINE_COMMENT=92 -MVEXPAND_WS=93 -INFO=94 -FUNCTIONS=95 -SHOW_LINE_COMMENT=96 -SHOW_MULTILINE_COMMENT=97 -SHOW_WS=98 -'|'=26 -'='=33 -','=34 -'.'=36 -'('=40 -'?'=48 -')'=50 -'=='=52 -'!='=53 -'<'=54 -'<='=55 -'>'=56 -'>='=57 -'+'=58 -'-'=59 -'*'=60 -'/'=61 -'%'=62 -']'=64 diff --git a/packages/kbn-language-documentation-popover/kibana.jsonc b/packages/kbn-language-documentation-popover/kibana.jsonc index 49dcff96d5f86..59eaf56cef7d4 100644 --- a/packages/kbn-language-documentation-popover/kibana.jsonc +++ b/packages/kbn-language-documentation-popover/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/language-documentation-popover", - "owner": "@elastic/kibana-visualizations" + "owner": "@elastic/kibana-esql" } diff --git a/packages/kbn-management/settings/setting_ids/index.ts b/packages/kbn-management/settings/setting_ids/index.ts index 38d7c56c75259..bd026c15c54db 100644 --- a/packages/kbn-management/settings/setting_ids/index.ts +++ b/packages/kbn-management/settings/setting_ids/index.ts @@ -135,6 +135,8 @@ export const OBSERVABILITY_APM_ENABLE_CONTINUOUS_ROLLUPS_ID = export const OBSERVABILITY_APM_ENABLE_PROFILING_INTEGRATION_ID = 'observability:apmEnableProfilingIntegration'; export const OBSERVABILITY_APM_ENABLE_TABLE_SEARCH_BAR = 'observability:apmEnableTableSearchBar'; +export const OBSERVABILITY_APM_ENABLE_SERVICE_INVENTORY_TABLE_SEARCH_BAR = + 'observability:apmEnableServiceInventoryTableSearchBar'; export const OBSERVABILITY_LOGS_EXPLORER_ALLOWED_DATA_VIEWS_ID = 'observability:logsExplorer:allowedDataViews'; diff --git a/packages/kbn-monaco/BUILD.bazel b/packages/kbn-monaco/BUILD.bazel index 05616f813e937..9a2e2b8f03243 100644 --- a/packages/kbn-monaco/BUILD.bazel +++ b/packages/kbn-monaco/BUILD.bazel @@ -26,10 +26,11 @@ SRCS = glob( SHARED_DEPS = [ "//packages/kbn-i18n", "//packages/kbn-ui-theme", + "//packages/kbn-esql-validation-autocomplete", + "//packages/kbn-esql-ast", "@npm//antlr4", "@npm//monaco-editor", "@npm//monaco-yaml", - "@npm//js-levenshtein", ] webpack_cli( diff --git a/packages/kbn-monaco/index.ts b/packages/kbn-monaco/index.ts index 49f93e85e77d1..25f683aacb247 100644 --- a/packages/kbn-monaco/index.ts +++ b/packages/kbn-monaco/index.ts @@ -20,7 +20,7 @@ export { export { XJsonLang } from './src/xjson'; export { SQLLang } from './src/sql'; export { ESQL_LANG_ID, ESQL_THEME_ID, ESQLLang } from './src/esql'; -export type { ESQLCallbacks } from './src/esql'; +export type { ESQLCallbacks } from '@kbn/esql-validation-autocomplete'; export * from './src/painless'; /* eslint-disable-next-line @kbn/eslint/module_migration */ @@ -32,4 +32,4 @@ import { registerLanguage } from './src/helpers'; export { BarePluginApi, registerLanguage }; export * from './src/types'; -export { CONSOLE_LANG_ID } from './src/console'; +export { CONSOLE_LANG_ID, CONSOLE_THEME_ID } from './src/console'; diff --git a/packages/kbn-monaco/package.json b/packages/kbn-monaco/package.json index 3f700e2abd369..4e2535870953a 100644 --- a/packages/kbn-monaco/package.json +++ b/packages/kbn-monaco/package.json @@ -5,7 +5,6 @@ "license": "SSPL-1.0 OR Elastic License 2.0", "scripts": { "build:antlr4:painless": "antlr -Dlanguage=TypeScript ./src/painless/antlr/painless_lexer.g4 ./src/painless/antlr/painless_parser.g4 && node ./scripts/fix_generated_antlr.js painless", - "build:antlr4:esql": "antlr -Dlanguage=TypeScript src/esql/antlr/esql_lexer.g4 src/esql/antlr/esql_parser.g4 && node ./scripts/fix_generated_antlr.js esql && node ./scripts/esql_update_ast_script.js", "prebuild:antlr4": "brew bundle --file=./scripts/antlr4_tools/brewfile", "build:antlr4": "yarn run build:antlr4:painless && npm run build:antlr4:esql" } diff --git a/packages/kbn-monaco/src/common/diagnostics_adapter.ts b/packages/kbn-monaco/src/common/diagnostics_adapter.ts index 5dedce11bf54c..cf878996796d2 100644 --- a/packages/kbn-monaco/src/common/diagnostics_adapter.ts +++ b/packages/kbn-monaco/src/common/diagnostics_adapter.ts @@ -9,9 +9,14 @@ import { BehaviorSubject } from 'rxjs'; import { monaco } from '../monaco_imports'; -import type { SyntaxErrors, LangValidation, EditorError, BaseWorkerDefinition } from '../types'; - -const toDiagnostics = (error: EditorError): monaco.editor.IMarkerData => { +import type { + SyntaxErrors, + LangValidation, + MonacoEditorError, + BaseWorkerDefinition, +} from '../types'; + +const toDiagnostics = (error: MonacoEditorError): monaco.editor.IMarkerData => { return { ...error, severity: monaco.MarkerSeverity.Error, diff --git a/packages/kbn-monaco/src/common/error_listener.ts b/packages/kbn-monaco/src/common/error_listener.ts index d1d0db4310544..dafa7be831b89 100644 --- a/packages/kbn-monaco/src/common/error_listener.ts +++ b/packages/kbn-monaco/src/common/error_listener.ts @@ -8,10 +8,10 @@ import type { Recognizer, RecognitionException } from 'antlr4'; import { ErrorListener } from 'antlr4'; -import type { EditorError } from '../types'; +import type { MonacoEditorError } from '../types'; export class ANTLRErrorListener extends ErrorListener { - protected errors: EditorError[] = []; + protected errors: MonacoEditorError[] = []; syntaxError( recognizer: Recognizer, @@ -37,7 +37,7 @@ export class ANTLRErrorListener extends ErrorListener { }); } - getErrors(): EditorError[] { + getErrors(): MonacoEditorError[] { return this.errors; } } diff --git a/packages/kbn-monaco/src/xjson/lexer_rules/shared.ts b/packages/kbn-monaco/src/common/lexer_rules.ts similarity index 100% rename from packages/kbn-monaco/src/xjson/lexer_rules/shared.ts rename to packages/kbn-monaco/src/common/lexer_rules.ts diff --git a/packages/kbn-monaco/src/common/theme.ts b/packages/kbn-monaco/src/common/theme.ts new file mode 100644 index 0000000000000..57f42eb70fc87 --- /dev/null +++ b/packages/kbn-monaco/src/common/theme.ts @@ -0,0 +1,16 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +export const themeRuleGroupBuilderFactory = + (postfix: string = '') => + (tokens: string[], color: string, isBold: boolean = false) => + tokens.map((i) => ({ + token: i + postfix, + foreground: color, + fontStyle: isBold ? 'bold' : '', + })); diff --git a/packages/kbn-monaco/src/console/constants.ts b/packages/kbn-monaco/src/console/constants.ts index b777e6eb22532..1eba867b617c0 100644 --- a/packages/kbn-monaco/src/console/constants.ts +++ b/packages/kbn-monaco/src/console/constants.ts @@ -7,3 +7,5 @@ */ export const CONSOLE_LANG_ID = 'console'; +export const CONSOLE_THEME_ID = 'consoleTheme'; +export const CONSOLE_POSTFIX = '.console'; diff --git a/packages/kbn-monaco/src/console/index.ts b/packages/kbn-monaco/src/console/index.ts index b7f22299d62ee..e94ebdd0ccae5 100644 --- a/packages/kbn-monaco/src/console/index.ts +++ b/packages/kbn-monaco/src/console/index.ts @@ -15,7 +15,9 @@ import type { LangModuleType } from '../types'; import { CONSOLE_LANG_ID } from './constants'; import { lexerRules, languageConfiguration } from './lexer_rules'; -export { CONSOLE_LANG_ID } from './constants'; +export { CONSOLE_LANG_ID, CONSOLE_THEME_ID } from './constants'; + +export { buildConsoleTheme } from './theme'; export const ConsoleLang: LangModuleType = { ID: CONSOLE_LANG_ID, diff --git a/packages/kbn-monaco/src/console/lexer_rules/index.ts b/packages/kbn-monaco/src/console/lexer_rules/index.ts index fcde238930d57..bf40e2c2824f6 100644 --- a/packages/kbn-monaco/src/console/lexer_rules/index.ts +++ b/packages/kbn-monaco/src/console/lexer_rules/index.ts @@ -7,46 +7,191 @@ */ import { monaco } from '../../monaco_imports'; +import { globals } from '../../common/lexer_rules'; +import { buildXjsonRules } from '../../xjson/lexer_rules/xjson'; -export const languageConfiguration: monaco.languages.LanguageConfiguration = {}; +export const languageConfiguration: monaco.languages.LanguageConfiguration = { + brackets: [ + ['{', '}'], + ['[', ']'], + ], + autoClosingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '"', close: '"' }, + ], +}; + +/* + util function to build the action object + */ +const addNextStateToAction = (tokens: string[], nextState?: string) => { + return tokens.map((token, index) => { + // only last action needs to specify the next state + if (index === tokens.length - 1 && nextState) { + return { token, next: nextState }; + } + return token; + }); +}; + +/* + if regex is matched, tokenize as "token" and move to the state "nextState" if defined + */ +const matchToken = (token: string, regex: string | RegExp, nextState?: string) => { + if (nextState) { + return { regex, action: { token, next: nextState } }; + } + return { regex, action: { token } }; +}; + +/* + if regex is matched, tokenize as "tokens" consecutively and move to the state "nextState" + regex needs to have the same number of capturing group as the number of tokens + */ +const matchTokens = (tokens: string[], regex: string | RegExp, nextState?: string) => { + const action = addNextStateToAction(tokens, nextState); + return { + regex, + action, + }; +}; + +const matchTokensWithEOL = ( + tokens: string | string[], + regex: string | RegExp, + nextIfEOL: string, + normalNext?: string +) => { + if (Array.isArray(tokens)) { + const endOfLineAction = addNextStateToAction(tokens, nextIfEOL); + const action = addNextStateToAction(tokens, normalNext); + return { + regex, + action: { + cases: { + '@eos': endOfLineAction, + '@default': action, + }, + }, + }; + } + return { + regex, + action: { + cases: { + '@eos': { token: tokens, next: nextIfEOL }, + '@default': { token: tokens, next: normalNext }, + }, + }, + }; +}; + +const xjsonRules = { ...buildXjsonRules('json_root') }; +// @ts-expect-error include comments into json +xjsonRules.json_root = [{ include: '@comments' }, ...xjsonRules.json_root]; +xjsonRules.json_root = [ + // @ts-expect-error include variables into json + matchToken('variable.template', /("\${\w+}")/), + ...xjsonRules.json_root, +]; export const lexerRules: monaco.languages.IMonarchLanguage = { + ...(globals as any), + defaultToken: 'invalid', - regex_method: /get|post|put|patch|delete/, - regex_url: /.*$/, - // C# style strings - escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/, - ignoreCase: true, tokenizer: { root: [ - // whitespace - { include: '@rule_whitespace' }, - // start a multi-line comment - { include: '@rule_start_multi_comment' }, - // a one-line comment - [/\/\/.*$/, 'comment'], + // warning comment + matchToken('warning', '#!.*$'), + // comments + { include: '@comments' }, + // start of json + matchToken('paren.lparen', '{', 'json_root'), // method - [/@regex_method/, 'keyword'], - // url - [/@regex_url/, 'identifier'], + matchTokensWithEOL('method', /([a-zA-Z]+)/, 'root', 'method_sep'), + // whitespace + matchToken('whitespace', '\\s+'), + // text + matchToken('text', '.+?'), ], - rule_whitespace: [[/[ \t\r\n]+/, 'WHITESPACE']], - rule_start_multi_comment: [[/\/\*/, 'comment', '@rule_multi_comment']], - rule_multi_comment: [ + method_sep: [ + // protocol host with slash + matchTokensWithEOL( + ['whitespace', 'url.protocol_host', 'url.slash'], + /(\s+)(https?:\/\/[^?\/,]+)(\/)/, + 'root', + 'url' + ), + // variable template + matchTokensWithEOL(['whitespace', 'variable.template'], /(\s+)(\${\w+})/, 'root', 'url'), + // protocol host + matchTokensWithEOL( + ['whitespace', 'url.protocol_host'], + /(\s+)(https?:\/\/[^?\/,]+)/, + 'root', + 'url' + ), + // slash + matchTokensWithEOL(['whitespace', 'url.slash'], /(\s+)(\/)/, 'root', 'url'), + // whitespace + matchTokensWithEOL('whitespace', /(\s+)/, 'root', 'url'), + ], + url: [ + // variable template + matchTokensWithEOL('variable.template', /(\${\w+})/, 'root'), + // pathname + matchTokensWithEOL('url.part', /([^?\/,\s]+)\s*/, 'root'), + // comma + matchTokensWithEOL('url.comma', /(,)/, 'root'), + // slash + matchTokensWithEOL('url.slash', /(\/)/, 'root'), + // question mark + matchTokensWithEOL('url.questionmark', /(\?)/, 'root', 'urlParams'), + // comment + matchTokensWithEOL( + ['whitespace', 'comment.punctuation', 'comment.line'], + /(\s+)(\/\/)(.*$)/, + 'root' + ), + ], + urlParams: [ + // param with variable template + matchTokensWithEOL( + ['url.param', 'url.equal', 'variable.template'], + /([^&=]+)(=)(\${\w+})/, + 'root' + ), + // param with value + matchTokensWithEOL(['url.param', 'url.equal', 'url.value'], /([^&=]+)(=)([^&]*)/, 'root'), + // param + matchTokensWithEOL('url.param', /([^&=]+)/, 'root'), + // ampersand + matchTokensWithEOL('url.amp', /(&)/, 'root'), + // comment + matchTokensWithEOL( + ['whitespace', 'comment.punctuation', 'comment.line'], + /(\s+)(\/\/)(.*$)/, + 'root' + ), + ], + comments: [ + // line comment indicated by # + matchTokens(['comment.punctuation', 'comment.line'], /(#)(.*$)/), + // start a block comment indicated by /* + matchToken('comment.punctuation', /\/\*/, 'block_comment'), + // line comment indicated by // + matchTokens(['comment.punctuation', 'comment.line'], /(\/\/)(.*$)/), + ], + block_comment: [ // match everything on a single line inside the comment except for chars / and * - [/[^\/*]+/, 'comment'], - // start a nested comment by going 1 level down - [/\/\*/, 'comment', '@push'], - // match the closing of the comment and return 1 level up - ['\\*/', 'comment', '@pop'], + matchToken('comment', /[^\/*]+/), + // end block comment + matchToken('comment.punctuation', /\*\//, '@pop'), // match individual chars inside a multi-line comment - [/[\/*]/, 'comment'], - ], - string: [ - [/[^\\"]+/, 'string'], - [/@escapes/, 'string.escape'], - [/\\./, 'string.escape.invalid'], - [/"/, { token: 'string.quote', bracket: '@close', next: '@pop' }], + matchToken('comment', /[\/*]/), ], + // include json rules + ...xjsonRules, }, }; diff --git a/packages/kbn-monaco/src/console/theme.ts b/packages/kbn-monaco/src/console/theme.ts new file mode 100644 index 0000000000000..b9330ec97afee --- /dev/null +++ b/packages/kbn-monaco/src/console/theme.ts @@ -0,0 +1,54 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { makeHighContrastColor } from '@elastic/eui'; +import { darkMode, euiThemeVars } from '@kbn/ui-theme'; + +import { themeRuleGroupBuilderFactory } from '../common/theme'; +import { monaco } from '../monaco_imports'; + +const buildRuleGroup = themeRuleGroupBuilderFactory(); + +const background = euiThemeVars.euiColorLightestShade; +const methodTextColor = '#DD0A73'; +const urlTextColor = '#00A69B'; +const stringTextColor = '#009926'; +const commentTextColor = '#4C886B'; +const variableTextColor = '#0079A5'; +const booleanTextColor = '#585CF6'; +const numericTextColor = variableTextColor; +export const buildConsoleTheme = (): monaco.editor.IStandaloneThemeData => { + return { + base: darkMode ? 'vs-dark' : 'vs', + inherit: true, + rules: [ + ...buildRuleGroup(['method'], makeHighContrastColor(methodTextColor)(background)), + ...buildRuleGroup(['url'], makeHighContrastColor(urlTextColor)(background)), + ...buildRuleGroup( + ['string', 'string-literal', 'multi-string', 'punctuation.end-triple-quote'], + makeHighContrastColor(stringTextColor)(background) + ), + ...buildRuleGroup(['comment'], makeHighContrastColor(commentTextColor)(background)), + ...buildRuleGroup(['variable'], makeHighContrastColor(variableTextColor)(background)), + ...buildRuleGroup( + ['constant.language.boolean'], + makeHighContrastColor(booleanTextColor)(background) + ), + ...buildRuleGroup(['constant.numeric'], makeHighContrastColor(numericTextColor)(background)), + ], + colors: { + 'editor.background': background, + // color of the line numbers + 'editorLineNumber.foreground': euiThemeVars.euiColorDarkShade, + // color of the active line number + 'editorLineNumber.activeForeground': euiThemeVars.euiColorDarkShade, + // background of the line numbers side panel + 'editorGutter.background': euiThemeVars.euiColorEmptyShade, + }, + }; +}; diff --git a/packages/kbn-monaco/src/esql/index.ts b/packages/kbn-monaco/src/esql/index.ts index a3b5f3bec666d..8d743aa4fb52e 100644 --- a/packages/kbn-monaco/src/esql/index.ts +++ b/packages/kbn-monaco/src/esql/index.ts @@ -8,5 +8,4 @@ export { ESQL_LANG_ID, ESQL_THEME_ID } from './lib/constants'; export { ESQLLang } from './language'; -export type { ESQLCallbacks } from './lib/ast/shared/types'; -export { buildESQlTheme } from './lib/monaco/esql_theme'; +export { buildESQlTheme } from './lib/esql_theme'; diff --git a/packages/kbn-monaco/src/esql/language.ts b/packages/kbn-monaco/src/esql/language.ts index 90d73af3e02f5..4e486a5c24188 100644 --- a/packages/kbn-monaco/src/esql/language.ts +++ b/packages/kbn-monaco/src/esql/language.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import type { ESQLCallbacks } from '@kbn/esql-validation-autocomplete'; import { monaco } from '../monaco_imports'; import { ESQL_LANG_ID } from './lib/constants'; @@ -14,15 +15,16 @@ import type { CustomLangModuleType } from '../types'; import type { ESQLWorker } from './worker/esql_worker'; import { WorkerProxyService } from '../common/worker_proxy'; -import type { ESQLCallbacks } from './lib/ast/shared/types'; -import { ESQLAstAdapter } from './lib/monaco/esql_ast_provider'; +import { ESQLAstAdapter } from './lib/esql_ast_provider'; +import { wrapAsMonacoSuggestions } from './lib/converters/suggestions'; +import { wrapAsMonacoCodeActions } from './lib/converters/actions'; const workerProxyService = new WorkerProxyService(); export const ESQLLang: CustomLangModuleType = { ID: ESQL_LANG_ID, async onLanguage() { - const { ESQLTokensProvider } = await import('./lib/monaco'); + const { ESQLTokensProvider } = await import('./lib'); workerProxyService.setup(ESQL_LANG_ID); @@ -98,10 +100,7 @@ export const ESQLLang: CustomLangModuleType = { ); const suggestionEntries = await astAdapter.autocomplete(model, position, context); return { - suggestions: suggestionEntries.suggestions.map((suggestion) => ({ - ...suggestion, - range: undefined as unknown as monaco.IRange, - })), + suggestions: wrapAsMonacoSuggestions(suggestionEntries.suggestions), }; }, }; @@ -121,7 +120,7 @@ export const ESQLLang: CustomLangModuleType = { ); const actions = await astAdapter.codeAction(model, range, context); return { - actions, + actions: wrapAsMonacoCodeActions(model, actions), dispose: () => {}, }; }, diff --git a/packages/kbn-monaco/src/esql/lib/README.md b/packages/kbn-monaco/src/esql/lib/README.md deleted file mode 100644 index b30082f710596..0000000000000 --- a/packages/kbn-monaco/src/esql/lib/README.md +++ /dev/null @@ -1,128 +0,0 @@ -# ES|QL utility library - -## Folder structure - -This library enables all the advanced features for ES|QL within Monaco, as validation, autocomplete, hover, etc... -The package is structure as follow: - -``` -|- antlr // => contains the ES|QL grammar files and various compilation assets -|- lib -| |- ast -| | | autocomplete // => the autocomplete/suggest logic -| | | definitions // => static assets to define all components behaviour of a ES|QL query: commands, functions, etc... -| | | hover // => hover logic -| | | signature // => signature service logic -| | | validation // => the validation logic -| | ast_factory.ts // => binding to the Antlr that generates the AST data structure -| | ast_errors.ts // => error translation utility from raw Antlr to something understandable (somewhat) -| | ... // => miscellaneas utilities to work with AST -| |- monaco // => some high level interfaces to work with -| | | esql_ast_provider.ts // => the API to work with validation, autocomplete, etc... -| | | ... -| antlr_facade.ts // => getParser and getLexer utilities -|- worker // => some Monaco utilities that runs in a WebWorker -language.ts // => ES|QL language definition for Monaco with API that expose all features to it -``` - -### Syntax highlight support - -In general the syntax highlight works out of the box, but in case of new tokens added it is required to add them into the `esql_theme.ts` file to color them. -There's also a special | (pipe) handling in case of multi-line with some offset applied to the token location indexes to fix some grammar problems with multi-line. In case of issues with highlight look into the `esql_token_provider.ts` file. - -### How does it work - -The general idea of this package is to provide all ES|QL features on top of a custom compact AST definition (all data structure types defined in `./ast/types.ts`) which is designed to be resilient to many grammar changes. -The pipeline is the following: - -``` -Antlr grammar files -=> Compiled grammar files (.ts assets in the antlr folder) -=> AST Factory (Antlr Parser tree => custom AST) -=> featureFn( AST, Definitions, ESQLCallbacks ) -``` - -Each feature function works with the combination of the AST and the definition files: the former describe the current statement in a easy to traverse way, while the definitions describe what's the expected behaviour of each node in the AST node (i.e. what arguments should it accept? How many arguments? etc...). -ESQLCallbacks are a set of utilities to retrieve context metadata like fields/index/policies list and policies metadata. - -While AST requires the grammar to be compiled to be updated, definitions are static files which can be dynamically updated without running the ANTLR compile task. - -#### AST - -The AST is generated by 2 files: `ast_factory.ts` and its buddy `ast_walker.ts`: -* `ast_factory.ts` is a binding to Antlr and access the Parser tree -* Parser tree is passed over to `ast_walker` to append new AST nodes - -In general Antlr is resilient to grammar errors, in the sense that it can produe a Parser tree up to the point of the error, then stops. This is useful to perform partial tasks even with broken queries and this means that a partial AST can be produced even with an invalid query. - -#### Validation - -Validation takes an AST as input and generates a list of messages to show to the user. -The validation function leverages the definition files to check if the current AST is respecting the defined behaviour. -Most of the logic rely purely on the definitions, but in some specific cases some ad-hoc conditions are defined within the code for specific commands/options. - -#### Autocomplete - -The autocomplete/suggest task takes a query as input together with the current cursor position, then produces internally an AST to work with, to generate a list of suggestions for the given query. -Note that autocomplete works most of the time with incomplete/invalid queries, so some logic to manipulate the query into something valid (see the `EDITOR_MARKER` or the `countBracketsUnclosed` functions for more). - -Once the AST is produced there's a `getAstContext` function that finds the cursor position node (and its parent command), together with some hint like the type of current context: `expression`, `function`, `newCommand`, `option`. -The most complex case is the `expression` as it can cover a moltitude of cases. The function is highly commented in order to identify the specific cases, but there's probably some obscure area still to comment/clarify. - -#### Hover - -The hover logic leverages the same `getAstContext` function as autocomplete but its logic is way simpler as it picks the right definition based on context and produces a set of strings for the tooltip. - -#### Signature - -No signature implementation has been added yet, but it will likely work as hover if/when implemented. - -### Keeping ES|QL up to date - -In general when operating on changes here use the `yarn kbn watch` in a terminal window to make sure changes are correctly compiled. - -#### How to add new functions - -When a new function is added to ES|QL, this can be of one of these types: - -* Built-in function (+, -, in, like, etc...) -* Aggregation type (`STATS` only) -* Math type (`EVAL`, `WHERE`, etc...) - -For each function type there's a specific file to update within the `definitions` folder: -* Built-in function => `builtin.ts` -* Aggregation type => `aggs.ts` -* Math type => `functions.ts` - -All function definitions are of the `FunctionDefinition` type and it's quite easy to add new ones. - -While validation tests for Aggregation and Math type will be automatically generated, for the Built-in type new tests needs to be added for both validation and autocomplete. - -#### How to add new commands/options - -When a new command/option is added to ES|QL it is done via a grammar update. -Therefore adding them requires a two step phase: -* Update the grammar with the new one - * add/fix all AST generator bindings in case of new/changed TOKENS in the `lexer` grammar file -* Update the definition files for commands/options - -To update the grammar: -1. start by copying the source grammar `lexer` and `parser` files -2. make sure to fix all the case insensitive occurrencies in `lexer` file (all non-symbol strings like `"something"` into `S O M E T H I N G`). -3. run the script into the `package.json` to compile the ES|QL grammar. -4. open the `ast_factory.ts` file and add a new `exit` method -5. write some code in the `ast_walker/ts` to translate the Antlr Parser tree into the custom AST (there are already few utilites for that, but sometimes it is required to write some more code if the `parser` introduced a new flow) - * pro tip: use the `http://lab.antlr.org/` to visualize/debug the parser tree for a given statement (copy and paste the grammar files there) -6. if a new quoted/unquoted identifier token gets added open the `ast_helpers.ts` and manually add the ids of the new tokens in the `getQuotedText` and `getUnquotedText` functions - please make sure to leave a comment on the token name - -To update the definitions: -1. open either the `commands.ts` or `option.ts` file and add a new entry -2. write new tests for validation and autocomplete - -#### Debug and fix grammar changes (tokens, etc...) - -On TOKEN renaming or with subtle `lexer` grammar changes it can happens that test breaks, this can be happen for two main issues: -* A TOKEN name changed so the `ast_walker.ts` doesn't find it any more. Go there and rename the TOKEN name. -* TOKEN order changed and tests started failing. This probably generated some TOKEN id reorder and there are two functions in `ast_helpers.ts` who rely on hardcoded ids: `getQuotedText` and `getUnquotedText`. - * to fix this just look at the commented tokens and update the ids. If a new token add it and leave a comment to point to the new token name. - * This choice was made to reduce the bundle size, as importing the `esql_parser` adds some hundreds of Kbs to the bundle otherwise. \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/literals.ts b/packages/kbn-monaco/src/esql/lib/ast/definitions/literals.ts deleted file mode 100644 index 3cc61683372a7..0000000000000 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/literals.ts +++ /dev/null @@ -1,142 +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 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 or the Server - * Side Public License, v 1. - */ - -import { i18n } from '@kbn/i18n'; -import type { Literals } from './types'; - -export const timeLiterals: Literals[] = [ - { - name: 'year', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.year', { - defaultMessage: 'Year', - }), - }, - { - name: 'years', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.years', { - defaultMessage: 'Years (Plural)', - }), - }, - { - name: 'month', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.month', { - defaultMessage: 'Month', - }), - }, - { - name: 'months', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.months', { - defaultMessage: 'Months (Plural)', - }), - }, - { - name: 'week', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.week', { - defaultMessage: 'Week', - }), - }, - { - name: 'weeks', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.weeks', { - defaultMessage: 'Weeks (Plural)', - }), - }, - { - name: 'day', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.day', { - defaultMessage: 'Day', - }), - }, - { - name: 'days', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.days', { - defaultMessage: 'Days (Plural)', - }), - }, - { - name: 'hour', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.hour', { - defaultMessage: 'Hour', - }), - }, - { - name: 'hours', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.hours', { - defaultMessage: 'Hours (Plural)', - }), - }, - { - name: 'minute', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.minute', { - defaultMessage: 'Minute', - }), - }, - { - name: 'minutes', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.minutes', { - defaultMessage: 'Minutes (Plural)', - }), - }, - { - name: 'second', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.second', { - defaultMessage: 'Second', - }), - }, - { - name: 'seconds', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.seconds', { - defaultMessage: 'Seconds (Plural)', - }), - }, - { - name: 'millisecond', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.millisecond', { - defaultMessage: 'Millisecond', - }), - }, - { - name: 'milliseconds', - description: i18n.translate('monaco.esql.definitions.dateDurationDefinition.milliseconds', { - defaultMessage: 'Milliseconds (Plural)', - }), - }, -]; - -export const chronoLiterals: Literals[] = [ - 'ALIGNED_DAY_OF_WEEK_IN_MONTH', - 'ALIGNED_DAY_OF_WEEK_IN_YEAR', - 'ALIGNED_WEEK_OF_MONTH', - 'ALIGNED_WEEK_OF_YEAR', - 'AMPM_OF_DAY', - 'CLOCK_HOUR_OF_AMPM', - 'CLOCK_HOUR_OF_DAY', - 'DAY_OF_MONTH', - 'DAY_OF_WEEK', - 'DAY_OF_YEAR', - 'EPOCH_DAY', - 'ERA', - 'HOUR_OF_AMPM', - 'HOUR_OF_DAY', - 'INSTANT_SECONDS', - 'MICRO_OF_DAY', - 'MICRO_OF_SECOND', - 'MILLI_OF_DAY', - 'MILLI_OF_SECOND', - 'MINUTE_OF_DAY', - 'MINUTE_OF_HOUR', - 'MONTH_OF_YEAR', - 'NANO_OF_DAY', - 'NANO_OF_SECOND', - 'OFFSET_SECONDS', - 'PROLEPTIC_MONTH', - 'SECOND_OF_DAY', - 'SECOND_OF_MINUTE', - 'YEAR', - 'YEAR_OF_ERA', -].map((name) => ({ name: `"${name}"`, description: '' })); diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/settings.ts b/packages/kbn-monaco/src/esql/lib/ast/definitions/settings.ts deleted file mode 100644 index 4c76a87d9283c..0000000000000 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/settings.ts +++ /dev/null @@ -1,38 +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 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 or the Server - * Side Public License, v 1. - */ - -import { i18n } from '@kbn/i18n'; -import { CommandModeDefinition } from './types'; - -export const enrichModes: CommandModeDefinition = { - name: 'ccq.mode', - description: i18n.translate('monaco.esql.definitions.ccqModeDoc', { - defaultMessage: 'Cross-clusters query mode', - }), - prefix: '_', - values: [ - { - name: 'any', - description: i18n.translate('monaco.esql.definitions.ccqAnyDoc', { - defaultMessage: 'Enrich takes place on any cluster', - }), - }, - { - name: 'coordinator', - description: i18n.translate('monaco.esql.definitions.ccqCoordinatorDoc', { - defaultMessage: 'Enrich takes place on the coordinating cluster receiving an ES|QL', - }), - }, - { - name: 'remote', - description: i18n.translate('monaco.esql.definitions.ccqRemoteDoc', { - defaultMessage: 'Enrich takes place on the cluster hosting the target index.', - }), - }, - ], -}; diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/errors.ts b/packages/kbn-monaco/src/esql/lib/ast/validation/errors.ts deleted file mode 100644 index a0ae838429be5..0000000000000 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/errors.ts +++ /dev/null @@ -1,297 +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 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 or the Server - * Side Public License, v 1. - */ - -import { i18n } from '@kbn/i18n'; -import type { ESQLLocation, ESQLMessage } from '../types'; -import type { ErrorTypes, ErrorValues } from './types'; - -function getMessageAndTypeFromId({ - messageId, - values, -}: { - messageId: K; - values: ErrorValues; -}): { message: string; type?: 'error' | 'warning' } { - // Use a less strict type instead of doing a typecast on each message type - const out = values as unknown as Record; - // i18n validation wants to the values prop to be declared inline, so need to unpack and redeclare again all props - switch (messageId) { - case 'wrongArgumentType': - return { - message: i18n.translate('monaco.esql.validation.wrongArgumentType', { - defaultMessage: - 'Argument of [{name}] must be [{argType}], found value [{value}] type [{givenType}]', - values: { - name: out.name, - argType: out.argType, - value: out.value, - givenType: out.givenType, - }, - }), - }; - case 'unknownColumn': - return { - message: i18n.translate('monaco.esql.validation.unknownColumn', { - defaultMessage: 'Unknown column [{name}]', - values: { name: out.name }, - }), - }; - case 'unknownIndex': - return { - message: i18n.translate('monaco.esql.validation.unknownIndex', { - defaultMessage: 'Unknown index [{name}]', - values: { name: out.name }, - }), - }; - case 'unknownFunction': - return { - message: i18n.translate('monaco.esql.validation.missingFunction', { - defaultMessage: 'Unknown function [{name}]', - values: { name: out.name }, - }), - }; - case 'wrongArgumentNumber': - return { - message: i18n.translate('monaco.esql.validation.wrongArgumentExactNumber', { - defaultMessage: - 'Error: [{fn}] function expects exactly {numArgs, plural, one {one argument} other {{numArgs} arguments}}, got {passedArgs}.', - values: { - fn: out.fn, - numArgs: out.numArgs, - passedArgs: out.passedArgs, - }, - }), - }; - case 'wrongArgumentNumberTooMany': - return { - message: i18n.translate('monaco.esql.validation.wrongArgumentTooManyNumber', { - defaultMessage: - 'Error: [{fn}] function expects {extraArgs, plural, =0 {} other {no more than }}{numArgs, plural, one {one argument} other {{numArgs} arguments}}, got {passedArgs}.', - values: { - fn: out.fn, - numArgs: out.numArgs, - passedArgs: out.passedArgs, - extraArgs: out.extraArgs, - }, - }), - }; - case 'wrongArgumentNumberTooFew': - return { - message: i18n.translate('monaco.esql.validation.wrongArgumentTooFewNumber', { - defaultMessage: - 'Error: [{fn}] function expects {missingArgs, plural, =0 {} other {at least }}{numArgs, plural, one {one argument} other {{numArgs} arguments}}, got {passedArgs}.', - values: { - fn: out.fn, - numArgs: out.numArgs, - passedArgs: out.passedArgs, - missingArgs: out.missingArgs, - }, - }), - }; - case 'noNestedArgumentSupport': - return { - message: i18n.translate('monaco.esql.validation.noNestedArgumentSupport', { - defaultMessage: - "Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [{name}] of type [{argType}]", - values: { name: out.name, argType: out.argType }, - }), - }; - case 'shadowFieldType': - return { - message: i18n.translate('monaco.esql.validation.typeOverwrite', { - defaultMessage: - 'Column [{field}] of type {fieldType} has been overwritten as new type: {newType}', - values: { field: out.field, fieldType: out.fieldType, newType: out.newType }, - }), - type: 'warning', - }; - case 'unsupportedColumnTypeForCommand': - return { - message: i18n.translate('monaco.esql.validation.unsupportedColumnTypeForCommand', { - defaultMessage: - '{command} only supports {type} {typeCount, plural, one {type} other {types}} values, found [{column}] of type [{givenType}]', - values: { - command: out.command, - type: out.type, - typeCount: out.typeCount, - column: out.column, - givenType: out.givenType, - }, - }), - }; - case 'unknownOption': - return { - message: i18n.translate('monaco.esql.validation.unknownOption', { - defaultMessage: 'Invalid option for {command}: [{option}]', - values: { - command: out.command, - option: out.option, - }, - }), - }; - case 'unsupportedFunctionForCommand': - return { - message: i18n.translate('monaco.esql.validation.unsupportedFunctionForCommand', { - defaultMessage: '{command} does not support function {name}', - values: { - command: out.command, - name: out.name, - }, - }), - }; - case 'unsupportedFunctionForCommandOption': - return { - message: i18n.translate('monaco.esql.validation.unsupportedFunctionforCommandOption', { - defaultMessage: '{command} {option} does not support function {name}', - values: { - command: out.command, - option: out.option, - name: out.name, - }, - }), - }; - case 'unknownInterval': - return { - message: i18n.translate('monaco.esql.validation.unknownInterval', { - defaultMessage: `Unexpected time interval qualifier: '{value}'`, - values: { - value: out.value, - }, - }), - }; - case 'unsupportedTypeForCommand': - return { - message: i18n.translate('monaco.esql.validation.unsupportedTypeForCommand', { - defaultMessage: '{command} does not support [{type}] in expression [{value}]', - values: { - command: out.command, - type: out.type, - value: out.value, - }, - }), - }; - case 'unknownPolicy': - return { - message: i18n.translate('monaco.esql.validation.unknownPolicy', { - defaultMessage: 'Unknown policy [{name}]', - values: { - name: out.name, - }, - }), - }; - case 'unknownAggregateFunction': - return { - message: i18n.translate('monaco.esql.validation.unknowAggregateFunction', { - defaultMessage: - 'Expected an aggregate function or group but got [{value}] of type [{type}]', - values: { - type: out.type, - value: out.value, - }, - }), - }; - case 'wildcardNotSupportedForCommand': - return { - message: i18n.translate('monaco.esql.validation.wildcardNotSupportedForCommand', { - defaultMessage: 'Using wildcards (*) in {command} is not allowed [{value}]', - values: { - command: out.command, - value: out.value, - }, - }), - }; - case 'noWildcardSupportAsArg': - return { - message: i18n.translate('monaco.esql.validation.wildcardNotSupportedForFunction', { - defaultMessage: 'Using wildcards (*) in {name} is not allowed', - values: { - name: out.name, - }, - }), - }; - case 'unsupportedFieldType': - return { - message: i18n.translate('monaco.esql.validation.unsupportedFieldType', { - defaultMessage: - 'Field [{field}] cannot be retrieved, it is unsupported or not indexed; returning null', - values: { - field: out.field, - }, - }), - type: 'warning', - }; - case 'unsupportedSetting': - return { - message: i18n.translate('monaco.esql.validation.unsupportedSetting', { - defaultMessage: 'Unsupported setting [{setting}], expected [{expected}]', - values: { - setting: out.setting, - expected: out.expected, - }, - }), - type: 'error', - }; - case 'unsupportedSettingCommandValue': - return { - message: i18n.translate('monaco.esql.validation.unsupportedSettingValue', { - defaultMessage: - 'Unrecognized value [{value}] for {command}, mode needs to be one of [{expected}]', - values: { - expected: out.expected, - value: out.value, - command: out.command, - }, - }), - type: 'error', - }; - case 'expectedConstant': - return { - message: i18n.translate('monaco.esql.validation.expectedConstantValue', { - defaultMessage: 'Argument of [{fn}] must be a constant, received [{given}]', - values: { - given: out.given, - fn: out.fn, - }, - }), - type: 'error', - }; - } - return { message: '' }; -} - -export function getMessageFromId({ - locations, - ...payload -}: { - messageId: K; - values: ErrorValues; - locations: ESQLLocation; -}): ESQLMessage { - const { message, type = 'error' } = getMessageAndTypeFromId(payload); - return createMessage(type, message, locations, payload.messageId); -} - -export function createMessage( - type: 'error' | 'warning', - message: string, - location: ESQLLocation, - messageId: string -) { - return { - type, - text: message, - location, - code: messageId, - }; -} - -export function getUnknownTypeLabel() { - return i18n.translate('monaco.esql.validation.unknownColumnType', { - defaultMessage: 'Unknown type', - }); -} diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/esql_validation_meta_tests.json b/packages/kbn-monaco/src/esql/lib/ast/validation/esql_validation_meta_tests.json deleted file mode 100644 index a1edd9cbac423..0000000000000 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/esql_validation_meta_tests.json +++ /dev/null @@ -1,8682 +0,0 @@ -{ - "indexes": [ - "a_index", - "index", - "other_index", - ".secret_index", - "my-index", - "unsupported_index" - ], - "fields": [ - { - "name": "numberField", - "type": "number" - }, - { - "name": "dateField", - "type": "date" - }, - { - "name": "booleanField", - "type": "boolean" - }, - { - "name": "ipField", - "type": "ip" - }, - { - "name": "stringField", - "type": "string" - }, - { - "name": "cartesianPointField", - "type": "cartesian_point" - }, - { - "name": "geoPointField", - "type": "geo_point" - }, - { - "name": "any#Char$Field", - "type": "number" - }, - { - "name": "kubernetes.something.something", - "type": "number" - }, - { - "name": "@timestamp", - "type": "date" - }, - { - "name": "otherStringField", - "type": "keyword" - } - ], - "enrichFields": [ - { - "name": "otherField", - "type": "string" - }, - { - "name": "yetAnotherField", - "type": "number" - }, - { - "name": "otherStringField", - "type": "keyword" - } - ], - "policies": [ - { - "name": "policy", - "sourceIndices": [ - "enrich_index" - ], - "matchField": "otherStringField", - "enrichFields": [ - "otherField", - "yetAnotherField" - ] - }, - { - "name": "policy$", - "sourceIndices": [ - "enrich_index" - ], - "matchField": "otherStringField", - "enrichFields": [ - "otherField", - "yetAnotherField" - ] - } - ], - "unsupported_field": [ - { - "name": "unsupported_field", - "type": "unsupported" - } - ], - "testCases": [ - { - "query": "eval", - "error": true - }, - { - "query": "stats", - "error": true - }, - { - "query": "rename", - "error": true - }, - { - "query": "limit", - "error": true - }, - { - "query": "keep", - "error": true - }, - { - "query": "drop", - "error": true - }, - { - "query": "mv_expand", - "error": true - }, - { - "query": "dissect", - "error": true - }, - { - "query": "grok", - "error": true - }, - { - "query": "f", - "error": true - }, - { - "query": "from ", - "error": true - }, - { - "query": "from index,", - "error": true - }, - { - "query": "from assignment = 1", - "error": true - }, - { - "query": "from index", - "error": false - }, - { - "query": "FROM index", - "error": false - }, - { - "query": "FrOm index", - "error": false - }, - { - "query": "from `index`", - "error": false - }, - { - "query": "from index, other_index", - "error": false - }, - { - "query": "from index, missingIndex", - "error": true - }, - { - "query": "from fn()", - "error": true - }, - { - "query": "from average()", - "error": true - }, - { - "query": "from index [METADATA _id]", - "error": false - }, - { - "query": "from index [metadata _id]", - "error": false - }, - { - "query": "from index [METADATA _id, _source]", - "error": false - }, - { - "query": "from index [METADATA _id, _source2]", - "error": true - }, - { - "query": "from index [metadata _id, _source] [METADATA _id2]", - "error": true - }, - { - "query": "from remote-ccs:indexes [METADATA _id]", - "error": false - }, - { - "query": "from *:indexes [METADATA _id]", - "error": false - }, - { - "query": "from index METADATA _id", - "error": false - }, - { - "query": "from index metadata _id", - "error": false - }, - { - "query": "from index METADATA _id, _source", - "error": false - }, - { - "query": "from index METADATA _id, _source2", - "error": true - }, - { - "query": "from index metadata _id, _source METADATA _id2", - "error": true - }, - { - "query": "from remote-ccs:indexes METADATA _id", - "error": false - }, - { - "query": "from *:indexes METADATA _id", - "error": false - }, - { - "query": "from index (metadata _id)", - "error": true - }, - { - "query": "from ind*, other*", - "error": false - }, - { - "query": "from index*", - "error": false - }, - { - "query": "from *a_i*dex*", - "error": false - }, - { - "query": "from in*ex*", - "error": false - }, - { - "query": "from *n*ex", - "error": false - }, - { - "query": "from *n*ex*", - "error": false - }, - { - "query": "from i*d*x*", - "error": false - }, - { - "query": "from i*d*x", - "error": false - }, - { - "query": "from i***x*", - "error": false - }, - { - "query": "from i****", - "error": false - }, - { - "query": "from i**", - "error": false - }, - { - "query": "from index**", - "error": false - }, - { - "query": "from *ex", - "error": false - }, - { - "query": "from *ex*", - "error": false - }, - { - "query": "from in*ex", - "error": false - }, - { - "query": "from ind*ex", - "error": false - }, - { - "query": "from indexes*", - "error": true - }, - { - "query": "from remote-*:indexes*", - "error": false - }, - { - "query": "from remote-*:indexes", - "error": false - }, - { - "query": "from remote-ccs:indexes", - "error": false - }, - { - "query": "from a_index, remote-ccs:indexes", - "error": false - }, - { - "query": "from .secret_index", - "error": false - }, - { - "query": "from my-index", - "error": false - }, - { - "query": "from numberField", - "error": true - }, - { - "query": "from policy", - "error": true - }, - { - "query": "row", - "error": true - }, - { - "query": "row missing_column", - "error": true - }, - { - "query": "row fn()", - "error": true - }, - { - "query": "row missing_column, missing_column2", - "error": true - }, - { - "query": "row a=1", - "error": false - }, - { - "query": "row a=1, missing_column", - "error": true - }, - { - "query": "row a=1, b = average()", - "error": true - }, - { - "query": "row a = [1, 2, 3]", - "error": false - }, - { - "query": "row a = [true, false]", - "error": false - }, - { - "query": "row a = [\"a\", \"b\"]", - "error": false - }, - { - "query": "row a = null", - "error": false - }, - { - "query": "row a = (1)", - "error": false - }, - { - "query": "row a = (1, 2, 3)", - "error": true - }, - { - "query": "row a=NOT true", - "error": false - }, - { - "query": "row NOT true", - "error": false - }, - { - "query": "row a=NOT false", - "error": false - }, - { - "query": "row NOT false", - "error": false - }, - { - "query": "row var = 1 in ", - "error": true - }, - { - "query": "row var = 1 in (", - "error": true - }, - { - "query": "row var = 1 not in ", - "error": true - }, - { - "query": "row var = 1 in (1, 2, 3)", - "error": false - }, - { - "query": "row var = 5 in (1, 2, 3)", - "error": false - }, - { - "query": "row var = 5 not in (1, 2, 3)", - "error": false - }, - { - "query": "row var = 1 in (1, 2, 3, round(5))", - "error": false - }, - { - "query": "row var = \"a\" in (\"a\", \"b\", \"c\")", - "error": false - }, - { - "query": "row var = \"a\" in (\"a\", \"b\", \"c\")", - "error": false - }, - { - "query": "row var = \"a\" not in (\"a\", \"b\", \"c\")", - "error": false - }, - { - "query": "row var = 1 in (\"a\", \"b\", \"c\")", - "error": true - }, - { - "query": "row var = 5 in (\"a\", \"b\", \"c\")", - "error": true - }, - { - "query": "row var = 5 not in (\"a\", \"b\", \"c\")", - "error": true - }, - { - "query": "row var = 5 not in (1, 2, 3, \"a\")", - "error": true - }, - { - "query": "row var = abs(5)", - "error": false - }, - { - "query": "row abs(5)", - "error": false - }, - { - "query": "row var = abs(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = abs(\"a\")", - "error": true - }, - { - "query": "row var = acos(5)", - "error": false - }, - { - "query": "row acos(5)", - "error": false - }, - { - "query": "row var = acos(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = acos(\"a\")", - "error": true - }, - { - "query": "row var = asin(5)", - "error": false - }, - { - "query": "row asin(5)", - "error": false - }, - { - "query": "row var = asin(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = asin(\"a\")", - "error": true - }, - { - "query": "row var = atan(5)", - "error": false - }, - { - "query": "row atan(5)", - "error": false - }, - { - "query": "row var = atan(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = atan(\"a\")", - "error": true - }, - { - "query": "row var = atan2(5, 5)", - "error": false - }, - { - "query": "row atan2(5, 5)", - "error": false - }, - { - "query": "row var = atan2(to_integer(\"a\"), to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = atan2(\"a\", \"a\")", - "error": true - }, - { - "query": "row var = auto_bucket(now(), 5, \"a\", \"a\")", - "error": false - }, - { - "query": "row auto_bucket(now(), 5, \"a\", \"a\")", - "error": false - }, - { - "query": "row var = auto_bucket(now(), 5, 5, 5)", - "error": false - }, - { - "query": "row auto_bucket(now(), 5, 5, 5)", - "error": false - }, - { - "query": "row var = case(true, \"a\")", - "error": false - }, - { - "query": "row case(true, \"a\")", - "error": false - }, - { - "query": "row var = ceil(5)", - "error": false - }, - { - "query": "row ceil(5)", - "error": false - }, - { - "query": "row var = ceil(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = ceil(\"a\")", - "error": true - }, - { - "query": "row var = cidr_match(to_ip(\"127.0.0.1\"), \"a\")", - "error": false - }, - { - "query": "row cidr_match(to_ip(\"127.0.0.1\"), \"a\")", - "error": false - }, - { - "query": "row var = cidr_match(to_ip(\"a\"), to_string(\"a\"))", - "error": false - }, - { - "query": "row var = cidr_match(\"a\", 5)", - "error": true - }, - { - "query": "row var = coalesce(\"a\")", - "error": false - }, - { - "query": "row coalesce(\"a\")", - "error": false - }, - { - "query": "row var = concat(\"a\", \"a\")", - "error": false - }, - { - "query": "row concat(\"a\", \"a\")", - "error": false - }, - { - "query": "row var = concat(to_string(\"a\"), to_string(\"a\"))", - "error": false - }, - { - "query": "row var = concat(5, 5)", - "error": true - }, - { - "query": "row var = cos(5)", - "error": false - }, - { - "query": "row cos(5)", - "error": false - }, - { - "query": "row var = cos(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = cos(\"a\")", - "error": true - }, - { - "query": "row var = cosh(5)", - "error": false - }, - { - "query": "row cosh(5)", - "error": false - }, - { - "query": "row var = cosh(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = cosh(\"a\")", - "error": true - }, - { - "query": "row var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", now())", - "error": false - }, - { - "query": "row date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", now())", - "error": false - }, - { - "query": "row var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", to_datetime(\"a\"))", - "error": false - }, - { - "query": "row var = date_extract(\"a\", \"a\")", - "error": true - }, - { - "query": "row var = date_format(now(), \"a\")", - "error": false - }, - { - "query": "row date_format(now(), \"a\")", - "error": false - }, - { - "query": "row var = date_format(to_datetime(\"a\"), to_string(\"a\"))", - "error": false - }, - { - "query": "row var = date_format(\"a\", 5)", - "error": true - }, - { - "query": "row var = date_parse(\"a\", \"a\")", - "error": false - }, - { - "query": "row date_parse(\"a\", \"a\")", - "error": false - }, - { - "query": "row var = date_parse(to_string(\"a\"), to_string(\"a\"))", - "error": false - }, - { - "query": "row var = date_parse(5, 5)", - "error": true - }, - { - "query": "row var = date_trunc(1 year, now())", - "error": false - }, - { - "query": "row date_trunc(1 year, now())", - "error": false - }, - { - "query": "row var = date_trunc(1 year, to_datetime(\"a\"))", - "error": false - }, - { - "query": "row var = date_trunc(\"a\", \"a\")", - "error": true - }, - { - "query": "row var = e()", - "error": false - }, - { - "query": "row e()", - "error": false - }, - { - "query": "row var = e()", - "error": false - }, - { - "query": "row var = e()", - "error": false - }, - { - "query": "row var = ends_with(\"a\", \"a\")", - "error": false - }, - { - "query": "row ends_with(\"a\", \"a\")", - "error": false - }, - { - "query": "row var = ends_with(to_string(\"a\"), to_string(\"a\"))", - "error": false - }, - { - "query": "row var = ends_with(5, 5)", - "error": true - }, - { - "query": "row var = floor(5)", - "error": false - }, - { - "query": "row floor(5)", - "error": false - }, - { - "query": "row var = floor(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = floor(\"a\")", - "error": true - }, - { - "query": "row var = greatest(\"a\")", - "error": false - }, - { - "query": "row greatest(\"a\")", - "error": false - }, - { - "query": "row var = least(\"a\")", - "error": false - }, - { - "query": "row least(\"a\")", - "error": false - }, - { - "query": "row var = left(\"a\", 5)", - "error": false - }, - { - "query": "row left(\"a\", 5)", - "error": false - }, - { - "query": "row var = left(to_string(\"a\"), to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = left(5, \"a\")", - "error": true - }, - { - "query": "row var = length(\"a\")", - "error": false - }, - { - "query": "row length(\"a\")", - "error": false - }, - { - "query": "row var = length(to_string(\"a\"))", - "error": false - }, - { - "query": "row var = length(5)", - "error": true - }, - { - "query": "row var = log(5, 5)", - "error": false - }, - { - "query": "row log(5, 5)", - "error": false - }, - { - "query": "row var = log(to_integer(\"a\"), to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = log(\"a\", \"a\")", - "error": true - }, - { - "query": "row var = log10(5)", - "error": false - }, - { - "query": "row log10(5)", - "error": false - }, - { - "query": "row var = log10(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = log10(\"a\")", - "error": true - }, - { - "query": "row var = ltrim(\"a\")", - "error": false - }, - { - "query": "row ltrim(\"a\")", - "error": false - }, - { - "query": "row var = ltrim(to_string(\"a\"))", - "error": false - }, - { - "query": "row var = ltrim(5)", - "error": true - }, - { - "query": "row var = mv_avg(5)", - "error": false - }, - { - "query": "row mv_avg(5)", - "error": false - }, - { - "query": "row var = mv_avg(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = mv_avg(\"a\")", - "error": true - }, - { - "query": "row var = mv_concat(\"a\", \"a\")", - "error": false - }, - { - "query": "row mv_concat(\"a\", \"a\")", - "error": false - }, - { - "query": "row var = mv_concat(to_string(\"a\"), to_string(\"a\"))", - "error": false - }, - { - "query": "row var = mv_concat(5, 5)", - "error": true - }, - { - "query": "row var = mv_count(\"a\")", - "error": false - }, - { - "query": "row mv_count(\"a\")", - "error": false - }, - { - "query": "row var = mv_dedupe(\"a\")", - "error": false - }, - { - "query": "row mv_dedupe(\"a\")", - "error": false - }, - { - "query": "row var = mv_first(\"a\")", - "error": false - }, - { - "query": "row mv_first(\"a\")", - "error": false - }, - { - "query": "row var = mv_last(\"a\")", - "error": false - }, - { - "query": "row mv_last(\"a\")", - "error": false - }, - { - "query": "row var = mv_max(\"a\")", - "error": false - }, - { - "query": "row mv_max(\"a\")", - "error": false - }, - { - "query": "row var = mv_median(5)", - "error": false - }, - { - "query": "row mv_median(5)", - "error": false - }, - { - "query": "row var = mv_median(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = mv_median(\"a\")", - "error": true - }, - { - "query": "row var = mv_min(\"a\")", - "error": false - }, - { - "query": "row mv_min(\"a\")", - "error": false - }, - { - "query": "row var = mv_sum(5)", - "error": false - }, - { - "query": "row mv_sum(5)", - "error": false - }, - { - "query": "row var = mv_sum(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = mv_sum(\"a\")", - "error": true - }, - { - "query": "row var = now()", - "error": false - }, - { - "query": "row now()", - "error": false - }, - { - "query": "row var = now()", - "error": false - }, - { - "query": "row var = now()", - "error": false - }, - { - "query": "row var = pi()", - "error": false - }, - { - "query": "row pi()", - "error": false - }, - { - "query": "row var = pi()", - "error": false - }, - { - "query": "row var = pi()", - "error": false - }, - { - "query": "row var = pow(5, 5)", - "error": false - }, - { - "query": "row pow(5, 5)", - "error": false - }, - { - "query": "row var = pow(to_integer(\"a\"), to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = pow(\"a\", \"a\")", - "error": true - }, - { - "query": "row var = replace(\"a\", \"a\", \"a\")", - "error": false - }, - { - "query": "row replace(\"a\", \"a\", \"a\")", - "error": false - }, - { - "query": "row var = replace(to_string(\"a\"), to_string(\"a\"), to_string(\"a\"))", - "error": false - }, - { - "query": "row var = replace(5, 5, 5)", - "error": true - }, - { - "query": "row var = right(\"a\", 5)", - "error": false - }, - { - "query": "row right(\"a\", 5)", - "error": false - }, - { - "query": "row var = right(to_string(\"a\"), to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = right(5, \"a\")", - "error": true - }, - { - "query": "row var = round(5, 5)", - "error": false - }, - { - "query": "row round(5, 5)", - "error": false - }, - { - "query": "row var = round(to_integer(\"a\"), to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = round(\"a\", \"a\")", - "error": true - }, - { - "query": "row var = rtrim(\"a\")", - "error": false - }, - { - "query": "row rtrim(\"a\")", - "error": false - }, - { - "query": "row var = rtrim(to_string(\"a\"))", - "error": false - }, - { - "query": "row var = rtrim(5)", - "error": true - }, - { - "query": "row var = sin(5)", - "error": false - }, - { - "query": "row sin(5)", - "error": false - }, - { - "query": "row var = sin(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = sin(\"a\")", - "error": true - }, - { - "query": "row var = sinh(5)", - "error": false - }, - { - "query": "row sinh(5)", - "error": false - }, - { - "query": "row var = sinh(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = sinh(\"a\")", - "error": true - }, - { - "query": "row var = split(\"a\", \"a\")", - "error": false - }, - { - "query": "row split(\"a\", \"a\")", - "error": false - }, - { - "query": "row var = split(to_string(\"a\"), to_string(\"a\"))", - "error": false - }, - { - "query": "row var = split(5, 5)", - "error": true - }, - { - "query": "row var = sqrt(5)", - "error": false - }, - { - "query": "row sqrt(5)", - "error": false - }, - { - "query": "row var = sqrt(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = sqrt(\"a\")", - "error": true - }, - { - "query": "row var = starts_with(\"a\", \"a\")", - "error": false - }, - { - "query": "row starts_with(\"a\", \"a\")", - "error": false - }, - { - "query": "row var = starts_with(to_string(\"a\"), to_string(\"a\"))", - "error": false - }, - { - "query": "row var = starts_with(5, 5)", - "error": true - }, - { - "query": "row var = substring(\"a\", 5, 5)", - "error": false - }, - { - "query": "row substring(\"a\", 5, 5)", - "error": false - }, - { - "query": "row var = substring(to_string(\"a\"), to_integer(\"a\"), to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = substring(5, \"a\", \"a\")", - "error": true - }, - { - "query": "row var = tan(5)", - "error": false - }, - { - "query": "row tan(5)", - "error": false - }, - { - "query": "row var = tan(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = tan(\"a\")", - "error": true - }, - { - "query": "row var = tanh(5)", - "error": false - }, - { - "query": "row tanh(5)", - "error": false - }, - { - "query": "row var = tanh(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = tanh(\"a\")", - "error": true - }, - { - "query": "row var = tau()", - "error": false - }, - { - "query": "row tau()", - "error": false - }, - { - "query": "row var = tau()", - "error": false - }, - { - "query": "row var = tau()", - "error": false - }, - { - "query": "row var = to_boolean(\"a\")", - "error": false - }, - { - "query": "row to_boolean(\"a\")", - "error": false - }, - { - "query": "row var = to_bool(\"a\")", - "error": false - }, - { - "query": "row var = to_cartesianpoint(\"a\")", - "error": false - }, - { - "query": "row to_cartesianpoint(\"a\")", - "error": false - }, - { - "query": "row var = to_cartesianshape(\"a\")", - "error": false - }, - { - "query": "row to_cartesianshape(\"a\")", - "error": false - }, - { - "query": "row var = to_datetime(\"a\")", - "error": false - }, - { - "query": "row to_datetime(\"a\")", - "error": false - }, - { - "query": "row var = to_dt(\"a\")", - "error": false - }, - { - "query": "row var = to_degrees(5)", - "error": false - }, - { - "query": "row to_degrees(5)", - "error": false - }, - { - "query": "row var = to_degrees(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = to_degrees(\"a\")", - "error": true - }, - { - "query": "row var = to_double(\"a\")", - "error": false - }, - { - "query": "row to_double(\"a\")", - "error": false - }, - { - "query": "row var = to_dbl(\"a\")", - "error": false - }, - { - "query": "row var = to_geopoint(\"a\")", - "error": false - }, - { - "query": "row to_geopoint(\"a\")", - "error": false - }, - { - "query": "row var = to_geoshape(\"a\")", - "error": false - }, - { - "query": "row to_geoshape(\"a\")", - "error": false - }, - { - "query": "row var = to_integer(\"a\")", - "error": false - }, - { - "query": "row to_integer(\"a\")", - "error": false - }, - { - "query": "row var = to_int(\"a\")", - "error": false - }, - { - "query": "row var = to_ip(\"a\")", - "error": false - }, - { - "query": "row to_ip(\"a\")", - "error": false - }, - { - "query": "row var = to_long(\"a\")", - "error": false - }, - { - "query": "row to_long(\"a\")", - "error": false - }, - { - "query": "row var = to_lower(\"a\")", - "error": false - }, - { - "query": "row to_lower(\"a\")", - "error": false - }, - { - "query": "row var = to_lower(to_string(\"a\"))", - "error": false - }, - { - "query": "row var = to_lower(5)", - "error": true - }, - { - "query": "row var = to_radians(5)", - "error": false - }, - { - "query": "row to_radians(5)", - "error": false - }, - { - "query": "row var = to_radians(to_integer(\"a\"))", - "error": false - }, - { - "query": "row var = to_radians(\"a\")", - "error": true - }, - { - "query": "row var = to_string(\"a\")", - "error": false - }, - { - "query": "row to_string(\"a\")", - "error": false - }, - { - "query": "row var = to_str(\"a\")", - "error": false - }, - { - "query": "row var = to_unsigned_long(\"a\")", - "error": false - }, - { - "query": "row to_unsigned_long(\"a\")", - "error": false - }, - { - "query": "row var = to_ul(\"a\")", - "error": false - }, - { - "query": "row var = to_ulong(\"a\")", - "error": false - }, - { - "query": "row var = to_upper(\"a\")", - "error": false - }, - { - "query": "row to_upper(\"a\")", - "error": false - }, - { - "query": "row var = to_upper(to_string(\"a\"))", - "error": false - }, - { - "query": "row var = to_upper(5)", - "error": true - }, - { - "query": "row var = to_version(\"a\")", - "error": false - }, - { - "query": "row to_version(\"a\")", - "error": false - }, - { - "query": "row var = to_ver(\"a\")", - "error": false - }, - { - "query": "row var = to_version(\"a\")", - "error": false - }, - { - "query": "row to_version(\"a\")", - "error": false - }, - { - "query": "row var = to_ver(\"a\")", - "error": false - }, - { - "query": "row var = trim(\"a\")", - "error": false - }, - { - "query": "row trim(\"a\")", - "error": false - }, - { - "query": "row var = trim(to_string(\"a\"))", - "error": false - }, - { - "query": "row var = trim(5)", - "error": true - }, - { - "query": "row var = 5 > 0", - "error": false - }, - { - "query": "row var = NOT 5 > 0", - "error": false - }, - { - "query": "row var = (numberField > 0)", - "error": true - }, - { - "query": "row var = (NOT (5 > 0))", - "error": false - }, - { - "query": "row var = \"a\" > 0", - "error": true - }, - { - "query": "row var = 5 >= 0", - "error": false - }, - { - "query": "row var = NOT 5 >= 0", - "error": false - }, - { - "query": "row var = (numberField >= 0)", - "error": true - }, - { - "query": "row var = (NOT (5 >= 0))", - "error": false - }, - { - "query": "row var = \"a\" >= 0", - "error": true - }, - { - "query": "row var = 5 < 0", - "error": false - }, - { - "query": "row var = NOT 5 < 0", - "error": false - }, - { - "query": "row var = (numberField < 0)", - "error": true - }, - { - "query": "row var = (NOT (5 < 0))", - "error": false - }, - { - "query": "row var = \"a\" < 0", - "error": true - }, - { - "query": "row var = 5 <= 0", - "error": false - }, - { - "query": "row var = NOT 5 <= 0", - "error": false - }, - { - "query": "row var = (numberField <= 0)", - "error": true - }, - { - "query": "row var = (NOT (5 <= 0))", - "error": false - }, - { - "query": "row var = \"a\" <= 0", - "error": true - }, - { - "query": "row var = 5 == 0", - "error": false - }, - { - "query": "row var = NOT 5 == 0", - "error": false - }, - { - "query": "row var = (numberField == 0)", - "error": true - }, - { - "query": "row var = (NOT (5 == 0))", - "error": false - }, - { - "query": "row var = \"a\" == 0", - "error": true - }, - { - "query": "row var = 1 + 1", - "error": false - }, - { - "query": "row var = (5 + 1)", - "error": false - }, - { - "query": "row var = 1 - 1", - "error": false - }, - { - "query": "row var = (5 - 1)", - "error": false - }, - { - "query": "row var = 1 * 1", - "error": false - }, - { - "query": "row var = (5 * 1)", - "error": false - }, - { - "query": "row var = 1 / 1", - "error": false - }, - { - "query": "row var = (5 / 1)", - "error": false - }, - { - "query": "row var = 1 % 1", - "error": false - }, - { - "query": "row var = (5 % 1)", - "error": false - }, - { - "query": "row var = \"a\" like \"?a\"", - "error": false - }, - { - "query": "row var = \"a\" NOT like \"?a\"", - "error": false - }, - { - "query": "row var = NOT \"a\" like \"?a\"", - "error": false - }, - { - "query": "row var = NOT \"a\" NOT like \"?a\"", - "error": false - }, - { - "query": "row var = 5 like \"?a\"", - "error": true - }, - { - "query": "row var = 5 NOT like \"?a\"", - "error": true - }, - { - "query": "row var = NOT 5 like \"?a\"", - "error": true - }, - { - "query": "row var = NOT 5 NOT like \"?a\"", - "error": true - }, - { - "query": "row var = \"a\" rlike \"?a\"", - "error": false - }, - { - "query": "row var = \"a\" NOT rlike \"?a\"", - "error": false - }, - { - "query": "row var = NOT \"a\" rlike \"?a\"", - "error": false - }, - { - "query": "row var = NOT \"a\" NOT rlike \"?a\"", - "error": false - }, - { - "query": "row var = 5 rlike \"?a\"", - "error": true - }, - { - "query": "row var = 5 NOT rlike \"?a\"", - "error": true - }, - { - "query": "row var = NOT 5 rlike \"?a\"", - "error": true - }, - { - "query": "row var = NOT 5 NOT rlike \"?a\"", - "error": true - }, - { - "query": "row 1 anno", - "error": true - }, - { - "query": "row var = 1 anno", - "error": true - }, - { - "query": "row now() + 1 anno", - "error": true - }, - { - "query": "row 1 year", - "error": true - }, - { - "query": "row 1 year", - "error": true - }, - { - "query": "row var = now() - 1 year", - "error": false - }, - { - "query": "row var = now() - 1 YEAR", - "error": false - }, - { - "query": "row var = now() - 1 Year", - "error": false - }, - { - "query": "row var = now() + 1 year", - "error": false - }, - { - "query": "row 1 year + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 year", - "error": true - }, - { - "query": "row var = now() / 1 year", - "error": true - }, - { - "query": "row var = now() % 1 year", - "error": true - }, - { - "query": "row 1 years", - "error": true - }, - { - "query": "row 1 years", - "error": true - }, - { - "query": "row var = now() - 1 years", - "error": false - }, - { - "query": "row var = now() - 1 YEARS", - "error": false - }, - { - "query": "row var = now() - 1 Years", - "error": false - }, - { - "query": "row var = now() + 1 years", - "error": false - }, - { - "query": "row 1 years + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 years", - "error": true - }, - { - "query": "row var = now() / 1 years", - "error": true - }, - { - "query": "row var = now() % 1 years", - "error": true - }, - { - "query": "row 1 month", - "error": true - }, - { - "query": "row 1 month", - "error": true - }, - { - "query": "row var = now() - 1 month", - "error": false - }, - { - "query": "row var = now() - 1 MONTH", - "error": false - }, - { - "query": "row var = now() - 1 Month", - "error": false - }, - { - "query": "row var = now() + 1 month", - "error": false - }, - { - "query": "row 1 month + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 month", - "error": true - }, - { - "query": "row var = now() / 1 month", - "error": true - }, - { - "query": "row var = now() % 1 month", - "error": true - }, - { - "query": "row 1 months", - "error": true - }, - { - "query": "row 1 months", - "error": true - }, - { - "query": "row var = now() - 1 months", - "error": false - }, - { - "query": "row var = now() - 1 MONTHS", - "error": false - }, - { - "query": "row var = now() - 1 Months", - "error": false - }, - { - "query": "row var = now() + 1 months", - "error": false - }, - { - "query": "row 1 months + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 months", - "error": true - }, - { - "query": "row var = now() / 1 months", - "error": true - }, - { - "query": "row var = now() % 1 months", - "error": true - }, - { - "query": "row 1 week", - "error": true - }, - { - "query": "row 1 week", - "error": true - }, - { - "query": "row var = now() - 1 week", - "error": false - }, - { - "query": "row var = now() - 1 WEEK", - "error": false - }, - { - "query": "row var = now() - 1 Week", - "error": false - }, - { - "query": "row var = now() + 1 week", - "error": false - }, - { - "query": "row 1 week + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 week", - "error": true - }, - { - "query": "row var = now() / 1 week", - "error": true - }, - { - "query": "row var = now() % 1 week", - "error": true - }, - { - "query": "row 1 weeks", - "error": true - }, - { - "query": "row 1 weeks", - "error": true - }, - { - "query": "row var = now() - 1 weeks", - "error": false - }, - { - "query": "row var = now() - 1 WEEKS", - "error": false - }, - { - "query": "row var = now() - 1 Weeks", - "error": false - }, - { - "query": "row var = now() + 1 weeks", - "error": false - }, - { - "query": "row 1 weeks + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 weeks", - "error": true - }, - { - "query": "row var = now() / 1 weeks", - "error": true - }, - { - "query": "row var = now() % 1 weeks", - "error": true - }, - { - "query": "row 1 day", - "error": true - }, - { - "query": "row 1 day", - "error": true - }, - { - "query": "row var = now() - 1 day", - "error": false - }, - { - "query": "row var = now() - 1 DAY", - "error": false - }, - { - "query": "row var = now() - 1 Day", - "error": false - }, - { - "query": "row var = now() + 1 day", - "error": false - }, - { - "query": "row 1 day + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 day", - "error": true - }, - { - "query": "row var = now() / 1 day", - "error": true - }, - { - "query": "row var = now() % 1 day", - "error": true - }, - { - "query": "row 1 days", - "error": true - }, - { - "query": "row 1 days", - "error": true - }, - { - "query": "row var = now() - 1 days", - "error": false - }, - { - "query": "row var = now() - 1 DAYS", - "error": false - }, - { - "query": "row var = now() - 1 Days", - "error": false - }, - { - "query": "row var = now() + 1 days", - "error": false - }, - { - "query": "row 1 days + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 days", - "error": true - }, - { - "query": "row var = now() / 1 days", - "error": true - }, - { - "query": "row var = now() % 1 days", - "error": true - }, - { - "query": "row 1 hour", - "error": true - }, - { - "query": "row 1 hour", - "error": true - }, - { - "query": "row var = now() - 1 hour", - "error": false - }, - { - "query": "row var = now() - 1 HOUR", - "error": false - }, - { - "query": "row var = now() - 1 Hour", - "error": false - }, - { - "query": "row var = now() + 1 hour", - "error": false - }, - { - "query": "row 1 hour + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 hour", - "error": true - }, - { - "query": "row var = now() / 1 hour", - "error": true - }, - { - "query": "row var = now() % 1 hour", - "error": true - }, - { - "query": "row 1 hours", - "error": true - }, - { - "query": "row 1 hours", - "error": true - }, - { - "query": "row var = now() - 1 hours", - "error": false - }, - { - "query": "row var = now() - 1 HOURS", - "error": false - }, - { - "query": "row var = now() - 1 Hours", - "error": false - }, - { - "query": "row var = now() + 1 hours", - "error": false - }, - { - "query": "row 1 hours + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 hours", - "error": true - }, - { - "query": "row var = now() / 1 hours", - "error": true - }, - { - "query": "row var = now() % 1 hours", - "error": true - }, - { - "query": "row 1 minute", - "error": true - }, - { - "query": "row 1 minute", - "error": true - }, - { - "query": "row var = now() - 1 minute", - "error": false - }, - { - "query": "row var = now() - 1 MINUTE", - "error": false - }, - { - "query": "row var = now() - 1 Minute", - "error": false - }, - { - "query": "row var = now() + 1 minute", - "error": false - }, - { - "query": "row 1 minute + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 minute", - "error": true - }, - { - "query": "row var = now() / 1 minute", - "error": true - }, - { - "query": "row var = now() % 1 minute", - "error": true - }, - { - "query": "row 1 minutes", - "error": true - }, - { - "query": "row 1 minutes", - "error": true - }, - { - "query": "row var = now() - 1 minutes", - "error": false - }, - { - "query": "row var = now() - 1 MINUTES", - "error": false - }, - { - "query": "row var = now() - 1 Minutes", - "error": false - }, - { - "query": "row var = now() + 1 minutes", - "error": false - }, - { - "query": "row 1 minutes + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 minutes", - "error": true - }, - { - "query": "row var = now() / 1 minutes", - "error": true - }, - { - "query": "row var = now() % 1 minutes", - "error": true - }, - { - "query": "row 1 second", - "error": true - }, - { - "query": "row 1 second", - "error": true - }, - { - "query": "row var = now() - 1 second", - "error": false - }, - { - "query": "row var = now() - 1 SECOND", - "error": false - }, - { - "query": "row var = now() - 1 Second", - "error": false - }, - { - "query": "row var = now() + 1 second", - "error": false - }, - { - "query": "row 1 second + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 second", - "error": true - }, - { - "query": "row var = now() / 1 second", - "error": true - }, - { - "query": "row var = now() % 1 second", - "error": true - }, - { - "query": "row 1 seconds", - "error": true - }, - { - "query": "row 1 seconds", - "error": true - }, - { - "query": "row var = now() - 1 seconds", - "error": false - }, - { - "query": "row var = now() - 1 SECONDS", - "error": false - }, - { - "query": "row var = now() - 1 Seconds", - "error": false - }, - { - "query": "row var = now() + 1 seconds", - "error": false - }, - { - "query": "row 1 seconds + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 seconds", - "error": true - }, - { - "query": "row var = now() / 1 seconds", - "error": true - }, - { - "query": "row var = now() % 1 seconds", - "error": true - }, - { - "query": "row 1 millisecond", - "error": true - }, - { - "query": "row 1 millisecond", - "error": true - }, - { - "query": "row var = now() - 1 millisecond", - "error": false - }, - { - "query": "row var = now() - 1 MILLISECOND", - "error": false - }, - { - "query": "row var = now() - 1 Millisecond", - "error": false - }, - { - "query": "row var = now() + 1 millisecond", - "error": false - }, - { - "query": "row 1 millisecond + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 millisecond", - "error": true - }, - { - "query": "row var = now() / 1 millisecond", - "error": true - }, - { - "query": "row var = now() % 1 millisecond", - "error": true - }, - { - "query": "row 1 milliseconds", - "error": true - }, - { - "query": "row 1 milliseconds", - "error": true - }, - { - "query": "row var = now() - 1 milliseconds", - "error": false - }, - { - "query": "row var = now() - 1 MILLISECONDS", - "error": false - }, - { - "query": "row var = now() - 1 Milliseconds", - "error": false - }, - { - "query": "row var = now() + 1 milliseconds", - "error": false - }, - { - "query": "row 1 milliseconds + 1 year", - "error": true - }, - { - "query": "row var = now() * 1 milliseconds", - "error": true - }, - { - "query": "row var = now() / 1 milliseconds", - "error": true - }, - { - "query": "row var = now() % 1 milliseconds", - "error": true - }, - { - "query": "meta", - "error": true - }, - { - "query": "meta functions", - "error": false - }, - { - "query": "meta functions()", - "error": true - }, - { - "query": "meta functions blah", - "error": true - }, - { - "query": "meta info", - "error": true - }, - { - "query": "show", - "error": true - }, - { - "query": "show functions", - "error": true - }, - { - "query": "show info", - "error": false - }, - { - "query": "show numberField", - "error": true - }, - { - "query": "from index | limit ", - "error": true - }, - { - "query": "from index | limit 4 ", - "error": false - }, - { - "query": "from index | limit 4.5", - "error": true - }, - { - "query": "from index | limit a", - "error": true - }, - { - "query": "from index | limit numberField", - "error": true - }, - { - "query": "from index | limit stringField", - "error": true - }, - { - "query": "from index | limit 4", - "error": false - }, - { - "query": "from index | keep ", - "error": true - }, - { - "query": "from index | keep stringField, numberField, dateField", - "error": false - }, - { - "query": "from index | keep `stringField`, `numberField`, `dateField`", - "error": false - }, - { - "query": "from index | keep 4.5", - "error": true - }, - { - "query": "from index | keep `4.5`", - "error": true - }, - { - "query": "from index | keep missingField, numberField, dateField", - "error": true - }, - { - "query": "from index | keep `any#Char$Field`", - "error": false - }, - { - "query": "from index | project ", - "error": true - }, - { - "query": "from index | project stringField, numberField, dateField", - "error": true - }, - { - "query": "from index | PROJECT stringField, numberField, dateField", - "error": true - }, - { - "query": "from index | project missingField, numberField, dateField", - "error": true - }, - { - "query": "from index | keep s*", - "error": false - }, - { - "query": "from index | keep *Field", - "error": false - }, - { - "query": "from index | keep s*Field", - "error": false - }, - { - "query": "from index | keep string*Field", - "error": false - }, - { - "query": "from index | keep s*, n*", - "error": false - }, - { - "query": "from index | keep m*", - "error": true - }, - { - "query": "from index | keep *m", - "error": true - }, - { - "query": "from index | keep d*m", - "error": true - }, - { - "query": "from unsupported_index | keep unsupported_field", - "error": false - }, - { - "query": "FROM index | STATS ROUND(AVG(numberField * 1.5)), COUNT(*), MIN(numberField * 10) | KEEP `MIN(numberField * 10)`", - "error": false - }, - { - "query": "FROM index | STATS COUNT(*), MIN(numberField * 10), MAX(numberField)| KEEP `COUNT(*)`", - "error": false - }, - { - "query": "from index | drop ", - "error": true - }, - { - "query": "from index | drop stringField, numberField, dateField", - "error": false - }, - { - "query": "from index | drop 4.5", - "error": true - }, - { - "query": "from index | drop missingField, numberField, dateField", - "error": true - }, - { - "query": "from index | drop `any#Char$Field`", - "error": false - }, - { - "query": "from index | drop s*", - "error": false - }, - { - "query": "from index | drop s**Field", - "error": false - }, - { - "query": "from index | drop *Field*", - "error": false - }, - { - "query": "from index | drop s*F*d", - "error": false - }, - { - "query": "from index | drop *Field", - "error": false - }, - { - "query": "from index | drop s*Field", - "error": false - }, - { - "query": "from index | drop string*Field", - "error": false - }, - { - "query": "from index | drop s*, n*", - "error": false - }, - { - "query": "from index | drop m*", - "error": true - }, - { - "query": "from index | drop *m", - "error": true - }, - { - "query": "from index | drop d*m", - "error": true - }, - { - "query": "from index | drop *", - "error": true - }, - { - "query": "from index | drop stringField, *", - "error": true - }, - { - "query": "from index | drop @timestamp", - "error": false - }, - { - "query": "from index | drop stringField, @timestamp", - "error": false - }, - { - "query": "FROM index | STATS ROUND(AVG(numberField * 1.5)), COUNT(*), MIN(numberField * 10) | DROP `MIN(numberField * 10)`", - "error": false - }, - { - "query": "FROM index | STATS COUNT(*), MIN(numberField * 10), MAX(numberField)| DROP `COUNT(*)`", - "error": false - }, - { - "query": "from a_index | mv_expand ", - "error": true - }, - { - "query": "from a_index | mv_expand stringField", - "error": false - }, - { - "query": "from a_index | mv_expand numberField", - "error": false - }, - { - "query": "from a_index | mv_expand dateField", - "error": false - }, - { - "query": "from a_index | mv_expand booleanField", - "error": false - }, - { - "query": "from a_index | mv_expand ipField", - "error": false - }, - { - "query": "from a_index | mv_expand numberField, b", - "error": true - }, - { - "query": "row a = \"a\" | mv_expand a", - "error": false - }, - { - "query": "row a = [1, 2, 3] | mv_expand a", - "error": false - }, - { - "query": "row a = [true, false] | mv_expand a", - "error": false - }, - { - "query": "row a = [\"a\", \"b\"] | mv_expand a", - "error": false - }, - { - "query": "from a_index | rename", - "error": true - }, - { - "query": "from a_index | rename stringField", - "error": true - }, - { - "query": "from a_index | rename a", - "error": true - }, - { - "query": "from a_index | rename stringField as", - "error": true - }, - { - "query": "from a_index | rename missingField as", - "error": true - }, - { - "query": "from a_index | rename stringField as b", - "error": false - }, - { - "query": "from a_index | rename stringField AS b", - "error": false - }, - { - "query": "from a_index | rename stringField As b", - "error": false - }, - { - "query": "from a_index | rename stringField As b, b AS c", - "error": false - }, - { - "query": "from a_index | rename fn() as a", - "error": true - }, - { - "query": "from a_index | eval numberField + 1 | rename `numberField + 1` as a", - "error": false - }, - { - "query": "from a_index | stats avg(numberField) | rename `avg(numberField)` as avg0", - "error": false - }, - { - "query": "from a_index |eval numberField + 1 | rename `numberField + 1` as ", - "error": true - }, - { - "query": "from a_index | rename s* as strings", - "error": true - }, - { - "query": "row a = 10 | rename a as `this``is fine`", - "error": false - }, - { - "query": "row a = 10 | rename a as this is fine", - "error": true - }, - { - "query": "from a_index | dissect", - "error": true - }, - { - "query": "from a_index | dissect stringField", - "error": true - }, - { - "query": "from a_index | dissect stringField 2", - "error": true - }, - { - "query": "from a_index | dissect stringField .", - "error": true - }, - { - "query": "from a_index | dissect stringField %a", - "error": true - }, - { - "query": "from a_index | dissect stringField \"%{firstWord}\"", - "error": false - }, - { - "query": "from a_index | dissect numberField \"%{firstWord}\"", - "error": true - }, - { - "query": "from a_index | dissect stringField \"%{firstWord}\" option ", - "error": true - }, - { - "query": "from a_index | dissect stringField \"%{firstWord}\" option = ", - "error": true - }, - { - "query": "from a_index | dissect stringField \"%{firstWord}\" option = 1", - "error": true - }, - { - "query": "from a_index | dissect stringField \"%{firstWord}\" append_separator = \"-\"", - "error": false - }, - { - "query": "from a_index | dissect stringField \"%{firstWord}\" ignore_missing = true", - "error": true - }, - { - "query": "from a_index | dissect stringField \"%{firstWord}\" append_separator = true", - "error": true - }, - { - "query": "from a_index | dissect stringField \"%{firstWord}\" | keep firstWord", - "error": false - }, - { - "query": "from a_index | grok", - "error": true - }, - { - "query": "from a_index | grok stringField", - "error": true - }, - { - "query": "from a_index | grok stringField 2", - "error": true - }, - { - "query": "from a_index | grok stringField .", - "error": true - }, - { - "query": "from a_index | grok stringField %a", - "error": true - }, - { - "query": "from a_index | grok stringField \"%{firstWord}\"", - "error": false - }, - { - "query": "from a_index | grok numberField \"%{firstWord}\"", - "error": true - }, - { - "query": "from a_index | grok stringField \"%{firstWord}\" | keep firstWord", - "error": false - }, - { - "query": "from a_index | where b", - "error": true - }, - { - "query": "from a_index | where true", - "error": false - }, - { - "query": "from a_index | where NOT true", - "error": false - }, - { - "query": "from a_index | where false", - "error": false - }, - { - "query": "from a_index | where NOT false", - "error": false - }, - { - "query": "from a_index | where 1 > 0", - "error": false - }, - { - "query": "from a_index | where NOT 1 > 0", - "error": false - }, - { - "query": "from a_index | where +1 > 0", - "error": false - }, - { - "query": "from a_index | where NOT +1 > 0", - "error": false - }, - { - "query": "from a_index | where 1 * 1 > 0", - "error": false - }, - { - "query": "from a_index | where NOT 1 * 1 > 0", - "error": false - }, - { - "query": "from a_index | where -1 > 0", - "error": false - }, - { - "query": "from a_index | where NOT -1 > 0", - "error": false - }, - { - "query": "from a_index | where 1 / 1 > 0", - "error": false - }, - { - "query": "from a_index | where NOT 1 / 1 > 0", - "error": false - }, - { - "query": "from a_index | where 1.0 > 0", - "error": false - }, - { - "query": "from a_index | where NOT 1.0 > 0", - "error": false - }, - { - "query": "from a_index | where 1.5 > 0", - "error": false - }, - { - "query": "from a_index | where NOT 1.5 > 0", - "error": false - }, - { - "query": "from a_index | where numberField > 0", - "error": false - }, - { - "query": "from a_index | where NOT numberField > 0", - "error": false - }, - { - "query": "from a_index | where (numberField > 0)", - "error": false - }, - { - "query": "from a_index | where (NOT (numberField > 0))", - "error": false - }, - { - "query": "from a_index | where 1 > 0", - "error": false - }, - { - "query": "from a_index | eval stringField > 0", - "error": true - }, - { - "query": "from a_index | where numberField >= 0", - "error": false - }, - { - "query": "from a_index | where NOT numberField >= 0", - "error": false - }, - { - "query": "from a_index | where (numberField >= 0)", - "error": false - }, - { - "query": "from a_index | where (NOT (numberField >= 0))", - "error": false - }, - { - "query": "from a_index | where 1 >= 0", - "error": false - }, - { - "query": "from a_index | eval stringField >= 0", - "error": true - }, - { - "query": "from a_index | where numberField < 0", - "error": false - }, - { - "query": "from a_index | where NOT numberField < 0", - "error": false - }, - { - "query": "from a_index | where (numberField < 0)", - "error": false - }, - { - "query": "from a_index | where (NOT (numberField < 0))", - "error": false - }, - { - "query": "from a_index | where 1 < 0", - "error": false - }, - { - "query": "from a_index | eval stringField < 0", - "error": true - }, - { - "query": "from a_index | where numberField <= 0", - "error": false - }, - { - "query": "from a_index | where NOT numberField <= 0", - "error": false - }, - { - "query": "from a_index | where (numberField <= 0)", - "error": false - }, - { - "query": "from a_index | where (NOT (numberField <= 0))", - "error": false - }, - { - "query": "from a_index | where 1 <= 0", - "error": false - }, - { - "query": "from a_index | eval stringField <= 0", - "error": true - }, - { - "query": "from a_index | where numberField == 0", - "error": false - }, - { - "query": "from a_index | where NOT numberField == 0", - "error": false - }, - { - "query": "from a_index | where (numberField == 0)", - "error": false - }, - { - "query": "from a_index | where (NOT (numberField == 0))", - "error": false - }, - { - "query": "from a_index | where 1 == 0", - "error": false - }, - { - "query": "from a_index | eval stringField == 0", - "error": true - }, - { - "query": "from a_index | where - numberField > 0", - "error": false - }, - { - "query": "from a_index | where - round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + - numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 - numberField > 0", - "error": false - }, - { - "query": "from a_index | where - numberField > 0", - "error": false - }, - { - "query": "from a_index | where - round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + - numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 - numberField > 0", - "error": false - }, - { - "query": "from a_index | where + numberField > 0", - "error": false - }, - { - "query": "from a_index | where + round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + + numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 + numberField > 0", - "error": false - }, - { - "query": "from a_index | where + numberField > 0", - "error": false - }, - { - "query": "from a_index | where + round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + + numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 + numberField > 0", - "error": false - }, - { - "query": "from a_index | where not booleanField", - "error": false - }, - { - "query": "from a_index | where -- numberField > 0", - "error": false - }, - { - "query": "from a_index | where -- round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + -- numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 -- numberField > 0", - "error": false - }, - { - "query": "from a_index | where -+ numberField > 0", - "error": false - }, - { - "query": "from a_index | where -+ round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + -+ numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 -+ numberField > 0", - "error": false - }, - { - "query": "from a_index | where +- numberField > 0", - "error": false - }, - { - "query": "from a_index | where +- round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + +- numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 +- numberField > 0", - "error": false - }, - { - "query": "from a_index | where ++ numberField > 0", - "error": false - }, - { - "query": "from a_index | where ++ round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + ++ numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 ++ numberField > 0", - "error": false - }, - { - "query": "from a_index | where not not booleanField", - "error": false - }, - { - "query": "from a_index | where --- numberField > 0", - "error": false - }, - { - "query": "from a_index | where --- round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + --- numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 --- numberField > 0", - "error": false - }, - { - "query": "from a_index | where -+- numberField > 0", - "error": false - }, - { - "query": "from a_index | where -+- round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + -+- numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 -+- numberField > 0", - "error": false - }, - { - "query": "from a_index | where +-+ numberField > 0", - "error": false - }, - { - "query": "from a_index | where +-+ round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + +-+ numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 +-+ numberField > 0", - "error": false - }, - { - "query": "from a_index | where +++ numberField > 0", - "error": false - }, - { - "query": "from a_index | where +++ round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + +++ numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 +++ numberField > 0", - "error": false - }, - { - "query": "from a_index | where not not not booleanField", - "error": false - }, - { - "query": "from a_index | where ---- numberField > 0", - "error": false - }, - { - "query": "from a_index | where ---- round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + ---- numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 ---- numberField > 0", - "error": false - }, - { - "query": "from a_index | where -+-+ numberField > 0", - "error": false - }, - { - "query": "from a_index | where -+-+ round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + -+-+ numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 -+-+ numberField > 0", - "error": false - }, - { - "query": "from a_index | where +-+- numberField > 0", - "error": false - }, - { - "query": "from a_index | where +-+- round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + +-+- numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 +-+- numberField > 0", - "error": false - }, - { - "query": "from a_index | where ++++ numberField > 0", - "error": false - }, - { - "query": "from a_index | where ++++ round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where 1 + ++++ numberField > 0", - "error": false - }, - { - "query": "from a_index | where 1 ++++ numberField > 0", - "error": false - }, - { - "query": "from a_index | where not not not not booleanField", - "error": false - }, - { - "query": "from a_index | where *+ numberField", - "error": true - }, - { - "query": "from a_index | where /+ numberField", - "error": true - }, - { - "query": "from a_index | where %+ numberField", - "error": true - }, - { - "query": "from a_index | where numberField =~ 0", - "error": true - }, - { - "query": "from a_index | where NOT numberField =~ 0", - "error": true - }, - { - "query": "from a_index | where (numberField =~ 0)", - "error": true - }, - { - "query": "from a_index | where (NOT (numberField =~ 0))", - "error": true - }, - { - "query": "from a_index | where 1 =~ 0", - "error": true - }, - { - "query": "from a_index | eval stringField =~ 0", - "error": true - }, - { - "query": "from a_index | where stringField like \"?a\"", - "error": false - }, - { - "query": "from a_index | where stringField NOT like \"?a\"", - "error": false - }, - { - "query": "from a_index | where NOT stringField like \"?a\"", - "error": false - }, - { - "query": "from a_index | where NOT stringField NOT like \"?a\"", - "error": false - }, - { - "query": "from a_index | where numberField like \"?a\"", - "error": true - }, - { - "query": "from a_index | where numberField NOT like \"?a\"", - "error": true - }, - { - "query": "from a_index | where NOT numberField like \"?a\"", - "error": true - }, - { - "query": "from a_index | where NOT numberField NOT like \"?a\"", - "error": true - }, - { - "query": "from a_index | where stringField rlike \"?a\"", - "error": false - }, - { - "query": "from a_index | where stringField NOT rlike \"?a\"", - "error": false - }, - { - "query": "from a_index | where NOT stringField rlike \"?a\"", - "error": false - }, - { - "query": "from a_index | where NOT stringField NOT rlike \"?a\"", - "error": false - }, - { - "query": "from a_index | where numberField rlike \"?a\"", - "error": true - }, - { - "query": "from a_index | where numberField NOT rlike \"?a\"", - "error": true - }, - { - "query": "from a_index | where NOT numberField rlike \"?a\"", - "error": true - }, - { - "query": "from a_index | where NOT numberField NOT rlike \"?a\"", - "error": true - }, - { - "query": "from a_index | where cidr_match(ipField)", - "error": true - }, - { - "query": "from a_index | eval cidr = \"172.0.0.1/30\" | where cidr_match(ipField, \"172.0.0.1/30\", cidr)", - "error": false - }, - { - "query": "from a_index | where numberField IS NULL", - "error": false - }, - { - "query": "from a_index | where numberField IS null", - "error": false - }, - { - "query": "from a_index | where numberField is null", - "error": false - }, - { - "query": "from a_index | where numberField is NULL", - "error": false - }, - { - "query": "from a_index | where numberField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | where numberField IS NOT null", - "error": false - }, - { - "query": "from a_index | where numberField IS not NULL", - "error": false - }, - { - "query": "from a_index | where numberField Is nOt NuLL", - "error": false - }, - { - "query": "from a_index | where dateField IS NULL", - "error": false - }, - { - "query": "from a_index | where dateField IS null", - "error": false - }, - { - "query": "from a_index | where dateField is null", - "error": false - }, - { - "query": "from a_index | where dateField is NULL", - "error": false - }, - { - "query": "from a_index | where dateField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | where dateField IS NOT null", - "error": false - }, - { - "query": "from a_index | where dateField IS not NULL", - "error": false - }, - { - "query": "from a_index | where dateField Is nOt NuLL", - "error": false - }, - { - "query": "from a_index | where booleanField IS NULL", - "error": false - }, - { - "query": "from a_index | where booleanField IS null", - "error": false - }, - { - "query": "from a_index | where booleanField is null", - "error": false - }, - { - "query": "from a_index | where booleanField is NULL", - "error": false - }, - { - "query": "from a_index | where booleanField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | where booleanField IS NOT null", - "error": false - }, - { - "query": "from a_index | where booleanField IS not NULL", - "error": false - }, - { - "query": "from a_index | where booleanField Is nOt NuLL", - "error": false - }, - { - "query": "from a_index | where ipField IS NULL", - "error": false - }, - { - "query": "from a_index | where ipField IS null", - "error": false - }, - { - "query": "from a_index | where ipField is null", - "error": false - }, - { - "query": "from a_index | where ipField is NULL", - "error": false - }, - { - "query": "from a_index | where ipField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | where ipField IS NOT null", - "error": false - }, - { - "query": "from a_index | where ipField IS not NULL", - "error": false - }, - { - "query": "from a_index | where ipField Is nOt NuLL", - "error": false - }, - { - "query": "from a_index | where stringField IS NULL", - "error": false - }, - { - "query": "from a_index | where stringField IS null", - "error": false - }, - { - "query": "from a_index | where stringField is null", - "error": false - }, - { - "query": "from a_index | where stringField is NULL", - "error": false - }, - { - "query": "from a_index | where stringField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | where stringField IS NOT null", - "error": false - }, - { - "query": "from a_index | where stringField IS not NULL", - "error": false - }, - { - "query": "from a_index | where stringField Is nOt NuLL", - "error": false - }, - { - "query": "from a_index | where cartesianPointField IS NULL", - "error": false - }, - { - "query": "from a_index | where cartesianPointField IS null", - "error": false - }, - { - "query": "from a_index | where cartesianPointField is null", - "error": false - }, - { - "query": "from a_index | where cartesianPointField is NULL", - "error": false - }, - { - "query": "from a_index | where cartesianPointField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | where cartesianPointField IS NOT null", - "error": false - }, - { - "query": "from a_index | where cartesianPointField IS not NULL", - "error": false - }, - { - "query": "from a_index | where cartesianPointField Is nOt NuLL", - "error": false - }, - { - "query": "from a_index | where geoPointField IS NULL", - "error": false - }, - { - "query": "from a_index | where geoPointField IS null", - "error": false - }, - { - "query": "from a_index | where geoPointField is null", - "error": false - }, - { - "query": "from a_index | where geoPointField is NULL", - "error": false - }, - { - "query": "from a_index | where geoPointField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | where geoPointField IS NOT null", - "error": false - }, - { - "query": "from a_index | where geoPointField IS not NULL", - "error": false - }, - { - "query": "from a_index | where geoPointField Is nOt NuLL", - "error": false - }, - { - "query": "from a_index | where avg(numberField)", - "error": true - }, - { - "query": "from a_index | where avg(numberField) > 0", - "error": true - }, - { - "query": "from a_index | where max(numberField)", - "error": true - }, - { - "query": "from a_index | where max(numberField) > 0", - "error": true - }, - { - "query": "from a_index | where min(numberField)", - "error": true - }, - { - "query": "from a_index | where min(numberField) > 0", - "error": true - }, - { - "query": "from a_index | where sum(numberField)", - "error": true - }, - { - "query": "from a_index | where sum(numberField) > 0", - "error": true - }, - { - "query": "from a_index | where median(numberField)", - "error": true - }, - { - "query": "from a_index | where median(numberField) > 0", - "error": true - }, - { - "query": "from a_index | where median_absolute_deviation(numberField)", - "error": true - }, - { - "query": "from a_index | where median_absolute_deviation(numberField) > 0", - "error": true - }, - { - "query": "from a_index | where percentile(numberField, 5)", - "error": true - }, - { - "query": "from a_index | where percentile(numberField, 5) > 0", - "error": true - }, - { - "query": "from a_index | where count(stringField)", - "error": true - }, - { - "query": "from a_index | where count(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where count_distinct(stringField, numberField)", - "error": true - }, - { - "query": "from a_index | where count_distinct(stringField, numberField) > 0", - "error": true - }, - { - "query": "from a_index | where abs(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where abs(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where acos(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where acos(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where asin(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where asin(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where atan(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where atan(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where atan2(numberField, numberField) > 0", - "error": false - }, - { - "query": "from a_index | where atan2(stringField, stringField) > 0", - "error": true - }, - { - "query": "from a_index | where ceil(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where ceil(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(concat(stringField, stringField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(concat(numberField, numberField)) > 0", - "error": true - }, - { - "query": "from a_index | where cos(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where cos(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where cosh(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where cosh(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where e() > 0", - "error": false - }, - { - "query": "from a_index | where e() > 0", - "error": false - }, - { - "query": "from a_index | where floor(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where floor(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(left(stringField, numberField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(left(numberField, stringField)) > 0", - "error": true - }, - { - "query": "from a_index | where length(stringField) > 0", - "error": false - }, - { - "query": "from a_index | where length(numberField) > 0", - "error": true - }, - { - "query": "from a_index | where log(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where log(stringField, stringField) > 0", - "error": true - }, - { - "query": "from a_index | where log10(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where log10(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(ltrim(stringField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(ltrim(numberField)) > 0", - "error": true - }, - { - "query": "from a_index | where mv_avg(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where mv_avg(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(mv_concat(stringField, stringField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(mv_concat(numberField, numberField)) > 0", - "error": true - }, - { - "query": "from a_index | where mv_median(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where mv_median(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where mv_sum(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where mv_sum(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where pi() > 0", - "error": false - }, - { - "query": "from a_index | where pi() > 0", - "error": false - }, - { - "query": "from a_index | where pow(numberField, numberField) > 0", - "error": false - }, - { - "query": "from a_index | where pow(stringField, stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(replace(stringField, stringField, stringField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(replace(numberField, numberField, numberField)) > 0", - "error": true - }, - { - "query": "from a_index | where length(right(stringField, numberField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(right(numberField, stringField)) > 0", - "error": true - }, - { - "query": "from a_index | where round(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where round(stringField, stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(rtrim(stringField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(rtrim(numberField)) > 0", - "error": true - }, - { - "query": "from a_index | where sin(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where sin(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where sinh(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where sinh(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(split(stringField, stringField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(split(numberField, numberField)) > 0", - "error": true - }, - { - "query": "from a_index | where sqrt(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where sqrt(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(substring(stringField, numberField, numberField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(substring(numberField, stringField, stringField)) > 0", - "error": true - }, - { - "query": "from a_index | where tan(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where tan(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where tanh(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where tanh(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where tau() > 0", - "error": false - }, - { - "query": "from a_index | where tau() > 0", - "error": false - }, - { - "query": "from a_index | where to_degrees(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where to_degrees(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(to_lower(stringField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(to_lower(numberField)) > 0", - "error": true - }, - { - "query": "from a_index | where to_radians(numberField) > 0", - "error": false - }, - { - "query": "from a_index | where to_radians(stringField) > 0", - "error": true - }, - { - "query": "from a_index | where length(to_upper(stringField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(to_upper(numberField)) > 0", - "error": true - }, - { - "query": "from a_index | where length(trim(stringField)) > 0", - "error": false - }, - { - "query": "from a_index | where length(trim(numberField)) > 0", - "error": true - }, - { - "query": "from a_index | eval ", - "error": true - }, - { - "query": "from a_index | eval stringField ", - "error": false - }, - { - "query": "from a_index | eval b = stringField", - "error": false - }, - { - "query": "from a_index | eval numberField + 1", - "error": false - }, - { - "query": "from a_index | eval numberField + ", - "error": true - }, - { - "query": "from a_index | eval stringField + 1", - "error": true - }, - { - "query": "from a_index | eval a=b", - "error": true - }, - { - "query": "from a_index | eval a=b, ", - "error": true - }, - { - "query": "from a_index | eval a=round", - "error": true - }, - { - "query": "from a_index | eval a=round(", - "error": true - }, - { - "query": "from a_index | eval a=round(numberField) ", - "error": false - }, - { - "query": "from a_index | eval a=round(numberField), ", - "error": true - }, - { - "query": "from a_index | eval a=round(numberField) + round(numberField) ", - "error": false - }, - { - "query": "from a_index | eval a=round(numberField) + round(stringField) ", - "error": true - }, - { - "query": "from a_index | eval a=round(numberField) + round(stringField), numberField ", - "error": true - }, - { - "query": "from a_index | eval a=round(numberField) + round(numberField), numberField ", - "error": false - }, - { - "query": "from a_index | eval a=round(numberField) + round(numberField), b = numberField ", - "error": false - }, - { - "query": "from a_index | eval a=[1, 2, 3]", - "error": false - }, - { - "query": "from a_index | eval a=[true, false]", - "error": false - }, - { - "query": "from a_index | eval a=[\"a\", \"b\"]", - "error": false - }, - { - "query": "from a_index | eval a=null", - "error": false - }, - { - "query": "from a_index | eval numberField IS NULL", - "error": false - }, - { - "query": "from a_index | eval numberField IS null", - "error": false - }, - { - "query": "from a_index | eval numberField is null", - "error": false - }, - { - "query": "from a_index | eval numberField is NULL", - "error": false - }, - { - "query": "from a_index | eval numberField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | eval numberField IS NOT null", - "error": false - }, - { - "query": "from a_index | eval numberField IS not NULL", - "error": false - }, - { - "query": "from a_index | eval dateField IS NULL", - "error": false - }, - { - "query": "from a_index | eval dateField IS null", - "error": false - }, - { - "query": "from a_index | eval dateField is null", - "error": false - }, - { - "query": "from a_index | eval dateField is NULL", - "error": false - }, - { - "query": "from a_index | eval dateField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | eval dateField IS NOT null", - "error": false - }, - { - "query": "from a_index | eval dateField IS not NULL", - "error": false - }, - { - "query": "from a_index | eval booleanField IS NULL", - "error": false - }, - { - "query": "from a_index | eval booleanField IS null", - "error": false - }, - { - "query": "from a_index | eval booleanField is null", - "error": false - }, - { - "query": "from a_index | eval booleanField is NULL", - "error": false - }, - { - "query": "from a_index | eval booleanField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | eval booleanField IS NOT null", - "error": false - }, - { - "query": "from a_index | eval booleanField IS not NULL", - "error": false - }, - { - "query": "from a_index | eval ipField IS NULL", - "error": false - }, - { - "query": "from a_index | eval ipField IS null", - "error": false - }, - { - "query": "from a_index | eval ipField is null", - "error": false - }, - { - "query": "from a_index | eval ipField is NULL", - "error": false - }, - { - "query": "from a_index | eval ipField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | eval ipField IS NOT null", - "error": false - }, - { - "query": "from a_index | eval ipField IS not NULL", - "error": false - }, - { - "query": "from a_index | eval stringField IS NULL", - "error": false - }, - { - "query": "from a_index | eval stringField IS null", - "error": false - }, - { - "query": "from a_index | eval stringField is null", - "error": false - }, - { - "query": "from a_index | eval stringField is NULL", - "error": false - }, - { - "query": "from a_index | eval stringField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | eval stringField IS NOT null", - "error": false - }, - { - "query": "from a_index | eval stringField IS not NULL", - "error": false - }, - { - "query": "from a_index | eval cartesianPointField IS NULL", - "error": false - }, - { - "query": "from a_index | eval cartesianPointField IS null", - "error": false - }, - { - "query": "from a_index | eval cartesianPointField is null", - "error": false - }, - { - "query": "from a_index | eval cartesianPointField is NULL", - "error": false - }, - { - "query": "from a_index | eval cartesianPointField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | eval cartesianPointField IS NOT null", - "error": false - }, - { - "query": "from a_index | eval cartesianPointField IS not NULL", - "error": false - }, - { - "query": "from a_index | eval geoPointField IS NULL", - "error": false - }, - { - "query": "from a_index | eval geoPointField IS null", - "error": false - }, - { - "query": "from a_index | eval geoPointField is null", - "error": false - }, - { - "query": "from a_index | eval geoPointField is NULL", - "error": false - }, - { - "query": "from a_index | eval geoPointField IS NOT NULL", - "error": false - }, - { - "query": "from a_index | eval geoPointField IS NOT null", - "error": false - }, - { - "query": "from a_index | eval geoPointField IS not NULL", - "error": false - }, - { - "query": "from a_index | eval - numberField", - "error": false - }, - { - "query": "from a_index | eval a=- numberField", - "error": false - }, - { - "query": "from a_index | eval a=- round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + - numberField", - "error": false - }, - { - "query": "from a_index | eval 1 - numberField", - "error": false - }, - { - "query": "from a_index | eval - numberField", - "error": false - }, - { - "query": "from a_index | eval a=- numberField", - "error": false - }, - { - "query": "from a_index | eval a=- round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + - numberField", - "error": false - }, - { - "query": "from a_index | eval 1 - numberField", - "error": false - }, - { - "query": "from a_index | eval + numberField", - "error": false - }, - { - "query": "from a_index | eval a=+ numberField", - "error": false - }, - { - "query": "from a_index | eval a=+ round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + + numberField", - "error": false - }, - { - "query": "from a_index | eval 1 + numberField", - "error": false - }, - { - "query": "from a_index | eval + numberField", - "error": false - }, - { - "query": "from a_index | eval a=+ numberField", - "error": false - }, - { - "query": "from a_index | eval a=+ round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + + numberField", - "error": false - }, - { - "query": "from a_index | eval 1 + numberField", - "error": false - }, - { - "query": "from a_index | eval not booleanField", - "error": false - }, - { - "query": "from a_index | eval -- numberField", - "error": false - }, - { - "query": "from a_index | eval a=-- numberField", - "error": false - }, - { - "query": "from a_index | eval a=-- round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + -- numberField", - "error": false - }, - { - "query": "from a_index | eval 1 -- numberField", - "error": false - }, - { - "query": "from a_index | eval -+ numberField", - "error": false - }, - { - "query": "from a_index | eval a=-+ numberField", - "error": false - }, - { - "query": "from a_index | eval a=-+ round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + -+ numberField", - "error": false - }, - { - "query": "from a_index | eval 1 -+ numberField", - "error": false - }, - { - "query": "from a_index | eval +- numberField", - "error": false - }, - { - "query": "from a_index | eval a=+- numberField", - "error": false - }, - { - "query": "from a_index | eval a=+- round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + +- numberField", - "error": false - }, - { - "query": "from a_index | eval 1 +- numberField", - "error": false - }, - { - "query": "from a_index | eval ++ numberField", - "error": false - }, - { - "query": "from a_index | eval a=++ numberField", - "error": false - }, - { - "query": "from a_index | eval a=++ round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + ++ numberField", - "error": false - }, - { - "query": "from a_index | eval 1 ++ numberField", - "error": false - }, - { - "query": "from a_index | eval not not booleanField", - "error": false - }, - { - "query": "from a_index | eval --- numberField", - "error": false - }, - { - "query": "from a_index | eval a=--- numberField", - "error": false - }, - { - "query": "from a_index | eval a=--- round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + --- numberField", - "error": false - }, - { - "query": "from a_index | eval 1 --- numberField", - "error": false - }, - { - "query": "from a_index | eval -+- numberField", - "error": false - }, - { - "query": "from a_index | eval a=-+- numberField", - "error": false - }, - { - "query": "from a_index | eval a=-+- round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + -+- numberField", - "error": false - }, - { - "query": "from a_index | eval 1 -+- numberField", - "error": false - }, - { - "query": "from a_index | eval +-+ numberField", - "error": false - }, - { - "query": "from a_index | eval a=+-+ numberField", - "error": false - }, - { - "query": "from a_index | eval a=+-+ round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + +-+ numberField", - "error": false - }, - { - "query": "from a_index | eval 1 +-+ numberField", - "error": false - }, - { - "query": "from a_index | eval +++ numberField", - "error": false - }, - { - "query": "from a_index | eval a=+++ numberField", - "error": false - }, - { - "query": "from a_index | eval a=+++ round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + +++ numberField", - "error": false - }, - { - "query": "from a_index | eval 1 +++ numberField", - "error": false - }, - { - "query": "from a_index | eval not not not booleanField", - "error": false - }, - { - "query": "from a_index | eval ---- numberField", - "error": false - }, - { - "query": "from a_index | eval a=---- numberField", - "error": false - }, - { - "query": "from a_index | eval a=---- round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + ---- numberField", - "error": false - }, - { - "query": "from a_index | eval 1 ---- numberField", - "error": false - }, - { - "query": "from a_index | eval -+-+ numberField", - "error": false - }, - { - "query": "from a_index | eval a=-+-+ numberField", - "error": false - }, - { - "query": "from a_index | eval a=-+-+ round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + -+-+ numberField", - "error": false - }, - { - "query": "from a_index | eval 1 -+-+ numberField", - "error": false - }, - { - "query": "from a_index | eval +-+- numberField", - "error": false - }, - { - "query": "from a_index | eval a=+-+- numberField", - "error": false - }, - { - "query": "from a_index | eval a=+-+- round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + +-+- numberField", - "error": false - }, - { - "query": "from a_index | eval 1 +-+- numberField", - "error": false - }, - { - "query": "from a_index | eval ++++ numberField", - "error": false - }, - { - "query": "from a_index | eval a=++++ numberField", - "error": false - }, - { - "query": "from a_index | eval a=++++ round(numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 + ++++ numberField", - "error": false - }, - { - "query": "from a_index | eval 1 ++++ numberField", - "error": false - }, - { - "query": "from a_index | eval not not not not booleanField", - "error": false - }, - { - "query": "from a_index | eval *+ numberField", - "error": true - }, - { - "query": "from a_index | eval /+ numberField", - "error": true - }, - { - "query": "from a_index | eval %+ numberField", - "error": true - }, - { - "query": "from a_index | eval var = avg(numberField)", - "error": true - }, - { - "query": "from a_index | eval var = avg(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval avg(numberField)", - "error": true - }, - { - "query": "from a_index | eval avg(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = max(numberField)", - "error": true - }, - { - "query": "from a_index | eval var = max(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval max(numberField)", - "error": true - }, - { - "query": "from a_index | eval max(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = min(numberField)", - "error": true - }, - { - "query": "from a_index | eval var = min(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval min(numberField)", - "error": true - }, - { - "query": "from a_index | eval min(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = sum(numberField)", - "error": true - }, - { - "query": "from a_index | eval var = sum(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval sum(numberField)", - "error": true - }, - { - "query": "from a_index | eval sum(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = median(numberField)", - "error": true - }, - { - "query": "from a_index | eval var = median(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval median(numberField)", - "error": true - }, - { - "query": "from a_index | eval median(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = median_absolute_deviation(numberField)", - "error": true - }, - { - "query": "from a_index | eval var = median_absolute_deviation(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval median_absolute_deviation(numberField)", - "error": true - }, - { - "query": "from a_index | eval median_absolute_deviation(numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = percentile(numberField, 5)", - "error": true - }, - { - "query": "from a_index | eval var = percentile(numberField, 5) > 0", - "error": true - }, - { - "query": "from a_index | eval percentile(numberField, 5)", - "error": true - }, - { - "query": "from a_index | eval percentile(numberField, 5) > 0", - "error": true - }, - { - "query": "from a_index | eval var = count(stringField)", - "error": true - }, - { - "query": "from a_index | eval var = count(stringField) > 0", - "error": true - }, - { - "query": "from a_index | eval count(stringField)", - "error": true - }, - { - "query": "from a_index | eval count(stringField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = count_distinct(stringField, numberField)", - "error": true - }, - { - "query": "from a_index | eval var = count_distinct(stringField, numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval count_distinct(stringField, numberField)", - "error": true - }, - { - "query": "from a_index | eval count_distinct(stringField, numberField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = st_centroid(cartesianPointField)", - "error": true - }, - { - "query": "from a_index | eval var = st_centroid(cartesianPointField) > 0", - "error": true - }, - { - "query": "from a_index | eval st_centroid(cartesianPointField)", - "error": true - }, - { - "query": "from a_index | eval st_centroid(cartesianPointField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = st_centroid(geoPointField)", - "error": true - }, - { - "query": "from a_index | eval var = st_centroid(geoPointField) > 0", - "error": true - }, - { - "query": "from a_index | eval st_centroid(geoPointField)", - "error": true - }, - { - "query": "from a_index | eval st_centroid(geoPointField) > 0", - "error": true - }, - { - "query": "from a_index | eval var = abs(numberField)", - "error": false - }, - { - "query": "from a_index | eval abs(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = abs(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval abs(stringField)", - "error": true - }, - { - "query": "from a_index | eval abs(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = abs(*)", - "error": true - }, - { - "query": "from a_index | eval var = acos(numberField)", - "error": false - }, - { - "query": "from a_index | eval acos(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = acos(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval acos(stringField)", - "error": true - }, - { - "query": "from a_index | eval acos(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = acos(*)", - "error": true - }, - { - "query": "from a_index | eval var = asin(numberField)", - "error": false - }, - { - "query": "from a_index | eval asin(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = asin(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval asin(stringField)", - "error": true - }, - { - "query": "from a_index | eval asin(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = asin(*)", - "error": true - }, - { - "query": "from a_index | eval var = atan(numberField)", - "error": false - }, - { - "query": "from a_index | eval atan(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = atan(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval atan(stringField)", - "error": true - }, - { - "query": "from a_index | eval atan(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = atan(*)", - "error": true - }, - { - "query": "from a_index | eval var = atan2(numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval atan2(numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval var = atan2(to_integer(stringField), to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval atan2(stringField, stringField)", - "error": true - }, - { - "query": "from a_index | eval atan2(numberField, numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = auto_bucket(dateField, numberField, \"a\", \"a\")", - "error": false - }, - { - "query": "from a_index | eval auto_bucket(dateField, numberField, \"a\", \"a\")", - "error": false - }, - { - "query": "from a_index | eval auto_bucket(dateField, numberField, stringField, stringField)", - "error": true - }, - { - "query": "from a_index | eval var = auto_bucket(dateField, numberField, 5, 5)", - "error": false - }, - { - "query": "from a_index | eval auto_bucket(dateField, numberField, 5, 5)", - "error": false - }, - { - "query": "from a_index | eval auto_bucket(dateField, numberField, numberField, numberField)", - "error": true - }, - { - "query": "from a_index | eval var = case(booleanField, stringField)", - "error": false - }, - { - "query": "from a_index | eval case(booleanField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = ceil(numberField)", - "error": false - }, - { - "query": "from a_index | eval ceil(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = ceil(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval ceil(stringField)", - "error": true - }, - { - "query": "from a_index | eval ceil(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = ceil(*)", - "error": true - }, - { - "query": "from a_index | eval var = cidr_match(ipField, stringField)", - "error": false - }, - { - "query": "from a_index | eval cidr_match(ipField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = cidr_match(to_ip(stringField), to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval cidr_match(stringField, numberField)", - "error": true - }, - { - "query": "from a_index | eval var = coalesce(stringField)", - "error": false - }, - { - "query": "from a_index | eval coalesce(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = concat(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval concat(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = concat(to_string(stringField), to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval concat(numberField, numberField)", - "error": true - }, - { - "query": "from a_index | eval var = cos(numberField)", - "error": false - }, - { - "query": "from a_index | eval cos(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = cos(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval cos(stringField)", - "error": true - }, - { - "query": "from a_index | eval cos(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = cos(*)", - "error": true - }, - { - "query": "from a_index | eval var = cosh(numberField)", - "error": false - }, - { - "query": "from a_index | eval cosh(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = cosh(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval cosh(stringField)", - "error": true - }, - { - "query": "from a_index | eval cosh(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = cosh(*)", - "error": true - }, - { - "query": "from a_index | eval var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", dateField)", - "error": false - }, - { - "query": "from a_index | eval date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", dateField)", - "error": false - }, - { - "query": "from a_index | eval var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", to_datetime(stringField))", - "error": false - }, - { - "query": "from a_index | eval date_extract(stringField, stringField)", - "error": true - }, - { - "query": "from a_index | eval date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", dateField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = date_format(dateField, stringField)", - "error": false - }, - { - "query": "from a_index | eval date_format(dateField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = date_format(to_datetime(stringField), to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval date_format(stringField, numberField)", - "error": true - }, - { - "query": "from a_index | eval date_format(dateField, stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = date_parse(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval date_parse(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = date_parse(to_string(stringField), to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval date_parse(numberField, numberField)", - "error": true - }, - { - "query": "from a_index | eval date_parse(stringField, stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = date_trunc(1 year, dateField)", - "error": false - }, - { - "query": "from a_index | eval date_trunc(1 year, dateField)", - "error": false - }, - { - "query": "from a_index | eval var = date_trunc(1 year, to_datetime(stringField))", - "error": false - }, - { - "query": "from a_index | eval date_trunc(stringField, stringField)", - "error": true - }, - { - "query": "from a_index | eval date_trunc(1 year, dateField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = e()", - "error": false - }, - { - "query": "from a_index | eval e()", - "error": false - }, - { - "query": "from a_index | eval var = e()", - "error": false - }, - { - "query": "from a_index | eval e()", - "error": false - }, - { - "query": "from a_index | eval e(extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = ends_with(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval ends_with(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = ends_with(to_string(stringField), to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval ends_with(numberField, numberField)", - "error": true - }, - { - "query": "from a_index | eval ends_with(stringField, stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = floor(numberField)", - "error": false - }, - { - "query": "from a_index | eval floor(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = floor(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval floor(stringField)", - "error": true - }, - { - "query": "from a_index | eval floor(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = floor(*)", - "error": true - }, - { - "query": "from a_index | eval var = greatest(stringField)", - "error": false - }, - { - "query": "from a_index | eval greatest(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = least(stringField)", - "error": false - }, - { - "query": "from a_index | eval least(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = left(stringField, numberField)", - "error": false - }, - { - "query": "from a_index | eval left(stringField, numberField)", - "error": false - }, - { - "query": "from a_index | eval var = left(to_string(stringField), to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval left(numberField, stringField)", - "error": true - }, - { - "query": "from a_index | eval left(stringField, numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = length(stringField)", - "error": false - }, - { - "query": "from a_index | eval length(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = length(to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval length(numberField)", - "error": true - }, - { - "query": "from a_index | eval length(stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = length(*)", - "error": true - }, - { - "query": "from a_index | eval var = log(numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval log(numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval var = log(to_integer(stringField), to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval log(stringField, stringField)", - "error": true - }, - { - "query": "from a_index | eval log(numberField, numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = log10(numberField)", - "error": false - }, - { - "query": "from a_index | eval log10(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = log10(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval log10(stringField)", - "error": true - }, - { - "query": "from a_index | eval log10(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = log10(*)", - "error": true - }, - { - "query": "from a_index | eval var = ltrim(stringField)", - "error": false - }, - { - "query": "from a_index | eval ltrim(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = ltrim(to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval ltrim(numberField)", - "error": true - }, - { - "query": "from a_index | eval ltrim(stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = ltrim(*)", - "error": true - }, - { - "query": "from a_index | eval var = mv_avg(numberField)", - "error": false - }, - { - "query": "from a_index | eval mv_avg(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_avg(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval mv_avg(stringField)", - "error": true - }, - { - "query": "from a_index | eval mv_avg(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = mv_avg(*)", - "error": true - }, - { - "query": "from a_index | eval var = mv_concat(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval mv_concat(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_concat(to_string(stringField), to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval mv_concat(numberField, numberField)", - "error": true - }, - { - "query": "from a_index | eval mv_concat(stringField, stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = mv_count(stringField)", - "error": false - }, - { - "query": "from a_index | eval mv_count(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_count(*)", - "error": true - }, - { - "query": "from a_index | eval var = mv_dedupe(stringField)", - "error": false - }, - { - "query": "from a_index | eval mv_dedupe(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_dedupe(*)", - "error": true - }, - { - "query": "from a_index | eval var = mv_first(stringField)", - "error": false - }, - { - "query": "from a_index | eval mv_first(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_first(*)", - "error": true - }, - { - "query": "from a_index | eval var = mv_last(stringField)", - "error": false - }, - { - "query": "from a_index | eval mv_last(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_last(*)", - "error": true - }, - { - "query": "from a_index | eval var = mv_max(stringField)", - "error": false - }, - { - "query": "from a_index | eval mv_max(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_max(*)", - "error": true - }, - { - "query": "from a_index | eval var = mv_median(numberField)", - "error": false - }, - { - "query": "from a_index | eval mv_median(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_median(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval mv_median(stringField)", - "error": true - }, - { - "query": "from a_index | eval mv_median(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = mv_median(*)", - "error": true - }, - { - "query": "from a_index | eval var = mv_min(stringField)", - "error": false - }, - { - "query": "from a_index | eval mv_min(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_min(*)", - "error": true - }, - { - "query": "from a_index | eval var = mv_sum(numberField)", - "error": false - }, - { - "query": "from a_index | eval mv_sum(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = mv_sum(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval mv_sum(stringField)", - "error": true - }, - { - "query": "from a_index | eval mv_sum(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = mv_sum(*)", - "error": true - }, - { - "query": "from a_index | eval var = now()", - "error": false - }, - { - "query": "from a_index | eval now()", - "error": false - }, - { - "query": "from a_index | eval var = now()", - "error": false - }, - { - "query": "from a_index | eval now()", - "error": false - }, - { - "query": "from a_index | eval now(extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = pi()", - "error": false - }, - { - "query": "from a_index | eval pi()", - "error": false - }, - { - "query": "from a_index | eval var = pi()", - "error": false - }, - { - "query": "from a_index | eval pi()", - "error": false - }, - { - "query": "from a_index | eval pi(extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = pow(numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval pow(numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval var = pow(to_integer(stringField), to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval pow(stringField, stringField)", - "error": true - }, - { - "query": "from a_index | eval pow(numberField, numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = replace(stringField, stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval replace(stringField, stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = replace(to_string(stringField), to_string(stringField), to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval replace(numberField, numberField, numberField)", - "error": true - }, - { - "query": "from a_index | eval replace(stringField, stringField, stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = right(stringField, numberField)", - "error": false - }, - { - "query": "from a_index | eval right(stringField, numberField)", - "error": false - }, - { - "query": "from a_index | eval var = right(to_string(stringField), to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval right(numberField, stringField)", - "error": true - }, - { - "query": "from a_index | eval right(stringField, numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = round(numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval round(numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval var = round(to_integer(stringField), to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval round(stringField, stringField)", - "error": true - }, - { - "query": "from a_index | eval round(numberField, numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = rtrim(stringField)", - "error": false - }, - { - "query": "from a_index | eval rtrim(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = rtrim(to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval rtrim(numberField)", - "error": true - }, - { - "query": "from a_index | eval rtrim(stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = rtrim(*)", - "error": true - }, - { - "query": "from a_index | eval var = sin(numberField)", - "error": false - }, - { - "query": "from a_index | eval sin(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = sin(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval sin(stringField)", - "error": true - }, - { - "query": "from a_index | eval sin(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = sin(*)", - "error": true - }, - { - "query": "from a_index | eval var = sinh(numberField)", - "error": false - }, - { - "query": "from a_index | eval sinh(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = sinh(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval sinh(stringField)", - "error": true - }, - { - "query": "from a_index | eval sinh(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = sinh(*)", - "error": true - }, - { - "query": "from a_index | eval var = split(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval split(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = split(to_string(stringField), to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval split(numberField, numberField)", - "error": true - }, - { - "query": "from a_index | eval split(stringField, stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = sqrt(numberField)", - "error": false - }, - { - "query": "from a_index | eval sqrt(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = sqrt(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval sqrt(stringField)", - "error": true - }, - { - "query": "from a_index | eval sqrt(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = sqrt(*)", - "error": true - }, - { - "query": "from a_index | eval var = starts_with(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval starts_with(stringField, stringField)", - "error": false - }, - { - "query": "from a_index | eval var = starts_with(to_string(stringField), to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval starts_with(numberField, numberField)", - "error": true - }, - { - "query": "from a_index | eval starts_with(stringField, stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = substring(stringField, numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval substring(stringField, numberField, numberField)", - "error": false - }, - { - "query": "from a_index | eval var = substring(to_string(stringField), to_integer(stringField), to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval substring(numberField, stringField, stringField)", - "error": true - }, - { - "query": "from a_index | eval substring(stringField, numberField, numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = tan(numberField)", - "error": false - }, - { - "query": "from a_index | eval tan(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = tan(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval tan(stringField)", - "error": true - }, - { - "query": "from a_index | eval tan(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = tan(*)", - "error": true - }, - { - "query": "from a_index | eval var = tanh(numberField)", - "error": false - }, - { - "query": "from a_index | eval tanh(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = tanh(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval tanh(stringField)", - "error": true - }, - { - "query": "from a_index | eval tanh(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = tanh(*)", - "error": true - }, - { - "query": "from a_index | eval var = tau()", - "error": false - }, - { - "query": "from a_index | eval tau()", - "error": false - }, - { - "query": "from a_index | eval var = tau()", - "error": false - }, - { - "query": "from a_index | eval tau()", - "error": false - }, - { - "query": "from a_index | eval tau(extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = to_boolean(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_boolean(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_bool(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_boolean(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_cartesianpoint(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_cartesianpoint(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_cartesianpoint(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_cartesianshape(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_cartesianshape(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_cartesianshape(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_datetime(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_datetime(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_dt(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_datetime(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_degrees(numberField)", - "error": false - }, - { - "query": "from a_index | eval to_degrees(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = to_degrees(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval to_degrees(stringField)", - "error": true - }, - { - "query": "from a_index | eval to_degrees(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = to_degrees(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_double(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_double(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_dbl(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_double(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_geopoint(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_geopoint(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_geopoint(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_geoshape(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_geoshape(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_geoshape(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_integer(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_integer(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_int(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_integer(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_ip(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_ip(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_ip(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_long(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_long(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_long(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_lower(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_lower(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_lower(to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval to_lower(numberField)", - "error": true - }, - { - "query": "from a_index | eval to_lower(stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = to_lower(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_radians(numberField)", - "error": false - }, - { - "query": "from a_index | eval to_radians(numberField)", - "error": false - }, - { - "query": "from a_index | eval var = to_radians(to_integer(stringField))", - "error": false - }, - { - "query": "from a_index | eval to_radians(stringField)", - "error": true - }, - { - "query": "from a_index | eval to_radians(numberField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = to_radians(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_string(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_string(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_str(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_string(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_unsigned_long(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_unsigned_long(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_ul(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_ulong(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_unsigned_long(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_upper(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_upper(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_upper(to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval to_upper(numberField)", - "error": true - }, - { - "query": "from a_index | eval to_upper(stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = to_upper(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_version(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_version(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_ver(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_version(*)", - "error": true - }, - { - "query": "from a_index | eval var = to_version(stringField)", - "error": false - }, - { - "query": "from a_index | eval to_version(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_ver(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = to_version(*)", - "error": true - }, - { - "query": "from a_index | eval var = trim(stringField)", - "error": false - }, - { - "query": "from a_index | eval trim(stringField)", - "error": false - }, - { - "query": "from a_index | eval var = trim(to_string(stringField))", - "error": false - }, - { - "query": "from a_index | eval trim(numberField)", - "error": true - }, - { - "query": "from a_index | eval trim(stringField, extraArg)", - "error": true - }, - { - "query": "from a_index | eval var = trim(*)", - "error": true - }, - { - "query": "from a_index | eval log10(-1)", - "error": false - }, - { - "query": "from a_index | eval log(-1)", - "error": false - }, - { - "query": "from a_index | eval log(-1, 20)", - "error": false - }, - { - "query": "from a_index | eval log(-1, -20)", - "error": false - }, - { - "query": "from a_index | eval var0 = log(-1, -20)", - "error": false - }, - { - "query": "from a_index | eval numberField > 0", - "error": false - }, - { - "query": "from a_index | eval NOT numberField > 0", - "error": false - }, - { - "query": "from a_index | eval (numberField > 0)", - "error": false - }, - { - "query": "from a_index | eval (NOT (numberField > 0))", - "error": false - }, - { - "query": "from a_index | eval 1 > 0", - "error": false - }, - { - "query": "from a_index | eval stringField > 0", - "error": true - }, - { - "query": "from a_index | eval numberField >= 0", - "error": false - }, - { - "query": "from a_index | eval NOT numberField >= 0", - "error": false - }, - { - "query": "from a_index | eval (numberField >= 0)", - "error": false - }, - { - "query": "from a_index | eval (NOT (numberField >= 0))", - "error": false - }, - { - "query": "from a_index | eval 1 >= 0", - "error": false - }, - { - "query": "from a_index | eval stringField >= 0", - "error": true - }, - { - "query": "from a_index | eval numberField < 0", - "error": false - }, - { - "query": "from a_index | eval NOT numberField < 0", - "error": false - }, - { - "query": "from a_index | eval (numberField < 0)", - "error": false - }, - { - "query": "from a_index | eval (NOT (numberField < 0))", - "error": false - }, - { - "query": "from a_index | eval 1 < 0", - "error": false - }, - { - "query": "from a_index | eval stringField < 0", - "error": true - }, - { - "query": "from a_index | eval numberField <= 0", - "error": false - }, - { - "query": "from a_index | eval NOT numberField <= 0", - "error": false - }, - { - "query": "from a_index | eval (numberField <= 0)", - "error": false - }, - { - "query": "from a_index | eval (NOT (numberField <= 0))", - "error": false - }, - { - "query": "from a_index | eval 1 <= 0", - "error": false - }, - { - "query": "from a_index | eval stringField <= 0", - "error": true - }, - { - "query": "from a_index | eval numberField == 0", - "error": false - }, - { - "query": "from a_index | eval NOT numberField == 0", - "error": false - }, - { - "query": "from a_index | eval (numberField == 0)", - "error": false - }, - { - "query": "from a_index | eval (NOT (numberField == 0))", - "error": false - }, - { - "query": "from a_index | eval 1 == 0", - "error": false - }, - { - "query": "from a_index | eval stringField == 0", - "error": true - }, - { - "query": "from a_index | eval numberField + 1", - "error": false - }, - { - "query": "from a_index | eval (numberField + 1)", - "error": false - }, - { - "query": "from a_index | eval 1 + 1", - "error": false - }, - { - "query": "from a_index | eval numberField - 1", - "error": false - }, - { - "query": "from a_index | eval (numberField - 1)", - "error": false - }, - { - "query": "from a_index | eval 1 - 1", - "error": false - }, - { - "query": "from a_index | eval numberField * 1", - "error": false - }, - { - "query": "from a_index | eval (numberField * 1)", - "error": false - }, - { - "query": "from a_index | eval 1 * 1", - "error": false - }, - { - "query": "from a_index | eval numberField / 1", - "error": false - }, - { - "query": "from a_index | eval (numberField / 1)", - "error": false - }, - { - "query": "from a_index | eval 1 / 1", - "error": false - }, - { - "query": "from a_index | eval numberField % 1", - "error": false - }, - { - "query": "from a_index | eval (numberField % 1)", - "error": false - }, - { - "query": "from a_index | eval 1 % 1", - "error": false - }, - { - "query": "from a_index | eval 1/0", - "error": false - }, - { - "query": "from a_index | eval var = 1/0", - "error": false - }, - { - "query": "from a_index | eval 1 + 1/0", - "error": false - }, - { - "query": "from a_index | eval 1%0", - "error": false - }, - { - "query": "from a_index | eval var = 1%0", - "error": false - }, - { - "query": "from a_index | eval 1 + 1%0", - "error": false - }, - { - "query": "from a_index | eval stringField like \"?a\"", - "error": false - }, - { - "query": "from a_index | eval stringField NOT like \"?a\"", - "error": false - }, - { - "query": "from a_index | eval NOT stringField like \"?a\"", - "error": false - }, - { - "query": "from a_index | eval NOT stringField NOT like \"?a\"", - "error": false - }, - { - "query": "from a_index | eval numberField like \"?a\"", - "error": true - }, - { - "query": "from a_index | eval numberField NOT like \"?a\"", - "error": true - }, - { - "query": "from a_index | eval NOT numberField like \"?a\"", - "error": true - }, - { - "query": "from a_index | eval NOT numberField NOT like \"?a\"", - "error": true - }, - { - "query": "from a_index | eval stringField rlike \"?a\"", - "error": false - }, - { - "query": "from a_index | eval stringField NOT rlike \"?a\"", - "error": false - }, - { - "query": "from a_index | eval NOT stringField rlike \"?a\"", - "error": false - }, - { - "query": "from a_index | eval NOT stringField NOT rlike \"?a\"", - "error": false - }, - { - "query": "from a_index | eval numberField rlike \"?a\"", - "error": true - }, - { - "query": "from a_index | eval numberField NOT rlike \"?a\"", - "error": true - }, - { - "query": "from a_index | eval NOT numberField rlike \"?a\"", - "error": true - }, - { - "query": "from a_index | eval NOT numberField NOT rlike \"?a\"", - "error": true - }, - { - "query": "from a_index | eval 1 in (1, 2, 3)", - "error": false - }, - { - "query": "from a_index | eval numberField in (1, 2, 3)", - "error": false - }, - { - "query": "from a_index | eval numberField not in (1, 2, 3)", - "error": false - }, - { - "query": "from a_index | eval numberField not in (1, 2, 3, numberField)", - "error": false - }, - { - "query": "from a_index | eval 1 in (1, 2, 3, round(numberField))", - "error": false - }, - { - "query": "from a_index | eval \"a\" in (\"a\", \"b\", \"c\")", - "error": false - }, - { - "query": "from a_index | eval stringField in (\"a\", \"b\", \"c\")", - "error": false - }, - { - "query": "from a_index | eval stringField not in (\"a\", \"b\", \"c\")", - "error": false - }, - { - "query": "from a_index | eval stringField not in (\"a\", \"b\", \"c\", stringField)", - "error": false - }, - { - "query": "from a_index | eval 1 in (\"a\", \"b\", \"c\")", - "error": true - }, - { - "query": "from a_index | eval numberField in (\"a\", \"b\", \"c\")", - "error": true - }, - { - "query": "from a_index | eval numberField not in (\"a\", \"b\", \"c\")", - "error": true - }, - { - "query": "from a_index | eval numberField not in (1, 2, 3, stringField)", - "error": true - }, - { - "query": "from a_index | eval avg(numberField)", - "error": true - }, - { - "query": "from a_index | stats avg(numberField) | eval `avg(numberField)` + 1", - "error": false - }, - { - "query": "from a_index | eval not", - "error": true - }, - { - "query": "from a_index | eval in", - "error": true - }, - { - "query": "from a_index | eval stringField in stringField", - "error": true - }, - { - "query": "from a_index | eval stringField in stringField)", - "error": true - }, - { - "query": "from a_index | eval stringField not in stringField", - "error": true - }, - { - "query": "from a_index | eval 1 anno", - "error": true - }, - { - "query": "from a_index | eval var = 1 anno", - "error": true - }, - { - "query": "from a_index | eval now() + 1 anno", - "error": true - }, - { - "query": "from a_index | eval 1 year", - "error": true - }, - { - "query": "from a_index | eval 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 year", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 year", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 YEAR", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Year", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 year", - "error": false - }, - { - "query": "from a_index | eval 1 year + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 year", - "error": true - }, - { - "query": "from a_index | eval 1 years", - "error": true - }, - { - "query": "from a_index | eval 1 years", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 years", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 years", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 YEARS", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Years", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 years", - "error": false - }, - { - "query": "from a_index | eval 1 years + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 years", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 years", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 years", - "error": true - }, - { - "query": "from a_index | eval 1 month", - "error": true - }, - { - "query": "from a_index | eval 1 month", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 month", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 month", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 MONTH", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Month", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 month", - "error": false - }, - { - "query": "from a_index | eval 1 month + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 month", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 month", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 month", - "error": true - }, - { - "query": "from a_index | eval 1 months", - "error": true - }, - { - "query": "from a_index | eval 1 months", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 months", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 months", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 MONTHS", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Months", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 months", - "error": false - }, - { - "query": "from a_index | eval 1 months + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 months", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 months", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 months", - "error": true - }, - { - "query": "from a_index | eval 1 week", - "error": true - }, - { - "query": "from a_index | eval 1 week", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 week", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 week", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 WEEK", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Week", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 week", - "error": false - }, - { - "query": "from a_index | eval 1 week + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 week", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 week", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 week", - "error": true - }, - { - "query": "from a_index | eval 1 weeks", - "error": true - }, - { - "query": "from a_index | eval 1 weeks", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 weeks", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 weeks", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 WEEKS", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Weeks", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 weeks", - "error": false - }, - { - "query": "from a_index | eval 1 weeks + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 weeks", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 weeks", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 weeks", - "error": true - }, - { - "query": "from a_index | eval 1 day", - "error": true - }, - { - "query": "from a_index | eval 1 day", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 day", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 day", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 DAY", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Day", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 day", - "error": false - }, - { - "query": "from a_index | eval 1 day + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 day", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 day", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 day", - "error": true - }, - { - "query": "from a_index | eval 1 days", - "error": true - }, - { - "query": "from a_index | eval 1 days", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 days", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 days", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 DAYS", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Days", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 days", - "error": false - }, - { - "query": "from a_index | eval 1 days + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 days", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 days", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 days", - "error": true - }, - { - "query": "from a_index | eval 1 hour", - "error": true - }, - { - "query": "from a_index | eval 1 hour", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 hour", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 hour", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 HOUR", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Hour", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 hour", - "error": false - }, - { - "query": "from a_index | eval 1 hour + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 hour", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 hour", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 hour", - "error": true - }, - { - "query": "from a_index | eval 1 hours", - "error": true - }, - { - "query": "from a_index | eval 1 hours", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 hours", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 hours", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 HOURS", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Hours", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 hours", - "error": false - }, - { - "query": "from a_index | eval 1 hours + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 hours", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 hours", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 hours", - "error": true - }, - { - "query": "from a_index | eval 1 minute", - "error": true - }, - { - "query": "from a_index | eval 1 minute", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 minute", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 minute", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 MINUTE", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Minute", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 minute", - "error": false - }, - { - "query": "from a_index | eval 1 minute + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 minute", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 minute", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 minute", - "error": true - }, - { - "query": "from a_index | eval 1 minutes", - "error": true - }, - { - "query": "from a_index | eval 1 minutes", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 minutes", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 minutes", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 MINUTES", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Minutes", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 minutes", - "error": false - }, - { - "query": "from a_index | eval 1 minutes + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 minutes", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 minutes", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 minutes", - "error": true - }, - { - "query": "from a_index | eval 1 second", - "error": true - }, - { - "query": "from a_index | eval 1 second", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 second", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 second", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 SECOND", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Second", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 second", - "error": false - }, - { - "query": "from a_index | eval 1 second + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 second", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 second", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 second", - "error": true - }, - { - "query": "from a_index | eval 1 seconds", - "error": true - }, - { - "query": "from a_index | eval 1 seconds", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 seconds", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 seconds", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 SECONDS", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Seconds", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 seconds", - "error": false - }, - { - "query": "from a_index | eval 1 seconds + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 seconds", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 seconds", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 seconds", - "error": true - }, - { - "query": "from a_index | eval 1 millisecond", - "error": true - }, - { - "query": "from a_index | eval 1 millisecond", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 millisecond", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 millisecond", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 MILLISECOND", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Millisecond", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 millisecond", - "error": false - }, - { - "query": "from a_index | eval 1 millisecond + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 millisecond", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 millisecond", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 millisecond", - "error": true - }, - { - "query": "from a_index | eval 1 milliseconds", - "error": true - }, - { - "query": "from a_index | eval 1 milliseconds", - "error": true - }, - { - "query": "from a_index | eval var = now() - 1 milliseconds", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 milliseconds", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 MILLISECONDS", - "error": false - }, - { - "query": "from a_index | eval var = dateField - 1 Milliseconds", - "error": false - }, - { - "query": "from a_index | eval var = dateField + 1 milliseconds", - "error": false - }, - { - "query": "from a_index | eval 1 milliseconds + 1 year", - "error": true - }, - { - "query": "from a_index | eval var = now() * 1 milliseconds", - "error": true - }, - { - "query": "from a_index | eval var = now() / 1 milliseconds", - "error": true - }, - { - "query": "from a_index | eval var = now() % 1 milliseconds", - "error": true - }, - { - "query": "from a_index | stats ", - "error": true - }, - { - "query": "from a_index | stats by stringField", - "error": false - }, - { - "query": "from a_index | stats by ", - "error": true - }, - { - "query": "from a_index | stats numberField ", - "error": true - }, - { - "query": "from a_index | stats numberField=", - "error": true - }, - { - "query": "from a_index | stats numberField=5 by ", - "error": true - }, - { - "query": "from a_index | stats avg(numberField) by wrongField", - "error": true - }, - { - "query": "from a_index | stats avg(numberField) by wrongField + 1", - "error": true - }, - { - "query": "from a_index | stats avg(numberField) by var0 = wrongField + 1", - "error": true - }, - { - "query": "from a_index | stats avg(numberField) by 1", - "error": false - }, - { - "query": "from a_index | stats avg(numberField) by percentile(numberField)", - "error": true - }, - { - "query": "from a_index | stats count(`numberField`)", - "error": false - }, - { - "query": "from a_index | stats count(`numberField`) | keep `count(``numberField``)` ", - "error": false - }, - { - "query": "from a_index | stats count(`numberField`) | drop `count(``numberField``)` ", - "error": false - }, - { - "query": "from a_index | stats count(`numberField`) | eval `count(``numberField``)` ", - "error": false - }, - { - "query": "from a_index | stats avg(numberField) by stringField, percentile(numberField) by ipField", - "error": true - }, - { - "query": "from a_index | stats avg(numberField), percentile(numberField, 50) by ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), percentile(numberField, 50) BY ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField) + percentile(numberField, 50) BY ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField) - percentile(numberField, 50) BY ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField) * percentile(numberField, 50) BY ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField) / percentile(numberField, 50) BY ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField) % percentile(numberField, 50) BY ipField", - "error": false - }, - { - "query": "from a_index | stats count(* + 1) BY ipField", - "error": true - }, - { - "query": "from a_index | stats count(* + round(numberField)) BY ipField", - "error": true - }, - { - "query": "from a_index | stats count(round(*)) BY ipField", - "error": true - }, - { - "query": "from a_index | stats count(count(*)) BY ipField", - "error": true - }, - { - "query": "from a_index | stats numberField + 1", - "error": true - }, - { - "query": "from a_index | stats 5 + avg(numberField) +1", - "error": false - }, - { - "query": "from a_index | stats 5 +1 + avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats 5 +1 + numberField", - "error": true - }, - { - "query": "from a_index | stats 5 + numberField +1", - "error": true - }, - { - "query": "from a_index | stats 5 + numberField +1, var0 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats round( sum(numberField) )", - "error": false - }, - { - "query": "from a_index | stats round( sum(numberField) ) + round( sum(numberField) )", - "error": false - }, - { - "query": "from a_index | stats round( numberField + sum(numberField) )", - "error": true - }, - { - "query": "from a_index | stats round( numberField + sum(numberField) ), var0 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats var0 = round( numberField + sum(numberField) ), var1 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats round( sum(numberField + numberField) )", - "error": false - }, - { - "query": "from a_index | stats round( sum(numberField + round(numberField)) )", - "error": false - }, - { - "query": "from a_index | stats round( sum(numberField + round(numberField)) ) + round( sum(numberField + round(numberField)) )", - "error": false - }, - { - "query": "from a_index | stats sum(round( numberField ) )", - "error": false - }, - { - "query": "from a_index | stats sum(round( numberField ) ) + sum(round( numberField ) )", - "error": false - }, - { - "query": "from a_index | stats 5 + avg(numberField) +1+1", - "error": false - }, - { - "query": "from a_index | stats 5 +1+1 + avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats 5 +1+1 + numberField", - "error": true - }, - { - "query": "from a_index | stats 5 + numberField +1+1", - "error": true - }, - { - "query": "from a_index | stats 5 + numberField +1+1, var0 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats round(round( sum(numberField) ))", - "error": false - }, - { - "query": "from a_index | stats round(round( sum(numberField) )) + round(round( sum(numberField) ))", - "error": false - }, - { - "query": "from a_index | stats round(round( numberField + sum(numberField) ))", - "error": true - }, - { - "query": "from a_index | stats round(round( numberField + sum(numberField) )), var0 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats var0 = round(round( numberField + sum(numberField) )), var1 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats round(round( sum(numberField + numberField) ))", - "error": false - }, - { - "query": "from a_index | stats round(round( sum(numberField + round(numberField)) ))", - "error": false - }, - { - "query": "from a_index | stats round(round( sum(numberField + round(numberField)) )) + round(round( sum(numberField + round(numberField)) ))", - "error": false - }, - { - "query": "from a_index | stats sum(round(round( numberField )) )", - "error": false - }, - { - "query": "from a_index | stats sum(round(round( numberField )) ) + sum(round(round( numberField )) )", - "error": false - }, - { - "query": "from a_index | stats 5 + avg(numberField) +1+1+1", - "error": false - }, - { - "query": "from a_index | stats 5 +1+1+1 + avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats 5 +1+1+1 + numberField", - "error": true - }, - { - "query": "from a_index | stats 5 + numberField +1+1+1", - "error": true - }, - { - "query": "from a_index | stats 5 + numberField +1+1+1, var0 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats round(round(round( sum(numberField) )))", - "error": false - }, - { - "query": "from a_index | stats round(round(round( sum(numberField) ))) + round(round(round( sum(numberField) )))", - "error": false - }, - { - "query": "from a_index | stats round(round(round( numberField + sum(numberField) )))", - "error": true - }, - { - "query": "from a_index | stats round(round(round( numberField + sum(numberField) ))), var0 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats var0 = round(round(round( numberField + sum(numberField) ))), var1 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats round(round(round( sum(numberField + numberField) )))", - "error": false - }, - { - "query": "from a_index | stats round(round(round( sum(numberField + round(numberField)) )))", - "error": false - }, - { - "query": "from a_index | stats round(round(round( sum(numberField + round(numberField)) ))) + round(round(round( sum(numberField + round(numberField)) )))", - "error": false - }, - { - "query": "from a_index | stats sum(round(round(round( numberField ))) )", - "error": false - }, - { - "query": "from a_index | stats sum(round(round(round( numberField ))) ) + sum(round(round(round( numberField ))) )", - "error": false - }, - { - "query": "from a_index | stats 5 + avg(numberField) +1+1+1+1", - "error": false - }, - { - "query": "from a_index | stats 5 +1+1+1+1 + avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats 5 +1+1+1+1 + numberField", - "error": true - }, - { - "query": "from a_index | stats 5 + numberField +1+1+1+1", - "error": true - }, - { - "query": "from a_index | stats 5 + numberField +1+1+1+1, var0 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats round(round(round(round( sum(numberField) ))))", - "error": false - }, - { - "query": "from a_index | stats round(round(round(round( sum(numberField) )))) + round(round(round(round( sum(numberField) ))))", - "error": false - }, - { - "query": "from a_index | stats round(round(round(round( numberField + sum(numberField) ))))", - "error": true - }, - { - "query": "from a_index | stats round(round(round(round( numberField + sum(numberField) )))), var0 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats var0 = round(round(round(round( numberField + sum(numberField) )))), var1 = sum(numberField)", - "error": true - }, - { - "query": "from a_index | stats round(round(round(round( sum(numberField + numberField) ))))", - "error": false - }, - { - "query": "from a_index | stats round(round(round(round( sum(numberField + round(numberField)) ))))", - "error": false - }, - { - "query": "from a_index | stats round(round(round(round( sum(numberField + round(numberField)) )))) + round(round(round(round( sum(numberField + round(numberField)) ))))", - "error": false - }, - { - "query": "from a_index | stats sum(round(round(round(round( numberField )))) )", - "error": false - }, - { - "query": "from a_index | stats sum(round(round(round(round( numberField )))) ) + sum(round(round(round(round( numberField )))) )", - "error": false - }, - { - "query": "from a_index | stats 5 + numberField + 1", - "error": true - }, - { - "query": "from a_index | stats numberField + 1 by ipField", - "error": true - }, - { - "query": "from a_index | stats avg(numberField), percentile(numberField, 50) + 1 by ipField", - "error": false - }, - { - "query": "from a_index | stats count(*)", - "error": false - }, - { - "query": "from a_index | stats count()", - "error": false - }, - { - "query": "from a_index | stats var0 = count(*)", - "error": false - }, - { - "query": "from a_index | stats var0 = count()", - "error": false - }, - { - "query": "from a_index | stats var0 = avg(numberField), count(*)", - "error": false - }, - { - "query": "from a_index | stats var0 = avg(fn(number)), count(*)", - "error": true - }, - { - "query": "from a_index | STATS sum( numberField ) + abs( numberField ) ", - "error": true - }, - { - "query": "from a_index | STATS abs( numberField + sum( numberField )) ", - "error": true - }, - { - "query": "from a_index | stats var = avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats var = round(avg(numberField))", - "error": false - }, - { - "query": "from a_index | stats round(avg(numberField))", - "error": false - }, - { - "query": "from a_index | stats var = round(avg(numberField)) + avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats round(avg(numberField)) + avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = avg(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), avg(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = avg(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats var0 = avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = avg(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField) by round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = avg(numberField) by var1 = round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), avg(numberField) by round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = avg(numberField) by var1 = round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), avg(numberField) by round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = avg(numberField) by var1 = round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats var = avg(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats avg(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats avg(stringField)", - "error": true - }, - { - "query": "from a_index | stats var = avg(*)", - "error": true - }, - { - "query": "from a_index | stats var = max(numberField)", - "error": false - }, - { - "query": "from a_index | stats max(numberField)", - "error": false - }, - { - "query": "from a_index | stats var = round(max(numberField))", - "error": false - }, - { - "query": "from a_index | stats round(max(numberField))", - "error": false - }, - { - "query": "from a_index | stats var = round(max(numberField)) + max(numberField)", - "error": false - }, - { - "query": "from a_index | stats round(max(numberField)) + max(numberField)", - "error": false - }, - { - "query": "from a_index | stats max(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = max(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), max(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = max(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats max(numberField)", - "error": false - }, - { - "query": "from a_index | stats var0 = max(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), max(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = max(numberField)", - "error": false - }, - { - "query": "from a_index | stats max(numberField) by round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = max(numberField) by var1 = round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), max(numberField) by round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = max(numberField) by var1 = round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), max(numberField) by round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = max(numberField) by var1 = round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats var = max(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats max(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats max(stringField)", - "error": true - }, - { - "query": "from a_index | stats var = max(*)", - "error": true - }, - { - "query": "from a_index | stats var = min(numberField)", - "error": false - }, - { - "query": "from a_index | stats min(numberField)", - "error": false - }, - { - "query": "from a_index | stats var = round(min(numberField))", - "error": false - }, - { - "query": "from a_index | stats round(min(numberField))", - "error": false - }, - { - "query": "from a_index | stats var = round(min(numberField)) + min(numberField)", - "error": false - }, - { - "query": "from a_index | stats round(min(numberField)) + min(numberField)", - "error": false - }, - { - "query": "from a_index | stats min(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = min(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), min(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = min(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats min(numberField)", - "error": false - }, - { - "query": "from a_index | stats var0 = min(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), min(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = min(numberField)", - "error": false - }, - { - "query": "from a_index | stats min(numberField) by round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = min(numberField) by var1 = round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), min(numberField) by round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = min(numberField) by var1 = round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), min(numberField) by round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = min(numberField) by var1 = round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats var = min(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats min(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats min(stringField)", - "error": true - }, - { - "query": "from a_index | stats var = min(*)", - "error": true - }, - { - "query": "from a_index | stats var = sum(numberField)", - "error": false - }, - { - "query": "from a_index | stats sum(numberField)", - "error": false - }, - { - "query": "from a_index | stats var = round(sum(numberField))", - "error": false - }, - { - "query": "from a_index | stats round(sum(numberField))", - "error": false - }, - { - "query": "from a_index | stats var = round(sum(numberField)) + sum(numberField)", - "error": false - }, - { - "query": "from a_index | stats round(sum(numberField)) + sum(numberField)", - "error": false - }, - { - "query": "from a_index | stats sum(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = sum(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), sum(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = sum(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats sum(numberField)", - "error": false - }, - { - "query": "from a_index | stats var0 = sum(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), sum(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = sum(numberField)", - "error": false - }, - { - "query": "from a_index | stats sum(numberField) by round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = sum(numberField) by var1 = round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), sum(numberField) by round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = sum(numberField) by var1 = round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), sum(numberField) by round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = sum(numberField) by var1 = round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats var = sum(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats sum(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats sum(stringField)", - "error": true - }, - { - "query": "from a_index | stats var = sum(*)", - "error": true - }, - { - "query": "from a_index | stats var = median(numberField)", - "error": false - }, - { - "query": "from a_index | stats median(numberField)", - "error": false - }, - { - "query": "from a_index | stats var = round(median(numberField))", - "error": false - }, - { - "query": "from a_index | stats round(median(numberField))", - "error": false - }, - { - "query": "from a_index | stats var = round(median(numberField)) + median(numberField)", - "error": false - }, - { - "query": "from a_index | stats round(median(numberField)) + median(numberField)", - "error": false - }, - { - "query": "from a_index | stats median(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = median(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), median(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = median(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats median(numberField)", - "error": false - }, - { - "query": "from a_index | stats var0 = median(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), median(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = median(numberField)", - "error": false - }, - { - "query": "from a_index | stats median(numberField) by round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = median(numberField) by var1 = round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), median(numberField) by round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = median(numberField) by var1 = round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), median(numberField) by round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = median(numberField) by var1 = round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats var = median(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats median(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats median(stringField)", - "error": true - }, - { - "query": "from a_index | stats var = median(*)", - "error": true - }, - { - "query": "from a_index | stats var = median_absolute_deviation(numberField)", - "error": false - }, - { - "query": "from a_index | stats median_absolute_deviation(numberField)", - "error": false - }, - { - "query": "from a_index | stats var = round(median_absolute_deviation(numberField))", - "error": false - }, - { - "query": "from a_index | stats round(median_absolute_deviation(numberField))", - "error": false - }, - { - "query": "from a_index | stats var = round(median_absolute_deviation(numberField)) + median_absolute_deviation(numberField)", - "error": false - }, - { - "query": "from a_index | stats round(median_absolute_deviation(numberField)) + median_absolute_deviation(numberField)", - "error": false - }, - { - "query": "from a_index | stats median_absolute_deviation(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = median_absolute_deviation(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), median_absolute_deviation(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = median_absolute_deviation(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats median_absolute_deviation(numberField)", - "error": false - }, - { - "query": "from a_index | stats var0 = median_absolute_deviation(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), median_absolute_deviation(numberField)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = median_absolute_deviation(numberField)", - "error": false - }, - { - "query": "from a_index | stats median_absolute_deviation(numberField) by round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = median_absolute_deviation(numberField) by var1 = round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), median_absolute_deviation(numberField) by round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = median_absolute_deviation(numberField) by var1 = round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), median_absolute_deviation(numberField) by round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = median_absolute_deviation(numberField) by var1 = round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats var = median_absolute_deviation(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats median_absolute_deviation(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats median_absolute_deviation(stringField)", - "error": true - }, - { - "query": "from a_index | stats var = median_absolute_deviation(*)", - "error": true - }, - { - "query": "from a_index | stats var = percentile(numberField, 5)", - "error": false - }, - { - "query": "from a_index | stats percentile(numberField, 5)", - "error": false - }, - { - "query": "from a_index | stats var = round(percentile(numberField, 5))", - "error": false - }, - { - "query": "from a_index | stats round(percentile(numberField, 5))", - "error": false - }, - { - "query": "from a_index | stats var = round(percentile(numberField, 5)) + percentile(numberField, 5)", - "error": false - }, - { - "query": "from a_index | stats round(percentile(numberField, 5)) + percentile(numberField, 5)", - "error": false - }, - { - "query": "from a_index | stats percentile(numberField, numberField)", - "error": true - }, - { - "query": "from a_index | stats percentile(numberField / 2, 5)", - "error": false - }, - { - "query": "from a_index | stats var0 = percentile(numberField / 2, 5)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), percentile(numberField / 2, 5)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = percentile(numberField / 2, 5)", - "error": false - }, - { - "query": "from a_index | stats percentile(numberField, 5)", - "error": false - }, - { - "query": "from a_index | stats var0 = percentile(numberField, 5)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), percentile(numberField, 5)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = percentile(numberField, 5)", - "error": false - }, - { - "query": "from a_index | stats percentile(numberField, 5) by round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats var0 = percentile(numberField, 5) by var1 = round(numberField / 2)", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), percentile(numberField, 5) by round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = percentile(numberField, 5) by var1 = round(numberField / 2), ipField", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), percentile(numberField, 5) by round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats avg(numberField), var0 = percentile(numberField, 5) by var1 = round(numberField / 2), numberField / 2", - "error": false - }, - { - "query": "from a_index | stats var = percentile(avg(numberField), 5)", - "error": true - }, - { - "query": "from a_index | stats percentile(avg(numberField), 5)", - "error": true - }, - { - "query": "from a_index | stats percentile(stringField, 5)", - "error": true - }, - { - "query": "from a_index | stats var = count(stringField)", - "error": false - }, - { - "query": "from a_index | stats count(stringField)", - "error": false - }, - { - "query": "from a_index | stats var = round(count(stringField))", - "error": false - }, - { - "query": "from a_index | stats round(count(stringField))", - "error": false - }, - { - "query": "from a_index | stats var = round(count(stringField)) + count(stringField)", - "error": false - }, - { - "query": "from a_index | stats round(count(stringField)) + count(stringField)", - "error": false - }, - { - "query": "from a_index | stats var = count_distinct(stringField, numberField)", - "error": false - }, - { - "query": "from a_index | stats count_distinct(stringField, numberField)", - "error": false - }, - { - "query": "from a_index | stats var = round(count_distinct(stringField, numberField))", - "error": false - }, - { - "query": "from a_index | stats round(count_distinct(stringField, numberField))", - "error": false - }, - { - "query": "from a_index | stats var = round(count_distinct(stringField, numberField)) + count_distinct(stringField, numberField)", - "error": false - }, - { - "query": "from a_index | stats round(count_distinct(stringField, numberField)) + count_distinct(stringField, numberField)", - "error": false - }, - { - "query": "from a_index | stats var = st_centroid(cartesianPointField)", - "error": false - }, - { - "query": "from a_index | stats st_centroid(cartesianPointField)", - "error": false - }, - { - "query": "from a_index | stats var = st_centroid(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats st_centroid(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats st_centroid(stringField)", - "error": true - }, - { - "query": "from a_index | stats var = st_centroid(*)", - "error": true - }, - { - "query": "from a_index | stats var = st_centroid(geoPointField)", - "error": false - }, - { - "query": "from a_index | stats st_centroid(geoPointField)", - "error": false - }, - { - "query": "from a_index | stats var = st_centroid(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats st_centroid(avg(numberField))", - "error": true - }, - { - "query": "from a_index | stats st_centroid(stringField)", - "error": true - }, - { - "query": "from a_index | stats var = st_centroid(*)", - "error": true - }, - { - "query": "FROM index\n | EVAL numberField * 3.281\n | STATS avg_numberField = AVG(`numberField * 3.281`)", - "error": false - }, - { - "query": "FROM index | STATS AVG(numberField) by round(numberField) + 1 | EVAL `round(numberField) + 1` / 2", - "error": false - }, - { - "query": "from a_index | sort ", - "error": true - }, - { - "query": "from a_index | sort \"field\" ", - "error": false - }, - { - "query": "from a_index | sort wrongField ", - "error": true - }, - { - "query": "from a_index | sort numberField, ", - "error": true - }, - { - "query": "from a_index | sort numberField, stringField", - "error": false - }, - { - "query": "from a_index | sort \"field\" desc ", - "error": false - }, - { - "query": "from a_index | sort numberField desc ", - "error": false - }, - { - "query": "from a_index | sort numberField desc nulls ", - "error": true - }, - { - "query": "from a_index | sort numberField desc nulls first", - "error": false - }, - { - "query": "from a_index | sort numberField desc first", - "error": true - }, - { - "query": "from a_index | sort numberField desc nulls last", - "error": false - }, - { - "query": "from a_index | sort numberField desc last", - "error": true - }, - { - "query": "from a_index | sort \"field\" asc ", - "error": false - }, - { - "query": "from a_index | sort numberField asc ", - "error": false - }, - { - "query": "from a_index | sort numberField asc nulls ", - "error": true - }, - { - "query": "from a_index | sort numberField asc nulls first", - "error": false - }, - { - "query": "from a_index | sort numberField asc first", - "error": true - }, - { - "query": "from a_index | sort numberField asc nulls last", - "error": false - }, - { - "query": "from a_index | sort numberField asc last", - "error": true - }, - { - "query": "from a_index | sort numberField nulls first", - "error": false - }, - { - "query": "from a_index | sort numberField first", - "error": true - }, - { - "query": "from a_index | sort numberField nulls last", - "error": false - }, - { - "query": "from a_index | sort numberField last", - "error": true - }, - { - "query": "row a = 1 | stats COUNT(*) | sort `COUNT(*)`", - "error": false - }, - { - "query": "ROW a = 1 | STATS couNt(*) | SORT `couNt(*)`", - "error": false - }, - { - "query": "from a_index | enrich", - "error": true - }, - { - "query": "from a_index | enrich _", - "error": true - }, - { - "query": "from a_index | enrich _:", - "error": true - }, - { - "query": "from a_index | enrich _:policy", - "error": true - }, - { - "query": "from a_index | enrich :policy", - "error": true - }, - { - "query": "from a_index | enrich any:", - "error": true - }, - { - "query": "from a_index | enrich _any:", - "error": true - }, - { - "query": "from a_index | enrich any:policy", - "error": true - }, - { - "query": "from a_index | enrich policy ", - "error": false - }, - { - "query": "from a_index | enrich `this``is fine`", - "error": true - }, - { - "query": "from a_index | enrich this is fine", - "error": true - }, - { - "query": "from a_index | enrich _any:policy ", - "error": false - }, - { - "query": "from a_index | enrich _any : policy ", - "error": true - }, - { - "query": "from a_index | enrich _any: policy ", - "error": true - }, - { - "query": "from a_index | enrich _any:policy ", - "error": false - }, - { - "query": "from a_index | enrich _ANY:policy ", - "error": false - }, - { - "query": "from a_index | enrich _coordinator:policy ", - "error": false - }, - { - "query": "from a_index | enrich _coordinator : policy ", - "error": true - }, - { - "query": "from a_index | enrich _coordinator: policy ", - "error": true - }, - { - "query": "from a_index | enrich _coordinator:policy ", - "error": false - }, - { - "query": "from a_index | enrich _COORDINATOR:policy ", - "error": false - }, - { - "query": "from a_index | enrich _remote:policy ", - "error": false - }, - { - "query": "from a_index | enrich _remote : policy ", - "error": true - }, - { - "query": "from a_index | enrich _remote: policy ", - "error": true - }, - { - "query": "from a_index | enrich _remote:policy ", - "error": false - }, - { - "query": "from a_index | enrich _REMOTE:policy ", - "error": false - }, - { - "query": "from a_index | enrich _unknown:policy", - "error": true - }, - { - "query": "from a_index |enrich missing-policy ", - "error": true - }, - { - "query": "from a_index |enrich policy on ", - "error": true - }, - { - "query": "from a_index | enrich policy on b ", - "error": true - }, - { - "query": "from a_index | enrich policy on `this``is fine`", - "error": true - }, - { - "query": "from a_index | enrich policy on this is fine", - "error": true - }, - { - "query": "from a_index | enrich policy on stringField with ", - "error": true - }, - { - "query": "from a_index | enrich policy on stringField with var0 ", - "error": true - }, - { - "query": "from a_index |enrich policy on numberField with var0 = ", - "error": true - }, - { - "query": "from a_index | enrich policy on stringField with var0 = c ", - "error": true - }, - { - "query": "from a_index |enrich policy on numberField with var0 = , ", - "error": true - }, - { - "query": "from a_index | enrich policy on stringField with var0 = otherField, var1 ", - "error": true - }, - { - "query": "from a_index | enrich policy on stringField with var0 = otherField ", - "error": false - }, - { - "query": "from a_index | enrich policy on stringField with var0 = otherField, yetAnotherField ", - "error": false - }, - { - "query": "from a_index |enrich policy on numberField with var0 = otherField, var1 = ", - "error": true - }, - { - "query": "from a_index | enrich policy on stringField with var0 = otherField, var1 = yetAnotherField", - "error": false - }, - { - "query": "from a_index | enrich policy on stringField with var0 = otherField, `this``is fine` = yetAnotherField", - "error": false - }, - { - "query": "from a_index | enrich policy with ", - "error": true - }, - { - "query": "from a_index | enrich policy with otherField", - "error": false - }, - { - "query": "from a_index | enrich policy | eval otherField", - "error": false - }, - { - "query": "from a_index | enrich policy with var0 = otherField | eval var0", - "error": false - }, - { - "query": "from a_index | enrich my-pol*", - "error": true - }, - { - "query": "from a_index | eval stringField = 5", - "error": false - }, - { - "query": "from a_index | eval numberField = \"5\"", - "error": false - }, - { - "query": "from a_index | eval round(numberField) + 1 | eval `round(numberField) + 1` + 1 | keep ```round(numberField) + 1`` + 1`", - "error": false - }, - { - "query": "from a_index | eval round(numberField) + 1 | eval `round(numberField) + 1` + 1 | eval ```round(numberField) + 1`` + 1` + 1 | keep ```````round(numberField) + 1```` + 1`` + 1`", - "error": false - }, - { - "query": "from a_index | eval round(numberField) + 1 | eval `round(numberField) + 1` + 1 | eval ```round(numberField) + 1`` + 1` + 1 | eval ```````round(numberField) + 1```` + 1`` + 1` + 1 | keep ```````````````round(numberField) + 1```````` + 1```` + 1`` + 1`", - "error": false - }, - { - "query": "from a_index | eval round(numberField) + 1 | eval `round(numberField) + 1` + 1 | eval ```round(numberField) + 1`` + 1` + 1 | eval ```````round(numberField) + 1```` + 1`` + 1` + 1 | eval ```````````````round(numberField) + 1```````` + 1```` + 1`` + 1` + 1 | keep ```````````````````````````````round(numberField) + 1```````````````` + 1```````` + 1```` + 1`` + 1`", - "error": false - } - ] -} \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts b/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts deleted file mode 100644 index 3f45d16a60593..0000000000000 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts +++ /dev/null @@ -1,2426 +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 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 or the Server - * Side Public License, v 1. - */ - -import { CharStreams } from 'antlr4'; -import { getParser, ROOT_STATEMENT } from '../../antlr_facade'; -import { join } from 'path'; -import { writeFile } from 'fs/promises'; -import { AstListener } from '../ast_factory'; -import { validateAst } from './validation'; -import { ESQLAst } from '../types'; -import { ESQLErrorListener } from '../../monaco/esql_error_listener'; -import { evalFunctionsDefinitions } from '../definitions/functions'; -import { getFunctionSignatures } from '../definitions/helpers'; -import { FunctionDefinition } from '../definitions/types'; -import { chronoLiterals, timeLiterals } from '../definitions/literals'; -import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; -import capitalize from 'lodash/capitalize'; -import { EditorError } from '../../../../types'; -import { camelCase } from 'lodash'; -import { nonNullable } from '../ast_helpers'; - -const fieldTypes = ['number', 'date', 'boolean', 'ip', 'string', 'cartesian_point', 'geo_point']; -const fields = [ - ...fieldTypes.map((type) => ({ name: `${camelCase(type)}Field`, type })), - { name: 'any#Char$Field', type: 'number' }, - { name: 'kubernetes.something.something', type: 'number' }, - { name: '@timestamp', type: 'date' }, -]; -const enrichFields = [ - { name: 'otherField', type: 'string' }, - { name: 'yetAnotherField', type: 'number' }, -]; -// eslint-disable-next-line @typescript-eslint/naming-convention -const unsupported_field = [{ name: 'unsupported_field', type: 'unsupported' }]; -const indexes = [ - 'a_index', - 'index', - 'other_index', - '.secret_index', - 'my-index', - 'unsupported_index', -]; -const policies = [ - { - name: 'policy', - sourceIndices: ['enrich_index'], - matchField: 'otherStringField', - enrichFields: ['otherField', 'yetAnotherField'], - }, - { - name: 'policy$', - sourceIndices: ['enrich_index'], - matchField: 'otherStringField', - enrichFields: ['otherField', 'yetAnotherField'], - }, -]; - -const NESTING_LEVELS = 4; -const NESTED_DEPTHS = Array(NESTING_LEVELS) - .fill(0) - .map((_, i) => i + 1); - -function getCallbackMocks() { - return { - getFieldsFor: jest.fn(async ({ query }) => { - if (/enrich/.test(query)) { - return enrichFields; - } - if (/unsupported_index/.test(query)) { - return unsupported_field; - } - if (/dissect|grok/.test(query)) { - return [{ name: 'firstWord', type: 'string' }]; - } - return fields; - }), - getSources: jest.fn(async () => - indexes.map((name) => ({ - name, - hidden: name.startsWith('.'), - })) - ), - getPolicies: jest.fn(async () => policies), - getMetaFields: jest.fn(async () => ['_id', '_source']), - }; -} - -const toInteger = evalFunctionsDefinitions.find(({ name }) => name === 'to_integer')!; -const toStringSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_string')!; -const toDateSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_datetime')!; -const toBooleanSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_boolean')!; -const toIpSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_ip')!; -const toGeoPointSignature = evalFunctionsDefinitions.find(({ name }) => name === 'to_geopoint')!; -const toCartesianPointSignature = evalFunctionsDefinitions.find( - ({ name }) => name === 'to_cartesianpoint' -)!; - -const toAvgSignature = statsAggregationFunctionDefinitions.find(({ name }) => name === 'avg')!; - -const nestedFunctions = { - number: prepareNestedFunction(toInteger), - string: prepareNestedFunction(toStringSignature), - date: prepareNestedFunction(toDateSignature), - boolean: prepareNestedFunction(toBooleanSignature), - ip: prepareNestedFunction(toIpSignature), - geo_point: prepareNestedFunction(toGeoPointSignature), - cartesian_point: prepareNestedFunction(toCartesianPointSignature), -}; - -const literals = { - chrono_literal: chronoLiterals[0].name, - time_literal: timeLiterals[0].name, -}; -function getLiteralType(typeString: 'chrono_literal' | 'time_literal') { - if (typeString === 'chrono_literal') { - return literals[typeString]; - } - return `1 ${literals[typeString]}`; -} -function getFieldName( - typeString: string, - { useNestedFunction, isStats }: { useNestedFunction: boolean; isStats: boolean } -) { - if (useNestedFunction && isStats) { - return prepareNestedFunction(toAvgSignature); - } - return useNestedFunction && typeString in nestedFunctions - ? nestedFunctions[typeString as keyof typeof nestedFunctions] - : `${camelCase(typeString)}Field`; -} - -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 prepareNestedFunction(fnSignature: FunctionDefinition): string { - return getFunctionSignatures( - { - ...fnSignature, - signatures: [ - { - ...fnSignature?.signatures[0]!, - params: getFieldMapping(fnSignature?.signatures[0]!.params), - }, - ], - }, - { withTypes: false } - )[0].declaration; -} -function getFieldMapping( - params: FunctionDefinition['signatures'][number]['params'], - { useNestedFunction, useLiterals }: { useNestedFunction: boolean; useLiterals: boolean } = { - useNestedFunction: false, - useLiterals: true, - } -) { - const literalValues = { - string: `"a"`, - number: '5', - }; - return params.map(({ name: _name, type, literalOnly, ...rest }) => { - const typeString: string = type; - if (fieldTypes.includes(typeString)) { - const fieldName = - literalOnly && 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 'chrono_literal' | 'time_literal'), - type, - ...rest, - }; - } - if (/[]$/.test(typeString)) { - return { - name: getMultiValue(typeString), - type, - ...rest, - }; - } - return { name: 'stringField', type, ...rest }; - }); -} - -function generateWrongMappingForArgs( - name: string, - signatures: FunctionDefinition['signatures'], - currentParams: FunctionDefinition['signatures'][number]['params'], - values: { stringField: string; numberField: string; booleanField: string } -) { - const literalValues = { - string: `"a"`, - number: '5', - }; - const wrongFieldMapping = currentParams.map(({ name: _name, literalOnly, type, ...rest }, i) => { - // this thing is complex enough, let's not make it harder for constants - if (literalOnly) { - return { name: literalValues[type as keyof typeof literalValues], type, ...rest }; - } - const typeString = type; - const canBeFieldButNotString = - fieldTypes.filter((t) => t !== 'string').includes(typeString) && - signatures.every(({ params: fnParams }) => fnParams[i].type !== 'string'); - const canBeFieldButNotNumber = - fieldTypes.filter((t) => t !== 'number').includes(typeString) && - signatures.every(({ params: fnParams }) => fnParams[i].type !== 'number'); - const isLiteralType = /literal$/.test(typeString); - // pick a field name purposely wrong - const nameValue = - canBeFieldButNotString || isLiteralType - ? values.stringField - : canBeFieldButNotNumber - ? values.numberField - : values.booleanField; - return { name: nameValue, type, ...rest }; - }); - - const generatedFieldTypes = { - [values.stringField]: 'string', - [values.numberField]: 'number', - [values.booleanField]: 'boolean', - }; - - const expectedErrors = signatures[0].params - .filter(({ literalOnly }) => !literalOnly) - .map(({ type }, i) => { - const fieldName = wrongFieldMapping[i].name; - if ( - fieldName === 'numberField' && - signatures.every(({ params: fnParams }) => fnParams[i].type !== 'string') - ) { - return; - } - return `Argument of [${name}] must be [${type}], found value [${fieldName}] type [${generatedFieldTypes[fieldName]}]`; - }) - .filter(nonNullable); - return { wrongFieldMapping, expectedErrors }; -} - -describe('validation logic', () => { - const testCases: Array<{ query: string; error: boolean }> = []; - - afterAll(async () => { - const targetFolder = join(__dirname, 'esql_validation_meta_tests.json'); - try { - await writeFile( - targetFolder, - JSON.stringify( - { - indexes, - fields: fields.concat([{ name: policies[0].matchField, type: 'keyword' }]), - enrichFields: enrichFields.concat([{ name: policies[0].matchField, type: 'keyword' }]), - policies, - unsupported_field, - testCases, - }, - null, - 2 - ) - ); - } catch (e) { - throw new Error(`Error writing test cases to ${targetFolder}: ${e.message}`); - } - }); - - const getAstAndErrors = async ( - text: string | undefined - ): Promise<{ - errors: EditorError[]; - ast: ESQLAst; - }> => { - if (text == null) { - return { ast: [], errors: [] }; - } - const errorListener = new ESQLErrorListener(); - const parseListener = new AstListener(); - const parser = getParser(CharStreams.fromString(text), errorListener, parseListener); - - parser[ROOT_STATEMENT](); - - return { ...parseListener.getAst(), errors: errorListener.getErrors() }; - }; - - function testErrorsAndWarningsFn( - statement: string, - expectedErrors: string[] = [], - expectedWarnings: string[] = [], - { only, skip }: { only?: boolean; skip?: boolean } = {} - ) { - const testFn = only ? it.only : skip ? it.skip : it; - testCases.push({ query: statement, error: Boolean(expectedErrors.length) }); - - testFn( - `${statement} => ${expectedErrors.length} errors, ${expectedWarnings.length} warnings`, - async () => { - const callbackMocks = getCallbackMocks(); - const { warnings, errors } = await validateAst(statement, getAstAndErrors, callbackMocks); - expect(errors.map((e) => ('message' in e ? e.message : e.text))).toEqual(expectedErrors); - expect(warnings.map((w) => w.text)).toEqual(expectedWarnings); - } - ); - } - - type TestArgs = [string, string[], string[]?]; - - // Make only and skip work with our custom wrapper - const testErrorsAndWarnings = Object.assign(testErrorsAndWarningsFn, { - skip: (...args: TestArgs) => { - const warningArgs = [[]].slice(args.length - 2); - return testErrorsAndWarningsFn( - ...((args.length > 1 ? [...args, ...warningArgs] : args) as TestArgs), - { - skip: true, - } - ); - }, - only: (...args: TestArgs) => { - const warningArgs = [[]].slice(args.length - 2); - return testErrorsAndWarningsFn( - ...((args.length > 1 ? [...args, ...warningArgs] : args) as TestArgs), - { - only: true, - } - ); - }, - }); - - describe('ESQL query should start with a source command', () => { - ['eval', 'stats', 'rename', 'limit', 'keep', 'drop', 'mv_expand', 'dissect', 'grok'].map( - (command) => - testErrorsAndWarnings(command, [ - `SyntaxError: mismatched input '${command}' expecting {'explain', 'from', 'meta', 'row', 'show'}`, - ]) - ); - }); - - describe('from', () => { - testErrorsAndWarnings('f', [ - "SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'meta', 'row', 'show'}", - ]); - testErrorsAndWarnings(`from `, [ - "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''", - ]); - testErrorsAndWarnings(`from index,`, [ - "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''", - ]); - testErrorsAndWarnings(`from assignment = 1`, [ - "SyntaxError: mismatched input '=' expecting ", - 'Unknown index [assignment]', - ]); - testErrorsAndWarnings(`from index`, []); - testErrorsAndWarnings(`FROM index`, []); - testErrorsAndWarnings(`FrOm index`, []); - testErrorsAndWarnings('from `index`', []); - - testErrorsAndWarnings(`from index, other_index`, []); - testErrorsAndWarnings(`from index, missingIndex`, ['Unknown index [missingIndex]']); - testErrorsAndWarnings(`from fn()`, ['Unknown index [fn()]']); - testErrorsAndWarnings(`from average()`, ['Unknown index [average()]']); - for (const isWrapped of [true, false]) { - function setWrapping(option: string) { - return isWrapped ? `[${option}]` : option; - } - function addBracketsWarning() { - return isWrapped - ? ["Square brackets '[]' need to be removed from FROM METADATA declaration"] - : []; - } - testErrorsAndWarnings(`from index ${setWrapping('METADATA _id')}`, [], addBracketsWarning()); - testErrorsAndWarnings(`from index ${setWrapping('metadata _id')}`, [], addBracketsWarning()); - - testErrorsAndWarnings( - `from index ${setWrapping('METADATA _id, _source')}`, - [], - addBracketsWarning() - ); - testErrorsAndWarnings( - `from index ${setWrapping('METADATA _id, _source2')}`, - [ - 'Metadata field [_source2] is not available. Available metadata fields are: [_id, _source]', - ], - addBracketsWarning() - ); - testErrorsAndWarnings( - `from index ${setWrapping('metadata _id, _source')} ${setWrapping('METADATA _id2')}`, - [ - isWrapped - ? "SyntaxError: mismatched input '[' expecting " - : "SyntaxError: mismatched input 'METADATA' expecting ", - ], - addBracketsWarning() - ); - - testErrorsAndWarnings( - `from remote-ccs:indexes ${setWrapping('METADATA _id')}`, - [], - addBracketsWarning() - ); - testErrorsAndWarnings( - `from *:indexes ${setWrapping('METADATA _id')}`, - [], - addBracketsWarning() - ); - } - testErrorsAndWarnings(`from index (metadata _id)`, [ - "SyntaxError: mismatched input '(metadata' expecting ", - ]); - testErrorsAndWarnings(`from ind*, other*`, []); - testErrorsAndWarnings(`from index*`, []); - testErrorsAndWarnings(`from *a_i*dex*`, []); - testErrorsAndWarnings(`from in*ex*`, []); - testErrorsAndWarnings(`from *n*ex`, []); - testErrorsAndWarnings(`from *n*ex*`, []); - testErrorsAndWarnings(`from i*d*x*`, []); - testErrorsAndWarnings(`from i*d*x`, []); - testErrorsAndWarnings(`from i***x*`, []); - testErrorsAndWarnings(`from i****`, []); - testErrorsAndWarnings(`from i**`, []); - testErrorsAndWarnings(`from index**`, []); - testErrorsAndWarnings(`from *ex`, []); - testErrorsAndWarnings(`from *ex*`, []); - testErrorsAndWarnings(`from in*ex`, []); - testErrorsAndWarnings(`from ind*ex`, []); - testErrorsAndWarnings(`from indexes*`, ['Unknown index [indexes*]']); - - testErrorsAndWarnings(`from remote-*:indexes*`, []); - testErrorsAndWarnings(`from remote-*:indexes`, []); - testErrorsAndWarnings(`from remote-ccs:indexes`, []); - testErrorsAndWarnings(`from a_index, remote-ccs:indexes`, []); - testErrorsAndWarnings('from .secret_index', []); - testErrorsAndWarnings('from my-index', []); - testErrorsAndWarnings('from numberField', ['Unknown index [numberField]']); - testErrorsAndWarnings('from policy', ['Unknown index [policy]']); - }); - - describe('row', () => { - testErrorsAndWarnings('row', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('row missing_column', ['Unknown column [missing_column]']); - testErrorsAndWarnings('row fn()', ['Unknown function [fn]']); - testErrorsAndWarnings('row missing_column, missing_column2', [ - 'Unknown column [missing_column]', - 'Unknown column [missing_column2]', - ]); - testErrorsAndWarnings('row a=1', []); - testErrorsAndWarnings('row a=1, missing_column', ['Unknown column [missing_column]']); - testErrorsAndWarnings('row a=1, b = average()', ['Unknown function [average]']); - testErrorsAndWarnings('row a = [1, 2, 3]', []); - testErrorsAndWarnings('row a = [true, false]', []); - testErrorsAndWarnings('row a = ["a", "b"]', []); - testErrorsAndWarnings('row a = null', []); - testErrorsAndWarnings('row a = (1)', []); - testErrorsAndWarnings('row a = (1, 2, 3)', [ - "SyntaxError: no viable alternative at input '(1,'", - "SyntaxError: extraneous input ')' expecting ", - ]); - for (const bool of ['true', 'false']) { - testErrorsAndWarnings(`row a=NOT ${bool}`, []); - testErrorsAndWarnings(`row NOT ${bool}`, []); - } - - testErrorsAndWarnings('row var = 1 in ', [ - "SyntaxError: mismatched input '' expecting '('", - ]); - testErrorsAndWarnings('row var = 1 in (', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - 'Error: [in] function expects exactly 2 arguments, got 1.', - ]); - testErrorsAndWarnings('row var = 1 not in ', [ - "SyntaxError: mismatched input '' expecting '('", - ]); - testErrorsAndWarnings('row var = 1 in (1, 2, 3)', []); - testErrorsAndWarnings('row var = 5 in (1, 2, 3)', []); - testErrorsAndWarnings('row var = 5 not in (1, 2, 3)', []); - testErrorsAndWarnings('row var = 1 in (1, 2, 3, round(5))', []); - testErrorsAndWarnings('row var = "a" in ("a", "b", "c")', []); - testErrorsAndWarnings('row var = "a" in ("a", "b", "c")', []); - testErrorsAndWarnings('row var = "a" not in ("a", "b", "c")', []); - testErrorsAndWarnings('row var = 1 in ("a", "b", "c")', [ - 'Argument of [in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', - ]); - testErrorsAndWarnings('row var = 5 in ("a", "b", "c")', [ - 'Argument of [in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', - ]); - testErrorsAndWarnings('row var = 5 not in ("a", "b", "c")', [ - 'Argument of [not_in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', - ]); - testErrorsAndWarnings('row var = 5 not in (1, 2, 3, "a")', [ - 'Argument of [not_in] must be [number[]], found value [(1, 2, 3, "a")] type [(number, number, number, string)]', - ]); - - function tweakSignatureForRowCommand(signature: string) { - /** - * row has no access to any field, so replace it with literal - * or functions (for dates) - */ - return signature - .replace(/numberField/g, '5') - .replace(/stringField/g, '"a"') - .replace(/dateField/g, 'now()') - .replace(/booleanField/g, 'true') - .replace(/ipField/g, 'to_ip("127.0.0.1")'); - } - - for (const { name, alias, signatures, ...defRest } of evalFunctionsDefinitions) { - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - const signatureStringCorrect = tweakSignatureForRowCommand( - getFunctionSignatures( - { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration - ); - - testErrorsAndWarnings(`row var = ${signatureStringCorrect}`, []); - testErrorsAndWarnings(`row ${signatureStringCorrect}`, []); - - if (alias) { - for (const otherName of alias) { - const signatureStringWithAlias = tweakSignatureForRowCommand( - getFunctionSignatures( - { - name: otherName, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - ); - - testErrorsAndWarnings(`row var = ${signatureStringWithAlias}`, []); - } - } - - // Skip functions that have only arguments of type "any", as it is not possible to pass "the wrong type". - // auto_bucket and 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') && - !['auto_bucket', 'to_version'].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 - ); - - testErrorsAndWarnings(`row var = ${signatureString}`, []); - - const { wrongFieldMapping, expectedErrors } = generateWrongMappingForArgs( - name, - signatures, - params, - { stringField: '"a"', numberField: '5', booleanField: 'true' } - ); - const wrongSignatureString = tweakSignatureForRowCommand( - getFunctionSignatures( - { name, ...defRest, signatures: [{ params: wrongFieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration - ); - testErrorsAndWarnings(`row var = ${wrongSignatureString}`, expectedErrors); - } - } - } - for (const op of ['>', '>=', '<', '<=', '==']) { - testErrorsAndWarnings(`row var = 5 ${op} 0`, []); - testErrorsAndWarnings(`row var = NOT 5 ${op} 0`, []); - testErrorsAndWarnings(`row var = (numberField ${op} 0)`, ['Unknown column [numberField]']); - testErrorsAndWarnings(`row var = (NOT (5 ${op} 0))`, []); - testErrorsAndWarnings(`row var = "a" ${op} 0`, [ - `Argument of [${op}] must be [number], found value ["a"] type [string]`, - ]); - } - for (const op of ['+', '-', '*', '/', '%']) { - testErrorsAndWarnings(`row var = 1 ${op} 1`, []); - testErrorsAndWarnings(`row var = (5 ${op} 1)`, []); - } - - for (const op of ['like', 'rlike']) { - testErrorsAndWarnings(`row var = "a" ${op} "?a"`, []); - testErrorsAndWarnings(`row var = "a" NOT ${op} "?a"`, []); - testErrorsAndWarnings(`row var = NOT "a" ${op} "?a"`, []); - testErrorsAndWarnings(`row var = NOT "a" NOT ${op} "?a"`, []); - testErrorsAndWarnings(`row var = 5 ${op} "?a"`, [ - `Argument of [${op}] must be [string], found value [5] type [number]`, - ]); - testErrorsAndWarnings(`row var = 5 NOT ${op} "?a"`, [ - `Argument of [not_${op}] must be [string], found value [5] type [number]`, - ]); - testErrorsAndWarnings(`row var = NOT 5 ${op} "?a"`, [ - `Argument of [${op}] must be [string], found value [5] type [number]`, - ]); - testErrorsAndWarnings(`row var = NOT 5 NOT ${op} "?a"`, [ - `Argument of [not_${op}] must be [string], found value [5] type [number]`, - ]); - } - - describe('date math', () => { - testErrorsAndWarnings('row 1 anno', [ - 'ROW does not support [date_period] in expression [1 anno]', - ]); - testErrorsAndWarnings('row var = 1 anno', ["Unexpected time interval qualifier: 'anno'"]); - testErrorsAndWarnings('row now() + 1 anno', ["Unexpected time interval qualifier: 'anno'"]); - for (const timeLiteral of timeLiterals) { - testErrorsAndWarnings(`row 1 ${timeLiteral.name}`, [ - `ROW does not support [date_period] in expression [1 ${timeLiteral.name}]`, - ]); - testErrorsAndWarnings(`row 1 ${timeLiteral.name}`, [ - `ROW does not support [date_period] in expression [1 ${timeLiteral.name}]`, - ]); - - // this is not possible for now - // testErrorsAndWarnings(`row var = 1 ${timeLiteral.name}`, [ - // `Row does not support [date_period] in expression [1 ${timeLiteral.name}]`, - // ]); - testErrorsAndWarnings(`row var = now() - 1 ${timeLiteral.name}`, []); - testErrorsAndWarnings(`row var = now() - 1 ${timeLiteral.name.toUpperCase()}`, []); - testErrorsAndWarnings(`row var = now() - 1 ${capitalize(timeLiteral.name)}`, []); - testErrorsAndWarnings(`row var = now() + 1 ${timeLiteral.name}`, []); - testErrorsAndWarnings(`row 1 ${timeLiteral.name} + 1 year`, [ - `Argument of [+] must be [date], found value [1 ${timeLiteral.name}] type [duration]`, - ]); - for (const op of ['*', '/', '%']) { - testErrorsAndWarnings(`row var = now() ${op} 1 ${timeLiteral.name}`, [ - `Argument of [${op}] must be [number], found value [now()] type [date]`, - `Argument of [${op}] must be [number], found value [1 ${timeLiteral.name}] type [duration]`, - ]); - } - } - }); - }); - - describe('meta', () => { - testErrorsAndWarnings('meta', ["SyntaxError: missing 'functions' at ''"]); - testErrorsAndWarnings('meta functions', []); - testErrorsAndWarnings('meta functions()', [ - "SyntaxError: token recognition error at: '('", - "SyntaxError: token recognition error at: ')'", - ]); - testErrorsAndWarnings('meta functions blah', [ - "SyntaxError: token recognition error at: 'b'", - "SyntaxError: token recognition error at: 'l'", - "SyntaxError: token recognition error at: 'a'", - "SyntaxError: token recognition error at: 'h'", - ]); - testErrorsAndWarnings('meta info', [ - "SyntaxError: token recognition error at: 'i'", - "SyntaxError: token recognition error at: 'n'", - "SyntaxError: token recognition error at: 'fo'", - "SyntaxError: missing 'functions' at ''", - ]); - }); - - describe('show', () => { - testErrorsAndWarnings('show', ["SyntaxError: missing 'info' at ''"]); - testErrorsAndWarnings('show functions', [ - "SyntaxError: token recognition error at: 'f'", - "SyntaxError: token recognition error at: 'u'", - "SyntaxError: token recognition error at: 'n'", - "SyntaxError: token recognition error at: 'c'", - "SyntaxError: token recognition error at: 't'", - "SyntaxError: token recognition error at: 'io'", - "SyntaxError: token recognition error at: 'n'", - "SyntaxError: token recognition error at: 's'", - "SyntaxError: missing 'info' at ''", - ]); - testErrorsAndWarnings('show info', []); - testErrorsAndWarnings('show numberField', [ - "SyntaxError: token recognition error at: 'n'", - "SyntaxError: token recognition error at: 'u'", - "SyntaxError: token recognition error at: 'm'", - "SyntaxError: token recognition error at: 'b'", - "SyntaxError: token recognition error at: 'e'", - "SyntaxError: token recognition error at: 'r'", - "SyntaxError: token recognition error at: 'F'", - "SyntaxError: token recognition error at: 'ie'", - "SyntaxError: token recognition error at: 'l'", - "SyntaxError: token recognition error at: 'd'", - "SyntaxError: missing 'info' at ''", - ]); - }); - - describe('limit', () => { - testErrorsAndWarnings('from index | limit ', [ - `SyntaxError: missing INTEGER_LITERAL at ''`, - ]); - testErrorsAndWarnings('from index | limit 4 ', []); - testErrorsAndWarnings('from index | limit 4.5', [ - "SyntaxError: mismatched input '4.5' expecting INTEGER_LITERAL", - ]); - testErrorsAndWarnings('from index | limit a', [ - "SyntaxError: mismatched input 'a' expecting INTEGER_LITERAL", - ]); - testErrorsAndWarnings('from index | limit numberField', [ - "SyntaxError: mismatched input 'numberField' expecting INTEGER_LITERAL", - ]); - testErrorsAndWarnings('from index | limit stringField', [ - "SyntaxError: mismatched input 'stringField' expecting INTEGER_LITERAL", - ]); - testErrorsAndWarnings('from index | limit 4', []); - }); - - describe('keep', () => { - testErrorsAndWarnings('from index | keep ', ["SyntaxError: missing ID_PATTERN at ''"]); - testErrorsAndWarnings('from index | keep stringField, numberField, dateField', []); - testErrorsAndWarnings('from index | keep `stringField`, `numberField`, `dateField`', []); - testErrorsAndWarnings('from index | keep 4.5', [ - "SyntaxError: token recognition error at: '4'", - "SyntaxError: token recognition error at: '5'", - "SyntaxError: missing ID_PATTERN at '.'", - "SyntaxError: missing ID_PATTERN at ''", - ]); - testErrorsAndWarnings('from index | keep `4.5`', ['Unknown column [4.5]']); - testErrorsAndWarnings('from index | keep missingField, numberField, dateField', [ - 'Unknown column [missingField]', - ]); - testErrorsAndWarnings('from index | keep `any#Char$Field`', []); - testErrorsAndWarnings('from index | project ', [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", - ]); - testErrorsAndWarnings('from index | project stringField, numberField, dateField', [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", - ]); - testErrorsAndWarnings('from index | PROJECT stringField, numberField, dateField', [ - "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", - ]); - testErrorsAndWarnings('from index | project missingField, numberField, dateField', [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", - ]); - testErrorsAndWarnings('from index | keep s*', []); - testErrorsAndWarnings('from index | keep *Field', []); - testErrorsAndWarnings('from index | keep s*Field', []); - testErrorsAndWarnings('from index | keep string*Field', []); - testErrorsAndWarnings('from index | keep s*, n*', []); - testErrorsAndWarnings('from index | keep m*', ['Unknown column [m*]']); - testErrorsAndWarnings('from index | keep *m', ['Unknown column [*m]']); - testErrorsAndWarnings('from index | keep d*m', ['Unknown column [d*m]']); - testErrorsAndWarnings( - 'from unsupported_index | keep unsupported_field', - [], - [ - 'Field [unsupported_field] cannot be retrieved, it is unsupported or not indexed; returning null', - ] - ); - - testErrorsAndWarnings( - `FROM index | STATS ROUND(AVG(numberField * 1.5)), COUNT(*), MIN(numberField * 10) | KEEP \`MIN(numberField * 10)\``, - [] - ); - testErrorsAndWarnings( - `FROM index | STATS COUNT(*), MIN(numberField * 10), MAX(numberField)| KEEP \`COUNT(*)\``, - [] - ); - }); - - describe('drop', () => { - testErrorsAndWarnings('from index | drop ', ["SyntaxError: missing ID_PATTERN at ''"]); - testErrorsAndWarnings('from index | drop stringField, numberField, dateField', []); - testErrorsAndWarnings('from index | drop 4.5', [ - "SyntaxError: token recognition error at: '4'", - "SyntaxError: token recognition error at: '5'", - "SyntaxError: missing ID_PATTERN at '.'", - "SyntaxError: missing ID_PATTERN at ''", - ]); - testErrorsAndWarnings('from index | drop missingField, numberField, dateField', [ - 'Unknown column [missingField]', - ]); - testErrorsAndWarnings('from index | drop `any#Char$Field`', []); - testErrorsAndWarnings('from index | drop s*', []); - testErrorsAndWarnings('from index | drop s**Field', []); - testErrorsAndWarnings('from index | drop *Field*', []); - testErrorsAndWarnings('from index | drop s*F*d', []); - testErrorsAndWarnings('from index | drop *Field', []); - testErrorsAndWarnings('from index | drop s*Field', []); - testErrorsAndWarnings('from index | drop string*Field', []); - testErrorsAndWarnings('from index | drop s*, n*', []); - testErrorsAndWarnings('from index | drop m*', ['Unknown column [m*]']); - testErrorsAndWarnings('from index | drop *m', ['Unknown column [*m]']); - testErrorsAndWarnings('from index | drop d*m', ['Unknown column [d*m]']); - testErrorsAndWarnings('from index | drop *', ['Removing all fields is not allowed [*]']); - testErrorsAndWarnings('from index | drop stringField, *', [ - 'Removing all fields is not allowed [*]', - ]); - testErrorsAndWarnings( - 'from index | drop @timestamp', - [], - ['Drop [@timestamp] will remove all time filters to the search results'] - ); - testErrorsAndWarnings( - 'from index | drop stringField, @timestamp', - [], - ['Drop [@timestamp] will remove all time filters to the search results'] - ); - testErrorsAndWarnings( - `FROM index | STATS ROUND(AVG(numberField * 1.5)), COUNT(*), MIN(numberField * 10) | DROP \`MIN(numberField * 10)\``, - [] - ); - testErrorsAndWarnings( - `FROM index | STATS COUNT(*), MIN(numberField * 10), MAX(numberField)| DROP \`COUNT(*)\``, - [] - ); - }); - - describe('mv_expand', () => { - testErrorsAndWarnings('from a_index | mv_expand ', [ - "SyntaxError: missing {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER} at ''", - ]); - for (const type of ['string', 'number', 'date', 'boolean', 'ip']) { - testErrorsAndWarnings(`from a_index | mv_expand ${type}Field`, []); - } - - testErrorsAndWarnings('from a_index | mv_expand numberField, b', [ - "SyntaxError: token recognition error at: ','", - "SyntaxError: extraneous input 'b' expecting ", - ]); - - testErrorsAndWarnings('row a = "a" | mv_expand a', []); - testErrorsAndWarnings('row a = [1, 2, 3] | mv_expand a', []); - testErrorsAndWarnings('row a = [true, false] | mv_expand a', []); - testErrorsAndWarnings('row a = ["a", "b"] | mv_expand a', []); - }); - - describe('rename', () => { - testErrorsAndWarnings('from a_index | rename', [ - "SyntaxError: mismatched input '' expecting ID_PATTERN", - ]); - testErrorsAndWarnings('from a_index | rename stringField', [ - "SyntaxError: mismatched input '' expecting 'as'", - ]); - testErrorsAndWarnings('from a_index | rename a', [ - "SyntaxError: mismatched input '' expecting 'as'", - 'Unknown column [a]', - ]); - testErrorsAndWarnings('from a_index | rename stringField as', [ - "SyntaxError: missing ID_PATTERN at ''", - ]); - testErrorsAndWarnings('from a_index | rename missingField as', [ - "SyntaxError: missing ID_PATTERN at ''", - 'Unknown column [missingField]', - ]); - testErrorsAndWarnings('from a_index | rename stringField as b', []); - testErrorsAndWarnings('from a_index | rename stringField AS b', []); - testErrorsAndWarnings('from a_index | rename stringField As b', []); - testErrorsAndWarnings('from a_index | rename stringField As b, b AS c', []); - testErrorsAndWarnings('from a_index | rename fn() as a', [ - "SyntaxError: token recognition error at: '('", - "SyntaxError: token recognition error at: ')'", - 'Unknown column [fn]', - 'Unknown column [a]', - ]); - testErrorsAndWarnings( - 'from a_index | eval numberField + 1 | rename `numberField + 1` as a', - [] - ); - testErrorsAndWarnings( - 'from a_index | stats avg(numberField) | rename `avg(numberField)` as avg0', - [] - ); - testErrorsAndWarnings('from a_index |eval numberField + 1 | rename `numberField + 1` as ', [ - "SyntaxError: missing ID_PATTERN at ''", - ]); - testErrorsAndWarnings('from a_index | rename s* as strings', [ - 'Using wildcards (*) in RENAME is not allowed [s*]', - 'Unknown column [strings]', - ]); - testErrorsAndWarnings('row a = 10 | rename a as `this``is fine`', []); - testErrorsAndWarnings('row a = 10 | rename a as this is fine', [ - "SyntaxError: mismatched input 'is' expecting ", - ]); - }); - - describe('dissect', () => { - testErrorsAndWarnings('from a_index | dissect', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('from a_index | dissect stringField', [ - "SyntaxError: missing STRING at ''", - ]); - testErrorsAndWarnings('from a_index | dissect stringField 2', [ - "SyntaxError: mismatched input '2' expecting STRING", - ]); - testErrorsAndWarnings('from a_index | dissect stringField .', [ - "SyntaxError: mismatched input '' expecting {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - 'Unknown column [stringField.]', - ]); - testErrorsAndWarnings('from a_index | dissect stringField %a', [ - "SyntaxError: mismatched input '%' expecting STRING", - "SyntaxError: mismatched input '' expecting '='", - ]); - // Do not try to validate the dissect pattern string - testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}"', []); - testErrorsAndWarnings('from a_index | dissect numberField "%{firstWord}"', [ - 'DISSECT only supports string type values, found [numberField] of type [number]', - ]); - testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}" option ', [ - "SyntaxError: mismatched input '' expecting '='", - ]); - testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}" option = ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', OPENING_BRACKET}", - 'Invalid option for DISSECT: [option]', - ]); - testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}" option = 1', [ - 'Invalid option for DISSECT: [option]', - ]); - testErrorsAndWarnings( - 'from a_index | dissect stringField "%{firstWord}" append_separator = "-"', - [] - ); - testErrorsAndWarnings( - 'from a_index | dissect stringField "%{firstWord}" ignore_missing = true', - ['Invalid option for DISSECT: [ignore_missing]'] - ); - testErrorsAndWarnings( - 'from a_index | dissect stringField "%{firstWord}" append_separator = true', - ['Invalid value for DISSECT append_separator: expected a string, but was [true]'] - ); - testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}" | keep firstWord', []); - // testErrorsAndWarnings('from a_index | dissect s* "%{a}"', [ - // 'Using wildcards (*) in dissect is not allowed [s*]', - // ]); - }); - - describe('grok', () => { - testErrorsAndWarnings('from a_index | grok', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('from a_index | grok stringField', [ - "SyntaxError: missing STRING at ''", - ]); - testErrorsAndWarnings('from a_index | grok stringField 2', [ - "SyntaxError: mismatched input '2' expecting STRING", - ]); - testErrorsAndWarnings('from a_index | grok stringField .', [ - "SyntaxError: mismatched input '' expecting {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - 'Unknown column [stringField.]', - ]); - testErrorsAndWarnings('from a_index | grok stringField %a', [ - "SyntaxError: mismatched input '%' expecting STRING", - ]); - // Do not try to validate the grok pattern string - testErrorsAndWarnings('from a_index | grok stringField "%{firstWord}"', []); - testErrorsAndWarnings('from a_index | grok numberField "%{firstWord}"', [ - 'GROK only supports string type values, found [numberField] of type [number]', - ]); - testErrorsAndWarnings('from a_index | grok stringField "%{firstWord}" | keep firstWord', []); - // testErrorsAndWarnings('from a_index | grok s* "%{a}"', [ - // 'Using wildcards (*) in grok is not allowed [s*]', - // ]); - }); - - describe('where', () => { - testErrorsAndWarnings('from a_index | where b', ['Unknown column [b]']); - for (const cond of ['true', 'false']) { - testErrorsAndWarnings(`from a_index | where ${cond}`, []); - testErrorsAndWarnings(`from a_index | where NOT ${cond}`, []); - } - for (const nValue of ['1', '+1', '1 * 1', '-1', '1 / 1', '1.0', '1.5']) { - testErrorsAndWarnings(`from a_index | where ${nValue} > 0`, []); - testErrorsAndWarnings(`from a_index | where NOT ${nValue} > 0`, []); - } - for (const op of ['>', '>=', '<', '<=', '==']) { - testErrorsAndWarnings(`from a_index | where numberField ${op} 0`, []); - testErrorsAndWarnings(`from a_index | where NOT numberField ${op} 0`, []); - testErrorsAndWarnings(`from a_index | where (numberField ${op} 0)`, []); - testErrorsAndWarnings(`from a_index | where (NOT (numberField ${op} 0))`, []); - testErrorsAndWarnings(`from a_index | where 1 ${op} 0`, []); - testErrorsAndWarnings(`from a_index | eval stringField ${op} 0`, [ - `Argument of [${op}] must be [number], found value [stringField] type [string]`, - ]); - } - - for (const nesting of NESTED_DEPTHS) { - for (const evenOp of ['-', '+']) { - for (const oddOp of ['-', '+']) { - // This builds a combination of +/- operators - // i.e. ---- something, -+-+ something, +-+- something, etc... - const unaryCombination = Array(nesting) - .fill('- ') - .map((_, i) => (i % 2 ? oddOp : evenOp)) - .join(''); - testErrorsAndWarnings(`from a_index | where ${unaryCombination} numberField > 0`, []); - testErrorsAndWarnings( - `from a_index | where ${unaryCombination} round(numberField) > 0`, - [] - ); - testErrorsAndWarnings(`from a_index | where 1 + ${unaryCombination} numberField > 0`, []); - // still valid - testErrorsAndWarnings(`from a_index | where 1 ${unaryCombination} numberField > 0`, []); - } - } - testErrorsAndWarnings( - `from a_index | where ${Array(nesting).fill('not ').join('')} booleanField`, - [] - ); - } - for (const wrongOp of ['*', '/', '%']) { - testErrorsAndWarnings(`from a_index | where ${wrongOp}+ numberField`, [ - `SyntaxError: extraneous input '${wrongOp}' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, - ]); - } - - // Skip these tests until the insensitive case equality gets restored back - testErrorsAndWarnings.skip(`from a_index | where numberField =~ 0`, [ - 'Argument of [=~] must be [string], found value [numberField] type [number]', - 'Argument of [=~] must be [string], found value [0] type [number]', - ]); - testErrorsAndWarnings.skip(`from a_index | where NOT numberField =~ 0`, [ - 'Argument of [=~] must be [string], found value [numberField] type [number]', - 'Argument of [=~] must be [string], found value [0] type [number]', - ]); - testErrorsAndWarnings.skip(`from a_index | where (numberField =~ 0)`, [ - 'Argument of [=~] must be [string], found value [numberField] type [number]', - 'Argument of [=~] must be [string], found value [0] type [number]', - ]); - testErrorsAndWarnings.skip(`from a_index | where (NOT (numberField =~ 0))`, [ - 'Argument of [=~] must be [string], found value [numberField] type [number]', - 'Argument of [=~] must be [string], found value [0] type [number]', - ]); - testErrorsAndWarnings.skip(`from a_index | where 1 =~ 0`, [ - 'Argument of [=~] must be [string], found value [1] type [number]', - 'Argument of [=~] must be [string], found value [0] type [number]', - ]); - testErrorsAndWarnings.skip(`from a_index | eval stringField =~ 0`, [ - `Argument of [=~] must be [string], found value [0] type [number]`, - ]); - - for (const op of ['like', 'rlike']) { - testErrorsAndWarnings(`from a_index | where stringField ${op} "?a"`, []); - testErrorsAndWarnings(`from a_index | where stringField NOT ${op} "?a"`, []); - testErrorsAndWarnings(`from a_index | where NOT stringField ${op} "?a"`, []); - testErrorsAndWarnings(`from a_index | where NOT stringField NOT ${op} "?a"`, []); - testErrorsAndWarnings(`from a_index | where numberField ${op} "?a"`, [ - `Argument of [${op}] must be [string], found value [numberField] type [number]`, - ]); - testErrorsAndWarnings(`from a_index | where numberField NOT ${op} "?a"`, [ - `Argument of [not_${op}] must be [string], found value [numberField] type [number]`, - ]); - testErrorsAndWarnings(`from a_index | where NOT numberField ${op} "?a"`, [ - `Argument of [${op}] must be [string], found value [numberField] type [number]`, - ]); - testErrorsAndWarnings(`from a_index | where NOT numberField NOT ${op} "?a"`, [ - `Argument of [not_${op}] must be [string], found value [numberField] type [number]`, - ]); - } - - testErrorsAndWarnings(`from a_index | where cidr_match(ipField)`, [ - `Error: [cidr_match] function expects at least 2 arguments, got 1.`, - ]); - testErrorsAndWarnings( - `from a_index | eval cidr = "172.0.0.1/30" | where cidr_match(ipField, "172.0.0.1/30", cidr)`, - [] - ); - - for (const field of fieldTypes) { - testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS NULL`, []); - testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS null`, []); - testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field is null`, []); - testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field is NULL`, []); - testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS NOT NULL`, []); - testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS NOT null`, []); - testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field IS not NULL`, []); - testErrorsAndWarnings(`from a_index | where ${camelCase(field)}Field Is nOt NuLL`, []); - } - - for (const { - name, - alias, - signatures, - ...defRest - } of statsAggregationFunctionDefinitions.filter( - ({ name: fnName, signatures: statsSignatures }) => - statsSignatures.some(({ returnType, params }) => ['number'].includes(returnType)) - )) { - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - - testErrorsAndWarnings( - `from a_index | where ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [`WHERE does not support function ${name}`] - ); - - testErrorsAndWarnings( - `from a_index | where ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - } > 0`, - [`WHERE does not support function ${name}`] - ); - } - } - - // Test that all functions work in where - const numericOrStringFunctions = evalFunctionsDefinitions.filter(({ name, signatures }) => { - return signatures.some( - ({ returnType, params }) => - ['number', 'string'].includes(returnType) && - params.every(({ type }) => ['number', 'string'].includes(type)) - ); - }); - for (const { name, signatures, ...rest } of numericOrStringFunctions) { - const supportedSignatures = signatures.filter(({ returnType }) => - ['number', 'string'].includes(returnType) - ); - for (const { params, returnType, ...restSign } of supportedSignatures) { - const correctMapping = params - .filter(({ optional }) => !optional) - .map(({ type }) => - ['number', 'string'].includes(Array.isArray(type) ? type.join(', ') : type) - ? { name: `${type}Field`, type } - : { name: `numberField`, type } - ); - testErrorsAndWarnings( - `from a_index | where ${returnType !== 'number' ? 'length(' : ''}${ - // hijacking a bit this function to produce a function call - getFunctionSignatures( - { name, ...rest, signatures: [{ params: correctMapping, returnType, ...restSign }] }, - { withTypes: false } - )[0].declaration - }${returnType !== 'number' ? ')' : ''} > 0`, - [] - ); - - const { wrongFieldMapping, expectedErrors } = generateWrongMappingForArgs( - name, - signatures, - params, - { stringField: 'stringField', numberField: 'numberField', booleanField: 'booleanField' } - ); - testErrorsAndWarnings( - `from a_index | where ${returnType !== 'number' ? 'length(' : ''}${ - // hijacking a bit this function to produce a function call - getFunctionSignatures( - { - name, - ...rest, - signatures: [{ params: wrongFieldMapping, returnType, ...restSign }], - }, - { withTypes: false } - )[0].declaration - }${returnType !== 'number' ? ')' : ''} > 0`, - expectedErrors - ); - } - } - }); - - describe('eval', () => { - testErrorsAndWarnings('from a_index | eval ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('from a_index | eval stringField ', []); - testErrorsAndWarnings('from a_index | eval b = stringField', []); - testErrorsAndWarnings('from a_index | eval numberField + 1', []); - testErrorsAndWarnings('from a_index | eval numberField + ', [ - "SyntaxError: no viable alternative at input 'numberField + '", - ]); - testErrorsAndWarnings('from a_index | eval stringField + 1', [ - 'Argument of [+] must be [number], found value [stringField] type [string]', - ]); - testErrorsAndWarnings('from a_index | eval a=b', ['Unknown column [b]']); - testErrorsAndWarnings('from a_index | eval a=b, ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - 'Unknown column [b]', - ]); - testErrorsAndWarnings('from a_index | eval a=round', ['Unknown column [round]']); - testErrorsAndWarnings('from a_index | eval a=round(', [ - "SyntaxError: no viable alternative at input 'round('", - ]); - testErrorsAndWarnings('from a_index | eval a=round(numberField) ', []); - testErrorsAndWarnings('from a_index | eval a=round(numberField), ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('from a_index | eval a=round(numberField) + round(numberField) ', []); - testErrorsAndWarnings('from a_index | eval a=round(numberField) + round(stringField) ', [ - 'Argument of [round] must be [number], found value [stringField] type [string]', - ]); - testErrorsAndWarnings( - 'from a_index | eval a=round(numberField) + round(stringField), numberField ', - ['Argument of [round] must be [number], found value [stringField] type [string]'] - ); - testErrorsAndWarnings( - 'from a_index | eval a=round(numberField) + round(numberField), numberField ', - [] - ); - testErrorsAndWarnings( - 'from a_index | eval a=round(numberField) + round(numberField), b = numberField ', - [] - ); - - testErrorsAndWarnings('from a_index | eval a=[1, 2, 3]', []); - testErrorsAndWarnings('from a_index | eval a=[true, false]', []); - testErrorsAndWarnings('from a_index | eval a=["a", "b"]', []); - testErrorsAndWarnings('from a_index | eval a=null', []); - - for (const field of fieldTypes) { - testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS NULL`, []); - testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS null`, []); - testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field is null`, []); - testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field is NULL`, []); - testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS NOT NULL`, []); - testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS NOT null`, []); - testErrorsAndWarnings(`from a_index | eval ${camelCase(field)}Field IS not NULL`, []); - } - - for (const nesting of NESTED_DEPTHS) { - for (const evenOp of ['-', '+']) { - for (const oddOp of ['-', '+']) { - // This builds a combination of +/- operators - // i.e. ---- something, -+-+ something, +-+- something, etc... - const unaryCombination = Array(nesting) - .fill('- ') - .map((_, i) => (i % 2 ? oddOp : evenOp)) - .join(''); - testErrorsAndWarnings(`from a_index | eval ${unaryCombination} numberField`, []); - testErrorsAndWarnings(`from a_index | eval a=${unaryCombination} numberField`, []); - testErrorsAndWarnings(`from a_index | eval a=${unaryCombination} round(numberField)`, []); - testErrorsAndWarnings(`from a_index | eval 1 + ${unaryCombination} numberField`, []); - // still valid - testErrorsAndWarnings(`from a_index | eval 1 ${unaryCombination} numberField`, []); - } - } - - testErrorsAndWarnings( - `from a_index | eval ${Array(nesting).fill('not ').join('')} booleanField`, - [] - ); - } - - for (const wrongOp of ['*', '/', '%']) { - testErrorsAndWarnings(`from a_index | eval ${wrongOp}+ numberField`, [ - `SyntaxError: extraneous input '${wrongOp}' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, - ]); - } - - for (const { name, alias, signatures, ...defRest } of statsAggregationFunctionDefinitions) { - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - testErrorsAndWarnings( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [`EVAL does not support function ${name}`] - ); - - testErrorsAndWarnings( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - } > 0`, - [`EVAL does not support function ${name}`] - ); - - testErrorsAndWarnings( - `from a_index | eval ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [`EVAL does not support function ${name}`] - ); - - testErrorsAndWarnings( - `from a_index | eval ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - } > 0`, - [`EVAL does not support function ${name}`] - ); - } - } - - for (const { name, alias, signatures, ...defRest } of evalFunctionsDefinitions) { - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - testErrorsAndWarnings( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMapping, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [] - ); - testErrorsAndWarnings( - `from a_index | eval ${ - getFunctionSignatures( - { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration - }`, - [] - ); - if (params.some(({ literalOnly }) => literalOnly)) { - const fieldReplacedType = params - .filter(({ literalOnly }) => literalOnly) - .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(({ literalOnly, ...rest }) => rest) - ); - testErrorsAndWarnings( - `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; - - testErrorsAndWarnings(`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". - // auto_bucket and 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') && - !['auto_bucket', 'to_version'].includes(name) - ) { - // now test nested functions - const fieldMappingWithNestedFunctions = getFieldMapping(params, { - useNestedFunction: true, - useLiterals: true, - }); - testErrorsAndWarnings( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithNestedFunctions, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }` - ); - - const { wrongFieldMapping, expectedErrors } = generateWrongMappingForArgs( - name, - signatures, - params, - { stringField: 'stringField', numberField: 'numberField', booleanField: 'booleanField' } - ); - testErrorsAndWarnings( - `from a_index | eval ${ - getFunctionSignatures( - { name, ...defRest, signatures: [{ params: wrongFieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration - }`, - expectedErrors - ); - - if (!signRest.minParams) { - // test that additional args are spotted - const fieldMappingWithOneExtraArg = getFieldMapping(params).concat({ - name: 'extraArg', - type: 'number', - }); - const refSignature = signatures[0]; - // get the expected args from the first signature in case of errors - const minNumberOfArgs = refSignature.params.filter(({ optional }) => !optional).length; - const fullNumberOfArgs = refSignature.params.length; - const hasOptionalArgs = minNumberOfArgs < fullNumberOfArgs; - const hasTooManyArgs = fieldMappingWithOneExtraArg.length > fullNumberOfArgs; - - // 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 '; - } - testErrorsAndWarnings( - `from a_index | eval ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithOneExtraArg, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [ - `Error: [${name}] function expects ${messageQuantifier}${ - fullNumberOfArgs === 1 - ? 'one argument' - : fullNumberOfArgs === 0 - ? '0 arguments' - : `${fullNumberOfArgs} arguments` - }, got ${fieldMappingWithOneExtraArg.length}.`, - ] - ); - } - } - - // test that wildcard won't work as arg - if (fieldMapping.length === 1 && !signRest.minParams) { - const fieldMappingWithWildcard = [...fieldMapping]; - fieldMappingWithWildcard[0].name = '*'; - - testErrorsAndWarnings( - `from a_index | eval var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithWildcard, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - [`Using wildcards (*) in ${name} is not allowed`] - ); - } - } - } - testErrorsAndWarnings( - 'from a_index | eval log10(-1)', - [], - ['Log of a negative number results in null: -1'] - ); - testErrorsAndWarnings( - 'from a_index | eval log(-1)', - [], - ['Log of a negative number results in null: -1'] - ); - testErrorsAndWarnings( - 'from a_index | eval log(-1, 20)', - [], - ['Log of a negative number results in null: -1'] - ); - testErrorsAndWarnings( - 'from a_index | eval log(-1, -20)', - [], - [ - 'Log of a negative number results in null: -1', - 'Log of a negative number results in null: -20', - ] - ); - testErrorsAndWarnings( - 'from a_index | eval var0 = log(-1, -20)', - [], - [ - 'Log of a negative number results in null: -1', - 'Log of a negative number results in null: -20', - ] - ); - for (const op of ['>', '>=', '<', '<=', '==']) { - testErrorsAndWarnings(`from a_index | eval numberField ${op} 0`, []); - testErrorsAndWarnings(`from a_index | eval NOT numberField ${op} 0`, []); - testErrorsAndWarnings(`from a_index | eval (numberField ${op} 0)`, []); - testErrorsAndWarnings(`from a_index | eval (NOT (numberField ${op} 0))`, []); - testErrorsAndWarnings(`from a_index | eval 1 ${op} 0`, []); - testErrorsAndWarnings(`from a_index | eval stringField ${op} 0`, [ - `Argument of [${op}] must be [number], found value [stringField] type [string]`, - ]); - } - for (const op of ['+', '-', '*', '/', '%']) { - testErrorsAndWarnings(`from a_index | eval numberField ${op} 1`, []); - testErrorsAndWarnings(`from a_index | eval (numberField ${op} 1)`, []); - testErrorsAndWarnings(`from a_index | eval 1 ${op} 1`, []); - } - for (const divideByZeroExpr of ['1/0', 'var = 1/0', '1 + 1/0']) { - testErrorsAndWarnings( - `from a_index | eval ${divideByZeroExpr}`, - [], - ['Cannot divide by zero: 1/0'] - ); - } - for (const divideByZeroExpr of ['1%0', 'var = 1%0', '1 + 1%0']) { - testErrorsAndWarnings( - `from a_index | eval ${divideByZeroExpr}`, - [], - ['Module by zero can return null value: 1%0'] - ); - } - for (const op of ['like', 'rlike']) { - testErrorsAndWarnings(`from a_index | eval stringField ${op} "?a"`, []); - testErrorsAndWarnings(`from a_index | eval stringField NOT ${op} "?a"`, []); - testErrorsAndWarnings(`from a_index | eval NOT stringField ${op} "?a"`, []); - testErrorsAndWarnings(`from a_index | eval NOT stringField NOT ${op} "?a"`, []); - testErrorsAndWarnings(`from a_index | eval numberField ${op} "?a"`, [ - `Argument of [${op}] must be [string], found value [numberField] type [number]`, - ]); - testErrorsAndWarnings(`from a_index | eval numberField NOT ${op} "?a"`, [ - `Argument of [not_${op}] must be [string], found value [numberField] type [number]`, - ]); - testErrorsAndWarnings(`from a_index | eval NOT numberField ${op} "?a"`, [ - `Argument of [${op}] must be [string], found value [numberField] type [number]`, - ]); - testErrorsAndWarnings(`from a_index | eval NOT numberField NOT ${op} "?a"`, [ - `Argument of [not_${op}] must be [string], found value [numberField] type [number]`, - ]); - } - // test lists - testErrorsAndWarnings('from a_index | eval 1 in (1, 2, 3)', []); - testErrorsAndWarnings('from a_index | eval numberField in (1, 2, 3)', []); - testErrorsAndWarnings('from a_index | eval numberField not in (1, 2, 3)', []); - testErrorsAndWarnings('from a_index | eval numberField not in (1, 2, 3, numberField)', []); - testErrorsAndWarnings('from a_index | eval 1 in (1, 2, 3, round(numberField))', []); - testErrorsAndWarnings('from a_index | eval "a" in ("a", "b", "c")', []); - testErrorsAndWarnings('from a_index | eval stringField in ("a", "b", "c")', []); - testErrorsAndWarnings('from a_index | eval stringField not in ("a", "b", "c")', []); - testErrorsAndWarnings( - 'from a_index | eval stringField not in ("a", "b", "c", stringField)', - [] - ); - testErrorsAndWarnings('from a_index | eval 1 in ("a", "b", "c")', [ - 'Argument of [in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', - ]); - testErrorsAndWarnings('from a_index | eval numberField in ("a", "b", "c")', [ - 'Argument of [in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', - ]); - testErrorsAndWarnings('from a_index | eval numberField not in ("a", "b", "c")', [ - 'Argument of [not_in] must be [number[]], found value [("a", "b", "c")] type [(string, string, string)]', - ]); - testErrorsAndWarnings('from a_index | eval numberField not in (1, 2, 3, stringField)', [ - 'Argument of [not_in] must be [number[]], found value [(1, 2, 3, stringField)] type [(number, number, number, string)]', - ]); - - testErrorsAndWarnings('from a_index | eval avg(numberField)', [ - 'EVAL does not support function avg', - ]); - testErrorsAndWarnings( - 'from a_index | stats avg(numberField) | eval `avg(numberField)` + 1', - [] - ); - testErrorsAndWarnings('from a_index | eval not', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - 'Error: [not] function expects exactly one argument, got 0.', - ]); - testErrorsAndWarnings('from a_index | eval in', [ - "SyntaxError: mismatched input 'in' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - - testErrorsAndWarnings('from a_index | eval stringField in stringField', [ - "SyntaxError: missing '(' at 'stringField'", - "SyntaxError: mismatched input '' expecting {',', ')'}", - ]); - - testErrorsAndWarnings('from a_index | eval stringField in stringField)', [ - "SyntaxError: missing '(' at 'stringField'", - 'Error: [in] function expects exactly 2 arguments, got 1.', - ]); - testErrorsAndWarnings('from a_index | eval stringField not in stringField', [ - "SyntaxError: missing '(' at 'stringField'", - "SyntaxError: mismatched input '' expecting {',', ')'}", - ]); - - describe('date math', () => { - testErrorsAndWarnings('from a_index | eval 1 anno', [ - 'EVAL does not support [date_period] in expression [1 anno]', - ]); - testErrorsAndWarnings('from a_index | eval var = 1 anno', [ - "Unexpected time interval qualifier: 'anno'", - ]); - testErrorsAndWarnings('from a_index | eval now() + 1 anno', [ - "Unexpected time interval qualifier: 'anno'", - ]); - for (const timeLiteral of timeLiterals) { - testErrorsAndWarnings(`from a_index | eval 1 ${timeLiteral.name}`, [ - `EVAL does not support [date_period] in expression [1 ${timeLiteral.name}]`, - ]); - testErrorsAndWarnings(`from a_index | eval 1 ${timeLiteral.name}`, [ - `EVAL does not support [date_period] in expression [1 ${timeLiteral.name}]`, - ]); - - // this is not possible for now - // testErrorsAndWarnings(`from a_index | eval var = 1 ${timeLiteral.name}`, [ - // `Eval does not support [date_period] in expression [1 ${timeLiteral.name}]`, - // ]); - testErrorsAndWarnings(`from a_index | eval var = now() - 1 ${timeLiteral.name}`, []); - testErrorsAndWarnings(`from a_index | eval var = dateField - 1 ${timeLiteral.name}`, []); - testErrorsAndWarnings( - `from a_index | eval var = dateField - 1 ${timeLiteral.name.toUpperCase()}`, - [] - ); - testErrorsAndWarnings( - `from a_index | eval var = dateField - 1 ${capitalize(timeLiteral.name)}`, - [] - ); - testErrorsAndWarnings(`from a_index | eval var = dateField + 1 ${timeLiteral.name}`, []); - testErrorsAndWarnings(`from a_index | eval 1 ${timeLiteral.name} + 1 year`, [ - `Argument of [+] must be [date], found value [1 ${timeLiteral.name}] type [duration]`, - ]); - for (const op of ['*', '/', '%']) { - testErrorsAndWarnings(`from a_index | eval var = now() ${op} 1 ${timeLiteral.name}`, [ - `Argument of [${op}] must be [number], found value [now()] type [date]`, - `Argument of [${op}] must be [number], found value [1 ${timeLiteral.name}] type [duration]`, - ]); - } - } - }); - }); - - describe('stats', () => { - testErrorsAndWarnings('from a_index | stats ', [ - 'At least one aggregation or grouping expression required in [STATS]', - ]); - testErrorsAndWarnings('from a_index | stats by stringField', []); - testErrorsAndWarnings('from a_index | stats by ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('from a_index | stats numberField ', [ - 'Expected an aggregate function or group but got [numberField] of type [FieldAttribute]', - ]); - testErrorsAndWarnings('from a_index | stats numberField=', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('from a_index | stats numberField=5 by ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('from a_index | stats avg(numberField) by wrongField', [ - 'Unknown column [wrongField]', - ]); - testErrorsAndWarnings('from a_index | stats avg(numberField) by wrongField + 1', [ - 'Unknown column [wrongField]', - ]); - testErrorsAndWarnings('from a_index | stats avg(numberField) by var0 = wrongField + 1', [ - 'Unknown column [wrongField]', - ]); - testErrorsAndWarnings('from a_index | stats avg(numberField) by 1', []); - testErrorsAndWarnings('from a_index | stats avg(numberField) by percentile(numberField)', [ - 'STATS BY does not support function percentile', - ]); - testErrorsAndWarnings('from a_index | stats count(`numberField`)', []); - - for (const subCommand of ['keep', 'drop', 'eval']) { - testErrorsAndWarnings( - `from a_index | stats count(\`numberField\`) | ${subCommand} \`count(\`\`numberField\`\`)\` `, - [] - ); - } - - testErrorsAndWarnings( - 'from a_index | stats avg(numberField) by stringField, percentile(numberField) by ipField', - [ - "SyntaxError: mismatched input 'by' expecting ", - 'STATS BY does not support function percentile', - ] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(numberField), percentile(numberField, 50) by ipField', - [] - ); - - testErrorsAndWarnings( - 'from a_index | stats avg(numberField), percentile(numberField, 50) BY ipField', - [] - ); - for (const op of ['+', '-', '*', '/', '%']) { - testErrorsAndWarnings( - `from a_index | stats avg(numberField) ${op} percentile(numberField, 50) BY ipField`, - [] - ); - } - testErrorsAndWarnings('from a_index | stats count(* + 1) BY ipField', [ - "SyntaxError: no viable alternative at input 'count(* +'", - ]); - testErrorsAndWarnings('from a_index | stats count(* + round(numberField)) BY ipField', [ - "SyntaxError: no viable alternative at input 'count(* +'", - ]); - testErrorsAndWarnings('from a_index | stats count(round(*)) BY ipField', [ - 'Using wildcards (*) in round is not allowed', - ]); - testErrorsAndWarnings('from a_index | stats count(count(*)) BY ipField', [ - `Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [count(*)] of type [number]`, - ]); - testErrorsAndWarnings('from a_index | stats numberField + 1', [ - 'At least one aggregation function required in [STATS], found [numberField+1]', - ]); - - for (const nesting of NESTED_DEPTHS) { - const moreBuiltinWrapping = Array(nesting).fill('+1').join(''); - testErrorsAndWarnings(`from a_index | stats 5 + avg(numberField) ${moreBuiltinWrapping}`, []); - testErrorsAndWarnings(`from a_index | stats 5 ${moreBuiltinWrapping} + avg(numberField)`, []); - testErrorsAndWarnings(`from a_index | stats 5 ${moreBuiltinWrapping} + numberField`, [ - `At least one aggregation function required in [STATS], found [5${moreBuiltinWrapping}+numberField]`, - ]); - testErrorsAndWarnings(`from a_index | stats 5 + numberField ${moreBuiltinWrapping}`, [ - `At least one aggregation function required in [STATS], found [5+numberField${moreBuiltinWrapping}]`, - ]); - testErrorsAndWarnings( - `from a_index | stats 5 + numberField ${moreBuiltinWrapping}, var0 = sum(numberField)`, - [ - `At least one aggregation function required in [STATS], found [5+numberField${moreBuiltinWrapping}]`, - ] - ); - const evalFnWrapping = Array(nesting).fill('round(').join(''); - const closingWrapping = Array(nesting).fill(')').join(''); - // stress test the validation of the nesting check here - testErrorsAndWarnings( - `from a_index | stats ${evalFnWrapping} sum(numberField) ${closingWrapping}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats ${evalFnWrapping} sum(numberField) ${closingWrapping} + ${evalFnWrapping} sum(numberField) ${closingWrapping}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats ${evalFnWrapping} numberField + sum(numberField) ${closingWrapping}`, - [ - `Cannot combine aggregation and non-aggregation values in [STATS], found [${evalFnWrapping}numberField+sum(numberField)${closingWrapping}]`, - ] - ); - testErrorsAndWarnings( - `from a_index | stats ${evalFnWrapping} numberField + sum(numberField) ${closingWrapping}, var0 = sum(numberField)`, - [ - `Cannot combine aggregation and non-aggregation values in [STATS], found [${evalFnWrapping}numberField+sum(numberField)${closingWrapping}]`, - ] - ); - testErrorsAndWarnings( - `from a_index | stats var0 = ${evalFnWrapping} numberField + sum(numberField) ${closingWrapping}, var1 = sum(numberField)`, - [ - `Cannot combine aggregation and non-aggregation values in [STATS], found [${evalFnWrapping}numberField+sum(numberField)${closingWrapping}]`, - ] - ); - testErrorsAndWarnings( - `from a_index | stats ${evalFnWrapping} sum(numberField + numberField) ${closingWrapping}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats ${evalFnWrapping} sum(numberField + round(numberField)) ${closingWrapping}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats ${evalFnWrapping} sum(numberField + round(numberField)) ${closingWrapping} + ${evalFnWrapping} sum(numberField + round(numberField)) ${closingWrapping}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats sum(${evalFnWrapping} numberField ${closingWrapping} )`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats sum(${evalFnWrapping} numberField ${closingWrapping} ) + sum(${evalFnWrapping} numberField ${closingWrapping} )`, - [] - ); - } - - testErrorsAndWarnings('from a_index | stats 5 + numberField + 1', [ - 'At least one aggregation function required in [STATS], found [5+numberField+1]', - ]); - - testErrorsAndWarnings('from a_index | stats numberField + 1 by ipField', [ - 'At least one aggregation function required in [STATS], found [numberField+1]', - ]); - - testErrorsAndWarnings( - 'from a_index | stats avg(numberField), percentile(numberField, 50) + 1 by ipField', - [] - ); - - testErrorsAndWarnings('from a_index | stats count(*)', []); - testErrorsAndWarnings('from a_index | stats count()', []); - testErrorsAndWarnings('from a_index | stats var0 = count(*)', []); - testErrorsAndWarnings('from a_index | stats var0 = count()', []); - testErrorsAndWarnings('from a_index | stats var0 = avg(numberField), count(*)', []); - testErrorsAndWarnings('from a_index | stats var0 = avg(fn(number)), count(*)', [ - 'Unknown function [fn]', - ]); - - // test all not allowed combinations - testErrorsAndWarnings('from a_index | STATS sum( numberField ) + abs( numberField ) ', [ - 'Cannot combine aggregation and non-aggregation values in [STATS], found [sum(numberField)+abs(numberField)]', - ]); - testErrorsAndWarnings('from a_index | STATS abs( numberField + sum( numberField )) ', [ - 'Cannot combine aggregation and non-aggregation values in [STATS], found [abs(numberField+sum(numberField))]', - ]); - - for (const { name, alias, signatures, ...defRest } of statsAggregationFunctionDefinitions) { - for (const { params, ...signRest } of signatures) { - const fieldMapping = getFieldMapping(params); - - const correctSignature = getFunctionSignatures( - { name, ...defRest, signatures: [{ params: fieldMapping, ...signRest }] }, - { withTypes: false } - )[0].declaration; - testErrorsAndWarnings(`from a_index | stats var = ${correctSignature}`, []); - testErrorsAndWarnings(`from a_index | stats ${correctSignature}`, []); - - if (signRest.returnType === 'number') { - testErrorsAndWarnings(`from a_index | stats var = round(${correctSignature})`, []); - testErrorsAndWarnings(`from a_index | stats round(${correctSignature})`, []); - testErrorsAndWarnings( - `from a_index | stats var = round(${correctSignature}) + ${correctSignature}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats round(${correctSignature}) + ${correctSignature}`, - [] - ); - } - - if (params.some(({ literalOnly }) => literalOnly)) { - const fieldReplacedType = params - .filter(({ literalOnly }) => literalOnly) - .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(({ literalOnly, ...rest }) => rest) - ); - testErrorsAndWarnings( - `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; - - testErrorsAndWarnings(`from a_index | stats var = ${signatureStringWithAlias}`, []); - } - } - - // test only numeric functions for now - if (params[0].type === 'number') { - const nestedBuiltin = 'numberField / 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( numberField / 2 ) - testErrorsAndWarnings(`from a_index | stats ${fnSignatureWithBuiltinString}`, []); - testErrorsAndWarnings(`from a_index | stats var0 = ${fnSignatureWithBuiltinString}`, []); - testErrorsAndWarnings( - `from a_index | stats avg(numberField), ${fnSignatureWithBuiltinString}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats avg(numberField), var0 = ${fnSignatureWithBuiltinString}`, - [] - ); - - const nestedEvalAndBuiltin = 'round(numberField / 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(numberField / 2) ) - testErrorsAndWarnings(`from a_index | stats ${fnSignatureWithEvalAndBuiltinString}`, []); - testErrorsAndWarnings( - `from a_index | stats var0 = ${fnSignatureWithEvalAndBuiltinString}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats avg(numberField), ${fnSignatureWithEvalAndBuiltinString}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats avg(numberField), var0 = ${fnSignatureWithEvalAndBuiltinString}`, - [] - ); - // from a_index | STATS aggFn(round(numberField / 2) ) BY round(numberField / 2) - testErrorsAndWarnings( - `from a_index | stats ${fnSignatureWithEvalAndBuiltinString} by ${nestedEvalAndBuiltin}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats var0 = ${fnSignatureWithEvalAndBuiltinString} by var1 = ${nestedEvalAndBuiltin}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats avg(numberField), ${fnSignatureWithEvalAndBuiltinString} by ${nestedEvalAndBuiltin}, ipField`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats avg(numberField), var0 = ${fnSignatureWithEvalAndBuiltinString} by var1 = ${nestedEvalAndBuiltin}, ipField`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats avg(numberField), ${fnSignatureWithEvalAndBuiltinString} by ${nestedEvalAndBuiltin}, ${nestedBuiltin}`, - [] - ); - testErrorsAndWarnings( - `from a_index | stats avg(numberField), 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". - // auto_bucket and 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') && - !['auto_bucket', 'to_version'].includes(name) - ) { - // now test nested functions - const fieldMappingWithNestedAggsFunctions = getFieldMapping(params, { - useNestedFunction: true, - useLiterals: false, - }); - const nestedAggsExpectedErrors = params - .filter(({ literalOnly }) => !literalOnly) - .map( - (_) => - `Aggregate function's parameters must be an attribute, literal or a non-aggregation function; found [avg(numberField)] of type [number]` - ); - testErrorsAndWarnings( - `from a_index | stats var = ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithNestedAggsFunctions, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - nestedAggsExpectedErrors - ); - testErrorsAndWarnings( - `from a_index | stats ${ - getFunctionSignatures( - { - name, - ...defRest, - signatures: [{ params: fieldMappingWithNestedAggsFunctions, ...signRest }], - }, - { withTypes: false } - )[0].declaration - }`, - nestedAggsExpectedErrors - ); - const { wrongFieldMapping, expectedErrors } = generateWrongMappingForArgs( - name, - signatures, - params, - { stringField: 'stringField', numberField: 'numberField', booleanField: 'booleanField' } - ); - // and the message is case of wrong argument type is passed - testErrorsAndWarnings( - `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 = '*'; - - testErrorsAndWarnings( - `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`] - ); - } - } - } - } - testErrorsAndWarnings( - `FROM index - | EVAL numberField * 3.281 - | STATS avg_numberField = AVG(\`numberField * 3.281\`)`, - [] - ); - - testErrorsAndWarnings( - `FROM index | STATS AVG(numberField) by round(numberField) + 1 | EVAL \`round(numberField) + 1\` / 2`, - [] - ); - }); - - describe('sort', () => { - testErrorsAndWarnings('from a_index | sort ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('from a_index | sort "field" ', []); - testErrorsAndWarnings('from a_index | sort wrongField ', ['Unknown column [wrongField]']); - testErrorsAndWarnings('from a_index | sort numberField, ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", - ]); - testErrorsAndWarnings('from a_index | sort numberField, stringField', []); - for (const dir of ['desc', 'asc']) { - testErrorsAndWarnings(`from a_index | sort "field" ${dir} `, []); - testErrorsAndWarnings(`from a_index | sort numberField ${dir} `, []); - testErrorsAndWarnings(`from a_index | sort numberField ${dir} nulls `, [ - "SyntaxError: missing {'first', 'last'} at ''", - ]); - for (const nullDir of ['first', 'last']) { - testErrorsAndWarnings(`from a_index | sort numberField ${dir} nulls ${nullDir}`, []); - testErrorsAndWarnings(`from a_index | sort numberField ${dir} ${nullDir}`, [ - `SyntaxError: extraneous input '${nullDir}' expecting `, - ]); - } - } - for (const nullDir of ['first', 'last']) { - testErrorsAndWarnings(`from a_index | sort numberField nulls ${nullDir}`, []); - testErrorsAndWarnings(`from a_index | sort numberField ${nullDir}`, [ - `SyntaxError: extraneous input '${nullDir}' expecting `, - ]); - } - testErrorsAndWarnings(`row a = 1 | stats COUNT(*) | sort \`COUNT(*)\``, []); - testErrorsAndWarnings(`ROW a = 1 | STATS couNt(*) | SORT \`couNt(*)\``, []); - }); - - describe('enrich', () => { - testErrorsAndWarnings(`from a_index | enrich`, [ - "SyntaxError: missing ENRICH_POLICY_NAME at ''", - ]); - testErrorsAndWarnings(`from a_index | enrich _`, ['Unknown policy [_]']); - testErrorsAndWarnings(`from a_index | enrich _:`, [ - "SyntaxError: token recognition error at: ':'", - 'Unknown policy [_]', - ]); - testErrorsAndWarnings(`from a_index | enrich _:policy`, [ - 'Unrecognized value [_] for ENRICH, mode needs to be one of [_ANY, _COORDINATOR, _REMOTE]', - ]); - testErrorsAndWarnings(`from a_index | enrich :policy`, [ - "SyntaxError: token recognition error at: ':'", - ]); - testErrorsAndWarnings(`from a_index | enrich any:`, [ - "SyntaxError: token recognition error at: ':'", - 'Unknown policy [any]', - ]); - testErrorsAndWarnings(`from a_index | enrich _any:`, [ - "SyntaxError: token recognition error at: ':'", - 'Unknown policy [_any]', - ]); - testErrorsAndWarnings(`from a_index | enrich any:policy`, [ - 'Unrecognized value [any] for ENRICH, mode needs to be one of [_ANY, _COORDINATOR, _REMOTE]', - ]); - testErrorsAndWarnings(`from a_index | enrich policy `, []); - testErrorsAndWarnings('from a_index | enrich `this``is fine`', [ - "SyntaxError: mismatched input '`this``is fine`' expecting ENRICH_POLICY_NAME", - ]); - testErrorsAndWarnings('from a_index | enrich this is fine', [ - "SyntaxError: mismatched input 'is' expecting ", - 'Unknown policy [this]', - ]); - for (const value of ['any', 'coordinator', 'remote']) { - testErrorsAndWarnings(`from a_index | enrich _${value}:policy `, []); - testErrorsAndWarnings(`from a_index | enrich _${value} : policy `, [ - "SyntaxError: token recognition error at: ':'", - "SyntaxError: extraneous input 'policy' expecting ", - `Unknown policy [_${value}]`, - ]); - testErrorsAndWarnings(`from a_index | enrich _${value}: policy `, [ - "SyntaxError: token recognition error at: ':'", - "SyntaxError: extraneous input 'policy' expecting ", - `Unknown policy [_${value}]`, - ]); - testErrorsAndWarnings(`from a_index | enrich _${camelCase(value)}:policy `, []); - testErrorsAndWarnings(`from a_index | enrich _${value.toUpperCase()}:policy `, []); - } - - testErrorsAndWarnings(`from a_index | enrich _unknown:policy`, [ - 'Unrecognized value [_unknown] for ENRICH, mode needs to be one of [_ANY, _COORDINATOR, _REMOTE]', - ]); - testErrorsAndWarnings(`from a_index |enrich missing-policy `, [ - 'Unknown policy [missing-policy]', - ]); - testErrorsAndWarnings(`from a_index |enrich policy on `, [ - "SyntaxError: missing ID_PATTERN at ''", - ]); - testErrorsAndWarnings(`from a_index | enrich policy on b `, ['Unknown column [b]']); - - testErrorsAndWarnings('from a_index | enrich policy on `this``is fine`', [ - 'Unknown column [this`is fine]', - ]); - testErrorsAndWarnings('from a_index | enrich policy on this is fine', [ - "SyntaxError: mismatched input 'is' expecting ", - 'Unknown column [this]', - ]); - testErrorsAndWarnings(`from a_index | enrich policy on stringField with `, [ - "SyntaxError: mismatched input '' expecting ID_PATTERN", - ]); - testErrorsAndWarnings(`from a_index | enrich policy on stringField with var0 `, [ - 'Unknown column [var0]', - ]); - testErrorsAndWarnings(`from a_index |enrich policy on numberField with var0 = `, [ - "SyntaxError: missing ID_PATTERN at ''", - 'Unknown column [var0]', - ]); - testErrorsAndWarnings(`from a_index | enrich policy on stringField with var0 = c `, [ - 'Unknown column [var0]', - `Unknown column [c]`, - ]); - // need to re-enable once the fields/variables become location aware - // testErrorsAndWarnings(`from a_index | enrich policy on stringField with var0 = stringField `, [ - // `Unknown column [stringField]`, - // ]); - testErrorsAndWarnings(`from a_index |enrich policy on numberField with var0 = , `, [ - "SyntaxError: missing ID_PATTERN at ','", - "SyntaxError: mismatched input '' expecting ID_PATTERN", - 'Unknown column [var0]', - ]); - testErrorsAndWarnings( - `from a_index | enrich policy on stringField with var0 = otherField, var1 `, - ['Unknown column [var1]'] - ); - testErrorsAndWarnings( - `from a_index | enrich policy on stringField with var0 = otherField `, - [] - ); - testErrorsAndWarnings( - `from a_index | enrich policy on stringField with var0 = otherField, yetAnotherField `, - [] - ); - testErrorsAndWarnings( - `from a_index |enrich policy on numberField with var0 = otherField, var1 = `, - ["SyntaxError: missing ID_PATTERN at ''", 'Unknown column [var1]'] - ); - - testErrorsAndWarnings( - `from a_index | enrich policy on stringField with var0 = otherField, var1 = yetAnotherField`, - [] - ); - testErrorsAndWarnings( - 'from a_index | enrich policy on stringField with var0 = otherField, `this``is fine` = yetAnotherField', - [] - ); - testErrorsAndWarnings(`from a_index | enrich policy with `, [ - "SyntaxError: mismatched input '' expecting ID_PATTERN", - ]); - testErrorsAndWarnings(`from a_index | enrich policy with otherField`, []); - testErrorsAndWarnings(`from a_index | enrich policy | eval otherField`, []); - testErrorsAndWarnings(`from a_index | enrich policy with var0 = otherField | eval var0`, []); - testErrorsAndWarnings('from a_index | enrich my-pol*', [ - 'Using wildcards (*) in ENRICH is not allowed [my-pol*]', - ]); - }); - - describe('shadowing', () => { - testErrorsAndWarnings( - 'from a_index | eval stringField = 5', - [], - ['Column [stringField] of type string has been overwritten as new type: number'] - ); - testErrorsAndWarnings( - 'from a_index | eval numberField = "5"', - [], - ['Column [numberField] of type number has been overwritten as new type: string'] - ); - }); - - describe('quoting and escaping expressions', () => { - function getTicks(amount: number) { - return Array(amount).fill('`').join(''); - } - /** - * Given an initial quoted expression, build a new quoted expression - * that appends as many +1 to the previous one based on the nesting level - * i.e. given the expression `round(...) + 1` returns - * ```round(...) + 1`` + 1` (for nesting 1) - * ```````round(...) + 1```` + 1`` + 1` (for nesting 2) - * etc... - * Note how backticks double for each level + wrapping quotes - * The general rule follows an exponential curve given a nesting N: - * (`){ (2^N)-1 } ticks expression (`){ 2^N-1 } +1 (`){ 2^N-2 } +1 ... +1 - * - * Mind that nesting arg here is equivalent to N-1 - */ - function buildNestedExpression(expr: string, nesting: number) { - const openingTicks = getTicks(Math.pow(2, nesting + 1) - 1); - const firstClosingBatch = getTicks(Math.pow(2, nesting)); - const additionalPlusOneswithTicks = Array(nesting) - .fill(' + 1') - .reduce((acc, plusOneAppended, i) => { - // workout how many ticks to add: 2^N-i - const ticks = getTicks(Math.pow(2, nesting - 1 - i)); - return `${acc}${plusOneAppended}${ticks}`; - }, ''); - const ret = `${openingTicks}${expr}${firstClosingBatch}${additionalPlusOneswithTicks}`; - return ret; - } - - for (const nesting of NESTED_DEPTHS) { - // start with a quotable expression - const expr = 'round(numberField) + 1'; - const startingQuery = `from a_index | eval ${expr}`; - // now pipe for each nesting level a new eval command that appends a +1 to the previous quoted expression - const finalQuery = `${startingQuery} | ${Array(nesting) - .fill('') - .map((_, i) => { - return `eval ${buildNestedExpression(expr, i)} + 1`; - }) - .join(' | ')} | keep ${buildNestedExpression(expr, nesting)}`; - testErrorsAndWarnings(finalQuery, []); - } - }); - - describe('callbacks', () => { - it(`should not fetch source and fields list when a row command is set`, async () => { - const callbackMocks = getCallbackMocks(); - await validateAst(`row a = 1 | eval a`, getAstAndErrors, callbackMocks); - expect(callbackMocks.getFieldsFor).not.toHaveBeenCalled(); - expect(callbackMocks.getSources).not.toHaveBeenCalled(); - }); - - it(`should not fetch policies if no enrich command is found`, async () => { - const callbackMocks = getCallbackMocks(); - await validateAst(`row a = 1 | eval a`, getAstAndErrors, callbackMocks); - expect(callbackMocks.getPolicies).not.toHaveBeenCalled(); - }); - - it(`should not fetch source and fields for empty command`, async () => { - const callbackMocks = getCallbackMocks(); - await validateAst(` `, getAstAndErrors, callbackMocks); - expect(callbackMocks.getFieldsFor).not.toHaveBeenCalled(); - expect(callbackMocks.getSources).not.toHaveBeenCalled(); - }); - - it(`should skip initial source and fields call but still call fields for enriched policy`, async () => { - const callbackMocks = getCallbackMocks(); - await validateAst(`row a = 1 | eval b = a | enrich policy`, getAstAndErrors, callbackMocks); - expect(callbackMocks.getSources).not.toHaveBeenCalled(); - expect(callbackMocks.getPolicies).toHaveBeenCalled(); - expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(1); - expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ - query: `from enrich_index | keep otherField, yetAnotherField`, - }); - }); - - it('should call fields callbacks also for meta command', async () => { - const callbackMocks = getCallbackMocks(); - await validateAst(`meta functions | keep name`, getAstAndErrors, callbackMocks); - expect(callbackMocks.getSources).not.toHaveBeenCalled(); - expect(callbackMocks.getPolicies).not.toHaveBeenCalled(); - expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(1); - expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ - query: 'meta functions', - }); - }); - - it('should call fields callbacks also for show command', async () => { - const callbackMocks = getCallbackMocks(); - await validateAst(`show info | keep name`, getAstAndErrors, callbackMocks); - expect(callbackMocks.getSources).not.toHaveBeenCalled(); - expect(callbackMocks.getPolicies).not.toHaveBeenCalled(); - expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(1); - expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ - query: 'show info', - }); - }); - - it(`should fetch additional fields if an enrich command is found`, async () => { - const callbackMocks = getCallbackMocks(); - await validateAst( - `from a_index | eval b = a | enrich policy`, - getAstAndErrors, - callbackMocks - ); - expect(callbackMocks.getSources).toHaveBeenCalled(); - expect(callbackMocks.getPolicies).toHaveBeenCalled(); - expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(2); - expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ - query: `from enrich_index | keep otherField, yetAnotherField`, - }); - }); - - it(`should not crash if no callbacks are available`, async () => { - try { - await validateAst( - `from a_index | eval b = a | enrich policy | dissect stringField "%{firstWord}"`, - getAstAndErrors, - { - getFieldsFor: undefined, - getSources: undefined, - getPolicies: undefined, - getMetaFields: undefined, - } - ); - } catch { - fail('Should not throw'); - } - }); - - it(`should not crash if no callbacks are passed`, async () => { - try { - await validateAst( - `from a_index | eval b = a | enrich policy | dissect stringField "%{firstWord}"`, - getAstAndErrors - ); - } catch { - fail('Should not throw'); - } - }); - }); -}); diff --git a/packages/kbn-monaco/src/esql/lib/converters/actions.ts b/packages/kbn-monaco/src/esql/lib/converters/actions.ts new file mode 100644 index 0000000000000..3028395102535 --- /dev/null +++ b/packages/kbn-monaco/src/esql/lib/converters/actions.ts @@ -0,0 +1,40 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { CodeAction } from '@kbn/esql-validation-autocomplete'; +import { monaco } from '../../../monaco_imports'; +import { MonacoCodeAction } from '../types'; +import { wrapAsMonacoMessages } from './positions'; + +export function wrapAsMonacoCodeActions( + model: monaco.editor.ITextModel, + actions: CodeAction[] +): MonacoCodeAction[] { + const queryString = model.getValue(); + const uri = model.uri; + return actions.map((action) => { + const [error] = wrapAsMonacoMessages(queryString, action.diagnostics); + return { + title: action.title, + diagnostics: [error], + kind: action.kind, + edit: { + edits: action.edits.map((edit) => { + return { + resource: uri, + textEdit: { + range: error, + text: edit.text, + }, + versionId: undefined, + }; + }), + }, + }; + }); +} diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/monaco_utils.ts b/packages/kbn-monaco/src/esql/lib/converters/positions.ts similarity index 62% rename from packages/kbn-monaco/src/esql/lib/ast/shared/monaco_utils.ts rename to packages/kbn-monaco/src/esql/lib/converters/positions.ts index 4e7cf2cee7d8a..10805bc1319a1 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/monaco_utils.ts +++ b/packages/kbn-monaco/src/esql/lib/converters/positions.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import { EditorError } from '../../../../types'; -import { monaco } from '../../../../monaco_imports'; -import { ESQLMessage } from '../types'; +import type { EditorError, ESQLMessage } from '@kbn/esql-ast'; +import type { MonacoEditorError } from '../../../types'; +import { monaco } from '../../../monaco_imports'; // from linear offset to Monaco position export function offsetToRowColumn(expression: string, offset: number): monaco.Position { @@ -26,19 +26,28 @@ export function offsetToRowColumn(expression: string, offset: number): monaco.Po throw new Error('Algorithm failure'); } -export function wrapAsMonacoMessage( - type: 'error' | 'warning', - code: string, +function convertSeverityToMonacoKind(severity: 'error' | 'warning' | number) { + if (typeof severity === 'number') return severity; + return severity === 'error' ? monaco.MarkerSeverity.Error : monaco.MarkerSeverity.Warning; +} + +export function wrapAsMonacoMessages( + queryString: string, messages: Array -): EditorError[] { +): MonacoEditorError[] { const fallbackPosition = { column: 0, lineNumber: 0 }; return messages.map((e) => { if ('severity' in e) { - return e; + return { + ...e, + severity: convertSeverityToMonacoKind(e.severity), + }; } - const startPosition = e.location ? offsetToRowColumn(code, e.location.min) : fallbackPosition; + const startPosition = e.location + ? offsetToRowColumn(queryString, e.location.min) + : fallbackPosition; const endPosition = e.location - ? offsetToRowColumn(code, e.location.max || 0) + ? offsetToRowColumn(queryString, e.location.max || 0) : fallbackPosition; return { message: e.text, @@ -46,7 +55,7 @@ export function wrapAsMonacoMessage( startLineNumber: startPosition.lineNumber, endColumn: endPosition.column + 1, endLineNumber: endPosition.lineNumber, - severity: type === 'error' ? monaco.MarkerSeverity.Error : monaco.MarkerSeverity.Warning, + severity: convertSeverityToMonacoKind(e.type), _source: 'client' as const, code: e.code, }; diff --git a/packages/kbn-monaco/src/esql/lib/converters/suggestions.ts b/packages/kbn-monaco/src/esql/lib/converters/suggestions.ts new file mode 100644 index 0000000000000..0d02a19dda070 --- /dev/null +++ b/packages/kbn-monaco/src/esql/lib/converters/suggestions.ts @@ -0,0 +1,34 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { SuggestionRawDefinition } from '@kbn/esql-validation-autocomplete'; +import { monaco } from '../../../monaco_imports'; +import { MonacoAutocompleteCommandDefinition } from '../types'; + +export function wrapAsMonacoSuggestions( + suggestions: SuggestionRawDefinition[] +): MonacoAutocompleteCommandDefinition[] { + return suggestions.map( + ({ label, text, asSnippet, kind, detail, documentation, sortText, command }) => ({ + label, + insertText: text, + kind: + kind in monaco.languages.CompletionItemKind + ? monaco.languages.CompletionItemKind[kind] + : monaco.languages.CompletionItemKind.Method, // fallback to Method + detail, + documentation, + sortText, + command, + insertTextRules: asSnippet + ? monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet + : undefined, + range: undefined as unknown as monaco.IRange, + }) + ); +} diff --git a/packages/kbn-monaco/src/esql/lib/monaco/esql_ast_provider.ts b/packages/kbn-monaco/src/esql/lib/esql_ast_provider.ts similarity index 67% rename from packages/kbn-monaco/src/esql/lib/monaco/esql_ast_provider.ts rename to packages/kbn-monaco/src/esql/lib/esql_ast_provider.ts index d968d79e7c32e..4b4d54de39e8b 100644 --- a/packages/kbn-monaco/src/esql/lib/monaco/esql_ast_provider.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_ast_provider.ts @@ -5,16 +5,19 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - -import type { ESQLCallbacks } from '../ast/shared/types'; -import { monaco } from '../../../monaco_imports'; -import type { ESQLWorker } from '../../worker/esql_worker'; -import { suggest } from '../ast/autocomplete/autocomplete'; -import { getHoverItem } from '../ast/hover/hover'; -import { getSignatureHelp } from '../ast/signature'; -import { validateAst } from '../ast/validation/validation'; -import { getActions } from '../ast/code_actions/actions'; -import { wrapAsMonacoMessage } from '../ast/shared/monaco_utils'; +import type { EditorError } from '@kbn/esql-ast'; +import { + type ESQLCallbacks, + getActions, + suggest, + validateQuery, +} from '@kbn/esql-validation-autocomplete'; +import { monaco } from '../../monaco_imports'; +import type { ESQLWorker } from '../worker/esql_worker'; +import { wrapAsMonacoMessages } from './converters/positions'; +import { getHoverItem } from './hover/hover'; +import { monacoPositionToOffset } from './shared/utils'; +import { getSignatureHelp } from './signature'; export class ESQLAstAdapter { constructor( @@ -34,13 +37,10 @@ export class ESQLAstAdapter { async validate(model: monaco.editor.ITextModel, code: string) { const getAstFn = await this.getAstWorker(model); - const { errors, warnings } = await validateAst( - code ?? model.getValue(), - getAstFn, - this.callbacks - ); - const monacoErrors = wrapAsMonacoMessage('error', code, errors); - const monacoWarnings = wrapAsMonacoMessage('warning', code, warnings); + const text = code ?? model.getValue(); + const { errors, warnings } = await validateQuery(text, getAstFn, undefined, this.callbacks); + const monacoErrors = wrapAsMonacoMessages(text, errors); + const monacoWarnings = wrapAsMonacoMessages(text, warnings); return { errors: monacoErrors, warnings: monacoWarnings }; } @@ -68,7 +68,9 @@ export class ESQLAstAdapter { context: monaco.languages.CompletionContext ) { const getAstFn = await this.getAstWorker(model); - const suggestionEntries = await suggest(model, position, context, getAstFn, this.callbacks); + const fullText = model.getValue(); + const offset = monacoPositionToOffset(fullText, position); + const suggestionEntries = await suggest(fullText, offset, context, getAstFn, this.callbacks); return { suggestions: suggestionEntries.map((suggestion) => ({ ...suggestion, @@ -83,7 +85,12 @@ export class ESQLAstAdapter { context: monaco.languages.CodeActionContext ) { const getAstFn = await this.getAstWorker(model); - const codeActions = await getActions(model, range, context, getAstFn, this.callbacks); + const codeActions = await getActions( + model.getValue(), + context.markers as EditorError[], + getAstFn, + this.callbacks + ); return codeActions; } } diff --git a/packages/kbn-monaco/src/esql/lib/monaco/esql_line_tokens.ts b/packages/kbn-monaco/src/esql/lib/esql_line_tokens.ts similarity index 93% rename from packages/kbn-monaco/src/esql/lib/monaco/esql_line_tokens.ts rename to packages/kbn-monaco/src/esql/lib/esql_line_tokens.ts index 0148884f9bf8b..c7a148509ebde 100644 --- a/packages/kbn-monaco/src/esql/lib/monaco/esql_line_tokens.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_line_tokens.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { monaco } from '../../../monaco_imports'; +import { monaco } from '../../monaco_imports'; import { ESQLState } from './esql_state'; /** @internal **/ diff --git a/packages/kbn-monaco/src/esql/lib/monaco/esql_state.ts b/packages/kbn-monaco/src/esql/lib/esql_state.ts similarity index 94% rename from packages/kbn-monaco/src/esql/lib/monaco/esql_state.ts rename to packages/kbn-monaco/src/esql/lib/esql_state.ts index d69702ff926f4..1b616ef289df7 100644 --- a/packages/kbn-monaco/src/esql/lib/monaco/esql_state.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_state.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { monaco } from '../../../monaco_imports'; +import { monaco } from '../../monaco_imports'; /** @internal **/ export class ESQLState implements monaco.languages.IState { diff --git a/packages/kbn-monaco/src/esql/lib/monaco/esql_theme.ts b/packages/kbn-monaco/src/esql/lib/esql_theme.ts similarity index 88% rename from packages/kbn-monaco/src/esql/lib/monaco/esql_theme.ts rename to packages/kbn-monaco/src/esql/lib/esql_theme.ts index c6a06d048e699..dcd1519db4dec 100644 --- a/packages/kbn-monaco/src/esql/lib/monaco/esql_theme.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_theme.ts @@ -7,15 +7,11 @@ */ import { euiThemeVars, darkMode } from '@kbn/ui-theme'; -import { ESQL_TOKEN_POSTFIX } from '../constants'; -import { monaco } from '../../../monaco_imports'; +import { themeRuleGroupBuilderFactory } from '../../common/theme'; +import { ESQL_TOKEN_POSTFIX } from './constants'; +import { monaco } from '../../monaco_imports'; -const buildRuleGroup = (tokens: string[], color: string, isBold: boolean = false) => - tokens.map((i) => ({ - token: i + ESQL_TOKEN_POSTFIX, - foreground: color, - fontStyle: isBold ? 'bold' : '', - })); +const buildRuleGroup = themeRuleGroupBuilderFactory(ESQL_TOKEN_POSTFIX); export const buildESQlTheme = (): monaco.editor.IStandaloneThemeData => ({ base: darkMode ? 'vs-dark' : 'vs', diff --git a/packages/kbn-monaco/src/esql/lib/monaco/esql_token.ts b/packages/kbn-monaco/src/esql/lib/esql_token.ts similarity index 85% rename from packages/kbn-monaco/src/esql/lib/monaco/esql_token.ts rename to packages/kbn-monaco/src/esql/lib/esql_token.ts index 82058e68788f8..7db77c8b2061f 100644 --- a/packages/kbn-monaco/src/esql/lib/monaco/esql_token.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_token.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import { monaco } from '../../../monaco_imports'; -import { ESQL_TOKEN_POSTFIX } from '../constants'; +import { monaco } from '../../monaco_imports'; +import { ESQL_TOKEN_POSTFIX } from './constants'; /** @internal **/ export class ESQLToken implements monaco.languages.IToken { diff --git a/packages/kbn-monaco/src/esql/lib/monaco/esql_token_helpers.ts b/packages/kbn-monaco/src/esql/lib/esql_token_helpers.ts similarity index 86% rename from packages/kbn-monaco/src/esql/lib/monaco/esql_token_helpers.ts rename to packages/kbn-monaco/src/esql/lib/esql_token_helpers.ts index 497344dd606c4..e77b9ccfe6e40 100644 --- a/packages/kbn-monaco/src/esql/lib/monaco/esql_token_helpers.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_token_helpers.ts @@ -6,9 +6,12 @@ * Side Public License, v 1. */ -import { monaco } from '../../../monaco_imports'; -import { nonNullable } from '../ast/ast_helpers'; -import { ESQL_TOKEN_POSTFIX } from '../constants'; +import { monaco } from '../../monaco_imports'; +import { ESQL_TOKEN_POSTFIX } from './constants'; + +function nonNullable(value: T | undefined): value is T { + return value != null; +} export function enrichTokensWithFunctionsMetadata( tokens: monaco.languages.IToken[] diff --git a/packages/kbn-monaco/src/esql/lib/monaco/esql_tokens_provider.ts b/packages/kbn-monaco/src/esql/lib/esql_tokens_provider.ts similarity index 92% rename from packages/kbn-monaco/src/esql/lib/monaco/esql_tokens_provider.ts rename to packages/kbn-monaco/src/esql/lib/esql_tokens_provider.ts index 35689e0b56694..378e86cbfb27d 100644 --- a/packages/kbn-monaco/src/esql/lib/monaco/esql_tokens_provider.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_tokens_provider.ts @@ -7,15 +7,14 @@ */ import { CharStreams, type Token } from 'antlr4'; -import { monaco } from '../../../monaco_imports'; -import { ESQLErrorListener } from './esql_error_listener'; +import { getLexer, ESQLErrorListener } from '@kbn/esql-ast'; +import { monaco } from '../../monaco_imports'; import { ESQLToken } from './esql_token'; import { ESQLLineTokens } from './esql_line_tokens'; import { ESQLState } from './esql_state'; -import { getLexer } from '../antlr_facade'; -import { ESQL_TOKEN_POSTFIX } from '../constants'; +import { ESQL_TOKEN_POSTFIX } from './constants'; import { enrichTokensWithFunctionsMetadata } from './esql_token_helpers'; const EOF = -1; diff --git a/packages/kbn-monaco/src/esql/lib/ast/hover/hover.test.ts b/packages/kbn-monaco/src/esql/lib/hover/hover.test.ts similarity index 85% rename from packages/kbn-monaco/src/esql/lib/ast/hover/hover.test.ts rename to packages/kbn-monaco/src/esql/lib/hover/hover.test.ts index c2a28f28ba3d6..2aba87123b480 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/hover/hover.test.ts +++ b/packages/kbn-monaco/src/esql/lib/hover/hover.test.ts @@ -6,15 +6,14 @@ * Side Public License, v 1. */ -import { monaco } from '../../../../monaco_imports'; -import { CharStreams } from 'antlr4'; -import { getParser, ROOT_STATEMENT } from '../../antlr_facade'; -import { ESQLErrorListener } from '../../monaco/esql_error_listener'; -import { AstListener } from '../ast_factory'; +import { monaco } from '../../../monaco_imports'; import { getHoverItem } from './hover'; -import { getFunctionDefinition } from '../shared/helpers'; -import { getFunctionSignatures } from '../definitions/helpers'; -import { enrichModes } from '../definitions/settings'; +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import { + ENRICH_MODES, + getFunctionDefinition, + getFunctionSignatures, +} from '@kbn/esql-validation-autocomplete'; const fields: Array<{ name: string; type: string; suggestedAs?: string }> = [ ...['string', 'number', 'date', 'boolean', 'ip'].map((type) => ({ @@ -88,16 +87,6 @@ function createModelAndPosition(text: string, string: string) { } describe('hover', () => { - const getAstAndErrors = async (text: string) => { - const errorListener = new ESQLErrorListener(); - const parseListener = new AstListener(); - const parser = getParser(CharStreams.fromString(text), errorListener, parseListener); - - parser[ROOT_STATEMENT](); - - return { ...parseListener.getAst(), errors: [] }; - }; - type TestArgs = [ string, string, @@ -135,7 +124,7 @@ describe('hover', () => { model, position, token, - async (text) => (text ? await getAstAndErrors(text) : { ast: [], errors: [] }), + async (text) => (text ? await getAstAndSyntaxErrors(text) : { ast: [], errors: [] }), callbackMocks ); expect(contents.map(({ value }) => value)).toEqual(expected); @@ -190,11 +179,11 @@ describe('hover', () => { testSuggestions(`from a | enrich policy on b `, 'non-policy', createPolicyContent); describe('ccq mode', () => { - for (const mode of enrichModes.values) { + for (const mode of ENRICH_MODES.values) { testSuggestions( - `from a | enrich ${enrichModes.prefix || ''}${mode.name}:policy`, - `${enrichModes.prefix || ''}${mode.name}`, - () => [enrichModes.description, `**${mode.name}**: ${mode.description}`] + `from a | enrich ${ENRICH_MODES.prefix || ''}${mode.name}:policy`, + `${ENRICH_MODES.prefix || ''}${mode.name}`, + () => [ENRICH_MODES.description, `**${mode.name}**: ${mode.description}`] ); } }); diff --git a/packages/kbn-monaco/src/esql/lib/ast/hover/hover.ts b/packages/kbn-monaco/src/esql/lib/hover/hover.ts similarity index 88% rename from packages/kbn-monaco/src/esql/lib/ast/hover/hover.ts rename to packages/kbn-monaco/src/esql/lib/hover/hover.ts index bcc2f8c76ec8a..f9f307b0298cf 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/hover/hover.ts +++ b/packages/kbn-monaco/src/esql/lib/hover/hover.ts @@ -7,19 +7,19 @@ */ import { i18n } from '@kbn/i18n'; -import type { monaco } from '../../../../monaco_imports'; -import { getFunctionSignatures } from '../definitions/helpers'; -import { getAstContext } from '../shared/context'; +import type { AstProviderFn } from '@kbn/esql-ast'; import { - monacoPositionToOffset, + getAstContext, getFunctionDefinition, + getFunctionSignatures, isSourceItem, isSettingItem, getCommandDefinition, -} from '../shared/helpers'; -import { getPolicyHelper } from '../shared/resources_helpers'; -import { ESQLCallbacks } from '../shared/types'; -import type { AstProviderFn } from '../types'; + type ESQLCallbacks, + getPolicyHelper, +} from '@kbn/esql-validation-autocomplete'; +import type { monaco } from '../../../monaco_imports'; +import { monacoPositionToOffset } from '../shared/utils'; export async function getHoverItem( model: monaco.editor.ITextModel, diff --git a/packages/kbn-monaco/src/esql/lib/monaco/index.ts b/packages/kbn-monaco/src/esql/lib/index.ts similarity index 100% rename from packages/kbn-monaco/src/esql/lib/monaco/index.ts rename to packages/kbn-monaco/src/esql/lib/index.ts diff --git a/packages/kbn-monaco/src/esql/lib/shared/utils.ts b/packages/kbn-monaco/src/esql/lib/shared/utils.ts new file mode 100644 index 0000000000000..9f2d6d4f22545 --- /dev/null +++ b/packages/kbn-monaco/src/esql/lib/shared/utils.ts @@ -0,0 +1,21 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { monaco } from '../../../monaco_imports'; + +// From Monaco position to linear offset +export function monacoPositionToOffset(expression: string, position: monaco.Position): number { + const lines = expression.split(/\n/); + return lines + .slice(0, position.lineNumber) + .reduce( + (prev, current, index) => + prev + (index === position.lineNumber - 1 ? position.column - 1 : current.length + 1), + 0 + ); +} diff --git a/packages/kbn-monaco/src/esql/lib/ast/signature/index.ts b/packages/kbn-monaco/src/esql/lib/signature/index.ts similarity index 86% rename from packages/kbn-monaco/src/esql/lib/ast/signature/index.ts rename to packages/kbn-monaco/src/esql/lib/signature/index.ts index a3202591a9c7a..c858394479dc5 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/signature/index.ts +++ b/packages/kbn-monaco/src/esql/lib/signature/index.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import type { monaco } from '../../../../monaco_imports'; -import type { AstProviderFn } from '../types'; +import type { AstProviderFn } from '@kbn/esql-ast'; +import type { monaco } from '../../../monaco_imports'; export function getSignatureHelp( model: monaco.editor.ITextModel, diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/types.ts b/packages/kbn-monaco/src/esql/lib/types.ts similarity index 70% rename from packages/kbn-monaco/src/esql/lib/ast/autocomplete/types.ts rename to packages/kbn-monaco/src/esql/lib/types.ts index ad6428fcbc771..6bd51a1690067 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/types.ts +++ b/packages/kbn-monaco/src/esql/lib/types.ts @@ -6,16 +6,9 @@ * Side Public License, v 1. */ -import { monaco } from '../../../../..'; +import { monaco } from '../../monaco_imports'; -/** @internal **/ -export interface UserDefinedVariables { - userDefined: string[]; - policies: string[]; -} - -/** @internal **/ -export type AutocompleteCommandDefinition = Pick< +export type MonacoAutocompleteCommandDefinition = Pick< monaco.languages.CompletionItem, | 'label' | 'insertText' @@ -25,4 +18,7 @@ export type AutocompleteCommandDefinition = Pick< | 'sortText' | 'insertTextRules' | 'command' + | 'range' >; + +export type MonacoCodeAction = monaco.languages.CodeAction; diff --git a/packages/kbn-monaco/src/esql/worker/esql_worker.ts b/packages/kbn-monaco/src/esql/worker/esql_worker.ts index 537b08d9702aa..89ab95aa8cd21 100644 --- a/packages/kbn-monaco/src/esql/worker/esql_worker.ts +++ b/packages/kbn-monaco/src/esql/worker/esql_worker.ts @@ -7,11 +7,28 @@ */ import { CharStreams } from 'antlr4'; +import { + getAstAndSyntaxErrors, + getParser, + ROOT_STATEMENT, + ESQLErrorListener, + type EditorError, +} from '@kbn/esql-ast'; import type { monaco } from '../../monaco_imports'; import type { BaseWorkerDefinition } from '../../types'; -import { getParser, ROOT_STATEMENT } from '../lib/antlr_facade'; -import { AstListener } from '../lib/ast/ast_factory'; -import { ESQLErrorListener } from '../lib/monaco/esql_error_listener'; + +/** + * While this function looks similar to the wrapAsMonacoMessages one, it prevents from + * loading the whole monaco stuff within the WebWorker. + * Given that we're dealing only with EditorError objects here, and not other types, it is + * possible to use this simpler inline function to work. + */ +function inlineToMonacoErrors({ severity, ...error }: EditorError) { + return { + ...error, + severity: severity === 'error' ? 8 : 4, // monaco.MarkerSeverity.Error : monaco.MarkerSeverity.Warning + }; +} export class ESQLWorker implements BaseWorkerDefinition { private readonly _ctx: monaco.worker.IWorkerContext; @@ -38,26 +55,16 @@ export class ESQLWorker implements BaseWorkerDefinition { parser[ROOT_STATEMENT](); - return errorListener.getErrors(); + return errorListener.getErrors().map(inlineToMonacoErrors); } return []; } async getAst(text: string | undefined) { - if (!text) { - return { ast: [], errors: [] }; - } - const inputStream = CharStreams.fromString(text); - const errorListener = new ESQLErrorListener(); - const parserListener = new AstListener(); - const parser = getParser(inputStream, errorListener, parserListener); - - parser[ROOT_STATEMENT](); - - const { ast } = parserListener.getAst(); + const rawAst = await getAstAndSyntaxErrors(text); return { - ast, - errors: errorListener.getErrors(), + ast: rawAst.ast, + errors: rawAst.errors.map(inlineToMonacoErrors), }; } } diff --git a/packages/kbn-monaco/src/painless/worker/lib/parser.ts b/packages/kbn-monaco/src/painless/worker/lib/parser.ts index f33ca8b7e4667..eb7fa13cbdbbb 100644 --- a/packages/kbn-monaco/src/painless/worker/lib/parser.ts +++ b/packages/kbn-monaco/src/painless/worker/lib/parser.ts @@ -9,14 +9,14 @@ import { CommonTokenStream, CharStreams } from 'antlr4'; import { default as PainlessParser, SourceContext } from '../../antlr/painless_parser'; import { PainlessLexerEnhanced } from './lexer'; -import { EditorError } from '../../../types'; +import { MonacoEditorError } from '../../../types'; import { ANTLRErrorListener } from '../../../common/error_listener'; const parse = ( code: string ): { source: SourceContext; - errors: EditorError[]; + errors: MonacoEditorError[]; } => { const inputStream = CharStreams.fromString(code); const lexer = new PainlessLexerEnhanced(inputStream); @@ -30,7 +30,7 @@ const parse = ( lexer.addErrorListener(painlessLangErrorListener); parser.addErrorListener(painlessLangErrorListener); - const errors: EditorError[] = painlessLangErrorListener.getErrors(); + const errors: MonacoEditorError[] = painlessLangErrorListener.getErrors(); return { source: parser.source(), @@ -38,7 +38,7 @@ const parse = ( }; }; -export const parseAndGetSyntaxErrors = (code: string): EditorError[] => { +export const parseAndGetSyntaxErrors = (code: string): MonacoEditorError[] => { const { errors } = parse(code); return errors; }; diff --git a/packages/kbn-monaco/src/register_globals.ts b/packages/kbn-monaco/src/register_globals.ts index 8b12b34866a98..dc69e2ceaa8b0 100644 --- a/packages/kbn-monaco/src/register_globals.ts +++ b/packages/kbn-monaco/src/register_globals.ts @@ -13,7 +13,7 @@ import { monaco } from './monaco_imports'; import { ESQL_THEME_ID, ESQLLang, buildESQlTheme } from './esql'; import { YAML_LANG_ID } from './yaml'; import { registerLanguage, registerTheme } from './helpers'; -import { ConsoleLang } from './console'; +import { ConsoleLang, CONSOLE_THEME_ID, buildConsoleTheme } from './console'; export const DEFAULT_WORKER_ID = 'default'; const langSpecificWorkerIds = [ @@ -38,6 +38,7 @@ registerLanguage(ConsoleLang); * Register custom themes */ registerTheme(ESQL_THEME_ID, buildESQlTheme()); +registerTheme(CONSOLE_THEME_ID, buildConsoleTheme()); const monacoBundleDir = (window as any).__kbnPublicPath__?.['kbn-monaco']; diff --git a/packages/kbn-monaco/src/types.ts b/packages/kbn-monaco/src/types.ts index e2268caab771f..5a4d3c1793031 100644 --- a/packages/kbn-monaco/src/types.ts +++ b/packages/kbn-monaco/src/types.ts @@ -41,7 +41,7 @@ export interface CustomLangModuleType onLanguage: () => void; } -export interface EditorError { +export interface MonacoEditorError { severity: monaco.MarkerSeverity; startLineNumber: number; startColumn: number; @@ -54,13 +54,13 @@ export interface EditorError { export interface LangValidation { isValidating: boolean; isValid: boolean; - errors: EditorError[]; + errors: MonacoEditorError[]; } export interface SyntaxErrors { - [modelId: string]: EditorError[]; + [modelId: string]: MonacoEditorError[]; } export interface BaseWorkerDefinition { - getSyntaxErrors: (modelUri: string) => Promise; + getSyntaxErrors: (modelUri: string) => Promise; } diff --git a/packages/kbn-monaco/src/xjson/lexer_rules/xjson.ts b/packages/kbn-monaco/src/xjson/lexer_rules/xjson.ts index f2ab22f8c97df..e028ff38bb2af 100644 --- a/packages/kbn-monaco/src/xjson/lexer_rules/xjson.ts +++ b/packages/kbn-monaco/src/xjson/lexer_rules/xjson.ts @@ -8,16 +8,11 @@ import { monaco } from '../../monaco_imports'; -import { globals } from './shared'; +import { globals } from '../../common/lexer_rules'; -export const lexerRules: monaco.languages.IMonarchLanguage = { - ...(globals as any), - - defaultToken: 'invalid', - tokenPostfix: '', - - tokenizer: { - root: [ +export const buildXjsonRules = (root: string = 'root') => { + return { + [root]: [ [ /("(?:[^"]*_)?script"|"inline"|"source")(\s*?)(:)(\s*?)(""")/, [ @@ -106,7 +101,15 @@ export const lexerRules: monaco.languages.IMonarchLanguage = { [/\\""""/, { token: 'punctuation.end_triple_quote', next: '@pop' }], [/./, { token: 'multi_string' }], ], - }, + }; +}; +export const lexerRules: monaco.languages.IMonarchLanguage = { + ...(globals as any), + + defaultToken: 'invalid', + tokenPostfix: '', + + tokenizer: { ...buildXjsonRules() }, }; export const languageConfiguration: monaco.languages.LanguageConfiguration = { diff --git a/packages/kbn-monaco/tsconfig.json b/packages/kbn-monaco/tsconfig.json index f6ce023d74c67..4df3aa9b486b3 100644 --- a/packages/kbn-monaco/tsconfig.json +++ b/packages/kbn-monaco/tsconfig.json @@ -25,6 +25,8 @@ "@kbn/i18n", "@kbn/repo-info", "@kbn/ui-theme", + "@kbn/esql-ast", + "@kbn/esql-validation-autocomplete" ], "exclude": [ "target/**/*", diff --git a/packages/kbn-panel-loader/index.tsx b/packages/kbn-panel-loader/index.tsx index 475ffebacc7a2..710f4cafb7249 100644 --- a/packages/kbn-panel-loader/index.tsx +++ b/packages/kbn-panel-loader/index.tsx @@ -10,7 +10,11 @@ import React from 'react'; import { EuiLoadingChart, EuiPanel } from '@elastic/eui'; import { css } from '@emotion/react'; -export const PanelLoader = (props: { showShadow?: boolean; dataTestSubj?: string }) => { +export const PanelLoader = (props: { + showShadow?: boolean; + showBorder?: boolean; + dataTestSubj?: string; +}) => { return ( diff --git a/packages/kbn-securitysolution-io-ts-alerting-types/src/threat_mapping/index.test.ts b/packages/kbn-securitysolution-io-ts-alerting-types/src/threat_mapping/index.test.ts index fb5db89dbb229..3ebc7331aef71 100644 --- a/packages/kbn-securitysolution-io-ts-alerting-types/src/threat_mapping/index.test.ts +++ b/packages/kbn-securitysolution-io-ts-alerting-types/src/threat_mapping/index.test.ts @@ -37,12 +37,11 @@ describe('threat_mapping', () => { }); test('it should fail validation with an extra entry item', () => { - const payload: ThreatMappingEntries & Array<{ extra: string }> = [ + const payload: Array = [ { field: 'field.one', type: 'mapping', value: 'field.one', - // @ts-expect-error upgrade typescript v4.9.5 extra: 'blah', }, ]; @@ -112,7 +111,7 @@ describe('threat_mapping', () => { }); test('it should fail validate with an extra key', () => { - const payload: ThreatMapping & Array<{ extra: string }> = [ + const payload: Array = [ { entries: [ { @@ -121,7 +120,6 @@ describe('threat_mapping', () => { value: 'field.one', }, ], - // @ts-expect-error upgrade typescript v4.9.5 extra: 'invalid', }, ]; @@ -135,14 +133,13 @@ describe('threat_mapping', () => { }); test('it should fail validate with an extra inner entry', () => { - const payload: ThreatMapping & Array<{ entries: Array<{ extra: string }> }> = [ + const payload: Array }> = [ { entries: [ { field: 'field.one', type: 'mapping', value: 'field.one', - // @ts-expect-error upgrade typescript v4.9.5 extra: 'blah', }, ], diff --git a/packages/kbn-securitysolution-utils/src/add_remove_id_to_item/index.ts b/packages/kbn-securitysolution-utils/src/add_remove_id_to_item/index.ts index d08b2f54e6e7e..7dff865312829 100644 --- a/packages/kbn-securitysolution-utils/src/add_remove_id_to_item/index.ts +++ b/packages/kbn-securitysolution-utils/src/add_remove_id_to_item/index.ts @@ -19,8 +19,7 @@ import { v4 as uuidv4 } from 'uuid'; */ type NotArray = T extends unknown[] ? never : T; export const addIdToItem = (item: NotArray): T => { - // @ts-expect-error upgrade typescript v4.9.5 - const maybeId: typeof item & { id?: string } = item; + const maybeId = item as typeof item & { id?: string }; if (maybeId.id != null) { return item; } else { @@ -42,8 +41,7 @@ export const removeIdFromItem = ( }, Exclude > => { - // @ts-expect-error upgrade typescript v4.9.5 - const maybeId: typeof item & { id?: string } = item; + const maybeId = item as typeof item & { id?: string }; if (maybeId.id != null) { const { id, ...noId } = maybeId; return noId; diff --git a/packages/kbn-text-based-editor/kibana.jsonc b/packages/kbn-text-based-editor/kibana.jsonc index c9d3b8a2996ca..1046c18b094e7 100644 --- a/packages/kbn-text-based-editor/kibana.jsonc +++ b/packages/kbn-text-based-editor/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-browser", "id": "@kbn/text-based-editor", - "owner": "@elastic/kibana-visualizations", + "owner": "@elastic/kibana-esql", } \ No newline at end of file diff --git a/packages/kbn-visualization-ui-components/components/chart_switch_trigger.tsx b/packages/kbn-visualization-ui-components/components/chart_switch_trigger.tsx index 183d1ee48574f..bdd6d03fae28f 100644 --- a/packages/kbn-visualization-ui-components/components/chart_switch_trigger.tsx +++ b/packages/kbn-visualization-ui-components/components/chart_switch_trigger.tsx @@ -17,13 +17,11 @@ export const ChartSwitchTrigger = function ({ icon, onClick, dataTestSubj, - size = 's', }: { label: string; icon?: IconType; onClick: () => void; dataTestSubj?: string; - size?: 's' | 'm'; }) { return ( - ) : ( - - ) - } + label={} /> ); }; -const ChartSwitchLabel = function ({ label, icon }: { label: string; icon?: IconType }) { - return ( - <> - {icon && } - {label} - - ); -}; - const LayerChartSwitchLabel = function ({ label, icon }: { label: string; icon?: IconType }) { return ( diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index 3a692ef7a5f7e..97358bb006ed4 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -86,7 +86,7 @@ export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint '@elastic/ems-client@8.5.1': ['Elastic License 2.0'], - '@elastic/eui@93.4.0': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@93.5.1': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary '@bufbuild/protobuf@1.2.1': ['Apache-2.0'], // license (Apache-2.0 AND BSD-3-Clause) diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx index 4f637120e32c5..31f4aa328c282 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx +++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx @@ -9,7 +9,7 @@ import React, { FunctionComponent, useState } from 'react'; import { CodeEditor } from '@kbn/code-editor'; import { css } from '@emotion/react'; -import { CONSOLE_LANG_ID } from '@kbn/monaco'; +import { CONSOLE_LANG_ID, CONSOLE_THEME_ID } from '@kbn/monaco'; import { useEditorReadContext } from '../../../contexts'; export const MonacoEditor: FunctionComponent = () => { @@ -31,6 +31,7 @@ export const MonacoEditor: FunctionComponent = () => { options={{ fontSize: settings.fontSize, wordWrap: settings.wrapMode === true ? 'on' : 'off', + theme: CONSOLE_THEME_ID, }} /> diff --git a/src/plugins/console/public/application/models/legacy_core_editor/mode/input_highlight_rules.ts b/src/plugins/console/public/application/models/legacy_core_editor/mode/input_highlight_rules.ts index acf4b091c6b0f..e4ec266f002ee 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/mode/input_highlight_rules.ts +++ b/src/plugins/console/public/application/models/legacy_core_editor/mode/input_highlight_rules.ts @@ -31,11 +31,12 @@ export function addEOL( export const mergeTokens = (...args: any[]) => [].concat.apply([], args); const TextHighlightRules = ace.acequire('ace/mode/text_highlight_rules').TextHighlightRules; - +// translating this to monaco export class InputHighlightRules extends TextHighlightRules { constructor() { super(); this.$rules = { + // TODO 'start-sql': [ { token: 'whitespace', regex: '\\s+' }, { token: 'paren.lparen', regex: '{', next: 'json-sql', push: true }, @@ -43,16 +44,22 @@ export class InputHighlightRules extends TextHighlightRules { ], start: mergeTokens( [ + // done { token: 'warning', regex: '#!.*$' }, + // done { include: 'comments' }, + // done { token: 'paren.lparen', regex: '{', next: 'json', push: true }, ], + // done addEOL(['method'], /([a-zA-Z]+)/, 'start', 'method_sep'), [ + // done { token: 'whitespace', regex: '\\s+', }, + // done { token: 'text', regex: '.+?', @@ -60,39 +67,58 @@ export class InputHighlightRules extends TextHighlightRules { ] ), method_sep: mergeTokens( + // done addEOL( ['whitespace', 'url.protocol_host', 'url.slash'], /(\s+)(https?:\/\/[^?\/,]+)(\/)/, 'start', 'url' ), + // done addEOL(['whitespace', 'variable.template'], /(\s+)(\${\w+})/, 'start', 'url'), + // done addEOL(['whitespace', 'url.protocol_host'], /(\s+)(https?:\/\/[^?\/,]+)/, 'start', 'url'), + // done addEOL(['whitespace', 'url.slash'], /(\s+)(\/)/, 'start', 'url'), + // done addEOL(['whitespace'], /(\s+)/, 'start', 'url') ), url: mergeTokens( + // done addEOL(['variable.template'], /(\${\w+})/, 'start'), + // TODO addEOL(['url.part'], /(_sql)/, 'start-sql', 'url-sql'), + // done addEOL(['url.part'], /([^?\/,\s]+)/, 'start'), + // done addEOL(['url.comma'], /(,)/, 'start'), + // done addEOL(['url.slash'], /(\/)/, 'start'), + // done addEOL(['url.questionmark'], /(\?)/, 'start', 'urlParams'), + // done addEOL(['whitespace', 'comment.punctuation', 'comment.line'], /(\s+)(\/\/)(.*$)/, 'start') ), urlParams: mergeTokens( + // done addEOL(['url.param', 'url.equal', 'variable.template'], /([^&=]+)(=)(\${\w+})/, 'start'), + // done addEOL(['url.param', 'url.equal', 'url.value'], /([^&=]+)(=)([^&]*)/, 'start'), + // done addEOL(['url.param'], /([^&=]+)/, 'start'), + // done addEOL(['url.amp'], /(&)/, 'start'), + // done addEOL(['whitespace', 'comment.punctuation', 'comment.line'], /(\s+)(\/\/)(.*$)/, 'start') ), + // TODO 'url-sql': mergeTokens( addEOL(['url.part'], /([^?\/,\s]+)/, 'start-sql'), addEOL(['url.comma'], /(,)/, 'start-sql'), addEOL(['url.slash'], /(\/)/, 'start-sql'), addEOL(['url.questionmark'], /(\?)/, 'start-sql', 'urlParams-sql') ), + // TODO 'urlParams-sql': mergeTokens( addEOL(['url.param', 'url.equal', 'url.value'], /([^&=]+)(=)([^&]*)/, 'start-sql'), addEOL(['url.param'], /([^&=]+)/, 'start-sql'), @@ -108,27 +134,32 @@ export class InputHighlightRules extends TextHighlightRules { comments: [ { // Capture a line comment, indicated by # + // done token: ['comment.punctuation', 'comment.line'], regex: /(#)(.*$)/, }, { // Begin capturing a block comment, indicated by /* + // done token: 'comment.punctuation', regex: /\/\*/, push: [ { // Finish capturing a block comment, indicated by */ + // done token: 'comment.punctuation', regex: /\*\//, next: 'pop', }, { + // done defaultToken: 'comment.block', }, ], }, { // Capture a line comment, indicated by // + // done token: ['comment.punctuation', 'comment.line'], regex: /(\/\/)(.*$)/, }, diff --git a/src/plugins/controls/public/range_slider/components/range_slider.scss b/src/plugins/controls/public/range_slider/components/range_slider.scss index 33795ea6f5286..6d8d3f435f197 100644 --- a/src/plugins/controls/public/range_slider/components/range_slider.scss +++ b/src/plugins/controls/public/range_slider/components/range_slider.scss @@ -5,10 +5,11 @@ background-color: transparent; .euiFormControlLayout__childrenWrapper { + background-color: transparent; border-top-left-radius: 0; border-bottom-left-radius: 0; - border-top-right-radius: $euiBorderRadius - 1px; - border-bottom-right-radius: $euiBorderRadius - 1px; + border-top-right-radius: $euiBorderRadius; + border-bottom-right-radius: $euiBorderRadius; .euiFormControlLayoutDelimited__delimiter, .euiFormControlLayoutIcons--static { height: auto !important; diff --git a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx index be9545c31e21b..a041370185f66 100644 --- a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx @@ -22,6 +22,7 @@ import { } from '@kbn/presentation-publishing'; import { toMountPoint } from '@kbn/react-kibana-mount'; import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; +import { apiCanExpandPanels } from '@kbn/presentation-containers/interfaces/panel_management'; import { DASHBOARD_CONTAINER_TYPE } from '../dashboard_container'; import { DashboardPluginInternalFunctions } from '../dashboard_container/external_api/dashboard_api'; @@ -48,7 +49,8 @@ const apiIsCompatible = (api: unknown): api is CopyToDashboardAPI => { apiHasUniqueId(api) && apiHasParentApi(api) && apiIsOfType(api.parentApi, DASHBOARD_CONTAINER_TYPE) && - apiPublishesSavedObjectId(api.parentApi) + apiPublishesSavedObjectId(api.parentApi) && + !(apiCanExpandPanels(api.parentApi) && api.parentApi.expandedPanelId.getValue()) ); }; diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_panel.scss b/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_panel.scss index eb448412d1ae4..5a252f9bf1630 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_panel.scss +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_panel.scss @@ -26,10 +26,6 @@ .dshDashboardGrid__item--expanded, .dshDashboardGrid__item--blurred, .dshDashboardGrid__item--focused { - .embPanel { - border-color: transparent; - } - .embPanel--dragHandle:hover { background-color: unset; cursor: default; diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx index 7bbb29c3013e6..6667a5dd2f3be 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx @@ -56,6 +56,7 @@ export const Item = React.forwardRef( const container = useDashboardContainer(); const scrollToPanelId = container.select((state) => state.componentState.scrollToPanelId); const highlightPanelId = container.select((state) => state.componentState.highlightPanelId); + const useMargins = container.select((state) => state.explicitInput.useMargins); const panel = container.select((state) => state.explicitInput.panels[id]); const expandPanel = expandedPanelId !== undefined && expandedPanelId === id; @@ -97,10 +98,18 @@ export const Item = React.forwardRef( pointer-events: none; opacity: 0.25; ` - : css``; + : undefined; const renderedEmbeddable = useMemo(() => { const references = getReferencesForPanelId(id, container.savedObjectReferences); + + const panelProps = { + showBadges: true, + showBorder: useMargins, + showNotifications: true, + showShadow: false, + }; + // render React embeddable if (reactEmbeddableRegistryHasKey(type)) { return ( @@ -110,6 +119,7 @@ export const Item = React.forwardRef( parentApi={container} key={`${type}_${id}`} state={{ rawState: panel.explicitInput, version: panel.version, references }} + panelProps={panelProps} /> ); } @@ -118,14 +128,21 @@ export const Item = React.forwardRef( container.untilEmbeddableLoaded(id)} + {...panelProps} /> ); - }, [container, id, index, onPanelStatusChange, type, panel]); + }, [ + id, + container, + type, + index, + useMargins, + onPanelStatusChange, + panel.explicitInput, + panel.version, + ]); return (
({ + ...jest.requireActual('@elastic/eui'), EuiBasicTable: 'eui-basic-table', EuiButton: 'eui-button', EuiButtonEmpty: 'eui-button-empty', diff --git a/src/plugins/data_views/common/data_views/data_view.test.ts b/src/plugins/data_views/common/data_views/data_view.test.ts index 15a229832a489..5b5c4ebd879b2 100644 --- a/src/plugins/data_views/common/data_views/data_view.test.ts +++ b/src/plugins/data_views/common/data_views/data_view.test.ts @@ -573,10 +573,14 @@ describe('IndexPattern', () => { }, test2: { customLabel: 'test12', + customDescription: 'test12 description', }, test3: { count: 30, }, + test4: { + customDescription: 'test14 description', + }, }, }).toMinimalSpec().fieldAttrs ).toMatchInlineSnapshot(` @@ -585,10 +589,116 @@ describe('IndexPattern', () => { "customLabel": "test11", }, "test2": Object { + "customDescription": "test12 description", "customLabel": "test12", }, + "test4": Object { + "customDescription": "test14 description", + }, } `); }); + + test('can customize what attributes to keep', () => { + const fieldsMap = { + test1: { + name: 'test1', + type: 'keyword', + aggregatable: true, + searchable: true, + readFromDocValues: false, + }, + test2: { + name: 'test2', + type: 'keyword', + aggregatable: true, + searchable: true, + readFromDocValues: false, + }, + test3: { + name: 'test3', + type: 'keyword', + aggregatable: true, + searchable: true, + readFromDocValues: false, + }, + test4: { + name: 'test4', + type: 'keyword', + aggregatable: true, + searchable: true, + readFromDocValues: false, + }, + }; + + const spec = { + id: 'test', + title: 'test*', + fields: fieldsMap, + fieldAttrs: { + test1: { + count: 11, + customLabel: 'test11', + }, + test2: { + customLabel: 'test12', + customDescription: 'test12 description', + }, + test3: { + count: 30, + }, + test4: { + customDescription: 'test14 description', + }, + }, + }; + + expect(create('test', spec).toMinimalSpec({ keepFieldAttrs: ['customLabel'] }).fieldAttrs) + .toMatchInlineSnapshot(` + Object { + "test1": Object { + "customLabel": "test11", + }, + "test2": Object { + "customLabel": "test12", + }, + } + `); + + expect( + create('test', spec).toMinimalSpec({ keepFieldAttrs: ['customDescription'] }).fieldAttrs + ).toMatchInlineSnapshot(` + Object { + "test2": Object { + "customDescription": "test12 description", + }, + "test4": Object { + "customDescription": "test14 description", + }, + } + `); + + expect( + create('test', spec).toMinimalSpec({ keepFieldAttrs: ['customLabel', 'customDescription'] }) + .fieldAttrs + ).toMatchInlineSnapshot(` + Object { + "test1": Object { + "customLabel": "test11", + }, + "test2": Object { + "customDescription": "test12 description", + "customLabel": "test12", + }, + "test4": Object { + "customDescription": "test14 description", + }, + } + `); + + expect( + create('test', spec).toMinimalSpec({ keepFieldAttrs: [] }).fieldAttrs + ).toMatchInlineSnapshot(`undefined`); + }); }); }); diff --git a/src/plugins/data_views/common/data_views/data_view.ts b/src/plugins/data_views/common/data_views/data_view.ts index 07a130324e81b..5e4278b7e2d42 100644 --- a/src/plugins/data_views/common/data_views/data_view.ts +++ b/src/plugins/data_views/common/data_views/data_view.ts @@ -11,7 +11,7 @@ import type { FieldFormatsStartCommon } from '@kbn/field-formats-plugin/common'; import { castEsToKbnFieldTypeName } from '@kbn/field-types'; import { CharacterNotAllowedInField } from '@kbn/kibana-utils-plugin/common'; import type { DataViewBase } from '@kbn/es-query'; -import { cloneDeep, each, mapValues, omit, pickBy, reject } from 'lodash'; +import { cloneDeep, each, mapValues, pick, pickBy, reject } from 'lodash'; import type { DataViewField, IIndexPatternFieldList } from '../fields'; import { fieldList } from '../fields'; import type { @@ -174,17 +174,24 @@ export class DataView extends AbstractDataView implements DataViewBase { /** * Creates a minimal static representation of the data view. Fields and popularity scores will be omitted. */ - public toMinimalSpec(): Omit { + public toMinimalSpec(params?: { + keepFieldAttrs?: Array<'customLabel' | 'customDescription'>; + }): Omit { + const fieldAttrsToKeep = params?.keepFieldAttrs ?? ['customLabel', 'customDescription']; + // removes `fields` const dataViewSpec = this.toSpec(false); + // removes `fieldAttrs` attributes that are not in `fieldAttrsToKeep` if (dataViewSpec.fieldAttrs) { - // removes `count` props (popularity scores) from `fieldAttrs` dataViewSpec.fieldAttrs = pickBy( - mapValues(dataViewSpec.fieldAttrs, (fieldAttrs) => omit(fieldAttrs, 'count')), + // removes unnecessary attributes + mapValues(dataViewSpec.fieldAttrs, (fieldAttrs) => pick(fieldAttrs, fieldAttrsToKeep)), + // removes empty objects if all attributes have been removed (trimmedFieldAttrs) => Object.keys(trimmedFieldAttrs).length > 0 ); + // removes `fieldAttrs` if it's empty if (Object.keys(dataViewSpec.fieldAttrs).length === 0) { dataViewSpec.fieldAttrs = undefined; } diff --git a/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.tsx b/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.tsx index ee80e467e7fb4..373d874fd0f21 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.tsx @@ -167,7 +167,7 @@ export function AlertsPopover({ ), icon: 'tableOfContents', href: services?.application?.getUrlForApp( - 'management/insightsAndAlerting/triggersActions/alerts' + 'management/insightsAndAlerting/triggersActions/rules' ), ['data-test-subj']: 'discoverManageAlertsButton', }, diff --git a/src/plugins/embeddable/public/__stories__/embeddable_panel.stories.tsx b/src/plugins/embeddable/public/__stories__/embeddable_panel.stories.tsx index f8fec308eb680..40785065bb64d 100644 --- a/src/plugins/embeddable/public/__stories__/embeddable_panel.stories.tsx +++ b/src/plugins/embeddable/public/__stories__/embeddable_panel.stories.tsx @@ -69,6 +69,7 @@ interface HelloWorldEmbeddablePanelProps { hideHeader: boolean; loading: boolean; showShadow: boolean; + showBorder: boolean; title: string; viewMode: boolean; } @@ -83,6 +84,7 @@ const HelloWorldEmbeddablePanel = forwardRef< hideHeader, loading, showShadow, + showBorder, title, viewMode, }: HelloWorldEmbeddablePanelProps, @@ -113,6 +115,7 @@ const HelloWorldEmbeddablePanel = forwardRef< getActions={getActions} hideHeader={hideHeader} showShadow={showShadow} + showBorder={showBorder} /> ); } @@ -123,7 +126,8 @@ export const Default = HelloWorldEmbeddablePanel as Meta; parentApi?: PresentationContainer; onApiAvailable?: (api: ApiType) => void; + panelProps?: Pick< + PresentationPanelProps, + | 'showShadow' + | 'showBorder' + | 'showBadges' + | 'showNotifications' + | 'hideHeader' + | 'hideInspector' + >; }) => { const cleanupFunction = useRef<(() => void) | null>(null); @@ -102,5 +112,5 @@ export const ReactEmbeddableRenderer = < }; }, []); - return ; + return ; }; diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts index 9ec99fda631fa..97f6a21ce0931 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -464,6 +464,10 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, }, + 'observability:apmEnableServiceInventoryTableSearchBar': { + type: 'boolean', + _meta: { description: 'Non-default value of setting.' }, + }, 'observability:apmAWSLambdaPriceFactor': { type: 'text', _meta: { description: 'Non-default value of setting.' }, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts index b7ee2c4cd6865..c4463f4bad96f 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -50,6 +50,7 @@ export interface UsageStats { 'observability:enableInfrastructureAssetCustomDashboards': boolean; 'observability:apmAgentExplorerView': boolean; 'observability:apmEnableTableSearchBar': boolean; + 'observability:apmEnableServiceInventoryTableSearchBar': boolean; 'observability:logsExplorer:allowedDataViews': string[]; 'visualization:heatmap:maxBuckets': number; 'visualization:colorMapping': string; diff --git a/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_editor.tsx b/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_editor.tsx index 88f20d4830945..cafb522c0af8d 100644 --- a/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_editor.tsx +++ b/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_editor.tsx @@ -189,9 +189,7 @@ export const CustomizePanelEditor = ({ size="xs" data-test-subj="resetCustomEmbeddablePanelDescriptionButton" onClick={() => setPanelDescription(api.defaultPanelDescription?.value)} - disabled={ - hideTitle || !editMode || api.defaultPanelDescription?.value === panelDescription - } + disabled={!editMode || api.defaultPanelDescription?.value === panelDescription} aria-label={i18n.translate( 'presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomDescriptionButtonAriaLabel', { @@ -210,7 +208,7 @@ export const CustomizePanelEditor = ({ id="panelDescriptionInput" className="panelDescriptionInputText" data-test-subj="customEmbeddablePanelDescriptionInput" - disabled={hideTitle || !editMode} + disabled={!editMode} name="description" value={panelDescription ?? ''} onChange={(e) => setPanelDescription(e.target.value)} @@ -222,6 +220,7 @@ export const CustomizePanelEditor = ({ )} /> +
); }; diff --git a/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss b/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss index 6f1dd075517f1..74767afa5bba0 100644 --- a/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss +++ b/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss @@ -147,14 +147,16 @@ // EDITING MODE .embPanel--editing { - outline-style: dashed !important; - outline-color: $euiColorMediumShade !important; transition: all $euiAnimSpeedFast $euiAnimSlightResistance; outline-width: $euiBorderWidthThin; &:hover, &:focus { @include euiSlightShadowHover; + + .embPanel__emptyTitleDragHandle { + display: block; + } } .embPanel--dragHandle { diff --git a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.tsx b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.tsx index e69df62e56fb5..5e277e5194f87 100644 --- a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.tsx +++ b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.tsx @@ -61,14 +61,17 @@ export const PresentationPanelTitle = ({ }, [hideTitle, panelTitle, viewMode, api]); const describedPanelTitleElement = useMemo(() => { - if (!panelDescription) + if (!panelDescription) { + if (hideTitle) return null; return ( {panelTitleElement} ); + } return ( - {panelTitleElement}{' '} + {!hideTitle ? <>{panelTitleElement}  : null} ); - }, [panelDescription, panelTitleElement]); + }, [hideTitle, panelDescription, panelTitle, panelTitleElement]); return describedPanelTitleElement; }; diff --git a/src/plugins/presentation_panel/public/panel_component/presentation_panel.tsx b/src/plugins/presentation_panel/public/panel_component/presentation_panel.tsx index afc7714ea022c..fc871c317d7d6 100644 --- a/src/plugins/presentation_panel/public/panel_component/presentation_panel.tsx +++ b/src/plugins/presentation_panel/public/panel_component/presentation_panel.tsx @@ -55,7 +55,11 @@ export const PresentationPanel = < if (loading || !value?.Panel || !value?.unwrappedComponent) return ( - + ); return ( diff --git a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx index 2bdaf61c2bfee..dfb3f85269979 100644 --- a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx +++ b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx @@ -28,6 +28,7 @@ export const PresentationPanelInternal = < index, hideHeader, showShadow, + showBorder, showBadges, showNotifications, @@ -103,6 +104,7 @@ export const PresentationPanelInternal = < 'embPanel--editing': viewMode === 'edit', })} hasShadow={showShadow} + hasBorder={showBorder} aria-labelledby={headerId} data-test-embeddable-id={api?.uuid} data-test-subj="embeddablePanel" diff --git a/src/plugins/presentation_panel/public/panel_component/types.ts b/src/plugins/presentation_panel/public/panel_component/types.ts index 61f6eaca887f5..eee6aa01a3e18 100644 --- a/src/plugins/presentation_panel/public/panel_component/types.ts +++ b/src/plugins/presentation_panel/public/panel_component/types.ts @@ -37,6 +37,7 @@ export interface PresentationPanelInternalProps< componentProps?: Omit>, 'ref'>; showShadow?: boolean; + showBorder?: boolean; showBadges?: boolean; showNotifications?: boolean; diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 9b4775c86c7cb..99de63e50abe9 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -10143,6 +10143,12 @@ "description": "Non-default value of setting." } }, + "observability:apmEnableServiceInventoryTableSearchBar": { + "type": "boolean", + "_meta": { + "description": "Non-default value of setting." + } + }, "observability:apmAWSLambdaPriceFactor": { "type": "text", "_meta": { diff --git a/src/plugins/text_based_languages/kibana.jsonc b/src/plugins/text_based_languages/kibana.jsonc index f22a87185b54c..545c1878cc4e4 100644 --- a/src/plugins/text_based_languages/kibana.jsonc +++ b/src/plugins/text_based_languages/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/text-based-languages", - "owner": "@elastic/kibana-visualizations", + "owner": "@elastic/kibana-esql", "plugin": { "id": "textBasedLanguages", "server": false, diff --git a/src/plugins/vis_types/timeseries/public/application/components/splits/terms.test.js b/src/plugins/vis_types/timeseries/public/application/components/splits/terms.test.js index 8139dcc34a326..3348d32f519eb 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/splits/terms.test.js +++ b/src/plugins/vis_types/timeseries/public/application/components/splits/terms.test.js @@ -11,6 +11,7 @@ import { shallow } from 'enzyme'; import { SplitByTermsUI } from './terms'; jest.mock('@elastic/eui', () => ({ + ...jest.requireActual('@elastic/eui'), htmlIdGenerator: jest.fn(() => () => '42'), EuiFlexGroup: jest.requireActual('@elastic/eui').EuiFlexGroup, EuiFlexItem: jest.requireActual('@elastic/eui').EuiFlexItem, diff --git a/test/api_integration/apis/esql/errors.ts b/test/api_integration/apis/esql/errors.ts index 8aca4b704ce42..ad4e251a8f364 100644 --- a/test/api_integration/apis/esql/errors.ts +++ b/test/api_integration/apis/esql/errors.ts @@ -19,11 +19,8 @@ function getConfigPath() { return Path.resolve( REPO_ROOT, 'packages', - 'kbn-monaco', + 'kbn-esql-validation-autocomplete', 'src', - 'esql', - 'lib', - 'ast', 'validation' ); } @@ -77,7 +74,7 @@ function createIndexRequest( } interface JSONConfig { - testCases: Array<{ query: string; error: boolean }>; + testCases: Array<{ query: string; error: string[] }>; indexes: string[]; policies: Array<{ name: string; @@ -240,7 +237,7 @@ export default function ({ getService }: FtrProviderContext) { for (const { query, error } of queryToErrors) { const jsonBody = await sendESQLQuery(query); - const clientSideHasError = error; + const clientSideHasError = Boolean(error.length); const serverSideHasError = Boolean(jsonBody.error); if (clientSideHasError !== serverSideHasError) { diff --git a/test/functional/apps/dashboard/group5/dashboard_settings.ts b/test/functional/apps/dashboard/group5/dashboard_settings.ts index bd6fb8d6c83a6..37e4fa92693f6 100644 --- a/test/functional/apps/dashboard/group5/dashboard_settings.ts +++ b/test/functional/apps/dashboard/group5/dashboard_settings.ts @@ -54,7 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboardSettings.clickApplyButton(); await retry.try(async () => { const titles = await PageObjects.dashboard.getPanelTitles(); - expect(titles[0]).to.eql(''); + expect(titles[0]).to.eql(undefined); }); }); diff --git a/test/functional/screenshots/baseline/area_chart.png b/test/functional/screenshots/baseline/area_chart.png index 5c33d8d5ad82f..fb2e7e295e3e9 100644 Binary files a/test/functional/screenshots/baseline/area_chart.png and b/test/functional/screenshots/baseline/area_chart.png differ diff --git a/test/functional/screenshots/baseline/dashboard_embed_mode.png b/test/functional/screenshots/baseline/dashboard_embed_mode.png index 720e8757ba280..53a928bc1514a 100644 Binary files a/test/functional/screenshots/baseline/dashboard_embed_mode.png and b/test/functional/screenshots/baseline/dashboard_embed_mode.png differ diff --git a/test/functional/screenshots/baseline/tsvb_dashboard.png b/test/functional/screenshots/baseline/tsvb_dashboard.png index be50fe32f7c98..f118bf55040e5 100644 Binary files a/test/functional/screenshots/baseline/tsvb_dashboard.png and b/test/functional/screenshots/baseline/tsvb_dashboard.png differ diff --git a/tsconfig.base.json b/tsconfig.base.json index 4219ab86a9e0e..53f3621566219 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -780,8 +780,14 @@ "@kbn/eso-model-version-example/*": ["examples/eso_model_version_example/*"], "@kbn/eso-plugin": ["x-pack/test/encrypted_saved_objects_api_integration/plugins/api_consumer_plugin"], "@kbn/eso-plugin/*": ["x-pack/test/encrypted_saved_objects_api_integration/plugins/api_consumer_plugin/*"], + "@kbn/esql-ast": ["packages/kbn-esql-ast"], + "@kbn/esql-ast/*": ["packages/kbn-esql-ast/*"], "@kbn/esql-utils": ["packages/kbn-esql-utils"], "@kbn/esql-utils/*": ["packages/kbn-esql-utils/*"], + "@kbn/esql-validation-autocomplete": ["packages/kbn-esql-validation-autocomplete"], + "@kbn/esql-validation-autocomplete/*": ["packages/kbn-esql-validation-autocomplete/*"], + "@kbn/esql-validation-example-plugin": ["examples/esql_validation_example"], + "@kbn/esql-validation-example-plugin/*": ["examples/esql_validation_example/*"], "@kbn/event-annotation-common": ["packages/kbn-event-annotation-common"], "@kbn/event-annotation-common/*": ["packages/kbn-event-annotation-common/*"], "@kbn/event-annotation-components": ["packages/kbn-event-annotation-components"], diff --git a/versions.json b/versions.json index 81d679e59c5c3..56c4217d264d2 100644 --- a/versions.json +++ b/versions.json @@ -8,7 +8,7 @@ "currentMinor": true }, { - "version": "8.13.0", + "version": "8.13.1", "branch": "8.13", "currentMajor": true, "previousMinor": true @@ -20,7 +20,7 @@ "previousMinor": true }, { - "version": "7.17.19", + "version": "7.17.20", "branch": "7.17", "previousMajor": true } diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_anomaly_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_anomaly_rule_request.yaml index 60bb44cad45db..79de09845df62 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_anomaly_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_anomaly_rule_request.yaml @@ -21,7 +21,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../apm/server/routes/alerts/rule_types/docs/params_property_apm_anomaly.yaml' + $ref: '../../../../../observability_solution/apm/server/routes/alerts/rule_types/docs/params_property_apm_anomaly.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_error_count_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_error_count_rule_request.yaml index 482aa0e289e82..6f1a088f79e9a 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_error_count_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_error_count_rule_request.yaml @@ -21,7 +21,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../apm/server/routes/alerts/rule_types/docs/params_property_apm_error_count.yaml' + $ref: '../../../../../observability_solution/apm/server/routes/alerts/rule_types/docs/params_property_apm_error_count.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_transaction_duration_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_transaction_duration_rule_request.yaml index f6757b188ee2c..366baffbb1664 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_transaction_duration_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_transaction_duration_rule_request.yaml @@ -21,7 +21,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../apm/server/routes/alerts/rule_types/docs/params_property_apm_transaction_duration.yaml' + $ref: '../../../../../observability_solution/apm/server/routes/alerts/rule_types/docs/params_property_apm_transaction_duration.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_transaction_error_rate_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_transaction_error_rate_rule_request.yaml index 239ded7c3cd85..638b01dc6e77d 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_transaction_error_rate_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_apm_transaction_error_rate_rule_request.yaml @@ -21,7 +21,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../apm/server/routes/alerts/rule_types/docs/params_property_apm_transaction_error_rate.yaml' + $ref: '../../../../../observability_solution/apm/server/routes/alerts/rule_types/docs/params_property_apm_transaction_error_rate.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_infra_inventory_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_infra_inventory_rule_request.yaml index f5b967c559f81..29087672db1eb 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_infra_inventory_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_infra_inventory_rule_request.yaml @@ -22,7 +22,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../infra/server/lib/alerting/docs/params_property_infra_inventory.yaml' + $ref: '../../../../../observability_solution/infra/server/lib/alerting/docs/params_property_infra_inventory.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_infra_metric_threshold_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_infra_metric_threshold_rule_request.yaml index 8d37ab9defc6e..fa19ad4c29ae5 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_infra_metric_threshold_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_infra_metric_threshold_rule_request.yaml @@ -22,7 +22,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../infra/server/lib/alerting/docs/params_property_infra_metric_threshold.yaml' + $ref: '../../../../../observability_solution/infra/server/lib/alerting/docs/params_property_infra_metric_threshold.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_log_threshold_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_log_threshold_rule_request.yaml index 35aa5805ad967..7354903ba28b2 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_log_threshold_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_log_threshold_rule_request.yaml @@ -21,7 +21,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../infra/server/lib/alerting/docs/params_property_log_threshold.yaml' + $ref: '../../../../../observability_solution/infra/server/lib/alerting/docs/params_property_log_threshold.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_slo_burn_rate_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_slo_burn_rate_rule_request.yaml index e3a7467109600..5d2992f54c61e 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_slo_burn_rate_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_slo_burn_rate_rule_request.yaml @@ -25,7 +25,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../observability/server/lib/rules/slo_burn_rate/docs/params_property_slo_burn_rate.yaml' + $ref: '../../../../../observability_solution/slo/server/lib/rules/slo_burn_rate/docs/params_property_slo_burn_rate.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_synthetics_uptime_tls_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_synthetics_uptime_tls_rule_request.yaml index 74344eb039e98..603ff97158c16 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_synthetics_uptime_tls_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_synthetics_uptime_tls_rule_request.yaml @@ -18,7 +18,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../uptime/server/legacy_uptime/lib/alerts/docs/params_property_synthetics_uptime_tls.yaml' + $ref: '../../../../../observability_solution/uptime/server/legacy_uptime/lib/alerts/docs/params_property_synthetics_uptime_tls.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_uptime_monitor_status_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_uptime_monitor_status_rule_request.yaml index 70f3b5b8b05ad..f23da2eb87046 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/create_uptime_monitor_status_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/create_uptime_monitor_status_rule_request.yaml @@ -21,7 +21,7 @@ properties: notify_when: $ref: 'notify_when.yaml' params: - $ref: '../../../../../uptime/server/legacy_uptime/lib/alerts/docs/params_property_synthetics_monitor_status.yaml' + $ref: '../../../../../observability_solution/uptime/server/legacy_uptime/lib/alerts/docs/params_property_synthetics_monitor_status.yaml' rule_type_id: type: string description: The ID of the rule type that you want to call when the rule is scheduled to run. diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client.mock.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client.mock.ts index f963d53899485..7416d97fe071f 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client.mock.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client.mock.ts @@ -35,6 +35,7 @@ const createPublicAlertsClientMock = () => { return { create: jest.fn(), report: jest.fn(), + isTrackedAlert: jest.fn(), getAlertLimitValue: jest.fn().mockReturnValue(1000), setAlertLimitReached: jest.fn(), getRecoveredAlerts: jest.fn().mockReturnValue([]), diff --git a/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx b/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx index 7191b0fc028e7..fcb1fa0fe59a8 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx @@ -15,7 +15,8 @@ import { useToasts } from '../../common/lib/kibana'; jest.mock('./api'); jest.mock('../../common/lib/kibana'); -describe('useActionTypes', () => { +// FLAKY: https://github.com/elastic/kibana/issues/178760 +describe.skip('useActionTypes', () => { let appMockRenderer: AppMockRenderer; beforeEach(() => { jest.clearAllMocks(); diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/esql/limit_size.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/esql/limit_size.tsx index 0eeb1fec33147..8919be73a868c 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/esql/limit_size.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/esql/limit_size.tsx @@ -35,21 +35,6 @@ const options = [ values: { limit: '100,000' }, }), }, - { - 'data-test-subj': 'dvESQLLimitSize-1000000', - value: '1000000', - text: i18n.translate('xpack.dataVisualizer.searchPanel.esql.limitSizeOptionLabel', { - defaultMessage: '{limit} rows', - values: { limit: '1,000,000' }, - }), - }, - { - 'data-test-subj': 'dvESQLLimitSize-none', - value: 'none', - text: i18n.translate('xpack.dataVisualizer.searchPanel.esql.analyzeAll', { - defaultMessage: 'Analyze all', - }), - }, ]; export const ESQLDefaultLimitSizeSelect = ({ diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/constants/esql_constants.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/constants/esql_constants.ts new file mode 100644 index 0000000000000..34742136cb07e --- /dev/null +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/constants/esql_constants.ts @@ -0,0 +1,8 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const DEFAULT_ESQL_LIMIT = 10000; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts index faadc6a460c77..8fa168e2e3984 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts @@ -47,7 +47,7 @@ export type ESQLDataVisualizerGridEmbeddableInput = DataVisualizerGridInput({ searchQuery, columns: allColumns, filter, - limitSize, + limit, }: { searchQuery?: AggregateQuery; columns?: T[]; filter?: QueryDslQueryContainer; - limitSize?: string; + limit: number; }) => { const [fieldStats, setFieldStats] = useState>(); @@ -65,7 +66,7 @@ export const useESQLFieldStatsData = ({ try { // By default, limit the source data to 100,000 rows - const esqlBaseQuery = searchQuery.esql + getSafeESQLLimitSize(limitSize); + const esqlBaseQuery = getESQLWithSafeLimit(searchQuery.esql, limit); const totalFieldsCnt = allColumns.length; const processedFieldStats = new Map(); @@ -168,7 +169,7 @@ export const useESQLFieldStatsData = ({ }; }, // eslint-disable-next-line react-hooks/exhaustive-deps - [allColumns, JSON.stringify({ filter }), limitSize] + [allColumns, JSON.stringify({ filter }), limit] ); return { fieldStats, fieldStatsProgress: fetchState, cancelFieldStatsRequest: cancelRequest }; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts index 7e2409d8b54a1..1d5e2e4626e70 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts @@ -14,6 +14,7 @@ import { type UseCancellableSearch, useCancellableSearch } from '@kbn/ml-cancell import type { estypes } from '@elastic/elasticsearch'; import type { ISearchOptions } from '@kbn/data-plugin/common'; import type { TimeBucketsInterval } from '@kbn/ml-time-buckets'; +import { getESQLWithSafeLimit } from '@kbn/esql-utils'; import { OMIT_FIELDS } from '../../../../../common/constants'; import type { DataStatsFetchProgress, @@ -22,11 +23,7 @@ import type { import { getSupportedFieldType } from '../../../common/components/fields_stats_grid/get_field_names'; import { useDataVisualizerKibana } from '../../../kibana_context'; import { getInitialProgress, getReducer } from '../../progress_utils'; -import { - getSafeESQLLimitSize, - getSafeESQLName, - isESQLQuery, -} from '../../search_strategy/requests/esql_utils'; +import { getSafeESQLName, isESQLQuery } from '../../search_strategy/requests/esql_utils'; import type { NonAggregatableField } from '../../types/overall_stats'; import { getESQLSupportedAggs } from '../../utils/get_supported_aggs'; import { getESQLOverallStats } from '../../search_strategy/esql_requests/get_count_and_cardinality'; @@ -35,7 +32,6 @@ import { handleError, type HandleErrorCallback, } from '../../search_strategy/esql_requests/handle_error'; -import type { ESQLDefaultLimitSizeOption } from '../../embeddables/grid_embeddable/types'; export interface Column { type: string; @@ -82,8 +78,7 @@ const getESQLDocumentCountStats = async ( const aggQuery = ` | EVAL _timestamp_= TO_DOUBLE(DATE_TRUNC(${intervalMs} millisecond, ${getSafeESQLName( timeFieldName )})) - | stats rows = count(*) by _timestamp_ - | LIMIT 10000`; + | stats rows = count(*) by _timestamp_`; const request = { params: { @@ -187,8 +182,8 @@ export const useESQLOverallStatsData = ( indexPattern: string | undefined; timeFieldName: string | undefined; lastRefresh: number; + limit: number; filter?: QueryDslQueryContainer; - limitSize?: ESQLDefaultLimitSizeOption; totalCount?: number; } | undefined @@ -234,7 +229,7 @@ export const useESQLOverallStatsData = ( searchQuery, intervalMs, filter: filter, - limitSize, + limit, totalCount: knownTotalCount, } = fieldStatsRequest; @@ -375,7 +370,7 @@ export const useESQLOverallStatsData = ( // COUNT + CARDINALITY // For % count & cardinality, we want the full base query WITH specified limit // to safeguard against huge datasets - const esqlBaseQueryWithLimit = searchQuery.esql + getSafeESQLLimitSize(limitSize); + const esqlBaseQueryWithLimit = getESQLWithSafeLimit(searchQuery.esql, limit); if (totalCount === 0) { setTableData({ @@ -399,7 +394,7 @@ export const useESQLOverallStatsData = ( fields, esqlBaseQueryWithLimit, filter, - limitSize, + limitSize: limit, totalCount, onError, }); diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts index 9ae0262a0da0d..41bc6e4b52b6d 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts @@ -20,7 +20,6 @@ import type { Column } from '../../hooks/esql/use_esql_overall_stats_data'; import type { AggregatableField } from '../../types/esql_data_visualizer'; import type { HandleErrorCallback } from './handle_error'; import { handleError } from './handle_error'; -import type { ESQLDefaultLimitSizeOption } from '../../embeddables/grid_embeddable/types'; interface Field extends Column { aggregatable?: boolean; @@ -38,7 +37,7 @@ const getESQLOverallStatsInChunk = async ({ fields: Field[]; esqlBaseQueryWithLimit: string; filter?: estypes.QueryDslQueryContainer; - limitSize?: ESQLDefaultLimitSizeOption; + limitSize: number; totalCount: number; onError?: HandleErrorCallback; }) => { @@ -123,8 +122,7 @@ const getESQLOverallStatsInChunk = async ({ } const esqlResultsResp = esqlResults.rawResponse as unknown as ESQLSearchReponse; - const sampleCount = - limitSize === 'none' || !isDefined(limitSize) ? totalCount : parseInt(limitSize, 10); + const sampleCount = !isDefined(limitSize) ? totalCount : limitSize; fieldsToFetch.forEach((field, idx) => { const count = esqlResultsResp.values[0][field.startIndex + aggToIndex.count] as number; @@ -210,7 +208,7 @@ export const getESQLOverallStats = async ({ fields: Column[]; esqlBaseQueryWithLimit: string; filter?: estypes.QueryDslQueryContainer; - limitSize?: ESQLDefaultLimitSizeOption; + limitSize: number; totalCount: number; onError?: HandleErrorCallback; }) => { diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/esql_utils.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/esql_utils.ts index 334b0b06bb0ab..fa2182f0bbc6e 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/esql_utils.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/esql_utils.ts @@ -35,8 +35,3 @@ export const getESQLPercentileQueryArray = (fieldName: string, percents = PERCEN (p) => `${getSafeESQLName(`${fieldName}_p${p}`)} = PERCENTILE(${getSafeESQLName(fieldName)}, ${p})` ); - -export const getSafeESQLLimitSize = (str?: string) => { - if (str === 'none' || !str) return ''; - return ` | LIMIT ${str}`; -}; diff --git a/x-pack/plugins/enterprise_search/kibana.jsonc b/x-pack/plugins/enterprise_search/kibana.jsonc index 98c4c86fe5ab6..9277e8c82c080 100644 --- a/x-pack/plugins/enterprise_search/kibana.jsonc +++ b/x-pack/plugins/enterprise_search/kibana.jsonc @@ -31,6 +31,7 @@ "customIntegrations", "globalSearch", "home", + "indexManagement", "ml", "spaces", "usageCollection", diff --git a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts index 18de5c8d0aa4a..f044307a9d8f7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts @@ -40,6 +40,7 @@ export const mockKibanaValues = { esConfig: { elasticsearch_host: 'https://your_deployment_url' }, guidedOnboarding: {}, history: mockHistory, + indexMappingComponent: null, isCloud: false, isSidebarEnabled: true, lens: { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_mappings.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_mappings.tsx index a1e8b7f6163a0..3968fecb22a49 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_mappings.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_mappings.tsx @@ -12,7 +12,6 @@ import { useActions, useValues } from 'kea'; import { EuiCallOut, EuiCode, - EuiCodeBlock, EuiFlexGroup, EuiFlexItem, EuiIcon, @@ -46,8 +45,8 @@ import './index_mappings.scss'; export const SearchIndexIndexMappings: React.FC = () => { const { indexName } = useValues(IndexNameLogic); - const { hasDocumentLevelSecurityFeature } = useValues(IndexViewLogic); - const { productFeatures } = useValues(KibanaLogic); + const { hasDocumentLevelSecurityFeature, isHiddenIndex } = useValues(IndexViewLogic); + const { indexMappingComponent: IndexMappingComponent, productFeatures } = useValues(KibanaLogic); const [selectedIndexType, setSelectedIndexType] = useState('content-index'); @@ -56,7 +55,7 @@ export const SearchIndexIndexMappings: React.FC = () => { ? indexName : stripSearchPrefix(indexName, CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX); const { makeRequest: makeMappingRequest } = useActions(mappingsWithPropsApiLogic(indexToShow)); - const { data: mappingData, error } = useValues(mappingsWithPropsApiLogic(indexToShow)); + const { error } = useValues(mappingsWithPropsApiLogic(indexToShow)); const shouldShowAccessControlSwitch = hasDocumentLevelSecurityFeature && productFeatures.hasDocumentLevelSecurityEnabled; const isAccessControlIndexNotFound = @@ -98,9 +97,28 @@ export const SearchIndexIndexMappings: React.FC = () => {

) : ( - - {JSON.stringify(mappingData, null, 2)} - + <> + {IndexMappingComponent ? ( + + ) : ( + + )} + )}
diff --git a/x-pack/plugins/enterprise_search/public/applications/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/index.test.tsx index 7ba58a45b8c2d..6e2de90ee1f1d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.test.tsx @@ -41,6 +41,9 @@ describe('renderApp', () => { charts: chartPluginMock.createStartContract(), data: dataPluginMock.createStartContract(), guidedOnboarding: guidedOnboardingMock.createStart(), + indexManagement: { + getIndexMappingComponent: jest.fn(), + }, lens: lensPluginMock.createStartContract(), licensing: licensingMock.createStart(), searchConnectors: searchConnectorsMock.createStart(), diff --git a/x-pack/plugins/enterprise_search/public/applications/index.tsx b/x-pack/plugins/enterprise_search/public/applications/index.tsx index ce0d5a28c0ae2..5e0f85fa5af28 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.tsx @@ -68,7 +68,16 @@ export const renderApp = ( const { history } = params; const { application, chrome, http, notifications, uiSettings } = core; const { capabilities, navigateToUrl } = application; - const { charts, cloud, guidedOnboarding, lens, security, share, ml } = plugins; + const { + charts, + cloud, + guidedOnboarding, + indexManagement: indexManagementPlugin, + lens, + security, + share, + ml, + } = plugins; const entCloudHost = getCloudEnterpriseSearchHost(plugins.cloud); externalUrl.enterpriseSearchUrl = publicUrl || entCloudHost || config.host || ''; @@ -99,6 +108,7 @@ export const renderApp = ( } catch { user = null; } + const indexMappingComponent = indexManagementPlugin.getIndexMappingComponent({ history }); const connectorTypes = plugins.searchConnectors?.getConnectorTypes() || []; @@ -114,6 +124,7 @@ export const renderApp = ( esConfig, guidedOnboarding, history, + indexMappingComponent, isSidebarEnabled, lens, ml, diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts index db8082a7659da..dbf0bb4208911 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts @@ -22,6 +22,7 @@ import { import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; +import { IndexMappingProps } from '@kbn/index-management-plugin/public'; import { LensPublicStart } from '@kbn/lens-plugin/public'; import { MlPluginStart } from '@kbn/ml-plugin/public'; import { ELASTICSEARCH_URL_PLACEHOLDER } from '@kbn/search-api-panels/constants'; @@ -51,6 +52,7 @@ export interface KibanaLogicProps { esConfig: ESConfig; guidedOnboarding?: GuidedOnboardingPluginStart; history: ScopedHistory; + indexMappingComponent: React.FC; isSidebarEnabled: boolean; lens: LensPublicStart; ml: MlPluginStart; @@ -91,6 +93,7 @@ export const KibanaLogic = kea>({ esConfig: [props.esConfig || { elasticsearch_host: ELASTICSEARCH_URL_PLACEHOLDER }, {}], guidedOnboarding: [props.guidedOnboarding, {}], history: [props.history, {}], + indexMappingComponent: [props.indexMappingComponent || null, {}], isSidebarEnabled: [props.isSidebarEnabled, {}], lens: [props.lens, {}], ml: [props.ml, {}], diff --git a/x-pack/plugins/enterprise_search/public/applications/test_helpers/test_utils.test_helper.tsx b/x-pack/plugins/enterprise_search/public/applications/test_helpers/test_utils.test_helper.tsx index b60496a30414f..b696054ea9fb2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/test_helpers/test_utils.test_helper.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/test_helpers/test_utils.test_helper.tsx @@ -55,6 +55,9 @@ export const mockKibanaProps: KibanaLogicProps = { }, guidedOnboarding: {}, history: mockHistory, + indexMappingComponent: () => { + return <>; + }, isSidebarEnabled: true, lens: { EmbeddableComponent: jest.fn(), diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts index 690c533444a92..87f6476b1ac2b 100644 --- a/x-pack/plugins/enterprise_search/public/plugin.ts +++ b/x-pack/plugins/enterprise_search/public/plugin.ts @@ -21,6 +21,7 @@ import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; import type { HomePublicPluginSetup } from '@kbn/home-plugin/public'; +import { IndexManagementPluginStart } from '@kbn/index-management-plugin/public'; import { LensPublicStart } from '@kbn/lens-plugin/public'; import { LicensingPluginStart } from '@kbn/licensing-plugin/public'; import { MlPluginStart } from '@kbn/ml-plugin/public'; @@ -72,6 +73,7 @@ export interface PluginsStart { console?: ConsolePluginStart; data: DataPublicPluginStart; guidedOnboarding: GuidedOnboardingPluginStart; + indexManagement: IndexManagementPluginStart; lens: LensPublicStart; licensing: LicensingPluginStart; ml: MlPluginStart; diff --git a/x-pack/plugins/enterprise_search/tsconfig.json b/x-pack/plugins/enterprise_search/tsconfig.json index 37b20b3f9b141..c9964a61f7834 100644 --- a/x-pack/plugins/enterprise_search/tsconfig.json +++ b/x-pack/plugins/enterprise_search/tsconfig.json @@ -71,6 +71,7 @@ "@kbn/es-errors", "@kbn/search-connectors-plugin", "@kbn/search-playground", - "@kbn/utility-types" + "@kbn/utility-types", + "@kbn/index-management-plugin" ] } diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/kubernetes_instructions.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/kubernetes_instructions.tsx index f1cf6b5a29032..6cc7a9fd213f9 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/kubernetes_instructions.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/kubernetes_instructions.tsx @@ -14,6 +14,7 @@ import { EuiFlexItem, EuiCopy, EuiCodeBlock, + EuiLink, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; @@ -48,7 +49,7 @@ export const KubernetesInstructions: React.FunctionComponent = ({ fleetServerHost, }) => { const core = useStartServices(); - const { notifications } = core; + const { notifications, docLinks } = core; const [yaml, setYaml] = useState(''); const [copyButtonClicked, setCopyButtonClicked] = useState(false); @@ -97,7 +98,21 @@ export const KubernetesInstructions: React.FunctionComponent = ({ const downloadDescription = ( + + + ), + }} /> ); @@ -141,7 +156,7 @@ export const KubernetesInstructions: React.FunctionComponent = ({ ) : ( )} diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/configure_standalone_agent_step.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/configure_standalone_agent_step.tsx index a411fe34ee01a..289c5b8ad8df2 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/configure_standalone_agent_step.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/configure_standalone_agent_step.tsx @@ -15,6 +15,7 @@ import { EuiFlexItem, EuiCopy, EuiCodeBlock, + EuiLink, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; @@ -22,6 +23,7 @@ import { i18n } from '@kbn/i18n'; import type { EuiContainedStepProps } from '@elastic/eui/src/components/steps/steps'; import type { K8sMode } from '../types'; +import { useStartServices } from '../../../hooks'; export const ConfigureStandaloneAgentStep = ({ isK8s, @@ -38,14 +40,28 @@ export const ConfigureStandaloneAgentStep = ({ isComplete?: boolean; onCopy?: () => void; }): EuiContainedStepProps => { + const core = useStartServices(); + const { docLinks } = core; const policyMsg = isK8s === 'IS_KUBERNETES' ? ( ES_USERNAME, ESPasswordVariable: ES_PASSWORD, + scalingGuideLink: ( + + + + ), }} /> ) : ( diff --git a/x-pack/plugins/fleet/server/services/epm/archive/parse.test.ts b/x-pack/plugins/fleet/server/services/epm/archive/parse.test.ts index f8f2734444b25..fb10d4ab88220 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/parse.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/parse.test.ts @@ -344,6 +344,11 @@ describe('parseAndVerifyArchive', () => { owner: { github: 'elastic/integrations', }, + agent: { + privileges: { + root: true, + }, + }, policy_templates: [ { description: 'Collect your custom log files.', diff --git a/x-pack/plugins/fleet/server/services/epm/archive/parse.ts b/x-pack/plugins/fleet/server/services/epm/archive/parse.ts index b0b5d8a94f06f..8b5723e1ef4e7 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/parse.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/parse.ts @@ -128,6 +128,7 @@ const optionalArchivePackageProps: readonly OptionalPackageProp[] = [ 'icons', 'policy_templates', 'release', + 'agent', 'elasticsearch', ] as const; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts index 2451caf69247a..235e5090a2695 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts @@ -126,6 +126,12 @@ const registerHttpRequestMockHelpers = ( error?: ResponseError ) => mockResponse('GET', `${API_BASE_PATH}/mapping/${indexName}`, response, error); + const setUpdateIndexMappingsResponse = ( + indexName: string, + response?: HttpResponse, + error?: ResponseError + ) => mockResponse('PUT', `${API_BASE_PATH}/mapping/${indexName}`, response, error); + const setLoadIndexStatsResponse = ( indexName: string, response?: HttpResponse, @@ -216,6 +222,7 @@ const registerHttpRequestMockHelpers = ( setCreateTemplateResponse, setLoadIndexSettingsResponse, setLoadIndexMappingResponse, + setUpdateIndexMappingsResponse, setLoadIndexStatsResponse, setUpdateIndexSettingsResponse, setSimulateTemplateResponse, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts index 77b2fb5ecd788..c59e57498e8dd 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts @@ -18,6 +18,7 @@ import { IndexDetailsTabId } from '../../../common/constants'; import { IndexDetailsPage } from '../../../public/application/sections/home/index_list/details_page'; import { WithAppDependencies } from '../helpers'; import { testIndexName } from './mocks'; +import { MappingField } from '../index_template_wizard/template_form.helpers'; let routerMock: typeof reactRouterMock; const getTestBedConfig = (initialEntry?: string): AsyncTestBedConfig => ({ @@ -39,11 +40,15 @@ export interface IndexDetailsPageTestBed extends TestBed { getIndexDetailsTabs: () => string[]; getActiveTabContent: () => string; mappings: { + addNewMappingFieldNameAndType: (mappingFields?: MappingField[]) => Promise; + clickAddFieldButton: () => Promise; + clickSaveMappingsButton: () => Promise; getCodeBlockContent: () => string; getDocsLinkHref: () => string; isErrorDisplayed: () => boolean; + isSaveMappingsErrorDisplayed: () => boolean; clickErrorReloadButton: () => Promise; - getTreeViewContent: () => string; + getTreeViewContent: (fieldName: string) => string; clickToggleViewButton: () => Promise; isSearchBarDisabled: () => boolean; }; @@ -198,17 +203,62 @@ export const setup = async ({ }); component.update(); }, - getTreeViewContent: () => { - return find('@timestampField-fieldName').text(); + getTreeViewContent: (fieldName: string) => { + expect(exists(fieldName)).toBe(true); + return find(fieldName).text(); }, + clickToggleViewButton: async () => { await act(async () => { + expect(exists('indexDetailsMappingsToggleViewButton')).toBe(true); find('indexDetailsMappingsToggleViewButton').simulate('click'); }); component.update(); }, isSearchBarDisabled: () => { - return find('DocumentFieldsSearch').prop('disabled'); + return find('indexDetailsMappingsFieldSearch').prop('disabled'); + }, + clickAddFieldButton: async () => { + expect(exists('indexDetailsMappingsAddField')).toBe(true); + await act(async () => { + find('indexDetailsMappingsAddField').simulate('click'); + }); + component.update(); + }, + clickSaveMappingsButton: async () => { + expect(exists('indexDetailsMappingsSaveMappings')).toBe(true); + expect(find('indexDetailsMappingsSaveMappings').props().disabled).toBeFalsy(); + await act(async () => { + find('indexDetailsMappingsSaveMappings').simulate('click'); + }); + component.update(); + }, + isSaveMappingsErrorDisplayed: () => { + return exists('indexDetailsSaveMappingsError'); + }, + addNewMappingFieldNameAndType: async (mappingFields?: MappingField[]) => { + const { form } = testBed; + if (mappingFields) { + for (const field of mappingFields) { + const { name, type } = field; + await act(async () => { + form.setInputValue('nameParameterInput', name); + find('createFieldForm').simulate('change', [ + { + label: type, + value: type, + }, + ]); + }); + + await act(async () => { + expect(exists('createFieldForm.addButton')).toBe(true); + find('createFieldForm.addButton').simulate('click'); + }); + + component.update(); + } + } }, }; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx index 876d8952a32bd..94681672dfc01 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx @@ -230,7 +230,9 @@ describe('', () => { it('changes the tab when its header is clicked', async () => { await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); - expect(testBed.exists('indexDetailsMappingsCodeBlock')).toBe(true); + expect(testBed.exists('indexDetailsMappingsCodeBlock')).toBe(false); + expect(testBed.exists('fieldsList')).toBe(true); + expect(testBed.exists('indexDetailsMappingsAddField')).toBe(true); await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Settings); expect(testBed.exists('indexDetailsSettingsCodeBlock')).toBe(true); }); @@ -454,54 +456,142 @@ describe('', () => { }); describe('Mappings tab', () => { - it('updates the breadcrumbs to index details mappings', async () => { + beforeEach(async () => { await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); + }); + it('updates the breadcrumbs to index details mappings', async () => { expect(breadcrumbService.setBreadcrumbs).toHaveBeenLastCalledWith( IndexManagementBreadcrumb.indexDetails, { text: 'Mappings' } ); }); it('loads mappings from the API', async () => { - await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); expect(httpSetup.get).toHaveBeenLastCalledWith( `${API_BASE_PATH}/mapping/${testIndexName}`, requestOptions ); }); - - it('displays the mappings in the code block', async () => { - await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); - - const tabContent = testBed.actions.mappings.getCodeBlockContent(); - expect(tabContent).toEqual(JSON.stringify(testIndexMappings, null, 2)); + it('searchbar, toggle button, add field button exists', async () => { + expect(testBed.exists('indexDetailsMappingsAddField')).toBe(true); + expect(testBed.exists('indexDetailsMappingsToggleViewButton')).toBe(true); + expect(testBed.exists('indexDetailsMappingsFieldSearch')).toBe(true); }); it('displays the mappings in the table view', async () => { - await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); - await testBed.actions.mappings.clickToggleViewButton(); - const tabContent = testBed.actions.mappings.getTreeViewContent(); + const tabContent = testBed.actions.mappings.getTreeViewContent('@timestampField-fieldName'); expect(tabContent).toContain('@timestamp'); }); - it('search bar is enabled in JSON view', async () => { - await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); + it('search bar is disabled in JSON view', async () => { + await testBed.actions.mappings.clickToggleViewButton(); expect(testBed.actions.mappings.isSearchBarDisabled()).toBe(true); }); - it('search bar is disabled in Tree view', async () => { - await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); + it('displays the mappings in the code block', async () => { await testBed.actions.mappings.clickToggleViewButton(); + const tabContent = testBed.actions.mappings.getCodeBlockContent(); + expect(tabContent).toEqual(JSON.stringify(testIndexMappings, null, 2)); + }); + + it('search bar is enabled in Tree view', async () => { expect(testBed.actions.mappings.isSearchBarDisabled()).toBe(false); }); it('sets the docs link href from the documentation service', async () => { - await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); const docsLinkHref = testBed.actions.mappings.getDocsLinkHref(); // the url from the mocked docs mock expect(docsLinkHref).toEqual( 'https://www.elastic.co/guide/en/elasticsearch/reference/mocked-test-branch/mapping.html' ); }); + describe('Add a new field ', () => { + const mockIndexMappingResponse: any = { + ...testIndexMappings.mappings, + properties: { + ...testIndexMappings.mappings.properties, + name: { + type: 'text', + }, + }, + }; + beforeEach(async () => { + httpRequestsMockHelpers.setUpdateIndexMappingsResponse(testIndexName, { + acknowledged: true, + }); + + await act(async () => { + testBed = await setup({ httpSetup }); + }); + + testBed.component.update(); + await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); + await testBed.actions.mappings.clickAddFieldButton(); + }); + + it('add field button opens pending block and save mappings is disabled by default', async () => { + expect(testBed.exists('indexDetailsMappingsPendingBlock')).toBe(true); + expect(testBed.find('indexDetailsMappingsSaveMappings').props().disabled); + }); + it('can cancel adding new field', async () => { + expect(testBed.exists('indexDetailsMappingsPendingBlock')).toBe(true); + expect(testBed.exists('cancelButton')).toBe(true); + + testBed.find('cancelButton').simulate('click'); + + expect(testBed.exists('indexDetailsMappingsPendingBlock')).toBe(false); + expect(testBed.exists('indexDetailsMappingsAddField')).toBe(true); + }); + + it('can add new fields and can save mappings', async () => { + httpRequestsMockHelpers.setLoadIndexMappingResponse(testIndexName, { + mappings: mockIndexMappingResponse, + }); + await testBed.actions.mappings.addNewMappingFieldNameAndType([ + { name: 'name', type: 'text' }, + ]); + await testBed.actions.mappings.clickSaveMappingsButton(); + + // add field button is available again + expect(testBed.exists('indexDetailsMappingsAddField')).toBe(true); + + expect(httpSetup.put).toHaveBeenCalledWith(`${API_BASE_PATH}/mapping/${testIndexName}`, { + body: '{"name":{"type":"text"}}', + }); + + expect(httpSetup.get).toHaveBeenCalledTimes(5); + expect(httpSetup.get).toHaveBeenLastCalledWith( + `${API_BASE_PATH}/mapping/${testIndexName}`, + requestOptions + ); + + // refresh mappings and page re-renders + expect(testBed.exists('indexDetailsMappingsAddField')).toBe(true); + expect(testBed.actions.mappings.isSearchBarDisabled()).toBe(false); + + const treeViewContent = testBed.actions.mappings.getTreeViewContent('nameField'); + expect(treeViewContent).toContain('name'); + + await testBed.actions.mappings.clickToggleViewButton(); + const jsonContent = testBed.actions.mappings.getCodeBlockContent(); + expect(jsonContent).toEqual( + JSON.stringify({ mappings: mockIndexMappingResponse }, null, 2) + ); + }); + it('there is a callout with error message when save mappings fail', async () => { + const error = { + statusCode: 400, + error: 'Bad Request', + message: 'Error saving mapping:', + }; + httpRequestsMockHelpers.setUpdateIndexMappingsResponse(testIndexName, undefined, error); + + await testBed.actions.mappings.addNewMappingFieldNameAndType([ + { name: 'test_field', type: 'boolean' }, + ]); + await testBed.actions.mappings.clickSaveMappingsButton(); + expect(testBed.actions.mappings.isSaveMappingsErrorDisplayed()).toBe(true); + }); + }); describe('error loading mappings', () => { beforeEach(async () => { @@ -522,8 +612,8 @@ describe('', () => { }); it('resends a request when reload button is clicked', async () => { - // already sent 3 requests while setting up the component - const numberOfRequests = 3; + // already sent 4 requests while setting up the component + const numberOfRequests = 4; expect(httpSetup.get).toHaveBeenCalledTimes(numberOfRequests); await testBed.actions.mappings.clickErrorReloadButton(); expect(httpSetup.get).toHaveBeenCalledTimes(numberOfRequests + 1); diff --git a/x-pack/plugins/index_management/public/application/app_context.tsx b/x-pack/plugins/index_management/public/application/app_context.tsx index cf2e9703669bd..d0544bbf867e0 100644 --- a/x-pack/plugins/index_management/public/application/app_context.tsx +++ b/x-pack/plugins/index_management/public/application/app_context.tsx @@ -8,7 +8,6 @@ import React, { createContext, useContext } from 'react'; import { Observable } from 'rxjs'; import SemVer from 'semver/classes/semver'; -import { ManagementAppMountParams } from '@kbn/management-plugin/public'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import { ApplicationStart, @@ -25,8 +24,10 @@ import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { SettingsStart } from '@kbn/core-ui-settings-browser'; import type { CloudSetup } from '@kbn/cloud-plugin/public'; import type { ConsolePluginStart } from '@kbn/console-plugin/public'; +import { EuiBreadcrumb } from '@elastic/eui'; import { ExtensionsService } from '../services'; import { UiMetricService, NotificationService, HttpService } from './services'; +import { IndexManagementBreadcrumb } from './services/breadcrumbs'; export const AppContext = createContext(undefined); @@ -59,7 +60,7 @@ export interface AppDependencies { enableDataStreamsStorageColumn: boolean; }; history: ScopedHistory; - setBreadcrumbs: ManagementAppMountParams['setBreadcrumbs']; + setBreadcrumbs: (type: IndexManagementBreadcrumb, additionalBreadcrumb?: EuiBreadcrumb) => void; uiSettings: IUiSettingsClient; settings: SettingsStart; url: SharePluginStart['url']; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/_index.scss b/x-pack/plugins/index_management/public/application/components/mappings_editor/_index.scss index 8e8ca5c571860..0ba1e74c2d5e8 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/_index.scss +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/_index.scss @@ -15,9 +15,6 @@ .mappingsEditor { &__createFieldWrapper { background-color: $euiColorLightestShade; - border-right: $euiBorderThin; - border-bottom: $euiBorderThin; - border-left: $euiBorderThin; padding: $euiSize; } diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx index a28531ed70953..4aeaacd89fa52 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx @@ -6,91 +6,84 @@ */ import React, { useMemo, useCallback, useEffect } from 'react'; -import { EuiSpacer } from '@elastic/eui'; import { GlobalFlyout } from '../../shared_imports'; import { useMappingsState, useDispatch } from '../../mappings_state_context'; import { deNormalize } from '../../lib'; import { EditFieldContainer, EditFieldContainerProps, defaultFlyoutProps } from './fields'; -import { DocumentFieldsHeader } from './document_fields_header'; import { DocumentFieldsJsonEditor } from './fields_json_editor'; import { DocumentFieldsTreeEditor } from './fields_tree_editor'; -import { SearchResult } from './search_fields'; const { useGlobalFlyout } = GlobalFlyout; +interface Props { + searchComponent?: React.ReactElement; + searchResultComponent?: React.ReactElement; + onCancelAddingNewFields?: () => void; + isAddingFields?: boolean; +} +export const DocumentFields = React.memo( + ({ searchComponent, searchResultComponent, onCancelAddingNewFields, isAddingFields }: Props) => { + const { fields, documentFields } = useMappingsState(); + const dispatch = useDispatch(); + const { addContent: addContentToGlobalFlyout, removeContent: removeContentFromGlobalFlyout } = + useGlobalFlyout(); -export const DocumentFields = React.memo(() => { - const { fields, search, documentFields } = useMappingsState(); - const dispatch = useDispatch(); - const { addContent: addContentToGlobalFlyout, removeContent: removeContentFromGlobalFlyout } = - useGlobalFlyout(); + const { editor: editorType } = documentFields; + const isEditing = documentFields.status === 'editingField'; - const { editor: editorType } = documentFields; - const isEditing = documentFields.status === 'editingField'; - - const jsonEditorDefaultValue = useMemo(() => { - if (editorType === 'json') { - return deNormalize(fields); - } - }, [editorType, fields]); - - const editor = - editorType === 'json' ? ( - - ) : ( - - ); - - const onSearchChange = useCallback( - (value: string) => { - dispatch({ type: 'search:update', value }); - }, - [dispatch] - ); - - const exitEdit = useCallback(() => { - dispatch({ type: 'documentField.changeStatus', value: 'idle' }); - }, [dispatch]); + const jsonEditorDefaultValue = useMemo(() => { + if (editorType === 'json') { + return deNormalize(fields); + } + }, [editorType, fields]); - useEffect(() => { - if (isEditing) { - // Open the flyout with the content - addContentToGlobalFlyout({ - id: 'mappingsEditField', - Component: EditFieldContainer, - props: { exitEdit }, - flyoutProps: { ...defaultFlyoutProps, onClose: exitEdit }, - cleanUpFunc: exitEdit, - }); - } - }, [isEditing, addContentToGlobalFlyout, fields.byId, exitEdit]); + const editor = + editorType === 'json' ? ( + + ) : ( + + ); - useEffect(() => { - if (!isEditing) { - removeContentFromGlobalFlyout('mappingsEditField'); - } - }, [isEditing, removeContentFromGlobalFlyout]); + const exitEdit = useCallback(() => { + dispatch({ type: 'documentField.changeStatus', value: 'idle' }); + }, [dispatch]); - useEffect(() => { - return () => { + useEffect(() => { if (isEditing) { - // When the component unmounts, exit edit mode. - exitEdit(); + // Open the flyout with the content + addContentToGlobalFlyout({ + id: 'mappingsEditField', + Component: EditFieldContainer, + props: { exitEdit }, + flyoutProps: { ...defaultFlyoutProps, onClose: exitEdit }, + cleanUpFunc: exitEdit, + }); } - }; - }, [isEditing, exitEdit]); + }, [isEditing, addContentToGlobalFlyout, fields.byId, exitEdit]); - const searchTerm = search.term.trim(); + useEffect(() => { + if (!isEditing) { + removeContentFromGlobalFlyout('mappingsEditField'); + } + }, [isEditing, removeContentFromGlobalFlyout]); - return ( -
- - - {searchTerm !== '' ? ( - - ) : ( - editor - )} -
- ); -}); + useEffect(() => { + return () => { + if (isEditing) { + // When the component unmounts, exit edit mode. + exitEdit(); + } + }; + }, [isEditing, exitEdit]); + + return ( +
+ {searchComponent} + {searchResultComponent ? searchResultComponent : editor} +
+ ); + } +); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields_search.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields_search.tsx index b596c214dd0c5..77f67e139ffc6 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields_search.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields_search.tsx @@ -22,7 +22,7 @@ export const DocumentFieldsSearch = React.memo( ); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx index bb9d314e396cb..d4dd3e21d8b36 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx @@ -37,6 +37,8 @@ interface Props { paddingLeft?: number; isCancelable?: boolean; maxNestedDepth?: number; + onCancelAddingNewFields?: () => void; + isAddingFields?: boolean; } export const CreateField = React.memo(function CreateFieldComponent({ @@ -46,6 +48,8 @@ export const CreateField = React.memo(function CreateFieldComponent({ paddingLeft, isCancelable, maxNestedDepth, + onCancelAddingNewFields, + isAddingFields, }: Props) { const dispatch = useDispatch(); @@ -65,7 +69,11 @@ export const CreateField = React.memo(function CreateFieldComponent({ }, [dispatch, subscribe]); const cancel = () => { - dispatch({ type: 'documentField.changeStatus', value: 'idle' }); + if (isAddingFields && onCancelAddingNewFields) { + onCancelAddingNewFields(); + } else { + dispatch({ type: 'documentField.changeStatus', value: 'idle' }); + } }; const submitForm = async (e?: React.FormEvent, exitAfter: boolean = false) => { @@ -136,7 +144,7 @@ export const CreateField = React.memo(function CreateFieldComponent({ const renderFormActions = () => ( - {isCancelable !== false && ( + {(isCancelable !== false || isAddingFields) && ( {i18n.translate('xpack.idxMgmt.mappingsEditor.createField.cancelButtonLabel', { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list.tsx index 771292d607532..241fa132a28bf 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list.tsx @@ -8,14 +8,23 @@ import React from 'react'; import { FieldsListItemContainer } from './fields_list_item_container'; -import { NormalizedField } from '../../../types'; +import { NormalizedField, State } from '../../../types'; interface Props { fields?: NormalizedField[]; treeDepth?: number; + state: State; + setPreviousState?: (state: State) => void; + isAddingFields?: boolean; } -export const FieldsList = React.memo(function FieldsListComponent({ fields, treeDepth }: Props) { +export const FieldsList = React.memo(function FieldsListComponent({ + fields, + treeDepth, + state, + setPreviousState, + isAddingFields, +}: Props) { if (fields === undefined) { return null; } @@ -27,6 +36,9 @@ export const FieldsList = React.memo(function FieldsListComponent({ fields, tree fieldId={field.id} treeDepth={treeDepth === undefined ? 0 : treeDepth} isLastItem={index === fields.length - 1} + state={state} + setPreviousState={setPreviousState} + isAddingFields={isAddingFields} /> ))} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx index d0957ca709ada..43e0726ea5889 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx @@ -17,7 +17,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { NormalizedField, NormalizedFields } from '../../../types'; +import { NormalizedField, NormalizedFields, State } from '../../../types'; import { getTypeLabelFromField } from '../../../lib'; import { CHILD_FIELD_INDENT_SIZE, LEFT_PADDING_SIZE_FIELD_ITEM_WRAPPER } from '../../../constants'; @@ -59,8 +59,11 @@ interface Props { maxNestedDepth: number; addField(): void; editField(): void; - toggleExpand(): void; + toggleExpand: () => void; + setPreviousState?: (state: State) => void; treeDepth: number; + state: State; + isAddingFields?: boolean; } function FieldListItemComponent( @@ -79,6 +82,9 @@ function FieldListItemComponent( editField, toggleExpand, treeDepth, + state, + isAddingFields, + setPreviousState, }: Props, ref: React.Ref ) { @@ -92,11 +98,9 @@ function FieldListItemComponent( isExpanded, path, } = field; - // When there aren't any "child" fields (the maxNestedDepth === 0), there is no toggle icon on the left of any field. // For that reason, we need to compensate and substract some indent to left align on the page. const substractIndentAmount = maxNestedDepth === 0 ? CHILD_FIELD_INDENT_SIZE * 0.5 : 0; - const indent = treeDepth * CHILD_FIELD_INDENT_SIZE - substractIndentAmount; const indentCreateField = @@ -122,6 +126,7 @@ function FieldListItemComponent( isMultiField={canHaveMultiFields} paddingLeft={indentCreateField} maxNestedDepth={maxNestedDepth} + isAddingFields={isAddingFields} /> ); }; @@ -301,7 +306,13 @@ function FieldListItemComponent( {Boolean(childFieldsArray.length) && isExpanded && ( - + )} {renderCreateField()} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item_container.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item_container.tsx index 71bf3c01e820a..a5e85eb1aad17 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item_container.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item_container.tsx @@ -7,25 +7,34 @@ import React, { useMemo, useCallback, useRef } from 'react'; -import { useMappingsState, useDispatch } from '../../../mappings_state_context'; -import { NormalizedField } from '../../../types'; +import { useDispatch } from '../../../mappings_state_context'; +import { NormalizedField, State } from '../../../types'; import { FieldsListItem } from './fields_list_item'; interface Props { fieldId: string; treeDepth: number; isLastItem: boolean; + state: State; + setPreviousState?: (state: State) => void; + isAddingFields?: boolean; } -export const FieldsListItemContainer = ({ fieldId, treeDepth, isLastItem }: Props) => { +export const FieldsListItemContainer = ({ + fieldId, + treeDepth, + isLastItem, + state, + setPreviousState, + isAddingFields, +}: Props) => { const dispatch = useDispatch(); const listElement = useRef(null); const { documentFields: { status, fieldToAddFieldTo, fieldToEdit }, fields: { byId, maxNestedDepth, rootLevelFields }, runtimeFields, - } = useMappingsState(); - + } = state; const getField = useCallback((id: string) => byId[id], [byId]); const runtimeFieldNames = Object.values(runtimeFields).map((field) => field.source.name); @@ -59,8 +68,27 @@ export const FieldsListItemContainer = ({ fieldId, treeDepth, isLastItem }: Prop }, [fieldId, dispatch]); const toggleExpand = useCallback(() => { - dispatch({ type: 'field.toggleExpand', value: { fieldId } }); - }, [fieldId, dispatch]); + // if using static state, set state manually + if (isAddingFields && setPreviousState !== undefined) { + const previousField = state.fields.byId[fieldId]; + const nextField: NormalizedField = { + ...previousField, + isExpanded: !previousField.isExpanded, + }; + setPreviousState({ + ...state, + fields: { + ...state.fields, + byId: { + ...state.fields.byId, + [fieldId]: nextField, + }, + }, + }); + } else { + dispatch({ type: 'field.toggleExpand', value: { fieldId } }); + } + }, [fieldId, dispatch, isAddingFields, setPreviousState, state]); return ( ); }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields_tree_editor.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields_tree_editor.tsx index 1115f605bd510..b88abe7ac99d7 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields_tree_editor.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields_tree_editor.tsx @@ -12,7 +12,12 @@ import { i18n } from '@kbn/i18n'; import { useMappingsState, useDispatch } from '../../mappings_state_context'; import { FieldsList, CreateField } from './fields'; -export const DocumentFieldsTreeEditor = () => { +interface Props { + onCancelAddingNewFields?: () => void; + isAddingFields?: boolean; +} + +export const DocumentFieldsTreeEditor = ({ onCancelAddingNewFields, isAddingFields }: Props) => { const dispatch = useDispatch(); const { fields: { byId, rootLevelFields }, @@ -34,7 +39,15 @@ export const DocumentFieldsTreeEditor = () => { return null; } - return 0} allFields={byId} isRootLevelField />; + return ( + 0} + allFields={byId} + isRootLevelField + onCancelAddingNewFields={onCancelAddingNewFields} + isAddingFields={isAddingFields} + /> + ); }; const renderAddFieldButton = () => { @@ -58,7 +71,7 @@ export const DocumentFieldsTreeEditor = () => { return ( <> - + {renderCreateField()} {renderAddFieldButton()} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx index 3055da755cdda..2c0e6b1dec5e5 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useMemo, useState, useEffect } from 'react'; +import React, { useMemo, useState, useEffect, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiSpacer, EuiTabs, EuiTab } from '@elastic/eui'; @@ -26,10 +26,12 @@ import { RuntimeFields, } from './types'; import { extractMappingsDefinition } from './lib'; -import { useMappingsState } from './mappings_state_context'; +import { useDispatch, useMappingsState } from './mappings_state_context'; import { useMappingsStateListener } from './use_state_listener'; import { useConfig } from './config_context'; import { DocLinksStart } from './shared_imports'; +import { DocumentFieldsHeader } from './components/document_fields/document_fields_header'; +import { SearchResult } from './components/document_fields/search_fields'; type TabName = 'fields' | 'runtimeFields' | 'advanced' | 'templates'; @@ -95,7 +97,6 @@ export const MappingsEditor = React.memo( }, runtime, }; - return { parsedDefaultValue: parsed, multipleMappingsDeclared: false }; }, [value]); @@ -151,8 +152,36 @@ export const MappingsEditor = React.memo( selectTab(tab); }; + const dispatch = useDispatch(); + const onSearchChange = useCallback( + (searchValue: string) => { + dispatch({ type: 'search:update', value: searchValue }); + }, + [dispatch] + ); + const tabToContentMap = { - fields: , + fields: ( + + + + + } + searchResultComponent={ + state.search.term.trim() !== '' ? ( + + ) : undefined + } + /> + ), runtimeFields: , templates: , advanced: ( diff --git a/x-pack/plugins/index_management/public/application/index.tsx b/x-pack/plugins/index_management/public/application/index.tsx index f795bd05c04ab..3f5e4960ee977 100644 --- a/x-pack/plugins/index_management/public/application/index.tsx +++ b/x-pack/plugins/index_management/public/application/index.tsx @@ -27,18 +27,19 @@ import { ComponentTemplatesProvider, MappingsEditorProvider } from './components const { GlobalFlyoutProvider } = GlobalFlyout; -export const renderApp = ( - elem: HTMLElement | null, - { core, dependencies }: { core: CoreStart; dependencies: AppDependencies } -) => { - if (!elem) { - return () => undefined; - } +export interface IndexManagementAppContextProps { + core: CoreStart; + dependencies: AppDependencies; +} +export const IndexManagementAppContext: React.FC = ({ + children, + core, + dependencies, +}) => { const { i18n, docLinks, notifications, application, executionContext, overlays, theme } = core; const { Context: I18nContext } = i18n; - const { services, history, setBreadcrumbs, uiSettings, settings, kibanaVersion, theme$ } = - dependencies; + const { services, setBreadcrumbs, uiSettings, settings, kibanaVersion, theme$ } = dependencies; // theme is required by the CodeEditor component used to edit runtime field Painless scripts. const { Provider: KibanaReactContextProvider } = @@ -64,7 +65,7 @@ export const renderApp = ( executionContext, }; - render( + return ( @@ -72,16 +73,30 @@ export const renderApp = ( - - - + {children} - , + + ); +}; + +export const renderApp = ( + elem: HTMLElement | null, + { core, dependencies }: { core: CoreStart; dependencies: AppDependencies } +) => { + if (!elem) { + return () => undefined; + } + const { history } = dependencies; + + render( + + + , elem ); diff --git a/x-pack/plugins/index_management/public/application/mount_management_section.ts b/x-pack/plugins/index_management/public/application/mount_management_section.ts index 6eecaafb9f74f..aaf2e871ca6f0 100644 --- a/x-pack/plugins/index_management/public/application/mount_management_section.ts +++ b/x-pack/plugins/index_management/public/application/mount_management_section.ts @@ -7,11 +7,12 @@ import { i18n } from '@kbn/i18n'; import SemVer from 'semver/classes/semver'; -import { CoreSetup, CoreStart } from '@kbn/core/public'; +import { CoreSetup, CoreStart, CoreTheme, ScopedHistory } from '@kbn/core/public'; import { ManagementAppMountParams } from '@kbn/management-plugin/public'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import { CloudSetup } from '@kbn/cloud-plugin/public'; +import { Observable } from 'rxjs'; import { UIM_APP_NAME } from '../../common/constants'; import { PLUGIN } from '../../common/constants/plugin'; import { ExtensionsService } from '../services'; @@ -47,50 +48,34 @@ function initSetup({ return { uiMetricService }; } -export async function mountManagementSection({ - coreSetup, +export function getIndexManagementDependencies({ + core, usageCollection, - params, extensionsService, + history, isFleetEnabled, kibanaVersion, config, cloud, + startDependencies, + theme$, + uiMetricService, }: { - coreSetup: CoreSetup; + core: CoreStart; usageCollection: UsageCollectionSetup; - params: ManagementAppMountParams; extensionsService: ExtensionsService; + history: ScopedHistory; isFleetEnabled: boolean; kibanaVersion: SemVer; config: AppDependencies['config']; cloud?: CloudSetup; -}) { - const { element, setBreadcrumbs, history, theme$ } = params; - const [core, startDependencies] = await coreSetup.getStartServices(); - const { - docLinks, - fatalErrors, - application, - chrome: { docTitle }, - uiSettings, - executionContext, - settings, - http, - } = core; - + startDependencies: StartDependencies; + theme$: Observable; + uiMetricService: UiMetricService; +}): AppDependencies { + const { docLinks, fatalErrors, application, uiSettings, executionContext, settings, http } = core; const { url } = startDependencies.share; - docTitle.change(PLUGIN.getI18nName(i18n)); - - breadcrumbService.setup(setBreadcrumbs); - documentationService.setup(docLinks); - - const { uiMetricService } = initSetup({ - usageCollection, - core, - }); - - const appDependencies: AppDependencies = { + return { core: { fatalErrors, getUrlForApp: application.getUrlForApp, @@ -113,7 +98,7 @@ export async function mountManagementSection({ }, config, history, - setBreadcrumbs, + setBreadcrumbs: breadcrumbService.setBreadcrumbs, uiSettings, settings, url, @@ -121,6 +106,55 @@ export async function mountManagementSection({ kibanaVersion, theme$, }; +} + +export async function mountManagementSection({ + coreSetup, + usageCollection, + params, + extensionsService, + isFleetEnabled, + kibanaVersion, + config, + cloud, +}: { + coreSetup: CoreSetup; + usageCollection: UsageCollectionSetup; + params: ManagementAppMountParams; + extensionsService: ExtensionsService; + isFleetEnabled: boolean; + kibanaVersion: SemVer; + config: AppDependencies['config']; + cloud?: CloudSetup; +}) { + const { element, setBreadcrumbs, history, theme$ } = params; + const [core, startDependencies] = await coreSetup.getStartServices(); + const { + docLinks, + chrome: { docTitle }, + } = core; + docTitle.change(PLUGIN.getI18nName(i18n)); + + breadcrumbService.setup(setBreadcrumbs); + documentationService.setup(docLinks); + + const { uiMetricService } = initSetup({ + usageCollection, + core, + }); + const appDependencies = getIndexManagementDependencies({ + cloud, + config, + core, + extensionsService, + history, + isFleetEnabled, + kibanaVersion, + startDependencies, + theme$, + uiMetricService, + usageCollection, + }); const unmountAppCallback = renderApp(element, { core, dependencies: appDependencies }); diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings.tsx index 03bc61ca71ab6..77360fd85ad9a 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings.tsx @@ -11,12 +11,16 @@ import { EuiButton, EuiPageTemplate, EuiSpacer, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { SectionLoading } from '@kbn/es-ui-shared-plugin/public'; +import { Index } from '../../../../..'; import { DetailsPageMappingsContent } from './details_page_mappings_content'; -import { Index } from '../../../../../../common'; + import { useLoadIndexMappings } from '../../../../services'; -export const DetailsPageMappings: FunctionComponent<{ index: Index }> = ({ index }) => { - const { isLoading, data, error, resendRequest } = useLoadIndexMappings(index.name); +export const DetailsPageMappings: FunctionComponent<{ + index?: Index; + showAboutMappings?: boolean; +}> = ({ index, showAboutMappings = true }) => { + const { isLoading, data, error, resendRequest } = useLoadIndexMappings(index?.name || ''); const [jsonError, setJsonError] = useState(false); const stringifiedData = useMemo(() => { @@ -40,7 +44,7 @@ export const DetailsPageMappings: FunctionComponent<{ index: Index }> = ({ index ); } - if (error || jsonError || !stringifiedData) { + if (error || jsonError || !stringifiedData || !index?.name) { return ( = ({ index id="xpack.idxMgmt.indexDetails.mappings.errorDescription" defaultMessage="We encountered an error loading mappings for index {indexName}. Make sure that the index name in the URL is correct and try again." values={{ - indexName: index.name, + indexName: index?.name || undefined, }} /> @@ -84,5 +88,13 @@ export const DetailsPageMappings: FunctionComponent<{ index: Index }> = ({ index ); } - return ; + return ( + + ); }; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx index 10fcb6d57172a..9273834c07492 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx @@ -5,30 +5,39 @@ * 2.0. */ +import React, { FunctionComponent, useCallback, useMemo, useState } from 'react'; import { + EuiAccordion, EuiButton, EuiCodeBlock, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiLink, + EuiNotificationBadge, EuiPanel, EuiSpacer, EuiText, EuiTitle, - useEuiTheme, EuiEmptyPrompt, + useGeneratedHtmlId, + EuiFilterGroup, + EuiFilterButton, + EuiCallOut, } from '@elastic/eui'; import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; -import React, { FunctionComponent, useCallback, useMemo, useState } from 'react'; +import { i18n } from '@kbn/i18n'; import { Index } from '../../../../../../common'; import { useAppContext } from '../../../../app_context'; import { DocumentFieldsSearch } from '../../../../components/mappings_editor/components/document_fields/document_fields_search'; import { FieldsList } from '../../../../components/mappings_editor/components/document_fields/fields'; import { SearchResult } from '../../../../components/mappings_editor/components/document_fields/search_fields'; -import { extractMappingsDefinition } from '../../../../components/mappings_editor/lib'; +import { + extractMappingsDefinition, + searchFields, +} from '../../../../components/mappings_editor/lib'; import { MappingsEditorParsedMetadata } from '../../../../components/mappings_editor/mappings_editor'; import { useDispatch, @@ -36,24 +45,62 @@ import { } from '../../../../components/mappings_editor/mappings_state_context'; import { useMappingsStateListener } from '../../../../components/mappings_editor/use_state_listener'; import { documentationService } from '../../../../services'; +import { DocumentFields } from '../../../../components/mappings_editor/components'; +import { deNormalize } from '../../../../components/mappings_editor/lib'; +import { updateIndexMappings } from '../../../../services/api'; +import { notificationService } from '../../../../services/notification'; +import { + NormalizedField, + NormalizedFields, + State, +} from '../../../../components/mappings_editor/types'; +const getFieldsFromState = (state: State) => { + const getField = (fieldId: string) => { + return state.fields.byId[fieldId]; + }; + const fields = () => { + return state.fields.rootLevelFields.map((id) => getField(id)); + }; + return fields(); +}; export const DetailsPageMappingsContent: FunctionComponent<{ index: Index; data: string; + showAboutMappings: boolean; jsonData: any; -}> = ({ index, data, jsonData }) => { + refetchMapping: () => void; +}> = ({ index, data, jsonData, refetchMapping, showAboutMappings }) => { const { services: { extensionsService }, core: { getUrlForApp }, } = useAppContext(); - const { euiTheme } = useEuiTheme(); - const [isJSONVisible, setIsJSONVisible] = useState(true); + const state = useMappingsState(); + const dispatch = useDispatch(); + + const indexName = index.name; + + const pendingFieldListId = useGeneratedHtmlId({ + prefix: 'pendingFieldListId', + }); + + const [isAddingFields, setAddingFields] = useState(false); + const newFieldsLength = useMemo(() => { + return Object.keys(state.fields.byId).length; + }, [state.fields.byId]); + + const [previousState, setPreviousState] = useState(state); + const [previousStateFields, setPreviousStateFields] = useState( + getFieldsFromState(state) + ); + const [saveMappingError, setSaveMappingError] = useState(undefined); + const [isJSONVisible, setIsJSONVisible] = useState(false); const onToggleChange = () => { setIsJSONVisible(!isJSONVisible); }; - const mappingsDefinition = extractMappingsDefinition(jsonData); + const mappingsDefinition = extractMappingsDefinition(jsonData); const { parsedDefaultValue } = useMemo(() => { if (mappingsDefinition === null) { return { multipleMappingsDeclared: true }; @@ -98,23 +145,80 @@ export const DetailsPageMappingsContent: FunctionComponent<{ useMappingsStateListener({ value: parsedDefaultValue, status: 'disabled' }); - const { - fields: { byId, rootLevelFields }, - search, - documentFields, - } = useMappingsState(); + const onCancelAddingNewFields = useCallback(() => { + setAddingFields(!isAddingFields); + + // reset mappings to previous state + dispatch({ + type: 'editor.replaceMappings', + value: { + ...previousState, + documentFields: { + status: 'disabled', + editor: 'default', + }, + }, + }); + }, [isAddingFields, dispatch, previousState]); + + const addFieldButtonOnClick = useCallback(() => { + setAddingFields(!isAddingFields); + + // when adding new field, save previous state. This state is then used by FieldsList component to show only saved mappings. + setPreviousStateFields(getFieldsFromState(state)); + setPreviousState(state); + + // reset mappings and change status to create field. + dispatch({ + type: 'editor.replaceMappings', + value: { + ...state, + fields: { ...state.fields, byId: {}, rootLevelFields: [] } as NormalizedFields, + documentFields: { + status: 'creatingField', + editor: 'default', + }, + }, + }); + }, [dispatch, isAddingFields, state]); + + const updateMappings = useCallback(async () => { + try { + const { error } = await updateIndexMappings(indexName, deNormalize(state.fields)); + + if (!error) { + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.indexDetails.mappings.successfullyUpdatedIndexMappings', { + defaultMessage: 'Index Mapping was successfully updated', + }) + ); + refetchMapping(); + } else { + setSaveMappingError(error.message); + } + } catch (exception) { + setSaveMappingError(exception.message); + } + }, [state.fields, indexName, refetchMapping]); - const getField = useCallback((fieldId: string) => byId[fieldId], [byId]); - const fields = useMemo(() => rootLevelFields.map(getField), [rootLevelFields, getField]); - const dispatch = useDispatch(); const onSearchChange = useCallback( (value: string) => { - dispatch({ type: 'search:update', value }); + if (isAddingFields) { + setPreviousState({ + ...previousState, + search: { + term: value, + result: searchFields(value, previousState.fields.byId), + }, + }); + } else { + dispatch({ type: 'search:update', value }); + } }, - [dispatch] + [dispatch, previousState, isAddingFields] ); - const searchTerm = search.term.trim(); + const searchTerm = isAddingFields ? previousState.search.term.trim() : state.search.term.trim(); const jsonBlock = ( ); + const searchResultComponent = isAddingFields ? ( + + ) : ( + + ); + const fieldsListComponent = isAddingFields ? ( + + ) : ( + + ); + const fieldSearchComponent = isAddingFields ? ( + + ) : ( + + ); const treeViewBlock = ( - - - {mappingsDefinition === null ? ( - - - - } - body={ -

- -

- } - /> - ) : searchTerm !== '' ? ( - - ) : ( - - )} -
-
+ <> + {mappingsDefinition === null ? ( + + + + } + body={ +

+ +

+ } + /> + ) : searchTerm !== '' ? ( + searchResultComponent + ) : ( + fieldsListComponent + )} + ); + const errorSavingMappings = saveMappingError && ( + + + + + + + + + ); return ( // using "rowReverse" to keep docs links on the top of the mappings code block on smaller screen <> - - - - {isJSONVisible ? ( - - ) : ( - - )} - - - - - + {showAboutMappings && ( + + + + + + + + +

+ +

+
+
+
+ + +

+ +

+
+ + + + +
+ {extensionsService.indexMappingsContent && ( + <> + + {extensionsService.indexMappingsContent.renderContent({ index, getUrlForApp })} + + )} +
+ )} + + + {fieldSearchComponent} + {!index.hidden && ( - - - - -

+ {!isAddingFields ? ( + -

-
+ + ) : ( + + + + )}
-
- - -

- -

-
- - - - -
- {extensionsService.indexMappingsContent && ( - <> - - {extensionsService.indexMappingsContent.renderContent({ index, getUrlForApp })} - + )} + + + + + + + + + + + +
+ {errorSavingMappings} + {isAddingFields && ( + + + + + + + + + + + 0 ? 'accent' : 'subdued'} + size="m" + > + {newFieldsLength} + + + + + } + > + + {newFieldsLength <= 0 ? ( + + ) : ( + + )} + + +
+ )} - - - {isJSONVisible ? jsonBlock : treeViewBlock} - + + + {isJSONVisible ? jsonBlock : treeViewBlock} + + + ); diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index.ts b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index.tsx similarity index 100% rename from x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index.ts rename to x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index.tsx diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index_mapping_with_context.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index_mapping_with_context.tsx new file mode 100644 index 0000000000000..5f8eb213a2af5 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index_mapping_with_context.tsx @@ -0,0 +1,46 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { UIM_APP_NAME } from '../../../../../../common/constants/ui_metric'; +import { httpService } from '../../../../services/http'; +import { notificationService } from '../../../../services/notification'; +import { UiMetricService } from '../../../../services/ui_metric'; +import { AppDependencies, IndexManagementAppContext } from '../../../..'; +import { IndexMappingWithContextProps } from './index_mapping_with_context_types'; +import { DetailsPageMappings } from './details_page_mappings'; + +export const IndexMappingWithContext: React.FC = ({ + core, + dependencies, + index, + showAboutMappings, +}) => { + // this normally happens when the index management app is rendered + // but if components are embedded elsewhere that setup is skipped, so we have to do it here + // would do it in plugin.ts but that blows up the bundle size + // can't do it in an effect because then the first http call fails as the instantiation happens after first render + if (!httpService.httpClient) { + httpService.setup(core.http); + notificationService.setup(core.notifications); + } + + const newDependencies: AppDependencies = { + ...dependencies, + services: { + ...(dependencies.services || {}), + httpService, + notificationService, + uiMetricService: new UiMetricService(UIM_APP_NAME), + }, + }; + return ( + + + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index_mapping_with_context_types.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index_mapping_with_context_types.tsx new file mode 100644 index 0000000000000..3d33b77bbd25b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index_mapping_with_context_types.tsx @@ -0,0 +1,46 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreStart } from '@kbn/core/public'; +import { ExtensionsService } from '../../../../../services'; +import { AppDependencies } from '../../../../app_context'; + +// duplicating this Index interface here so we don't blow up the bundle by importing all the types +interface Index { + name: string; + primary?: number | string; + replica?: number | string; + isFrozen: boolean; + hidden: boolean; + aliases: string | string[]; + data_stream?: string; + + // The types below are added by extension services if corresponding plugins are enabled (ILM, Rollup, CCR) + isRollupIndex?: boolean; + isFollowerIndex?: boolean; + + // The types from here below represent information returned from the index stats API; + // treated optional as the stats API is not available on serverless + documents?: number; + size?: string; + primary_size?: string; + documents_deleted?: number; +} + +export interface IndexMappingProps { + index?: Index; + showAboutMappings?: boolean; +} + +export type IndexMappingWithContextProps = { + core: CoreStart; + // omitting services here to constitute them inside the component + // this helps reduce bundle size significantly + dependencies: Omit & { + services: { extensionsService: ExtensionsService }; + }; +} & IndexMappingProps; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index_mappings_embeddable.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index_mappings_embeddable.tsx new file mode 100644 index 0000000000000..9102ba14859cd --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/index_mappings_embeddable.tsx @@ -0,0 +1,29 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLoadingSpinner } from '@elastic/eui'; +import { dynamic } from '@kbn/shared-ux-utility'; +import React, { Suspense, ComponentType } from 'react'; +import { IndexMappingWithContextProps } from './index_mapping_with_context_types'; + +// const IndexMappingWithContext = lazy>(async () => { +// return { +// default: (await import('./index_mapping_with_context')).IndexMappingWithContext, +// }; +// }); + +const IndexMappingWithContext = dynamic>(() => + import('./index_mapping_with_context').then((mod) => ({ default: mod.IndexMappingWithContext })) +); + +export const IndexMapping: React.FC = (props) => { + return ( + }> + + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/services/api.ts b/x-pack/plugins/index_management/public/application/services/api.ts index de911383cf26c..eb7e0c1876240 100644 --- a/x-pack/plugins/index_management/public/application/services/api.ts +++ b/x-pack/plugins/index_management/public/application/services/api.ts @@ -45,6 +45,7 @@ import { useRequest, sendRequest } from './use_request'; import { httpService } from './http'; import { UiMetricService } from './ui_metric'; import type { SerializedEnrichPolicy, FieldFromIndicesRequest } from '../../../common'; +import { Fields } from '../components/mappings_editor/types'; interface ReloadIndicesOptions { asSystemRequest?: boolean; @@ -431,3 +432,10 @@ export function createIndex(indexName: string) { }), }); } +export function updateIndexMappings(indexName: string, newFields: Fields) { + return sendRequest({ + path: `${API_BASE_PATH}/mapping/${encodeURIComponent(indexName)}`, + method: 'put', + body: JSON.stringify({ ...newFields }), + }); +} diff --git a/x-pack/plugins/index_management/public/index.ts b/x-pack/plugins/index_management/public/index.ts index 8fb836ba7ffd9..19d50a5f961f8 100644 --- a/x-pack/plugins/index_management/public/index.ts +++ b/x-pack/plugins/index_management/public/index.ts @@ -19,3 +19,5 @@ export type { IndexManagementPluginSetup, IndexManagementPluginStart } from './t export { getIndexListUri, getTemplateDetailsLink } from './application/services/routing'; export type { Index } from '../common'; + +export type { IndexMappingProps } from './application/sections/home/index_list/details_page/index_mapping_with_context_types'; diff --git a/x-pack/plugins/index_management/public/plugin.ts b/x-pack/plugins/index_management/public/plugin.ts index f4038a4e2677f..4cc904ebf6ad0 100644 --- a/x-pack/plugins/index_management/public/plugin.ts +++ b/x-pack/plugins/index_management/public/plugin.ts @@ -8,7 +8,13 @@ import { i18n } from '@kbn/i18n'; import SemVer from 'semver/classes/semver'; -import { CoreSetup, PluginInitializerContext } from '@kbn/core/public'; +import { + CoreSetup, + CoreStart, + Plugin, + PluginInitializerContext, + ScopedHistory, +} from '@kbn/core/public'; import { setExtensionsService } from './application/store/selectors/extension_service'; import { ExtensionsService, PublicApiService } from './services'; @@ -18,24 +24,38 @@ import { SetupDependencies, StartDependencies, ClientConfigType, + IndexManagementPluginStart, } from './types'; // avoid import from index files in plugin.ts, use specific import paths import { PLUGIN } from '../common/constants/plugin'; +import { IndexMapping } from './application/sections/home/index_list/details_page/index_mappings_embeddable'; -export class IndexMgmtUIPlugin { +export class IndexMgmtUIPlugin + implements + Plugin< + IndexManagementPluginSetup, + IndexManagementPluginStart, + SetupDependencies, + StartDependencies + > +{ private extensionsService = new ExtensionsService(); + private kibanaVersion: SemVer; + private config: { + enableIndexActions: boolean; + enableLegacyTemplates: boolean; + enableIndexStats: boolean; + editableIndexSettings: 'all' | 'limited'; + enableDataStreamsStorageColumn: boolean; + isIndexManagementUiEnabled: boolean; + }; - constructor(private ctx: PluginInitializerContext) { + constructor(ctx: PluginInitializerContext) { // Temporary hack to provide the service instances in module files in order to avoid a big refactor // For the selectors we should expose them through app dependencies and read them from there on each container component. setExtensionsService(this.extensionsService); - } - - public setup( - coreSetup: CoreSetup, - plugins: SetupDependencies - ): IndexManagementPluginSetup { + this.kibanaVersion = new SemVer(ctx.env.packageInfo.version); const { ui: { enabled: isIndexManagementUiEnabled }, enableIndexActions, @@ -43,18 +63,24 @@ export class IndexMgmtUIPlugin { enableIndexStats, editableIndexSettings, enableDataStreamsStorageColumn, - } = this.ctx.config.get(); + } = ctx.config.get(); + this.config = { + isIndexManagementUiEnabled, + enableIndexActions: enableIndexActions ?? true, + enableLegacyTemplates: enableLegacyTemplates ?? true, + enableIndexStats: enableIndexStats ?? true, + editableIndexSettings: editableIndexSettings ?? 'all', + enableDataStreamsStorageColumn: enableDataStreamsStorageColumn ?? true, + }; + } - if (isIndexManagementUiEnabled) { + public setup( + coreSetup: CoreSetup, + plugins: SetupDependencies + ): IndexManagementPluginSetup { + if (this.config.isIndexManagementUiEnabled) { const { fleet, usageCollection, management, cloud } = plugins; - const kibanaVersion = new SemVer(this.ctx.env.packageInfo.version); - const config = { - enableIndexActions: enableIndexActions ?? true, - enableLegacyTemplates: enableLegacyTemplates ?? true, - enableIndexStats: enableIndexStats ?? true, - editableIndexSettings: editableIndexSettings ?? 'all', - enableDataStreamsStorageColumn: enableDataStreamsStorageColumn ?? true, - }; + management.sections.section.data.registerApp({ id: PLUGIN.id, title: i18n.translate('xpack.idxMgmt.appTitle', { defaultMessage: 'Index Management' }), @@ -67,8 +93,8 @@ export class IndexMgmtUIPlugin { params, extensionsService: this.extensionsService, isFleetEnabled: Boolean(fleet), - kibanaVersion, - config, + kibanaVersion: this.kibanaVersion, + config: this.config, cloud, }); }, @@ -81,9 +107,47 @@ export class IndexMgmtUIPlugin { }; } - public start() { + public start(coreStart: CoreStart, plugins: StartDependencies): IndexManagementPluginStart { + const { fleet, usageCollection, cloud, share, console } = plugins; + return { extensionsService: this.extensionsService.setup(), + getIndexMappingComponent: (deps: { history: ScopedHistory }) => { + const { docLinks, fatalErrors, application, uiSettings, executionContext, settings, http } = + coreStart; + const { url } = share; + const appDependencies = { + core: { + fatalErrors, + getUrlForApp: application.getUrlForApp, + executionContext, + application, + http, + }, + plugins: { + usageCollection, + isFleetEnabled: Boolean(fleet), + share, + cloud, + console, + }, + services: { + extensionsService: this.extensionsService, + }, + config: this.config, + history: deps.history, + setBreadcrumbs: undefined as any, // breadcrumbService.setBreadcrumbs, + uiSettings, + settings, + url, + docLinks, + kibanaVersion: this.kibanaVersion, + theme$: coreStart.theme.theme$, + }; + return (props: any) => { + return IndexMapping({ dependencies: appDependencies, core: coreStart, ...props }); + }; + }, }; } public stop() {} diff --git a/x-pack/plugins/index_management/public/types.ts b/x-pack/plugins/index_management/public/types.ts index 729bfdcccc8c7..7deb650c1c266 100644 --- a/x-pack/plugins/index_management/public/types.ts +++ b/x-pack/plugins/index_management/public/types.ts @@ -10,6 +10,8 @@ import { ManagementSetup } from '@kbn/management-plugin/public'; import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; import { CloudSetup } from '@kbn/cloud-plugin/public'; import { ConsolePluginStart } from '@kbn/console-plugin/public'; +import { ScopedHistory } from '@kbn/core-application-browser'; +import { IndexMappingProps } from './application/sections/home/index_list/details_page/index_mapping_with_context_types'; import { ExtensionsSetup, PublicApiServiceSetup } from './services'; export interface IndexManagementPluginSetup { @@ -19,6 +21,9 @@ export interface IndexManagementPluginSetup { export interface IndexManagementPluginStart { extensionsService: ExtensionsSetup; + getIndexMappingComponent: (deps: { + history: ScopedHistory; + }) => React.FC; } export interface SetupDependencies { @@ -30,8 +35,12 @@ export interface SetupDependencies { } export interface StartDependencies { + cloud?: CloudSetup; console?: ConsolePluginStart; share: SharePluginStart; + fleet?: unknown; + usageCollection: UsageCollectionSetup; + management: ManagementSetup; } export interface ClientConfigType { diff --git a/x-pack/plugins/index_management/server/routes/api/mapping/index.ts b/x-pack/plugins/index_management/server/routes/api/mapping/index.ts index d73f8cc1809d1..a497f3a71707f 100644 --- a/x-pack/plugins/index_management/server/routes/api/mapping/index.ts +++ b/x-pack/plugins/index_management/server/routes/api/mapping/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export { registerMappingRoute } from './register_mapping_route'; +export { registerIndexMappingRoutes } from './register_index_mapping_route'; diff --git a/x-pack/plugins/index_management/server/routes/api/mapping/register_index_mapping_route.ts b/x-pack/plugins/index_management/server/routes/api/mapping/register_index_mapping_route.ts new file mode 100644 index 0000000000000..9a60acc0f8ca3 --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/mapping/register_index_mapping_route.ts @@ -0,0 +1,15 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RouteDependencies } from '../../../types'; +import { registerGetMappingRoute } from './register_mapping_route'; +import { registerUpdateMappingRoute } from './register_update_mapping_route'; + +export function registerIndexMappingRoutes(dependencies: RouteDependencies) { + registerGetMappingRoute(dependencies); + registerUpdateMappingRoute(dependencies); +} diff --git a/x-pack/plugins/index_management/server/routes/api/mapping/register_mapping_route.ts b/x-pack/plugins/index_management/server/routes/api/mapping/register_mapping_route.ts index 641ad26417f67..81d084e995bb1 100644 --- a/x-pack/plugins/index_management/server/routes/api/mapping/register_mapping_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/mapping/register_mapping_route.ts @@ -21,7 +21,7 @@ function formatHit(hit: { [key: string]: { mappings: any } }, indexName: string) }; } -export function registerMappingRoute({ router, lib: { handleEsError } }: RouteDependencies) { +export function registerGetMappingRoute({ router, lib: { handleEsError } }: RouteDependencies) { router.get( { path: addBasePath('/mapping/{indexName}'), validate: { params: paramsSchema } }, async (context, request, response) => { diff --git a/x-pack/plugins/index_management/server/routes/api/mapping/register_update_mapping_route.ts b/x-pack/plugins/index_management/server/routes/api/mapping/register_update_mapping_route.ts new file mode 100644 index 0000000000000..cd668a8aa1cc1 --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/mapping/register_update_mapping_route.ts @@ -0,0 +1,41 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +import { RouteDependencies } from '../../../types'; +import { addBasePath } from '..'; + +const paramsSchema = schema.object({ + indexName: schema.string(), +}); + +export function registerUpdateMappingRoute({ router, lib: { handleEsError } }: RouteDependencies) { + router.put( + { + path: addBasePath('/mapping/{indexName}'), + validate: { + body: schema.maybe(schema.object({}, { unknowns: 'allow' })), + params: paramsSchema, + }, + }, + async (context, request, response) => { + const { client } = (await context.core).elasticsearch; + const { indexName } = request.params as typeof paramsSchema.type; + + try { + const responseBody = await client.asCurrentUser.indices.putMapping({ + properties: request.body, + index: indexName, + }); + return response.ok({ body: responseBody }); + } catch (error) { + return handleEsError({ error, response }); + } + } + ); +} diff --git a/x-pack/plugins/index_management/server/routes/index.ts b/x-pack/plugins/index_management/server/routes/index.ts index 9bcd2c0373e3f..ca29dbb7bf897 100644 --- a/x-pack/plugins/index_management/server/routes/index.ts +++ b/x-pack/plugins/index_management/server/routes/index.ts @@ -10,12 +10,12 @@ import { RouteDependencies } from '../types'; import { registerDataStreamRoutes } from './api/data_streams'; import { registerIndicesRoutes } from './api/indices'; import { registerTemplateRoutes } from './api/templates'; -import { registerMappingRoute } from './api/mapping'; import { registerSettingsRoutes } from './api/settings'; import { registerStatsRoute } from './api/stats'; import { registerComponentTemplateRoutes } from './api/component_templates'; import { registerNodesRoute } from './api/nodes'; import { registerEnrichPoliciesRoute } from './api/enrich_policies'; +import { registerIndexMappingRoutes } from './api/mapping/register_index_mapping_route'; export class ApiRoutes { setup(dependencies: RouteDependencies) { @@ -23,7 +23,7 @@ export class ApiRoutes { registerIndicesRoutes(dependencies); registerTemplateRoutes(dependencies); registerSettingsRoutes(dependencies); - registerMappingRoute(dependencies); + registerIndexMappingRoutes(dependencies); registerComponentTemplateRoutes(dependencies); registerNodesRoute(dependencies); registerEnrichPoliciesRoute(dependencies); diff --git a/x-pack/plugins/index_management/tsconfig.json b/x-pack/plugins/index_management/tsconfig.json index 50181a03e3f19..3c23b586002d1 100644 --- a/x-pack/plugins/index_management/tsconfig.json +++ b/x-pack/plugins/index_management/tsconfig.json @@ -45,6 +45,7 @@ "@kbn/code-editor", "@kbn/monaco", "@kbn/console-plugin", + "@kbn/shared-ux-utility", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/lens/kibana.jsonc b/x-pack/plugins/lens/kibana.jsonc index 1813264f7ca57..add1658514cd0 100644 --- a/x-pack/plugins/lens/kibana.jsonc +++ b/x-pack/plugins/lens/kibana.jsonc @@ -21,7 +21,6 @@ "navigation", "urlForwarding", "visualizations", - "dashboard", "uiActions", "uiActionsEnhanced", "embeddable", diff --git a/x-pack/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx index 83cc485e09c76..8a9f5e5d04605 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -332,12 +332,11 @@ describe('Lens App', () => { props, services, preloadedState: { - isLinkedToOriginatingApp: true, + isLinkedToOriginatingApp: false, }, }); expect(services.chrome.setBreadcrumbs).toHaveBeenCalledWith([ - { text: 'The Coolest Container Ever Made', onClick: expect.anything() }, { text: 'Visualize Library', href: '/testbasepath/app/visualize#/', @@ -347,7 +346,12 @@ describe('Lens App', () => { ]); await act(async () => { - instance.setProps({ initialInput: { savedObjectId: breadcrumbDocSavedObjectId } }); + instance.setProps({ + initialInput: { savedObjectId: breadcrumbDocSavedObjectId }, + preloadedState: { + isLinkedToOriginatingApp: true, + }, + }); lensStore.dispatch( setState({ @@ -357,7 +361,6 @@ describe('Lens App', () => { }); expect(services.chrome.setBreadcrumbs).toHaveBeenCalledWith([ - { text: 'The Coolest Container Ever Made', onClick: expect.anything() }, { text: 'Visualize Library', href: '/testbasepath/app/visualize#/', @@ -562,6 +565,10 @@ describe('Lens App', () => { : undefined, }; + props.incomingState = { + originatingApp: 'ultraDashboard', + }; + const services = makeDefaultServicesForApp(); services.attributeService.wrapAttributes = jest .fn() @@ -589,6 +596,7 @@ describe('Lens App', () => { props, preloadedState: { isSaveable: true, + isLinkedToOriginatingApp: true, ...preloadedState, }, }); @@ -653,7 +661,6 @@ describe('Lens App', () => { it('Shows Save and Return and Save As buttons in create by value mode with originating app', async () => { const props = makeDefaultProps(); const services = makeDefaultServicesForApp(); - services.dashboardFeatureFlag = { allowByValueEmbeddables: true }; props.incomingState = { originatingApp: 'ultraDashboard', valueInput: { @@ -817,14 +824,22 @@ describe('Lens App', () => { const mockedConsoleDir = jest.spyOn(console, 'dir'); // mocked console.dir to avoid messages in the console when running tests mockedConsoleDir.mockImplementation(() => {}); + const props = makeDefaultProps(); + + props.incomingState = { + originatingApp: 'ultraDashboard', + }; + const services = makeDefaultServicesForApp(); services.attributeService.wrapAttributes = jest .fn() .mockRejectedValue({ message: 'failed' }); - const { instance, props } = await mountWith({ + const { instance } = await mountWith({ + props, services, preloadedState: { isSaveable: true, + isLinkedToOriginatingApp: true, }, }); @@ -892,15 +907,19 @@ describe('Lens App', () => { }); it('checks for duplicate title before saving', async () => { + const props = makeDefaultProps(); + props.incomingState = { originatingApp: 'coolContainer' }; const services = makeDefaultServicesForApp(); services.attributeService.wrapAttributes = jest .fn() .mockReturnValue(Promise.resolve({ savedObjectId: '123' })); const { instance } = await mountWith({ + props, services, preloadedState: { isSaveable: true, persistedDoc: { savedObjectId: '123' } as unknown as Document, + isLinkedToOriginatingApp: true, }, }); await act(async () => { @@ -926,7 +945,12 @@ describe('Lens App', () => { }); it('does not show the copy button on first save', async () => { - const { instance } = await mountWith({ preloadedState: { isSaveable: true } }); + const props = makeDefaultProps(); + props.incomingState = { originatingApp: 'coolContainer' }; + const { instance } = await mountWith({ + props, + preloadedState: { isSaveable: true, isLinkedToOriginatingApp: true }, + }); await act(async () => getButton(instance).run(instance.getDOMNode())); instance.update(); expect(instance.find(SavedObjectSaveModal).prop('showCopyOnSave')).toEqual(false); diff --git a/x-pack/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx index c0ebd50245013..b8a7218cd7364 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -87,8 +87,6 @@ export function App({ http, notifications, executionContext, - // Temporarily required until the 'by value' paradigm is default. - dashboardFeatureFlag, locator, share, serverless, @@ -167,12 +165,8 @@ export function App({ }, [setIndicateNoData, indicateNoData, searchSessionId]); const getIsByValueMode = useCallback( - () => - Boolean( - // Temporarily required until the 'by value' paradigm is default. - dashboardFeatureFlag.allowByValueEmbeddables && isLinkedToOriginatingApp && !savedObjectId - ), - [dashboardFeatureFlag.allowByValueEmbeddables, isLinkedToOriginatingApp, savedObjectId] + () => Boolean(isLinkedToOriginatingApp && !savedObjectId), + [isLinkedToOriginatingApp, savedObjectId] ); useEffect(() => { @@ -304,7 +298,6 @@ export function App({ chrome.setBreadcrumbs(breadcrumbs); } }, [ - dashboardFeatureFlag.allowByValueEmbeddables, getOriginatingAppName, redirectToOrigin, getIsByValueMode, diff --git a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx index 0186804edc814..891f9b4ae5a21 100644 --- a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx +++ b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx @@ -103,7 +103,6 @@ function getSaveButtonMeta({ function getLensTopNavConfig(options: { isByValueMode: boolean; - allowByValue: boolean; actions: LensTopNavActions; savingToLibraryPermitted: boolean; savingToDashboardPermitted: boolean; @@ -115,7 +114,6 @@ function getLensTopNavConfig(options: { }): TopNavMenuData[] { const { actions, - allowByValue, savingToLibraryPermitted, savingToDashboardPermitted, contextOriginatingApp, @@ -130,7 +128,7 @@ function getLensTopNavConfig(options: { const enableSaveButton = savingToLibraryPermitted || - (allowByValue && savingToDashboardPermitted && !isByValueMode && !showSaveAndReturn); + (savingToDashboardPermitted && !isByValueMode && !showSaveAndReturn); const saveButtonLabel = isByValueMode ? i18n.translate('xpack.lens.app.addToLibrary', { @@ -296,7 +294,6 @@ export const LensTopNavMenu = ({ application, attributeService, share, - dashboardFeatureFlag, dataViewFieldEditor, dataViewEditor, dataViews: dataViewsService, @@ -539,14 +536,10 @@ export const LensTopNavMenu = ({ !(initialInput as LensByReferenceInput)?.savedObjectId; const contextFromEmbeddable = initialContext && 'isEmbeddable' in initialContext && initialContext.isEmbeddable; + const showSaveAndReturn = !(showReplaceInDashboard || showReplaceInCanvas) && - (Boolean( - isLinkedToOriginatingApp && - // Temporarily required until the 'by value' paradigm is default. - (dashboardFeatureFlag.allowByValueEmbeddables || Boolean(initialInput)) - ) || - Boolean(initialContextIsEmbedded)); + (isLinkedToOriginatingApp || Boolean(initialContextIsEmbedded)); const hasData = Boolean(activeData && Object.keys(activeData).length); const csvEnabled = Boolean(isSaveable && hasData); @@ -555,7 +548,6 @@ export const LensTopNavMenu = ({ const showShareMenu = csvEnabled || shareUrlEnabled; const baseMenuEntries = getLensTopNavConfig({ isByValueMode: getIsByValueMode(), - allowByValue: dashboardFeatureFlag.allowByValueEmbeddables, savingToLibraryPermitted, savingToDashboardPermitted, isSaveable, @@ -762,7 +754,6 @@ export const LensTopNavMenu = ({ initialContext, initialInput, isLinkedToOriginatingApp, - dashboardFeatureFlag.allowByValueEmbeddables, initialContextIsEmbedded, activeData, isSaveable, @@ -776,6 +767,8 @@ export const LensTopNavMenu = ({ lensInspector, title, share, + visualization, + visualizationMap, shortUrlService, data, filters, @@ -783,12 +776,11 @@ export const LensTopNavMenu = ({ activeDatasourceId, datasourceStates, datasourceMap, - visualizationMap, - visualization, currentDoc, adHocDataViews, - defaultLensTitle, isCurrentStateDirty, + dataViews.indexPatterns, + defaultLensTitle, onAppLeave, runSave, attributeService, @@ -798,7 +790,6 @@ export const LensTopNavMenu = ({ discoverLocator, indexPatterns, uiSettings, - dataViews.indexPatterns, isOnTextBasedMode, lensStore, theme$, diff --git a/x-pack/plugins/lens/public/app_plugin/mounter.tsx b/x-pack/plugins/lens/public/app_plugin/mounter.tsx index 483e57e6e9f56..72b1d742959f2 100644 --- a/x-pack/plugins/lens/public/app_plugin/mounter.tsx +++ b/x-pack/plugins/lens/public/app_plugin/mounter.tsx @@ -132,7 +132,6 @@ export async function getLensServices( presentationUtil: startDependencies.presentationUtil, dataViewEditor: startDependencies.dataViewEditor, dataViewFieldEditor: startDependencies.dataViewFieldEditor, - dashboard: startDependencies.dashboard, charts: startDependencies.charts, getOriginatingAppName: () => { const originatingApp = @@ -140,8 +139,6 @@ export async function getLensServices( return originatingApp ? stateTransfer?.getAppNameFromId(originatingApp) : undefined; }, dataViews: startDependencies.dataViews, - // Temporarily required until the 'by value' paradigm is default. - dashboardFeatureFlag: startDependencies.dashboard.dashboardFeatureFlagConfig, spaces, share, unifiedSearch, diff --git a/x-pack/plugins/lens/public/app_plugin/save_modal.tsx b/x-pack/plugins/lens/public/app_plugin/save_modal.tsx index cbab6d4e06a89..b1bab16ccb89b 100644 --- a/x-pack/plugins/lens/public/app_plugin/save_modal.tsx +++ b/x-pack/plugins/lens/public/app_plugin/save_modal.tsx @@ -25,7 +25,6 @@ export interface Props { originatingApp?: string; getOriginatingPath?: (dashboardId: string) => string; - allowByValueEmbeddables: boolean; savedObjectsTagging?: SavedObjectTaggingPluginStart; tagsIds: string[]; @@ -53,7 +52,6 @@ export const SaveModal = (props: Props) => { savedObjectId, title, description, - allowByValueEmbeddables, returnToOriginSwitchLabel, getAppNameFromId, onClose, @@ -63,7 +61,7 @@ export const SaveModal = (props: Props) => { } = props; // Use the modal with return-to-origin features if we're in an app's edit flow or if by-value embeddables are disabled - if ((originatingApp || !allowByValueEmbeddables) && returnToOrigin !== false) { + if (originatingApp && returnToOrigin !== false) { return ( { setLastKnownDoc(initLastKnownDoc); @@ -170,7 +169,6 @@ export function SaveModalContainer({ originatingApp={originatingApp} getOriginatingPath={getOriginatingPath} savingToLibraryPermitted={savingToLibraryPermitted} - allowByValueEmbeddables={dashboardFeatureFlag?.allowByValueEmbeddables} savedObjectsTagging={savedObjectsTagging} tagsIds={tagsIds} onSave={(saveProps, options) => { @@ -227,7 +225,6 @@ export const runSaveLensVisualization = async ( | 'overlays' | 'notifications' | 'stateTransfer' - | 'dashboardFeatureFlag' | 'attributeService' | 'savedObjectsTagging' >, @@ -248,7 +245,6 @@ export const runSaveLensVisualization = async ( redirectToOrigin, onAppLeave, redirectTo, - dashboardFeatureFlag, textBasedLanguageSave, switchDatasource, application, @@ -338,7 +334,6 @@ export const runSaveLensVisualization = async ( embeddableInput: newInput, dashboardId: saveProps.dashboardId, stateTransfer, - dashboardFeatureFlag, originatingApp: props.originatingApp, getOriginatingPath: props.getOriginatingPath, }); diff --git a/x-pack/plugins/lens/public/app_plugin/save_modal_container_helpers.test.ts b/x-pack/plugins/lens/public/app_plugin/save_modal_container_helpers.test.ts index 0bf4be34a9db0..1f4e255c54414 100644 --- a/x-pack/plugins/lens/public/app_plugin/save_modal_container_helpers.test.ts +++ b/x-pack/plugins/lens/public/app_plugin/save_modal_container_helpers.test.ts @@ -15,21 +15,6 @@ describe('redirectToDashboard', () => { } as unknown as LensEmbeddableInput; const mockServices = makeDefaultServices(); - it('should return error in case of allowByValueEmbeddables false', () => { - expect(() => { - redirectToDashboard({ - embeddableInput, - dashboardFeatureFlag: { - allowByValueEmbeddables: false, - }, - dashboardId: 'id', - originatingApp: '', - getOriginatingPath: jest.fn(), - stateTransfer: mockServices.stateTransfer, - }); - }).toThrow('redirectToDashboard called with by-value embeddables disabled'); - }); - it('should call the navigateToWithEmbeddablePackage with the correct args if originatingApp is given', () => { const navigateToWithEmbeddablePackageSpy = jest.fn(); const transferService = { @@ -38,9 +23,6 @@ describe('redirectToDashboard', () => { } as unknown as LensAppServices['stateTransfer']; redirectToDashboard({ embeddableInput, - dashboardFeatureFlag: { - allowByValueEmbeddables: true, - }, dashboardId: 'id', originatingApp: 'security', getOriginatingPath: jest.fn(), @@ -60,9 +42,6 @@ describe('redirectToDashboard', () => { } as unknown as LensAppServices['stateTransfer']; redirectToDashboard({ embeddableInput, - dashboardFeatureFlag: { - allowByValueEmbeddables: true, - }, dashboardId: 'id', originatingApp: '', getOriginatingPath: jest.fn(), diff --git a/x-pack/plugins/lens/public/app_plugin/save_modal_container_helpers.ts b/x-pack/plugins/lens/public/app_plugin/save_modal_container_helpers.ts index b8a9a8da72a49..98b2d0bdc2aba 100644 --- a/x-pack/plugins/lens/public/app_plugin/save_modal_container_helpers.ts +++ b/x-pack/plugins/lens/public/app_plugin/save_modal_container_helpers.ts @@ -11,7 +11,6 @@ import { LENS_EMBEDDABLE_TYPE } from '../../common/constants'; export const redirectToDashboard = ({ embeddableInput, - dashboardFeatureFlag, dashboardId, originatingApp, getOriginatingPath, @@ -19,15 +18,10 @@ export const redirectToDashboard = ({ }: { embeddableInput: LensEmbeddableInput; dashboardId: string; - dashboardFeatureFlag: LensAppServices['dashboardFeatureFlag']; originatingApp?: string; getOriginatingPath?: (dashboardId: string) => string | undefined; stateTransfer: LensAppServices['stateTransfer']; }) => { - if (!dashboardFeatureFlag.allowByValueEmbeddables) { - throw new Error('redirectToDashboard called with by-value embeddables disabled'); - } - const state = { input: embeddableInput, type: LENS_EMBEDDABLE_TYPE, diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx index dae81eab843ed..3527ce73b6b9c 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx @@ -27,7 +27,7 @@ export function LayerConfiguration({ hasPadding, setIsInlineFlyoutVisible, getUserMessages, - shouldDisplayChartSwitch, + onlyAllowSwitchToSubtypes, }: LayerConfigurationProps) { const dispatch = useLensDispatch(); const { euiTheme } = useEuiTheme(); @@ -59,7 +59,7 @@ export function LayerConfiguration({ uiActions: startDependencies.uiActions, hideLayerHeader: datasourceId === 'textBased', // TODO: remove this prop once we display the chart switch in Discover - shouldDisplayChartSwitch, + onlyAllowSwitchToSubtypes, indexPatternService, setIsInlineFlyoutVisible, getUserMessages, diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx index 73c3797f3e7b7..f0d106285b14d 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx @@ -366,6 +366,8 @@ export function LensEditConfigurationFlyout({ isSaveable={isSaveable} > <> void; getUserMessages: UserMessagesGetter; - shouldDisplayChartSwitch?: boolean; + onlyAllowSwitchToSubtypes?: boolean; } diff --git a/x-pack/plugins/lens/public/app_plugin/types.ts b/x-pack/plugins/lens/public/app_plugin/types.ts index 4e53b66a3244f..774be71d0879b 100644 --- a/x-pack/plugins/lens/public/app_plugin/types.ts +++ b/x-pack/plugins/lens/public/app_plugin/types.ts @@ -25,10 +25,8 @@ import type { import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; -import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; -import type { DashboardFeatureFlagConfig } from '@kbn/dashboard-plugin/public'; import type { SavedObjectTaggingPluginStart } from '@kbn/saved-objects-tagging-plugin/public'; import type { IndexPatternFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; import type { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public'; @@ -147,7 +145,6 @@ export interface LensAppServices { chrome: ChromeStart; overlays: OverlayStart; storage: IStorageWrapper; - dashboard: DashboardStart; dataViews: DataViewsPublicPluginStart; fieldFormats: FieldFormatsStart; data: DataPublicPluginStart; @@ -171,8 +168,6 @@ export interface LensAppServices { share?: SharePluginStart; unifiedSearch: UnifiedSearchPublicPluginStart; docLinks: DocLinksStart; - // Temporarily required until the 'by value' paradigm is default. - dashboardFeatureFlag: DashboardFeatureFlagConfig; dataViewEditor: DataViewEditorStart; dataViewFieldEditor: IndexPatternFieldEditorStart; locator?: LensAppLocator; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/chart_option_append.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_option_append.tsx similarity index 91% rename from x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/chart_option_append.tsx rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_option_append.tsx index 09ec24c5b847f..5ae9fd302bfa6 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/chart_option_append.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_option_append.tsx @@ -6,7 +6,7 @@ */ import './chart_switch.scss'; -import React, { ReactNode } from 'react'; +import React from 'react'; import { EuiFlexItem, EuiIconTip, EuiBetaBadge, EuiFlexGroup, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; @@ -31,15 +31,13 @@ export const getDataLossWarning = (dataLoss: 'nothing' | 'layers' | 'everything' }); }; -const DataLossWarning = ({ content, id }: { content: ReactNode; id: string }) => { +const DataLossWarning = ({ content, id }: { content?: string; id: string }) => { if (!content) return null; return ( ({ + ...createMockFramePublicAPI(), + datasourceLayers: layers.reduce( + (acc, layerId) => ({ + ...acc, + [layerId]: { + getTableSpec: jest.fn(() => [{ columnId: 'col2' }]), + getOperationForColumnId: () => {}, + } as unknown as DatasourcePublicAPI, + }), + {} as Record + ), +}); + +const datasourceSuggestions: Record = { + unchanged: [ + { + state: 'testDatasource suggestion', + table: { + columns: [ + { + columnId: 'col1', + operation: { + label: '', + dataType: 'string', + isBucketed: true, + }, + }, + { + columnId: 'col2', + operation: { + label: '', + dataType: 'number', + isBucketed: false, + }, + }, + ], + layerId: 'a', + isMultiRow: true, + changeType: 'unchanged', + }, + keptLayerIds: ['a', 'b'], + }, + ], + layers: [ + { + state: 'testDatasource suggestion layer a', + table: { + columns: [ + { + columnId: 'col1', + operation: { + label: '', + dataType: 'string', + isBucketed: true, + }, + }, + { + columnId: 'col2', + operation: { + label: '', + dataType: 'number', + isBucketed: false, + }, + }, + ], + layerId: 'a', + isMultiRow: true, + changeType: 'layers', + }, + keptLayerIds: ['a'], + }, + { + state: 'testDatasource suggestion layer b', + table: { + columns: [ + { + columnId: 'col1', + operation: { + label: '', + dataType: 'string', + isBucketed: true, + }, + }, + { + columnId: 'col2', + operation: { + label: '', + dataType: 'number', + isBucketed: false, + }, + }, + ], + layerId: 'b', + isMultiRow: true, + changeType: 'layers', + }, + keptLayerIds: ['b'], + }, + ], +}; + +describe('chart_switch', () => { + let visualizationMap = mockVisualizationMap(); + let datasourceMap = mockDatasourceMap(); + let datasourceStates = mockDatasourceStates(); + let frame = mockFrame(['a']); + + beforeEach(() => { + visualizationMap = mockVisualizationMap(); + datasourceMap = mockDatasourceMap(); + datasourceStates = mockDatasourceStates(); + frame = mockFrame(['a']); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + + /** + * There are three visualizations. Each one has the following suggestion behavior: + * + * testVis: suggests an empty state + * testVis2: suggests an empty state + * testVis3: + * - Never switches to subvisC2 + * - Allows a switch to subvisC3 + * - Allows a switch to subvisC1 + */ + function mockVisualizationMap() { + return { + testVis: { + ...createMockVisualization('testVis'), + getSuggestions: jest.fn((options) => [ + { + score: 1, + title: '', + state: `suggestion layer a`, + previewIcon: 'empty', + keptLayers: ['a'], + }, + { + score: 1, + title: '', + state: `suggestion layer b`, + previewIcon: 'empty', + keptLayers: ['b'], + }, + ]), + }, + testVis2: { + ...createMockVisualization('testVis2'), + getSuggestions: jest.fn((options) => [ + { + score: 1, + title: '', + state: `suggestion testVis2`, + previewIcon: 'empty', + keptLayers: ['a'], + }, + ]), + }, + testVis3: { + ...createMockVisualization('testVis3'), + initialize: jest.fn((_frame, state) => state ?? { type: 'subvisC1' }), + visualizationTypes: ['subvisC1', 'subvisC2', 'subvisC3'].map((id) => ({ + icon: 'empty', + id, + label: id, + groupLabel: `${id}Group`, + })), + getVisualizationTypeId: jest.fn((state) => state.type), + getSuggestions: jest.fn((options) => { + if (options.subVisualizationId === 'subvisC2') { + return []; + } + // Multiple suggestions need to be filtered + return [ + { + score: 1, + title: 'Primary suggestion', + state: { type: 'subvisC3' }, + previewIcon: 'empty', + }, + { + score: 1, + title: '', + state: { type: 'subvisC1', notPrimary: true }, + previewIcon: 'empty', + }, + ]; + }), + hiddenVis: { ...createMockVisualization('hiddenVis'), hideFromChartSwitch: () => true }, + }, + }; + } + + const renderChartSwitch = ( + propsOverrides: Partial = {}, + { preloadedStateOverrides }: { preloadedStateOverrides: Partial } = { + preloadedStateOverrides: {}, + } + ) => { + const { store, ...rtlRender } = renderWithReduxStore( + , + {}, + { + storeDeps: mockStoreDeps({ datasourceMap, visualizationMap }), + preloadedState: { + visualization: { + activeId: 'testVis', + state: 'state from a', + }, + datasourceStates, + activeDatasourceId: 'testDatasource', + ...preloadedStateOverrides, + }, + } + ); + + const openChartSwitch = () => { + userEvent.click(screen.getByTestId('lnsChartSwitchPopover')); + }; + + const queryWarningNode = (subType: string) => + within(getMenuItem(subType)).queryByTestId(`lnsChartSwitchPopoverAlert_${subType}`); + + const getMenuItem = (subType: string) => { + return screen.getByTestId(`lnsChartSwitchPopover_${subType}`); + }; + + const switchToVis = (subType: string) => { + fireEvent.click(getMenuItem(subType)); + }; + + const waitForChartSwitchClosed = () => { + waitFor(() => { + expect(screen.queryByTestId('lnsChartSwitchList')).not.toBeInTheDocument(); + }); + }; + + return { + ...rtlRender, + store, + switchToVis, + getMenuItem, + openChartSwitch, + waitForChartSwitchClosed, + queryWarningNode, + }; + }; + + describe('data loss indicators', () => { + it('should indicate data loss if not all columns will be used', async () => { + datasourceMap.testDatasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue( + datasourceSuggestions.unchanged + ); + datasourceMap.testDatasource.publicAPIMock.getTableSpec.mockReturnValue([ + { columnId: 'col1', fields: [] }, + { columnId: 'col2', fields: [] }, + { columnId: 'col3', fields: [] }, + ]); + + const { openChartSwitch, queryWarningNode } = renderChartSwitch(); + openChartSwitch(); + + expect(queryWarningNode('testVis2')).toHaveTextContent( + /Changing to this visualization modifies the current configuration/i + ); + }); + + it('should indicate data loss if not all layers will be used', async () => { + frame = mockFrame(['a', 'b']); + const { openChartSwitch, queryWarningNode } = renderChartSwitch(); + openChartSwitch(); + + expect(queryWarningNode('testVis2')).toHaveTextContent( + 'Changing to this visualization modifies currently selected layer`s configuration and removes all other layers.' + ); + }); + + it('should support multi-layer suggestions without data loss', async () => { + frame = mockFrame(['a', 'b']); + datasourceMap.testDatasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue( + datasourceSuggestions.unchanged + ); + (frame.datasourceLayers.a?.getTableSpec as jest.Mock).mockReturnValue([ + { columnId: 'col2' }, + { columnId: 'col1' }, + ]); + const { openChartSwitch, queryWarningNode } = renderChartSwitch(); + openChartSwitch(); + expect(queryWarningNode('testVis2')).not.toBeInTheDocument(); + }); + + it('should indicate data loss if no data will be used', async () => { + visualizationMap.testVis2.getSuggestions.mockReturnValueOnce([]); + const { openChartSwitch, queryWarningNode } = renderChartSwitch(); + openChartSwitch(); + + expect(queryWarningNode('testVis2')).toHaveTextContent( + 'Changing to this visualization clears the current configuration.' + ); + }); + + it('should not indicate data loss if there is no data', async () => { + visualizationMap.testVis2.getSuggestions.mockReturnValueOnce([]); + frame = mockFrame(['a']); + (frame.datasourceLayers.a?.getTableSpec as jest.Mock).mockReturnValue([]); + const { openChartSwitch, queryWarningNode } = renderChartSwitch(); + openChartSwitch(); + expect(queryWarningNode('testVis2')).not.toBeInTheDocument(); + }); + + it('should not show a warning when the subvisualization is the same', async () => { + frame = mockFrame(['a', 'b', 'c']); + + visualizationMap.testVis3.getVisualizationTypeId.mockReturnValue('subvisC2'); + visualizationMap.testVis3.switchVisualizationType = jest.fn(() => ({ type: 'subvisC1' })); + const { openChartSwitch, queryWarningNode } = renderChartSwitch(undefined, { + preloadedStateOverrides: { + visualization: { + activeId: 'testVis3', + state: { type: 'subvisC2' }, + }, + }, + }); + openChartSwitch(); + + expect(queryWarningNode('subvisC2')).not.toBeInTheDocument(); + }); + + it('should not show a warning when the subvisualization is compatible', async () => { + frame = mockFrame(['a', 'b', 'c']); + + visualizationMap.testVis3.getVisualizationTypeId.mockReturnValue('subvisC2'); + visualizationMap.testVis3.switchVisualizationType = jest.fn(() => ({ type: 'subvisC1' })); + // we're mocking that subvisC1 is compatible with subvisC2 + visualizationMap.testVis3.isSubtypeCompatible = jest.fn( + (t1, t2) => t2 === 'subvisC1' && t1 === 'subvisC2' + ); + const { openChartSwitch, queryWarningNode } = renderChartSwitch(undefined, { + preloadedStateOverrides: { + visualization: { + activeId: 'testVis3', + state: { type: 'subvisC2' }, + }, + }, + }); + openChartSwitch(); + + // subvisC1 is compatible + expect(queryWarningNode('subvisC1')).not.toBeInTheDocument(); + // subvisC2 is itself + expect(queryWarningNode('subvisC2')).not.toBeInTheDocument(); + // subvisC3 is not compatible + expect(queryWarningNode('subvisC3')).toHaveTextContent( + 'Changing to this visualization clears the current configuration.' + ); + }); + }); + + it('should initialize other visualization on switch', async () => { + const { openChartSwitch, switchToVis } = renderChartSwitch(); + openChartSwitch(); + switchToVis('testVis2'); + expect(visualizationMap.testVis2.initialize).toHaveBeenCalled(); + }); + + it('should use suggested state if there is a suggestion from the target visualization', async () => { + const { store, openChartSwitch, switchToVis } = renderChartSwitch(); + openChartSwitch(); + switchToVis('testVis2'); + + expect(store.dispatch).toHaveBeenCalledWith({ + type: 'lens/switchVisualization', + payload: { + suggestion: { + visualizationState: 'testVis2 initial state', + newVisualizationId: 'testVis2', + datasourceId: 'testDatasource', + datasourceState: {}, + }, + clearStagedPreview: true, + }, + }); + expect(store.dispatch).not.toHaveBeenCalledWith({ type: applyChanges.type }); // should not apply changes automatically + }); + + it('should use suggestions to switch to new visualization', async () => { + const { openChartSwitch, switchToVis } = renderChartSwitch(); + const initialState = 'suggested State'; + visualizationMap.testVis2.initialize.mockReturnValueOnce({ initial: true }); + visualizationMap.testVis2.getVisualizationTypeId.mockReturnValueOnce('testVis2'); + visualizationMap.testVis2.getSuggestions.mockReturnValueOnce([ + { + title: 'Suggested vis', + score: 1, + state: initialState, + previewIcon: 'empty', + keptLayers: ['a'], + }, + ]); + openChartSwitch(); + switchToVis('testVis2'); + expect(visualizationMap.testVis2.getSuggestions).toHaveBeenCalled(); + expect(visualizationMap.testVis2.initialize).toHaveBeenCalledWith( + expect.anything(), + initialState + ); + }); + + it('should fall back when switching visualizations if the visualization has no suggested use', async () => { + visualizationMap.testVis2.initialize.mockReturnValueOnce({ initial: true }); + visualizationMap.testVis2.getSuggestions.mockReturnValueOnce([]); + const { openChartSwitch, switchToVis, waitForChartSwitchClosed } = renderChartSwitch(); + openChartSwitch(); + switchToVis('testVis2'); + + // expect(datasourceMap.testDatasource.publicAPIMock.getTableSpec).toHaveBeenCalled(); + expect(visualizationMap.testVis2.getSuggestions).toHaveBeenCalled(); + expect(visualizationMap.testVis2.initialize).toHaveBeenCalledWith( + expect.any(Function), // generated layerId + undefined, + undefined + ); + waitForChartSwitchClosed(); + }); + + it('should use initial state if there is no suggestion from the target visualization', async () => { + visualizationMap.testVis2.getSuggestions.mockReturnValueOnce([]); + (frame.datasourceLayers.a?.getTableSpec as jest.Mock).mockReturnValue([]); + const { store, switchToVis, openChartSwitch } = renderChartSwitch(); + openChartSwitch(); + switchToVis('testVis2'); + + expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'a'); // from preloaded state + expect(store.dispatch).toHaveBeenCalledWith({ + type: 'lens/switchVisualization', + payload: { + suggestion: { + visualizationState: 'testVis2 initial state', + newVisualizationId: 'testVis2', + }, + clearStagedPreview: true, + }, + }); + expect(store.dispatch).toHaveBeenCalledWith({ + type: 'lens/removeLayers', + payload: { layerIds: ['a'], visualizationId: 'testVis' }, + }); + }); + + it('should query main palette from active chart and pass into suggestions', async () => { + const legacyPalette: SuggestionRequest['mainPalette'] = { + type: 'legacyPalette', + value: { type: 'palette', name: 'mock' }, + }; + visualizationMap.testVis.getMainPalette = jest.fn(() => legacyPalette); + visualizationMap.testVis2.getSuggestions.mockReturnValueOnce([]); + frame = mockFrame(['a', 'b', 'c']); + datasourceMap.testDatasource.getLayers.mockReturnValue(['a', 'b', 'c']); + + const { openChartSwitch, switchToVis } = renderChartSwitch(); + openChartSwitch(); + switchToVis('testVis2'); + + expect(visualizationMap.testVis.getMainPalette).toHaveBeenCalledWith('state from a'); + + expect(visualizationMap.testVis2.getSuggestions).toHaveBeenCalledWith( + expect.objectContaining({ + keptLayerIds: ['a'], + mainPalette: legacyPalette, + }) + ); + }); + + it('should ensure the new visualization has the proper subtype', async () => { + visualizationMap.testVis2.switchVisualizationType = jest.fn( + (visualizationType, state) => `${state} ${visualizationType}` + ); + const { openChartSwitch, switchToVis, store } = renderChartSwitch(); + openChartSwitch(); + switchToVis('testVis2'); + + expect(store.dispatch).toHaveBeenCalledWith({ + type: 'lens/switchVisualization', + payload: { + suggestion: { + visualizationState: 'testVis2 initial state testVis2', + newVisualizationId: 'testVis2', + datasourceId: 'testDatasource', + datasourceState: {}, + }, + clearStagedPreview: true, + }, + }); + }); + + it('should use the suggestion that matches the subtype', async () => { + const { openChartSwitch, switchToVis } = renderChartSwitch(undefined, { + preloadedStateOverrides: { + visualization: { + activeId: 'testVis3', + state: { type: 'subvisC3' }, + }, + }, + }); + openChartSwitch(); + switchToVis('subvisC1'); + expect(visualizationMap.testVis3.switchVisualizationType).toHaveBeenCalledWith( + 'subvisC1', + { + type: 'subvisC1', + notPrimary: true, + }, + 'a' + ); + }); + + describe('multi-layer suggestions', () => { + it('should use suggestion for chart switch for selected layer', async () => { + frame = mockFrame(['a', 'b']); + datasourceMap.testDatasource.getLayers.mockReturnValue(['a', 'b']); + datasourceMap.testDatasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue( + datasourceSuggestions.layers + ); + (frame.datasourceLayers.a?.getTableSpec as jest.Mock).mockReturnValue([ + { columnId: 'col2' }, + { columnId: 'col1' }, + ]); + (frame.datasourceLayers.b?.getTableSpec as jest.Mock).mockReturnValue([ + { columnId: 'col2' }, + { columnId: 'col1' }, + ]); + + const { store, openChartSwitch, switchToVis } = renderChartSwitch({ layerId: 'b' }); + openChartSwitch(); + switchToVis('testVis2'); + + expect(store.dispatch).toHaveBeenCalledWith({ + type: 'lens/switchVisualization', + payload: { + suggestion: { + visualizationState: 'testVis2 initial state', + newVisualizationId: 'testVis2', + datasourceId: 'testDatasource', + datasourceState: 'testDatasource suggestion layer b', + }, + clearStagedPreview: true, + }, + }); + expect(store.dispatch).not.toHaveBeenCalledWith({ type: applyChanges.type }); // should not apply changes automatically + }); + + it('should not remove layers when switching between subtypes', async () => { + frame = mockFrame(['a', 'b', 'c']); + visualizationMap.testVis3.switchVisualizationType = jest.fn(() => 'switched'); + + const { openChartSwitch, switchToVis, store } = renderChartSwitch(undefined, { + preloadedStateOverrides: { + visualization: { + activeId: 'testVis3', + state: { type: 'subvisC1' }, + }, + }, + }); + + openChartSwitch(); + switchToVis('subvisC3'); + expect(visualizationMap.testVis3.switchVisualizationType).toHaveBeenCalledWith( + 'subvisC3', + { + type: 'subvisC3', + }, + 'a' + ); + + expect(store.dispatch).toHaveBeenCalledWith({ + type: 'lens/switchVisualization', + payload: { + suggestion: { + datasourceId: 'testDatasource', + datasourceState: {}, + visualizationState: 'switched', + newVisualizationId: 'testVis3', + }, + clearStagedPreview: true, + }, + }); + expect(datasourceMap.testDatasource.removeLayer).not.toHaveBeenCalled(); + }); + + it('should not remove layers and initialize with existing state when switching between subtypes without data', async () => { + const datasourceLayers = frame.datasourceLayers as Record; + datasourceLayers.a.getTableSpec = jest.fn().mockReturnValue([]); + + visualizationMap.testVis3.getSuggestions = jest.fn().mockReturnValue([]); + visualizationMap.testVis3.switchVisualizationType = jest.fn(() => 'switched'); + + const { openChartSwitch, switchToVis } = renderChartSwitch(undefined, { + preloadedStateOverrides: { + visualization: { + activeId: 'testVis3', + state: { type: 'subvisC1' }, + }, + }, + }); + openChartSwitch(); + switchToVis('subvisC3'); + + expect(visualizationMap.testVis3.switchVisualizationType).toHaveBeenCalledWith( + 'subvisC3', + { + type: 'subvisC1', + }, + 'a' + ); + expect(datasourceMap.testDatasource.removeLayer).not.toHaveBeenCalled(); + }); + + it('should switch to the updated datasource state', async () => { + frame = mockFrame(['a', 'b']); + + datasourceMap.testDatasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue( + datasourceSuggestions.unchanged + ); + + const { openChartSwitch, switchToVis, store } = renderChartSwitch(); + openChartSwitch(); + switchToVis('testVis2'); + + expect(store.dispatch).toHaveBeenCalledWith({ + type: 'lens/switchVisualization', + payload: { + suggestion: { + newVisualizationId: 'testVis2', + datasourceId: 'testDatasource', + datasourceState: 'testDatasource suggestion', + visualizationState: 'testVis2 initial state', + }, + clearStagedPreview: true, + }, + }); + }); + + // it('should get suggestions when switching subvisualization based on the current layer', async () => { + // visualizationMap.testVis3.getSuggestions.mockReturnValueOnce([]); + // frame = mockFrame(['a', 'b', 'c']); + // datasourceMap.testDatasource.getLayers.mockReturnValue(['a', 'b', 'c']); + + // const { openChartSwitch, switchToVis } = renderChartSwitch({ layerId: 'c' }); + // openChartSwitch(); + // screen.debug(); + // switchToVis('testVis3'); + + // expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'a'); + // expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'b'); + // expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'c'); + // expect(visualizationMap.testVis2.getSuggestions).toHaveBeenCalledWith( + // expect.objectContaining({ + // keptLayerIds: ['a'], + // }) + // ); + + // // expect(store.dispatch).toHaveBeenCalledWith({ + // // type: 'lens/switchVisualization', + // // payload: { + // // suggestion: { + // // datasourceId: undefined, + // // datasourceState: undefined, + // // visualizationState: 'testVis2 initial state', + // // newVisualizationId: 'testVis2', + // // }, + // // clearStagedPreview: true, + // // }, + // // }); + // }); + + it('should get suggestions when switching subvisualization', async () => { + visualizationMap.testVis2.getSuggestions.mockReturnValueOnce([]); + frame = mockFrame(['a', 'b', 'c']); + datasourceMap.testDatasource.getLayers.mockReturnValue(['a', 'b', 'c']); + + const { openChartSwitch, switchToVis, store } = renderChartSwitch(); + openChartSwitch(); + switchToVis('testVis2'); + + expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'a'); + expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'b'); + expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'c'); + expect(visualizationMap.testVis2.getSuggestions).toHaveBeenCalledWith( + expect.objectContaining({ + keptLayerIds: ['a'], + }) + ); + + expect(store.dispatch).toHaveBeenCalledWith({ + type: 'lens/switchVisualization', + payload: { + suggestion: { + datasourceId: undefined, + datasourceState: undefined, + visualizationState: 'testVis2 initial state', + newVisualizationId: 'testVis2', + }, + clearStagedPreview: true, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/chart_switch.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_switch.tsx similarity index 94% rename from x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/chart_switch.tsx rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_switch.tsx index 8cfe41b6bf98a..9fd7295993107 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/chart_switch.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_switch.tsx @@ -58,7 +58,7 @@ export interface ChartSwitchProps { framePublicAPI: FramePublicAPI; visualizationMap: VisualizationMap; datasourceMap: DatasourceMap; - size?: 's' | 'm'; + layerId: string; } type SelectableEntry = EuiSelectableOption<{ value: string }>; @@ -94,9 +94,9 @@ function getCurrentVisualizationId( export const ChartSwitch = memo(function ChartSwitch({ framePublicAPI, - visualizationMap: completeVisualizationMap, + visualizationMap, datasourceMap, - size = 'm', + layerId, }: ChartSwitchProps) { const [flyoutOpen, setFlyoutOpen] = useState(false); const dispatchLens = useLensDispatch(); @@ -104,16 +104,7 @@ export const ChartSwitch = memo(function ChartSwitch({ const visualization = useLensSelector(selectVisualization); const datasourceStates = useLensSelector(selectDatasourceStates); - const visualizationMap = { ...completeVisualizationMap }; - Object.keys(visualizationMap).forEach((key) => { - if (completeVisualizationMap[key]?.hideFromChartSwitch?.(framePublicAPI)) { - delete visualizationMap[key]; - } - }); - const commitSelection = (selection: VisualizationSelection) => { - setFlyoutOpen(false); - switchToSuggestion( dispatchLens, { @@ -141,10 +132,10 @@ export const ChartSwitch = memo(function ChartSwitch({ subVisualizationId: string ): VisualizationSelection { const newVisualization = visualizationMap[visualizationId]; - const switchVisType = (type: string, state: unknown) => { + const switchVisType = (type: string, state: unknown, lId: string) => { if (visualizationMap[visualizationId].switchVisualizationType) { return safeFnCall( - () => visualizationMap[visualizationId].switchVisualizationType!(type, state), + () => visualizationMap[visualizationId].switchVisualizationType!(type, state, lId), state ); } @@ -154,12 +145,18 @@ export const ChartSwitch = memo(function ChartSwitch({ const containsData = layers.some( ([_layerId, datasource]) => datasource && datasource.getTableSpec().length > 0 ); + // Always show the active visualization as a valid selection if ( visualization.activeId === visualizationId && visualization.state && safeFnCall( - () => newVisualization.getVisualizationTypeId(visualization.state) === subVisualizationId, + () => + newVisualization.getVisualizationTypeId(visualization.state) === subVisualizationId || + newVisualization.isSubtypeCompatible?.( + newVisualization.getVisualizationTypeId(visualization.state), + subVisualizationId + ), false ) ) { @@ -168,7 +165,8 @@ export const ChartSwitch = memo(function ChartSwitch({ subVisualizationId, dataLoss: 'nothing', keptLayerIds: Object.keys(framePublicAPI.datasourceLayers), - getVisualizationState: () => switchVisType(subVisualizationId, visualization.state), + getVisualizationState: () => + switchVisType(subVisualizationId, visualization.state, layerId), sameDatasources: true, }; } @@ -181,7 +179,8 @@ export const ChartSwitch = memo(function ChartSwitch({ datasourceStates, visualization, newVisualization, - subVisualizationId + subVisualizationId, + layerId ); let dataLoss: VisualizationSelection['dataLoss']; @@ -190,7 +189,7 @@ export const ChartSwitch = memo(function ChartSwitch({ dataLoss = 'nothing'; } else if (!topSuggestion) { dataLoss = 'everything'; - } else if (layers.length > 1 && layers.length !== topSuggestion.keptLayerIds.length) { + } else if (layers.length > 1 && layers.length > topSuggestion.keptLayerIds.length) { dataLoss = 'layers'; } else if (topSuggestion.columns !== layers[0][1]?.getTableSpec().length) { dataLoss = 'columns'; @@ -217,7 +216,8 @@ export const ChartSwitch = memo(function ChartSwitch({ ? () => switchVisType( subVisualizationId, - newVisualization.initialize(addNewLayer, topSuggestion.visualizationState) + newVisualization.initialize(addNewLayer, topSuggestion.visualizationState), + layerId ) : () => switchVisType( @@ -228,7 +228,8 @@ export const ChartSwitch = memo(function ChartSwitch({ visualization.activeId && visualizationMap[visualization.activeId].getMainPalette ? visualizationMap[visualization.activeId].getMainPalette!(visualization.state) : undefined - ) + ), + layerId ), keptLayerIds: topSuggestion ? topSuggestion.keptLayerIds : [], datasourceState: topSuggestion ? topSuggestion.datasourceState : undefined, @@ -360,7 +361,7 @@ export const ChartSwitch = memo(function ChartSwitch({ ); const { icon, label } = (visualization.activeId && - visualizationMap[visualization.activeId]?.getDescription(visualization.state)) || { + visualizationMap[visualization.activeId]?.getDescription(visualization.state, layerId)) || { label: i18n.translate('xpack.lens.configPanel.selectVisualization', { defaultMessage: 'Select a visualization', }), @@ -377,7 +378,6 @@ export const ChartSwitch = memo(function ChartSwitch({ panelPaddingSize="s" button={ { + setFlyoutOpen(false); const chosenType = newOptions.find(({ checked }) => checked === 'on'); if (!chosenType) { return; @@ -448,7 +449,8 @@ function getTopSuggestion( datasourceStates: DatasourceStates, visualization: VisualizationState, newVisualization: Visualization, - subVisualizationId?: string + subVisualizationId?: string, + layerId?: string ): Suggestion | undefined { const mainPalette = visualization.activeId && @@ -486,6 +488,7 @@ function getTopSuggestion( return ( suggestions.find((s) => s.changeType === 'unchanged' || s.changeType === 'reduced') || + suggestions.find((s) => s.keptLayerIds.some((id) => id === layerId)) || suggestions[0] ); } diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/index.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/index.tsx similarity index 100% rename from x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/index.tsx rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/index.tsx diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx index 5a28b1ac421e0..e67a6feda2e09 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx @@ -280,7 +280,7 @@ export function LayerPanels( updateDatasource={updateDatasource} updateDatasourceAsync={updateDatasourceAsync} displayLayerSettings={!props.hideLayerHeader} - shouldDisplayChartSwitch={props.shouldDisplayChartSwitch} + onlyAllowSwitchToSubtypes={props.onlyAllowSwitchToSubtypes} onChangeIndexPattern={(args) => { onChangeIndexPattern(args); const layersToRemove = diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_header.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_header.test.tsx new file mode 100644 index 0000000000000..fd983ee36a15b --- /dev/null +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_header.test.tsx @@ -0,0 +1,143 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { screen } from '@testing-library/react'; +import faker from 'faker'; +import { + createMockDatasource, + createMockFramePublicAPI, + createMockVisualization, + mockDatasourceStates, + mockStoreDeps, +} from '../../../mocks'; +import { LayerHeader } from './layer_header'; +import { renderWithReduxStore } from '../../../mocks'; +import userEvent from '@testing-library/user-event'; +import { LensAppState } from '../../../state_management'; + +describe('LayerHeader', () => { + const renderLayerSettings = ( + propsOverrides = {}, + { preloadedStateOverrides }: { preloadedStateOverrides: Partial } = { + preloadedStateOverrides: {}, + } + ) => { + const datasourceMap = { + testDatasource: createMockDatasource(), + testDatasource2: createMockDatasource('testDatasource2'), + }; + const visualizationMap = { + testVis: createMockVisualization(), + testVis2: { + ...createMockVisualization('testVis2'), + getCustomLayerHeader: () =>
CustomLayerHeader
, + }, + testVis3: { + ...createMockVisualization('testVis3'), + visualizationTypes: ['subvisC1', 'subvisC2', 'subvisC3'].map((id) => ({ + icon: 'empty', + id, + label: faker.lorem.word(), + groupLabel: `${id}Group`, + })), + }, + hiddenVis: { ...createMockVisualization('hiddenVis'), hideFromChartSwitch: () => true }, + }; + const rtlRender = renderWithReduxStore( + , + {}, + { + storeDeps: mockStoreDeps({ datasourceMap, visualizationMap }), + preloadedState: { + visualization: { + activeId: 'visA', + state: 'state from a', + }, + datasourceStates: mockDatasourceStates(), + activeDatasourceId: 'testDatasource', + ...preloadedStateOverrides, + }, + } + ); + const openChartSwitch = () => { + userEvent.click(screen.getByTestId('lnsChartSwitchPopover')); + }; + const queryChartOptionByLabel = (label: string) => { + return screen.queryByRole('presentation', { name: label }); + }; + const getAllChartSwitchOptions = () => { + return screen.queryAllByRole('presentation').map((el) => el.textContent); + }; + return { + ...rtlRender, + openChartSwitch, + queryChartOptionByLabel, + getAllChartSwitchOptions, + }; + }; + + it('should use custom renderer if passed', () => { + renderLayerSettings({ activeVisualizationId: 'testVis2' }); + expect(screen.getByText('CustomLayerHeader')).toBeInTheDocument(); + expect(screen.queryByTestId('lnsChartSwitchPopover')).not.toBeInTheDocument(); + }); + + it('should not display visualization if hideFromChartSwitch returns true', () => { + const { openChartSwitch, queryChartOptionByLabel, getAllChartSwitchOptions } = + renderLayerSettings(); + openChartSwitch(); + expect(queryChartOptionByLabel('hiddenVis')).not.toBeInTheDocument(); + expect(getAllChartSwitchOptions()).toEqual([ + 'testVisGroup', + 'testVis2Group', + 'subvisC1Group', + 'subvisC2Group', + 'subvisC3Group', + ]); + }); + + it('should render chart switch if custom layer header was not passed', () => { + renderLayerSettings(); + expect(screen.getByTestId('lnsChartSwitchPopover')).toBeInTheDocument(); + }); + + it('should render static header if only one visualization is available', () => { + renderLayerSettings({ + visualizationMap: { + testVis: { + ...createMockVisualization(), + getDescription: () => ({ label: 'myVisualizationType', icon: 'empty' }), + visualizationTypes: ['testVis'], + }, + }, + }); + expect(screen.getByText('myVisualizationType')).toBeInTheDocument(); + expect(screen.queryByTestId('lnsChartSwitchPopover')).not.toBeInTheDocument(); + }); + + it('Discover path: should only allow switch to subtypes when onlyAllowSwitchToSubtypes is true', () => { + const { openChartSwitch, getAllChartSwitchOptions } = renderLayerSettings({ + onlyAllowSwitchToSubtypes: true, + activeVisualizationId: 'testVis3', + }); + openChartSwitch(); + expect(getAllChartSwitchOptions()).toEqual(['subvisC1Group', 'subvisC2Group', 'subvisC3Group']); + }); +}); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_header.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_header.tsx new file mode 100644 index 0000000000000..1313c107555f0 --- /dev/null +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_header.tsx @@ -0,0 +1,89 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { StaticHeader } from '../../../shared_components'; +import { + DatasourceMap, + FramePublicAPI, + VisualizationLayerWidgetProps, + VisualizationMap, +} from '../../../types'; +import { ChartSwitch } from './chart_switch'; + +export function LayerHeader({ + activeVisualizationId, + layerConfigProps, + visualizationMap, + datasourceMap, + onlyAllowSwitchToSubtypes, +}: { + visualizationMap: VisualizationMap; + datasourceMap: DatasourceMap; + activeVisualizationId: string; + layerConfigProps: VisualizationLayerWidgetProps; + onlyAllowSwitchToSubtypes?: boolean; +}) { + const activeVisualization = visualizationMap[activeVisualizationId]; + if (!activeVisualization) { + return null; + } + const customLayerHeader = activeVisualization.getCustomLayerHeader?.(layerConfigProps); + if (customLayerHeader) { + return customLayerHeader; + } + + const availableVisualizationMap = filterVisualizationMap( + visualizationMap, + activeVisualization.id, + layerConfigProps.frame, + onlyAllowSwitchToSubtypes + ); + + const hasOnlyOneVisAvailable = + Object.keys(availableVisualizationMap).length === 1 && + Object.values(availableVisualizationMap)[0].visualizationTypes.length === 1; + + if (hasOnlyOneVisAvailable) { + const description = activeVisualization.getDescription(layerConfigProps.state); + return ; + } + + return ( + + ); +} + +const filterVisualizationMap = ( + visualizationMap: VisualizationMap, + activeVisualizationId: string, + frame: FramePublicAPI, + onlyAllowSwitchToSubtypes?: boolean +) => { + // TODO: for Discover, we should only show the active visualization subtypes till we fix how the communication with Discover works + if (onlyAllowSwitchToSubtypes) { + return { + [activeVisualizationId]: visualizationMap[activeVisualizationId], + }; + } + + const availableVisualizationMap = { ...visualizationMap }; + + // hides legacy metric for ES|QL charts + Object.keys(availableVisualizationMap).forEach((key) => { + if (availableVisualizationMap[key]?.hideFromChartSwitch?.(frame)) { + delete availableVisualizationMap[key]; + } + }); + + return availableVisualizationMap; +}; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx index 86fd90fbcb67b..cad1dd351c3ca 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx @@ -24,7 +24,7 @@ import { DragDropIdentifier, ReorderProvider, DropType } from '@kbn/dom-drag-dro import { DimensionButton } from '@kbn/visualization-ui-components'; import { LayerActions } from './layer_actions'; import { isOperation, LayerAction, VisualizationDimensionGroupConfig } from '../../../types'; -import { LayerSettings } from './layer_settings'; +import { LayerHeader } from './layer_header'; import { LayerPanelProps } from './types'; import { DimensionContainer } from './dimension_container'; import { EmptyDimensionButton } from './buttons/empty_dimension_button'; @@ -71,7 +71,7 @@ export function LayerPanel(props: LayerPanelProps) { core, onDropToDimension, setIsInlineFlyoutVisible, - shouldDisplayChartSwitch, + onlyAllowSwitchToSubtypes, } = props; const isInlineEditing = Boolean(props?.setIsInlineFlyoutVisible); @@ -366,7 +366,7 @@ export function LayerPanel(props: LayerPanelProps) {
- {props.displayLayerSettings && ( diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_settings.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_settings.test.tsx deleted file mode 100644 index 22848703cb96d..0000000000000 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_settings.test.tsx +++ /dev/null @@ -1,63 +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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { screen } from '@testing-library/react'; -import faker from 'faker'; -import { - createMockDatasource, - createMockFramePublicAPI, - createMockVisualization, -} from '../../../mocks'; -import { LayerSettings } from './layer_settings'; -import { renderWithReduxStore } from '../../../mocks'; - -describe('LayerSettings', () => { - const renderLayerSettings = (propsOverrides = {}) => { - return renderWithReduxStore( - - ); - }; - - it('should render a static header if visualization has only a description value', () => { - renderLayerSettings({ - activeVisualization: { - ...createMockVisualization(), - getDescription: () => ({ icon: 'myIcon', label: 'myVisualizationType' }), - }, - }); - expect(screen.getByText('myVisualizationType')).toBeInTheDocument(); - }); - - it('should use custom renderer if passed', () => { - const customLayerHeader = faker.lorem.word(); - - renderLayerSettings({ - activeVisualization: { - ...createMockVisualization(), - LayerHeaderComponent: () =>
{customLayerHeader}
, - }, - }); - expect(screen.getByText(customLayerHeader)).toBeInTheDocument(); - }); -}); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_settings.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_settings.tsx deleted file mode 100644 index aa4e4febd1ff1..0000000000000 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_settings.tsx +++ /dev/null @@ -1,47 +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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { - DatasourceMap, - Visualization, - VisualizationLayerWidgetProps, - VisualizationMap, -} from '../../../types'; -import { StaticHeader } from '../../../shared_components'; -import { ChartSwitch } from '../workspace_panel/chart_switch'; - -export function LayerSettings({ - activeVisualization, - layerConfigProps, - visualizationMap, - datasourceMap, - shouldDisplayChartSwitch, -}: { - visualizationMap: VisualizationMap; - datasourceMap: DatasourceMap; - activeVisualization: Visualization; - layerConfigProps: VisualizationLayerWidgetProps; - shouldDisplayChartSwitch?: boolean; -}) { - if (shouldDisplayChartSwitch) { - return ( - - ); - } - if (!activeVisualization.LayerHeaderComponent) { - const description = activeVisualization.getDescription(layerConfigProps.state); - return ; - } - - return ; -} diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts index 557ba90045e11..0f4c44a8e404d 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts @@ -35,7 +35,7 @@ export interface ConfigPanelWrapperProps { getUserMessages?: UserMessagesGetter; hideLayerHeader?: boolean; setIsInlineFlyoutVisible?: (status: boolean) => void; - shouldDisplayChartSwitch?: boolean; + onlyAllowSwitchToSubtypes?: boolean; } export interface LayerPanelProps { @@ -84,7 +84,7 @@ export interface LayerPanelProps { getUserMessages?: UserMessagesGetter; displayLayerSettings: boolean; setIsInlineFlyoutVisible?: (status: boolean) => void; - shouldDisplayChartSwitch?: boolean; + onlyAllowSwitchToSubtypes?: boolean; } export interface LayerDatasourceDropProps { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.test.tsx index f99eeaa7688a2..a06cea8b24119 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.test.tsx @@ -7,7 +7,7 @@ import React, { useEffect } from 'react'; import { ReactWrapper } from 'enzyme'; -import { screen, fireEvent, within, waitFor } from '@testing-library/react'; +import { screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { EditorFrame, EditorFrameProps } from './editor_frame'; @@ -168,24 +168,6 @@ describe('editor_frame', () => { } ); - const openChartSwitch = () => { - userEvent.click(screen.getByTestId('lnsChartSwitchPopover')); - }; - - const waitForChartSwitchClosed = () => { - waitFor(() => { - expect(screen.queryByTestId('lnsChartSwitchList')).not.toBeInTheDocument(); - }); - }; - - const getMenuItem = (subType: string) => { - const list = screen.getByTestId('lnsChartSwitchList'); - return within(list).getByTestId(`lnsChartSwitchPopover_${subType}`); - }; - - const switchToVis = (subType: string) => { - fireEvent.click(getMenuItem(subType)); - }; const queryLayerPanel = () => screen.queryByTestId('lns-layerPanel-0'); const queryWorkspacePanel = () => screen.queryByTestId('lnsWorkspace'); const queryDataPanel = () => screen.queryByTestId('lnsDataPanelWrapper'); @@ -193,13 +175,9 @@ describe('editor_frame', () => { return { ...rtlRender, store, - switchToVis, - getMenuItem, - openChartSwitch, queryLayerPanel, queryWorkspacePanel, queryDataPanel, - waitForChartSwitchClosed, simulateLoadingDatasource: () => store.dispatch( setState({ @@ -345,57 +323,6 @@ describe('editor_frame', () => { }); }); - describe('switching', () => { - it('should initialize other visualization on switch', async () => { - const { openChartSwitch, switchToVis } = renderEditorFrame(); - openChartSwitch(); - switchToVis('testVis2'); - expect(mockVisualization2.initialize).toHaveBeenCalled(); - }); - - it('should use suggestions to switch to new visualization', async () => { - const { openChartSwitch, switchToVis } = renderEditorFrame(); - const initialState = { suggested: true }; - mockVisualization2.initialize.mockReturnValueOnce({ initial: true }); - mockVisualization2.getVisualizationTypeId.mockReturnValueOnce('testVis2'); - mockVisualization2.getSuggestions.mockReturnValueOnce([ - { - title: 'Suggested vis', - score: 1, - state: initialState, - previewIcon: 'empty', - }, - ]); - openChartSwitch(); - switchToVis('testVis2'); - expect(mockVisualization2.getSuggestions).toHaveBeenCalled(); - expect(mockVisualization2.initialize).toHaveBeenCalledWith(expect.anything(), initialState); - expect(mockVisualization2.getConfiguration).toHaveBeenCalledWith( - expect.objectContaining({ state: { initial: true } }) - ); - }); - - it('should fall back when switching visualizations if the visualization has no suggested use', async () => { - mockVisualization2.initialize.mockReturnValueOnce({ initial: true }); - - const { openChartSwitch, switchToVis, waitForChartSwitchClosed } = renderEditorFrame(); - openChartSwitch(); - switchToVis('testVis2'); - - expect(mockDatasource.publicAPIMock.getTableSpec).toHaveBeenCalled(); - expect(mockVisualization2.getSuggestions).toHaveBeenCalled(); - expect(mockVisualization2.initialize).toHaveBeenCalledWith( - expect.any(Function), // generated layerId - undefined, - undefined - ); - expect(mockVisualization2.getConfiguration).toHaveBeenCalledWith( - expect.objectContaining({ state: { initial: true } }) - ); - waitForChartSwitchClosed(); - }); - }); - describe('suggestions', () => { it('should fetch suggestions of currently active datasource', async () => { renderEditorFrame(); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/chart_switch.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/chart_switch.test.tsx deleted file mode 100644 index 0b62384ff026b..0000000000000 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/chart_switch/chart_switch.test.tsx +++ /dev/null @@ -1,562 +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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { screen, fireEvent, within } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import { - createMockVisualization, - mockStoreDeps, - createMockFramePublicAPI, - mockDatasourceMap, - mockDatasourceStates, - renderWithReduxStore, -} from '../../../../mocks'; - -import { - Visualization, - FramePublicAPI, - DatasourcePublicAPI, - SuggestionRequest, -} from '../../../../types'; -import { ChartSwitch, ChartSwitchProps } from './chart_switch'; -import { LensAppState, applyChanges } from '../../../../state_management'; - -describe('chart_switch', () => { - function generateVisualization(id: string): jest.Mocked { - return { - ...createMockVisualization(id), - getSuggestions: jest.fn((options) => [ - { - score: 1, - title: '', - state: `suggestion ${id}`, - previewIcon: 'empty', - }, - ]), - }; - } - let visualizationMap = mockVisualizationMap(); - let datasourceMap = mockDatasourceMap(); - let datasourceStates = mockDatasourceStates(); - let frame = mockFrame(['a']); - - beforeEach(() => { - visualizationMap = mockVisualizationMap(); - datasourceMap = mockDatasourceMap(); - datasourceStates = mockDatasourceStates(); - frame = mockFrame(['a']); - }); - afterEach(() => { - jest.clearAllMocks(); - }); - - /** - * There are three visualizations. Each one has the same suggestion behavior: - * - * visA: suggests an empty state - * visB: suggests an empty state - * visC: - * - Never switches to subvisC2 - * - Allows a switch to subvisC3 - * - Allows a switch to subvisC1 - * visD: is not visible because hideFromChartSwitch returns true - */ - function mockVisualizationMap() { - return { - visA: generateVisualization('visA'), - visB: generateVisualization('visB'), - visC: { - ...generateVisualization('visC'), - initialize: jest.fn((_frame, state) => state ?? { type: 'subvisC1' }), - visualizationTypes: [ - { - icon: 'empty', - id: 'subvisC1', - label: 'C1', - groupLabel: 'visCGroup', - }, - { - icon: 'empty', - id: 'subvisC2', - label: 'C2', - groupLabel: 'visCGroup', - }, - { - icon: 'empty', - id: 'subvisC3', - label: 'C3', - groupLabel: 'visCGroup', - }, - ], - getVisualizationTypeId: jest.fn((state) => state.type), - getSuggestions: jest.fn((options) => { - if (options.subVisualizationId === 'subvisC2') { - return []; - } - // Multiple suggestions need to be filtered - return [ - { - score: 1, - title: 'Primary suggestion', - state: { type: 'subvisC3' }, - previewIcon: 'empty', - }, - { - score: 1, - title: '', - state: { type: 'subvisC1', notPrimary: true }, - previewIcon: 'empty', - }, - ]; - }), - }, - visD: { - ...generateVisualization('visD'), - hideFromChartSwitch: () => true, - }, - }; - } - - function mockFrame(layers: string[]) { - return { - ...createMockFramePublicAPI(), - datasourceLayers: layers.reduce( - (acc, layerId) => ({ - ...acc, - [layerId]: { - getTableSpec: jest.fn(() => { - return [{ columnId: 2 }]; - }), - getOperationForColumnId() { - return {}; - }, - } as unknown as DatasourcePublicAPI, - }), - {} as Record - ), - } as FramePublicAPI; - } - - const renderChartSwitch = ( - propsOverrides: Partial = {}, - { preloadedStateOverrides }: { preloadedStateOverrides: Partial } = { - preloadedStateOverrides: {}, - } - ) => { - const { store, ...rtlRender } = renderWithReduxStore( - , - {}, - { - storeDeps: mockStoreDeps({ datasourceMap, visualizationMap }), - preloadedState: { - visualization: { - activeId: 'visA', - state: 'state from a', - }, - datasourceStates, - activeDatasourceId: 'testDatasource', - ...preloadedStateOverrides, - }, - } - ); - - const openChartSwitch = () => { - userEvent.click(screen.getByTestId('lnsChartSwitchPopover')); - }; - - const getMenuItem = (subType: string) => { - const list = screen.getByTestId('lnsChartSwitchList'); - return within(list).getByTestId(`lnsChartSwitchPopover_${subType}`); - }; - - const switchToVis = (subType: string) => { - fireEvent.click(getMenuItem(subType)); - }; - - return { - ...rtlRender, - store, - switchToVis, - getMenuItem, - openChartSwitch, - }; - }; - - it('should use suggested state if there is a suggestion from the target visualization', async () => { - const { store, openChartSwitch, switchToVis } = renderChartSwitch(); - openChartSwitch(); - switchToVis('visB'); - - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'lens/switchVisualization', - payload: { - suggestion: { - visualizationState: 'visB initial state', - newVisualizationId: 'visB', - datasourceId: 'testDatasource', - datasourceState: {}, - }, - clearStagedPreview: true, - }, - }); - expect(store.dispatch).not.toHaveBeenCalledWith({ type: applyChanges.type }); // should not apply changes automatically - }); - - it('should use initial state if there is no suggestion from the target visualization', async () => { - visualizationMap.visB.getSuggestions.mockReturnValueOnce([]); - (frame.datasourceLayers.a?.getTableSpec as jest.Mock).mockReturnValue([]); - const { store, switchToVis, openChartSwitch } = renderChartSwitch(); - openChartSwitch(); - switchToVis('visB'); - - expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'a'); // from preloaded state - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'lens/switchVisualization', - payload: { - suggestion: { - visualizationState: 'visB initial state', - newVisualizationId: 'visB', - }, - clearStagedPreview: true, - }, - }); - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'lens/removeLayers', - payload: { layerIds: ['a'], visualizationId: 'visA' }, - }); - }); - - it('should indicate data loss if not all columns will be used', async () => { - datasourceMap.testDatasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue([ - { - state: {}, - table: { - columns: [ - { - columnId: 'col1', - operation: { - label: '', - dataType: 'string', - isBucketed: true, - }, - }, - { - columnId: 'col2', - operation: { - label: '', - dataType: 'number', - isBucketed: false, - }, - }, - ], - layerId: 'first', - isMultiRow: true, - changeType: 'unchanged', - }, - keptLayerIds: [], - }, - ]); - datasourceMap.testDatasource.publicAPIMock.getTableSpec.mockReturnValue([ - { columnId: 'col1', fields: [] }, - { columnId: 'col2', fields: [] }, - { columnId: 'col3', fields: [] }, - ]); - - const { openChartSwitch, getMenuItem } = renderChartSwitch(); - openChartSwitch(); - - expect(within(getMenuItem('visB')).getByText(/warning/i)).toBeInTheDocument(); - }); - - it('should indicate data loss if not all layers will be used', async () => { - frame = mockFrame(['a', 'b']); - const { openChartSwitch, getMenuItem } = renderChartSwitch(); - openChartSwitch(); - expect(within(getMenuItem('visB')).getByText(/warning/i)).toBeInTheDocument(); - }); - - it('should support multi-layer suggestions without data loss', async () => { - frame = mockFrame(['a', 'b']); - datasourceMap.testDatasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue([ - { - state: {}, - table: { - columns: [ - { - columnId: 'a', - operation: { - label: '', - dataType: 'string', - isBucketed: true, - }, - }, - ], - isMultiRow: true, - layerId: 'a', - changeType: 'unchanged', - }, - keptLayerIds: ['a', 'b'], - }, - ]); - const { openChartSwitch, getMenuItem } = renderChartSwitch(); - openChartSwitch(); - expect(within(getMenuItem('visB')).queryByText(/warning/i)).not.toBeInTheDocument(); - }); - - it('should indicate data loss if no data will be used', async () => { - visualizationMap.visB.getSuggestions.mockReturnValueOnce([]); - const { openChartSwitch, getMenuItem } = renderChartSwitch(); - openChartSwitch(); - expect(within(getMenuItem('visB')).queryByText(/warning/i)).toBeInTheDocument(); - }); - - it('should not indicate data loss if there is no data', async () => { - visualizationMap.visB.getSuggestions.mockReturnValueOnce([]); - frame = mockFrame(['a']); - (frame.datasourceLayers.a?.getTableSpec as jest.Mock).mockReturnValue([]); - const { openChartSwitch, getMenuItem } = renderChartSwitch(); - openChartSwitch(); - expect(within(getMenuItem('visB')).queryByText(/warning/i)).not.toBeInTheDocument(); - }); - - it('should not show a warning when the subvisualization is the same', async () => { - frame = mockFrame(['a', 'b', 'c']); - - visualizationMap.visC.getVisualizationTypeId.mockReturnValue('subvisC2'); - visualizationMap.visC.switchVisualizationType = jest.fn(() => ({ type: 'subvisC1' })); - const { openChartSwitch, getMenuItem } = renderChartSwitch(undefined, { - preloadedStateOverrides: { - visualization: { - activeId: 'visC', - state: { type: 'subvisC2' }, - }, - }, - }); - openChartSwitch(); - expect(within(getMenuItem('subvisC2')).queryByText(/warning/i)).not.toBeInTheDocument(); - }); - - it('should get suggestions when switching subvisualization', async () => { - visualizationMap.visB.getSuggestions.mockReturnValueOnce([]); - frame = mockFrame(['a', 'b', 'c']); - datasourceMap.testDatasource.getLayers.mockReturnValue(['a', 'b', 'c']); - - const { openChartSwitch, switchToVis, store } = renderChartSwitch(); - openChartSwitch(); - switchToVis('visB'); - - expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'a'); - expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'b'); - expect(datasourceMap.testDatasource.removeLayer).toHaveBeenCalledWith({}, 'c'); - expect(visualizationMap.visB.getSuggestions).toHaveBeenCalledWith( - expect.objectContaining({ - keptLayerIds: ['a'], - }) - ); - - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'lens/switchVisualization', - payload: { - suggestion: { - datasourceId: undefined, - datasourceState: undefined, - visualizationState: 'visB initial state', - newVisualizationId: 'visB', - }, - clearStagedPreview: true, - }, - }); - }); - - it('should query main palette from active chart and pass into suggestions', async () => { - const legacyPalette: SuggestionRequest['mainPalette'] = { - type: 'legacyPalette', - value: { type: 'palette', name: 'mock' }, - }; - visualizationMap.visA.getMainPalette = jest.fn(() => legacyPalette); - visualizationMap.visB.getSuggestions.mockReturnValueOnce([]); - frame = mockFrame(['a', 'b', 'c']); - datasourceMap.testDatasource.getLayers.mockReturnValue(['a', 'b', 'c']); - - const { openChartSwitch, switchToVis } = renderChartSwitch(); - openChartSwitch(); - switchToVis('visB'); - - expect(visualizationMap.visA.getMainPalette).toHaveBeenCalledWith('state from a'); - - expect(visualizationMap.visB.getSuggestions).toHaveBeenCalledWith( - expect.objectContaining({ - keptLayerIds: ['a'], - mainPalette: legacyPalette, - }) - ); - }); - - it('should not remove layers when switching between subtypes', async () => { - frame = mockFrame(['a', 'b', 'c']); - visualizationMap.visC.switchVisualizationType = jest.fn(() => 'switched'); - - const { openChartSwitch, switchToVis, store } = renderChartSwitch(undefined, { - preloadedStateOverrides: { - visualization: { - activeId: 'visC', - state: { type: 'subvisC1' }, - }, - }, - }); - - openChartSwitch(); - switchToVis('subvisC3'); - expect(visualizationMap.visC.switchVisualizationType).toHaveBeenCalledWith('subvisC3', { - type: 'subvisC3', - }); - - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'lens/switchVisualization', - payload: { - suggestion: { - datasourceId: 'testDatasource', - datasourceState: {}, - visualizationState: 'switched', - newVisualizationId: 'visC', - }, - clearStagedPreview: true, - }, - }); - expect(datasourceMap.testDatasource.removeLayer).not.toHaveBeenCalled(); - }); - - it('should not remove layers and initialize with existing state when switching between subtypes without data', async () => { - const datasourceLayers = frame.datasourceLayers as Record; - datasourceLayers.a.getTableSpec = jest.fn().mockReturnValue([]); - - visualizationMap.visC.getSuggestions = jest.fn().mockReturnValue([]); - visualizationMap.visC.switchVisualizationType = jest.fn(() => 'switched'); - - const { openChartSwitch, switchToVis } = renderChartSwitch(undefined, { - preloadedStateOverrides: { - visualization: { - activeId: 'visC', - state: { type: 'subvisC1' }, - }, - }, - }); - openChartSwitch(); - switchToVis('subvisC3'); - - expect(visualizationMap.visC.switchVisualizationType).toHaveBeenCalledWith('subvisC3', { - type: 'subvisC1', - }); - expect(datasourceMap.testDatasource.removeLayer).not.toHaveBeenCalled(); - }); - - it('should switch to the updated datasource state', async () => { - frame = mockFrame(['a', 'b']); - - datasourceMap.testDatasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue([ - { - state: 'testDatasource suggestion', - table: { - columns: [ - { - columnId: 'col1', - operation: { - label: '', - dataType: 'string', - isBucketed: true, - }, - }, - { - columnId: 'col2', - operation: { - label: '', - dataType: 'number', - isBucketed: false, - }, - }, - ], - layerId: 'a', - isMultiRow: true, - changeType: 'unchanged', - }, - keptLayerIds: [], - }, - ]); - - const { openChartSwitch, switchToVis, store } = renderChartSwitch(); - openChartSwitch(); - switchToVis('visB'); - - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'lens/switchVisualization', - payload: { - suggestion: { - newVisualizationId: 'visB', - datasourceId: 'testDatasource', - datasourceState: 'testDatasource suggestion', - visualizationState: 'visB initial state', - }, - clearStagedPreview: true, - }, - }); - }); - - it('should ensure the new visualization has the proper subtype', async () => { - visualizationMap.visB.switchVisualizationType = jest.fn( - (visualizationType, state) => `${state} ${visualizationType}` - ); - const { openChartSwitch, switchToVis, store } = renderChartSwitch(); - openChartSwitch(); - switchToVis('visB'); - - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'lens/switchVisualization', - payload: { - suggestion: { - visualizationState: 'visB initial state visB', - newVisualizationId: 'visB', - datasourceId: 'testDatasource', - datasourceState: {}, - }, - clearStagedPreview: true, - }, - }); - }); - - it('should use the suggestion that matches the subtype', async () => { - const { openChartSwitch, switchToVis } = renderChartSwitch(undefined, { - preloadedStateOverrides: { - visualization: { - activeId: 'visC', - state: { type: 'subvisC3' }, - }, - }, - }); - openChartSwitch(); - switchToVis('subvisC1'); - expect(visualizationMap.visC.switchVisualizationType).toHaveBeenCalledWith('subvisC1', { - type: 'subvisC1', - notPrimary: true, - }); - }); - - it('should show all visualization types and subtypes except from one that are hidden (D)', async () => { - const { openChartSwitch, getMenuItem } = renderChartSwitch(); - openChartSwitch(); - const allDisplayed = ['visA', 'visB', 'subvisC1', 'subvisC2', 'subvisC3'].every((subType) => - getMenuItem(subType) - ); - - expect(allDisplayed).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.tsx index acc49c4826846..54532360169fd 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.tsx @@ -22,7 +22,6 @@ import { Visualization, } from '../../../types'; import { DONT_CLOSE_DIMENSION_CONTAINER_ON_CLICK_CLASS } from '../../../utils'; -import { ChartSwitch } from './chart_switch'; import { MessageList } from './message_list'; import { useLensDispatch, @@ -189,14 +188,6 @@ export function WorkspacePanelWrapper({ {!isFullscreen && ( - - - id), - getDescription: jest.fn((_state) => ({ label: '' })), + getDescription: jest.fn((_state) => ({ label: id, icon: 'empty' })), switchVisualizationType: jest.fn((_, x) => x), getSuggestions: jest.fn((_options) => []), getRenderEventCounters: jest.fn((_state) => []), diff --git a/x-pack/plugins/lens/public/plugin.ts b/x-pack/plugins/lens/public/plugin.ts index 1c143ed1c6927..8bd4206a3fe98 100644 --- a/x-pack/plugins/lens/public/plugin.ts +++ b/x-pack/plugins/lens/public/plugin.ts @@ -17,7 +17,6 @@ import type { DataPublicPluginSetup, DataPublicPluginStart } from '@kbn/data-plu import type { EmbeddableSetup, EmbeddableStart } from '@kbn/embeddable-plugin/public'; import { CONTEXT_MENU_TRIGGER } from '@kbn/embeddable-plugin/public'; import type { DataViewsPublicPluginStart, DataView } from '@kbn/data-views-plugin/public'; -import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import type { ExpressionsServiceSetup, @@ -164,7 +163,6 @@ export interface LensPluginStartDependencies { expressions: ExpressionsStart; navigation: NavigationPublicPluginStart; uiActions: UiActionsStart; - dashboard: DashboardStart; visualizations: VisualizationsStart; embeddable: EmbeddableStart; charts: ChartsPluginStart; diff --git a/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts b/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts index daf6ae44aacaa..606ede8cd2686 100644 --- a/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts +++ b/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts @@ -111,7 +111,7 @@ export function loadInitial( storeDeps; const { resolvedDateRange, searchSessionId, isLinkedToOriginatingApp, ...emptyState } = getPreloadedState(storeDeps); - const { attributeService, notifications, data, dashboardFeatureFlag } = lensServices; + const { attributeService, notifications, data } = lensServices; const { lens } = store.getState(); const loaderSharedArgs = { @@ -344,9 +344,7 @@ export function loadInitial( filters: data.query.filterManager.getFilters(), query: doc.state.query, searchSessionId: - dashboardFeatureFlag.allowByValueEmbeddables && - !(initialInput as LensByReferenceInput)?.savedObjectId && - currentSessionId + !(initialInput as LensByReferenceInput)?.savedObjectId && currentSessionId ? currentSessionId : !inlineEditing ? data.search.session.start() diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 997842c8d6dd7..1f189f80c14b2 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -1085,9 +1085,9 @@ export interface Visualization T; + switchVisualizationType?: (visualizationTypeId: string, state: T, layerId?: string) => T; /** Description is displayed as the clickable text in the chart switcher */ - getDescription: (state: T) => { icon?: IconType; label: string }; + getDescription: (state: T, layerId?: string) => { icon?: IconType; label: string }; /** Visualizations can have references as well */ getPersistableState?: (state: T) => { state: P; savedObjectReferences: SavedObjectReference[] }; /** Frame needs to know which layers the visualization is currently using */ @@ -1163,13 +1163,15 @@ export interface Visualization boolean; + /** * Header rendered as layer title. This can be used for both static and dynamic content like * for extra configurability, such as for switch chart type */ - LayerHeaderComponent?: ( + getCustomLayerHeader?: ( props: VisualizationLayerWidgetProps - ) => null | ReactElement>; + ) => undefined | ReactElement>; /** * Layer panel content rendered. This can be used to render a custom content below the title, diff --git a/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx b/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx index 0a7df7f63d5ef..0c821775dff20 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx @@ -21,11 +21,11 @@ import type { FramePublicAPI, Visualization } from '../../../types'; import { isHorizontalChart } from '../state_helpers'; import type { XYState, XYDataLayerConfig, XYAnnotationLayerConfig, XYLayerConfig } from '../types'; import { - checkScaleOperation, getAnnotationsLayers, getAxisName, getDataLayers, isAnnotationsLayer, + isTimeChart, } from '../visualization_helpers'; import { generateId } from '../../../id_generator'; @@ -43,19 +43,6 @@ export const defaultRangeAnnotationLabel = i18n.translate( } ); -export const isDateHistogram = ( - dataLayers: XYDataLayerConfig[], - frame?: Pick | undefined -) => - Boolean( - dataLayers.length && - dataLayers.every( - (dataLayer) => - dataLayer.xAccessor && - checkScaleOperation('interval', 'date', frame?.datasourceLayers || {})(dataLayer) - ) - ); - export function getStaticDate(dataLayers: XYDataLayerConfig[], frame: FramePublicAPI) { const dataLayersId = dataLayers.map(({ layerId }) => layerId); const { activeData, dateRange } = frame; @@ -98,7 +85,7 @@ export const getAnnotationsSupportedLayer = ( ) => { const dataLayers = getDataLayers(state?.layers || []); - const hasDateHistogram = isDateHistogram(dataLayers, frame); + const hasDateHistogram = isTimeChart(dataLayers, frame); const initialDimensions = state && hasDateHistogram diff --git a/x-pack/plugins/lens/public/visualizations/xy/to_expression.test.ts b/x-pack/plugins/lens/public/visualizations/xy/to_expression.test.ts index 41bc7162c437b..08a013d036d5e 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/to_expression.test.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/to_expression.test.ts @@ -584,6 +584,12 @@ describe('#toExpression', () => { }); it('should correctly set the current time marker visibility settings', () => { + // mock the xAccessor column to be of type date + mockDatasource.publicAPIMock.getOperationForColumnId.mockImplementation((col) => { + if (col === 'a') + return { label: `col_${col}`, dataType: 'date', scale: 'interval' } as OperationDescriptor; + return { label: `col_${col}`, dataType: 'number' } as OperationDescriptor; + }); const state: XYState = { legend: { position: Position.Bottom, isVisible: true }, valueLabels: 'show', @@ -621,4 +627,32 @@ describe('#toExpression', () => { ) as Ast; expect(expression.chain[0].arguments.addTimeMarker[0] as Ast).toEqual(false); }); + + it('ignores set current time marker visibility settings if the chart is not time-based', () => { + const state: XYState = { + legend: { position: Position.Bottom, isVisible: true }, + valueLabels: 'show', + preferredSeriesType: 'bar', + layers: [ + { + layerId: 'first', + layerType: LayerTypes.DATA, + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], + }, + ], + }; + const expression = xyVisualization.toExpression( + { + ...state, + showCurrentTimeMarker: true, + }, + frame.datasourceLayers, + undefined, + datasourceExpressionsByLayers + ) as Ast; + expect(expression.chain[0].arguments.addTimeMarker[0] as Ast).toEqual(false); + }); }); diff --git a/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts b/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts index ffa803fa643db..bfa761817828b 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts @@ -57,6 +57,7 @@ import { getDataLayers, getReferenceLayers, getAnnotationsLayers, + isTimeChart, } from './visualization_helpers'; import { getUniqueLabels } from './annotations/helpers'; import { @@ -338,7 +339,8 @@ export const buildXYExpression = ( fillOpacity: state.fillOpacity ?? 0.3, valueLabels: state.valueLabels ?? 'hide', hideEndzones: state.hideEndzones ?? false, - addTimeMarker: state.showCurrentTimeMarker ?? false, + addTimeMarker: + (isTimeChart(validDataLayers, { datasourceLayers }) && state.showCurrentTimeMarker) ?? false, valuesInLegend: state.valuesInLegend ?? false, yAxisConfigs: [...yAxisConfigsToExpression(yAxisConfigs)], xAxisConfig: buildExpression([xAxisConfigFn]).toAst(), diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index f2cf292df233d..1fc617ce91fe5 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -42,7 +42,11 @@ import { DataDimensionEditor, DataDimensionEditorDataSectionExtra, } from './xy_config_panel/dimension_editor'; -import { LayerHeader, LayerHeaderContent } from './xy_config_panel/layer_header'; +import { + ReferenceLayerHeader, + AnnotationsLayerHeader, + LayerHeaderContent, +} from './xy_config_panel/layer_header'; import type { Visualization, FramePublicAPI, @@ -65,6 +69,8 @@ import { injectReferences, isHorizontalChart, isPersistedState, + annotationLayerHasUnsavedChanges, + isHorizontalSeries, } from './state_helpers'; import { toExpression, toPreviewExpression, getSortedAccessors } from './to_expression'; import { getAccessorColorConfigs, getColorAssignments } from './color_assignment'; @@ -81,7 +87,6 @@ import { setAnnotationsDimension, getUniqueLabels, onAnnotationDrop, - isDateHistogram, } from './annotations/helpers'; import { checkXAccessorCompatibility, @@ -104,6 +109,7 @@ import { newLayerState, supportedDataLayer, validateLayersForDimension, + isTimeChart, } from './visualization_helpers'; import { groupAxesByType } from './axes_configuration'; import type { XYByValueAnnotationLayerConfig, XYState } from './types'; @@ -244,11 +250,15 @@ export const getXyVisualization = ({ getDescription, - switchVisualizationType(seriesType: string, state: State) { + switchVisualizationType(seriesType: string, state: State, layerId?: string) { return { ...state, preferredSeriesType: seriesType as SeriesType, - layers: state.layers.map((layer) => ({ ...layer, seriesType: seriesType as SeriesType })), + layers: layerId + ? state.layers.map((layer) => + layer.layerId === layerId ? { ...layer, seriesType: seriesType as SeriesType } : layer + ) + : state.layers.map((layer) => ({ ...layer, seriesType: seriesType as SeriesType })), }; }, @@ -645,15 +655,36 @@ export const getXyVisualization = ({ { - // TODO: should it trigger an action as in the datasource? onChangeIndexPattern(indexPatternId); }} /> ); }, - LayerHeaderComponent(props) { - return ; + isSubtypeCompatible(subtype1, subtype2) { + return ( + (isHorizontalSeries(subtype1 as SeriesType) && isHorizontalSeries(subtype2 as SeriesType)) || + (!isHorizontalSeries(subtype1 as SeriesType) && !isHorizontalSeries(subtype2 as SeriesType)) + ); + }, + + getCustomLayerHeader(props) { + const layer = props.state.layers.find((l) => l.layerId === props.layerId); + if (!layer) { + return undefined; + } + if (isReferenceLayer(layer)) { + return ; + } + if (isAnnotationsLayer(layer)) { + return ( + + ); + } + return undefined; }, ToolbarComponent(props) { @@ -743,7 +774,7 @@ export const getXyVisualization = ({ const annotationLayers = getAnnotationsLayers(state.layers); const errors: UserMessage[] = []; - const hasDateHistogram = isDateHistogram(getDataLayers(state.layers), frame); + const hasDateHistogram = isTimeChart(getDataLayers(state.layers), frame); annotationLayers.forEach((layer) => { layer.annotations.forEach((annotation) => { diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx index 581c4a8e083cd..5236f814b04c2 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx @@ -9,7 +9,12 @@ import { i18n } from '@kbn/i18n'; import { cloneDeep, uniq } from 'lodash'; import { IconChartBarHorizontal, IconChartBarStacked, IconChartMixedXy } from '@kbn/chart-icons'; import type { LayerType as XYLayerType } from '@kbn/expression-xy-plugin/common'; -import { DatasourceLayers, OperationMetadata, VisualizationType } from '../../types'; +import { + DatasourceLayers, + FramePublicAPI, + OperationMetadata, + VisualizationType, +} from '../../types'; import { State, visualizationTypes, @@ -210,20 +215,26 @@ export const getLayerTypeOptions = (layer: XYLayerConfig, options: LayerTypeToLa return options[layerTypes.ANNOTATIONS](layer); }; -export function getVisualizationType(state: State): VisualizationType | 'mixed' { +export function getVisualizationType(state: State, layerId?: string): VisualizationType | 'mixed' { if (!state.layers.length) { return ( visualizationTypes.find((t) => t.id === state.preferredSeriesType) ?? visualizationTypes[0] ); } const dataLayers = getDataLayers(state?.layers); - const visualizationType = visualizationTypes.find((t) => t.id === dataLayers?.[0].seriesType); + if (layerId) { + const dataLayerSeries = layerId + ? dataLayers.find((d) => d.layerId === layerId)?.seriesType + : dataLayers[0].seriesType; + return visualizationTypes.find((t) => t.id === dataLayerSeries) || 'mixed'; + } + const visualizationType = visualizationTypes.find((t) => t.id === dataLayers[0].seriesType); const seriesTypes = uniq(dataLayers.map((l) => l.seriesType)); return visualizationType && seriesTypes.length === 1 ? visualizationType : 'mixed'; } -export function getDescription(state?: State) { +export function getDescription(state?: State, layerId?: string) { if (!state) { return { icon: defaultIcon, @@ -233,7 +244,7 @@ export function getDescription(state?: State) { }; } - const visualizationType = getVisualizationType(state); + const visualizationType = getVisualizationType(state, layerId); if (visualizationType === 'mixed' && isHorizontalChart(state.layers)) { return { @@ -418,3 +429,16 @@ export const isNumericMetric = (op: OperationMetadata) => export const isNumericDynamicMetric = (op: OperationMetadata) => isNumericMetric(op) && !op.isStaticValue; export const isBucketed = (op: OperationMetadata) => op.isBucketed; + +export const isTimeChart = ( + dataLayers: XYDataLayerConfig[], + frame?: Pick | undefined +) => + Boolean( + dataLayers.length && + dataLayers.every( + (dataLayer) => + dataLayer.xAccessor && + checkScaleOperation('interval', 'date', frame?.datasourceLayers || {})(dataLayer) + ) + ); diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx index a02d4c1d82772..df3440e6c6b1f 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx @@ -32,12 +32,9 @@ export function updateLayer( layer: UnwrapArray, index: number ): State { - const newLayers = [...state.layers]; - newLayers[index] = layer; - return { ...state, - layers: newLayers, + layers: state.layers.map((l, i) => (i === index ? layer : l)), }; } diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/layer_header.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/layer_header.tsx index 633d6a3ed280e..61627c87e8ff3 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/layer_header.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/layer_header.tsx @@ -5,17 +5,9 @@ * 2.0. */ -import React, { useState } from 'react'; +import React from 'react'; import { i18n } from '@kbn/i18n'; -import { - EuiIcon, - EuiPopover, - EuiSelectable, - EuiPopoverTitle, - useEuiTheme, - EuiIconTip, -} from '@elastic/eui'; -import { ChartSwitchTrigger } from '@kbn/visualization-ui-components'; +import { useEuiTheme, EuiIconTip } from '@elastic/eui'; import { IconChartBarReferenceLine, IconChartBarAnnotations } from '@kbn/chart-icons'; import { euiThemeVars } from '@kbn/ui-theme'; import { css } from '@emotion/react'; @@ -24,18 +16,12 @@ import type { VisualizationLayerHeaderContentProps, VisualizationLayerWidgetProps, } from '../../../types'; -import { State, visualizationTypes, SeriesType, XYAnnotationLayerConfig } from '../types'; -import { - annotationLayerHasUnsavedChanges, - isHorizontalChart, - isHorizontalSeries, -} from '../state_helpers'; +import { State, XYAnnotationLayerConfig } from '../types'; +import { annotationLayerHasUnsavedChanges } from '../state_helpers'; import { ChangeIndexPattern, StaticHeader } from '../../../shared_components'; -import { updateLayer } from '.'; import { getAnnotationLayerTitle, isAnnotationsLayer, - isDataLayer, isReferenceLayer, } from '../visualization_helpers'; @@ -55,7 +41,7 @@ export function LayerHeader(props: VisualizationLayerWidgetProps) { /> ); } - return ; + return null; } export function LayerHeaderContent(props: VisualizationLayerHeaderContentProps) { @@ -66,7 +52,7 @@ export function LayerHeaderContent(props: VisualizationLayerHeaderContentProps ); } - -function DataLayerHeader(props: VisualizationLayerWidgetProps) { - const [isPopoverOpen, setPopoverIsOpen] = useState(false); - const { state, layerId } = props; - const layers = state.layers.filter(isDataLayer); - const layer = layers.find((l) => l.layerId === layerId)!; - const index = state.layers.findIndex((l) => l === layer)!; - const currentVisType = visualizationTypes.find(({ id }) => id === layer.seriesType)!; - const horizontalOnly = isHorizontalChart(state.layers); - - return ( - setPopoverIsOpen(!isPopoverOpen)} - /> - } - isOpen={isPopoverOpen} - closePopover={() => setPopoverIsOpen(false)} - display="block" - panelPaddingSize="s" - ownFocus - > - - {i18n.translate('xpack.lens.layerPanel.layerVisualizationType', { - defaultMessage: 'Layer visualization type', - })} - -
- - singleSelection="always" - options={visualizationTypes - .filter((t) => isHorizontalSeries(t.id as SeriesType) === horizontalOnly) - .map((t) => ({ - value: t.id, - key: t.id, - checked: t.id === currentVisType.id ? 'on' : undefined, - prepend: , - label: t.fullLabel || t.label, - 'data-test-subj': `lnsXY_seriesType-${t.id}`, - }))} - onChange={(newOptions) => { - const chosenType = newOptions.find(({ checked }) => checked === 'on'); - if (!chosenType) { - return; - } - const id = chosenType.value!; - props.setState(updateLayer(state, { ...layer, seriesType: id as SeriesType }, index)); - setPopoverIsOpen(false); - }} - > - {(list) => <>{list}} - -
-
- ); -} diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index b6875ae3303ff..f0b7038d05ab7 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -18,7 +18,6 @@ "@kbn/navigation-plugin", "@kbn/url-forwarding-plugin", "@kbn/visualizations-plugin", - "@kbn/dashboard-plugin", "@kbn/ui-actions-plugin", "@kbn/ui-actions-enhanced-plugin", "@kbn/share-plugin", diff --git a/x-pack/plugins/lists/server/routes/utils/build_siem_response.ts b/x-pack/plugins/lists/server/routes/utils/build_siem_response.ts index 99552d332eca2..f4baa8779201f 100644 --- a/x-pack/plugins/lists/server/routes/utils/build_siem_response.ts +++ b/x-pack/plugins/lists/server/routes/utils/build_siem_response.ts @@ -5,7 +5,12 @@ * 2.0. */ -import { CustomHttpResponseOptions, KibanaResponseFactory } from '@kbn/core/server'; +import { + CustomHttpResponseOptions, + HttpResponsePayload, + KibanaResponseFactory, + ResponseError, +} from '@kbn/core/server'; /** * Copied from x-pack/plugins/security_solution/server/lib/detection_engine/routes/utils.ts @@ -48,22 +53,24 @@ const statusToErrorMessage = ( export class SiemResponseFactory { constructor(private response: KibanaResponseFactory) {} - // @ts-expect-error upgrade typescript v4.9.5 // eslint-disable-next-line @typescript-eslint/explicit-function-return-type - error({ statusCode, body, headers, bypassErrorFormat }: CustomHttpResponseOptions) { + error({ + statusCode, + body, + headers, + bypassErrorFormat, + }: CustomHttpResponseOptions) { // KibanaResponse is not exported so we cannot use a return type here and that is why the linter is turned off above - // @ts-expect-error upgrade typescript v4.9.5 const contentType: CustomHttpResponseOptions['headers'] = { 'content-type': 'application/json', }; - // @ts-expect-error upgrade typescript v4.9.5 const defaultedHeaders: CustomHttpResponseOptions['headers'] = { ...contentType, ...(headers ?? {}), }; const formattedBody = bypassErrorFormat - ? body + ? Object.assign<{}, unknown>({}, body) // eslint-disable-line prefer-object-spread : { message: body ?? statusToErrorMessage(statusCode) }; return this.response.custom({ diff --git a/x-pack/plugins/metrics_data_access/common/inventory_models/host/metrics/charts/disk.ts b/x-pack/plugins/metrics_data_access/common/inventory_models/host/metrics/charts/disk.ts index 182236952408f..516984a46009e 100644 --- a/x-pack/plugins/metrics_data_access/common/inventory_models/host/metrics/charts/disk.ts +++ b/x-pack/plugins/metrics_data_access/common/inventory_models/host/metrics/charts/disk.ts @@ -49,7 +49,7 @@ const diskThroughputReadWrite: LensConfigWithId = { }; const diskUsageByMountPoint: LensConfigWithId = { - id: 'DiskUsageByMountPoint', + id: 'diskUsageByMountPoint', chartType: 'xy', title: i18n.translate('xpack.metricsData.assetDetails.metricsCharts.diskUsageByMountingPoint', { defaultMessage: 'Disk Usage by Mount Point', diff --git a/x-pack/plugins/observability_solution/apm/common/rules/apm_rule_types.ts b/x-pack/plugins/observability_solution/apm/common/rules/apm_rule_types.ts index 644191f1d4e82..c2712fb972234 100644 --- a/x-pack/plugins/observability_solution/apm/common/rules/apm_rule_types.ts +++ b/x-pack/plugins/observability_solution/apm/common/rules/apm_rule_types.ts @@ -38,7 +38,7 @@ export enum AggregationType { export const THRESHOLD_MET_GROUP_ID = 'threshold_met'; export type ThresholdMetActionGroupId = typeof THRESHOLD_MET_GROUP_ID; -const THRESHOLD_MET_GROUP: ActionGroup = { +export const THRESHOLD_MET_GROUP: ActionGroup = { id: THRESHOLD_MET_GROUP_ID, name: i18n.translate('xpack.apm.a.thresholdMet', { defaultMessage: 'Threshold met', diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts index 5c50e79c145aa..302f9915ec434 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts @@ -115,18 +115,17 @@ describe('Service inventory', () => { }); }); - // Skipping this until we enable the table search on the Service inventory view - describe.skip('Table search', () => { + describe('Table search', () => { beforeEach(() => { - cy.updateAdvancedSettings({ - 'observability:apmEnableTableSearchBar': true, - }); - cy.loginAsEditorUser(); }); - it('filters for java service on the table', () => { + it('Toggles fast filter when clicking on link', () => { cy.visitKibana(serviceInventoryHref); + cy.get('[data-test-subj="tableSearchInput"]').should('not.exist'); + cy.contains('Try the new Fast Filter').click(); + cy.get('[data-test-subj="tableSearchInput"]').should('exist'); + cy.contains('Try it').should('not.exist'); cy.contains('opbeans-node'); cy.contains('opbeans-java'); cy.contains('opbeans-rum'); @@ -138,6 +137,25 @@ describe('Service inventory', () => { cy.contains('opbeans-node'); cy.contains('opbeans-java'); cy.contains('opbeans-rum'); + cy.contains('Turn off Fast Filter').click(); + cy.contains('Try it').should('exist'); + cy.get('[data-test-subj="tableSearchInput"]').should('not.exist'); + }); + }); + + describe('Table search with viewer user', () => { + beforeEach(() => { + cy.loginAsViewerUser(); + }); + + it('Should not be able to turn it on', () => { + cy.visitKibana(serviceInventoryHref); + cy.get('[data-test-subj="tableSearchInput"]').should('not.exist'); + cy.contains('Try the new Fast Filter').should('not.exist'); + cy.get('[data-test-subj="apmPopoverButton"]').click(); + cy.contains( + 'Please ask your administrator to turn it on by enabling it in within settings.' + ); }); }); diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/error_group_overview/error_group_list/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/error_group_overview/error_group_list/index.tsx index 3fbc22b845d33..bb720b8c53640 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/error_group_overview/error_group_list/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/error_group_overview/error_group_list/index.tsx @@ -14,6 +14,7 @@ import { import { i18n } from '@kbn/i18n'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; import React, { useMemo, useState } from 'react'; +import { apmEnableTableSearchBar } from '@kbn/observability-plugin/common'; import { isPending } from '../../../../hooks/use_fetcher'; import { NOT_AVAILABLE_LABEL } from '../../../../../common/i18n'; import { asBigNumber } from '../../../../../common/utils/formatters'; @@ -30,6 +31,7 @@ import { ITableColumn, ManagedTable, TableOptions, + TableSearchBar, } from '../../../shared/managed_table'; import { TimestampTooltip } from '../../../shared/timestamp_tooltip'; import { isTimeComparison } from '../../../shared/time_comparison/get_comparison_options'; @@ -37,6 +39,7 @@ import { ErrorGroupItem, useErrorGroupListData, } from './use_error_group_list_data'; +import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; const GroupIdLink = euiStyled(ErrorDetailLink)` font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; @@ -85,6 +88,14 @@ export function ErrorGroupList({ '/services/{serviceName}/overview', '/services/{serviceName}/errors' ); + + const { core } = useApmPluginContext(); + + const isTableSearchBarEnabled = core.uiSettings.get( + apmEnableTableSearchBar, + true + ); + const { offset } = query; const [renderedItems, setRenderedItems] = useState([]); @@ -293,11 +304,10 @@ export function ErrorGroupList({ offset, ]); - const tableSearchBar = useMemo(() => { + const tableSearchBar: TableSearchBar = useMemo(() => { return { - fieldsToSearch: ['name', 'groupId', 'culprit', 'type'] as Array< - keyof ErrorGroupItem - >, + isEnabled: isTableSearchBarEnabled, + fieldsToSearch: ['name', 'groupId', 'culprit', 'type'], maxCountExceeded: mainStatistics.maxCountExceeded, onChangeSearchQuery: setDebouncedSearchQuery, placeholder: i18n.translate( @@ -305,7 +315,11 @@ export function ErrorGroupList({ { defaultMessage: 'Search errors by message, type or culprit' } ), }; - }, [mainStatistics.maxCountExceeded, setDebouncedSearchQuery]); + }, [ + isTableSearchBarEnabled, + mainStatistics.maxCountExceeded, + setDebouncedSearchQuery, + ]); return ( ; @@ -293,9 +295,20 @@ export function ServiceInventory() { }); }, [mainStatisticsStatus, mainStatisticsData.items, setScreenContext]); + const { fields, isSaving, saveSingleSetting } = useEditableSettings('apm', [ + apmEnableServiceInventoryTableSearchBar, + ]); + + const settingsField = fields[apmEnableServiceInventoryTableSearchBar]; + const isTableSearchBarEnabled = + Boolean(settingsField?.savedValue ?? settingsField?.defaultValue) ?? false; + return ( <> - + {/* keep this div as we're collecting telemetry to track the usage of the table fast search vs KQL bar */} +
+ +
{displayMlCallout && mlCallout} @@ -317,6 +330,14 @@ export function ServiceInventory() { onChangeSearchQuery={setDebouncedSearchQuery} maxCountExceeded={mainStatisticsData?.maxCountExceeded ?? false} onChangeRenderedItems={setRenderedItems} + isTableSearchBarEnabled={isTableSearchBarEnabled} + isSavingSetting={isSaving} + onChangeTableSearchBarVisibility={() => { + saveSingleSetting( + apmEnableServiceInventoryTableSearchBar, + !isTableSearchBarEnabled + ); + }} /> diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/service_list/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/service_list/index.tsx index b25f352f609f6..6c849e97fcd3d 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/service_list/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/service_list/index.tsx @@ -10,20 +10,18 @@ import { EuiFlexGroup, EuiFlexItem, EuiIcon, + EuiLink, + EuiSpacer, EuiText, EuiToolTip, RIGHT_ALIGNMENT, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { getSurveyFeedbackURL } from '@kbn/observability-shared-plugin/public'; import { ALERT_STATUS_ACTIVE } from '@kbn/rule-data-utils'; import { TypeOf } from '@kbn/typed-react-router-config'; import { omit } from 'lodash'; -import React, { useMemo } from 'react'; -import { - FETCH_STATUS, - isFailure, - isPending, -} from '../../../../hooks/use_fetcher'; +import React, { useContext, useMemo } from 'react'; import { ServiceHealthStatus } from '../../../../../common/service_health_status'; import { ServiceInventoryFieldName, @@ -35,10 +33,16 @@ import { asPercent, asTransactionRate, } from '../../../../../common/utils/formatters'; +import { KibanaEnvironmentContext } from '../../../../context/kibana_environment_context/kibana_environment_context'; import { useApmParams } from '../../../../hooks/use_apm_params'; import { useApmRouter } from '../../../../hooks/use_apm_router'; import { Breakpoints, useBreakpoints } from '../../../../hooks/use_breakpoints'; import { useFallbackToTransactionsFetcher } from '../../../../hooks/use_fallback_to_transactions_fetcher'; +import { + FETCH_STATUS, + isFailure, + isPending, +} from '../../../../hooks/use_fetcher'; import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; import { unit } from '../../../../utils/style'; import { ApmRoutes } from '../../../routing/apm_route_config'; @@ -56,6 +60,7 @@ import { SortFunction, TableSearchBar, } from '../../../shared/managed_table'; +import { TryItButton } from '../../../shared/try_it_button'; import { HealthBadge } from './health_badge'; import { ColumnHeaderWithTooltip } from './column_header_with_tooltip'; @@ -313,6 +318,9 @@ interface Props { maxCountExceeded: boolean; onChangeSearchQuery: (searchQuery: string) => void; onChangeRenderedItems: (renderedItems: ServiceListItem[]) => void; + isTableSearchBarEnabled: boolean; + isSavingSetting: boolean; + onChangeTableSearchBarVisibility: () => void; } export function ServiceList({ status, @@ -330,7 +338,13 @@ export function ServiceList({ maxCountExceeded, onChangeSearchQuery, onChangeRenderedItems, + isTableSearchBarEnabled, + isSavingSetting, + onChangeTableSearchBarVisibility, }: Props) { + const { kibanaVersion, isCloudEnv, isServerlessEnv } = useContext( + KibanaEnvironmentContext + ); const breakpoints = useBreakpoints(); const { link } = useApmRouter(); const showTransactionTypeColumn = items.some( @@ -371,7 +385,7 @@ export function ServiceList({ const tableSearchBar: TableSearchBar = useMemo(() => { return { - isEnabled: false, + isEnabled: isTableSearchBarEnabled, fieldsToSearch: ['serviceName'], maxCountExceeded, onChangeSearchQuery, @@ -380,10 +394,61 @@ export function ServiceList({ { defaultMessage: 'Search services by name' } ), }; - }, [maxCountExceeded, onChangeSearchQuery]); + }, [isTableSearchBarEnabled, maxCountExceeded, onChangeSearchQuery]); return ( + + + + {i18n.translate('xpack.apm.serviceList.turnOffFastFilter', { + defaultMessage: + 'Fast filtering allows you to instantly search for your services using free text.', + })} + + {isTableSearchBarEnabled && ( + + + {i18n.translate( + 'xpack.apm.serviceList.giveFeedbackFlexItemLabel', + { defaultMessage: 'Give feedback' } + )} + + + )} + + } + /> + +
)} - {maxCountExceeded && ( )} -
- isLoading={isPending(status)} diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/settings/general_settings/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/settings/general_settings/index.tsx index b21ece193cef5..7fdccfb9e3346 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/settings/general_settings/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/settings/general_settings/index.tsx @@ -22,6 +22,7 @@ import { apmEnableProfilingIntegration, apmEnableTableSearchBar, apmEnableTransactionProfiling, + apmEnableServiceInventoryTableSearchBar, } from '@kbn/observability-plugin/common'; import { isEmpty } from 'lodash'; import React from 'react'; @@ -55,6 +56,7 @@ function getApmSettingsKeys(isProfilingIntegrationEnabled: boolean) { apmEnableContinuousRollups, enableAgentExplorerView, apmEnableTableSearchBar, + apmEnableServiceInventoryTableSearchBar, ]; if (isProfilingIntegrationEnabled) { diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/managed_table/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/managed_table/index.tsx index ae14f63f8d72b..3847ff6f635ba 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/managed_table/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/managed_table/index.tsx @@ -16,14 +16,12 @@ import React, { useState, } from 'react'; import { useHistory } from 'react-router-dom'; -import { apmEnableTableSearchBar } from '@kbn/observability-plugin/common'; import { useLegacyUrlParams } from '../../../context/url_params_context/use_url_params'; import { fromQuery, toQuery } from '../links/url_helpers'; import { getItemsFilteredBySearchQuery, TableSearchBar, } from '../table_search_bar/table_search_bar'; -import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; type SortDirection = 'asc' | 'desc'; @@ -46,7 +44,7 @@ export interface ITableColumn { } export interface TableSearchBar { - isEnabled?: boolean; + isEnabled: boolean; fieldsToSearch: Array; maxCountExceeded: boolean; placeholder: string; @@ -108,11 +106,6 @@ function UnoptimizedManagedTable(props: { }) { const [searchQuery, setSearchQuery] = useState(''); const history = useHistory(); - const { core } = useApmPluginContext(); - const isTableSearchBarEnabled = core.uiSettings.get( - apmEnableTableSearchBar, - true - ); const { items, @@ -276,12 +269,9 @@ function UnoptimizedManagedTable(props: { [searchQuery, tableSearchBar] ); - const isSearchBarEnabled = - isTableSearchBarEnabled && (tableSearchBar.isEnabled ?? true); - return ( <> - {isSearchBarEnabled ? ( + {tableSearchBar.isEnabled ? ( ( + apmEnableTableSearchBar, + true + ); + const tableSearchBar: TableSearchBar = useMemo(() => { return { + isEnabled: isTableSearchBarEnabled, fieldsToSearch: ['name'], maxCountExceeded: mainStatistics.maxCountExceeded, onChangeSearchQuery: setSearchQueryDebounced, @@ -162,10 +172,11 @@ export function TransactionsTable({ { defaultMessage: 'Search transactions by name' } ), }; - }, [mainStatistics.maxCountExceeded, setSearchQueryDebounced]); - - const { setScreenContext } = - useApmPluginContext().observabilityAIAssistant.service; + }, [ + isTableSearchBarEnabled, + mainStatistics.maxCountExceeded, + setSearchQueryDebounced, + ]); useEffect(() => { return setScreenContext({ diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/try_it_button/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/try_it_button/index.tsx new file mode 100644 index 0000000000000..5588ac039cc3d --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/try_it_button/index.tsx @@ -0,0 +1,188 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { + EuiBetaBadge, + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiLink, + EuiLoadingSpinner, + EuiPopover, + EuiSpacer, + EuiText, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import useToggle from 'react-use/lib/useToggle'; +import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; + +interface Props { + isFeatureEnabled: boolean; + promoLabel?: string; + linkLabel: string; + onClick: () => void; + popoverContent?: React.ReactElement; + icon?: 'beta' | 'beaker'; + isLoading: boolean; +} + +export function TryItButton({ + isFeatureEnabled, + linkLabel, + onClick, + popoverContent, + promoLabel, + icon, + isLoading, +}: Props) { + const { core } = useApmPluginContext(); + const canEditAdvancedSettings = + core.application.capabilities.advancedSettings?.save; + + const [isPopoverOpen, togglePopover] = useToggle(false); + + function TryItBadge() { + return ( + + + + ); + } + + function Icon() { + if (!icon) { + return null; + } + return ( + + + + ); + } + + function PromoLabel() { + if (!promoLabel) { + return null; + } + return ( + + {promoLabel} + + ); + } + + function Popover() { + if (!popoverContent && canEditAdvancedSettings) { + return null; + } + return ( + + + } + isOpen={isPopoverOpen} + closePopover={togglePopover} + anchorPosition="upCenter" + > + <> + {popoverContent} + {!canEditAdvancedSettings && ( + <> + + {i18n.translate( + 'xpack.apm.tryItButton.euiButtonIcon.adminAccess', + { + defaultMessage: + 'Please ask your administrator to turn it on by enabling it in within settings.', + } + )} + + )} + + + + ); + } + + function Link() { + return ( + <> + {linkLabel && canEditAdvancedSettings && ( + + + {linkLabel} + + + )} + + ); + } + + function Loading() { + return ( + <> + {isLoading && ( + + + + )} + + ); + } + + if (isFeatureEnabled) { + return ( + + + + + + + ); + } + + return ( + + + + + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/register_apm_rule_types.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/register_apm_rule_types.ts index 54f4a824ee687..526fcc4b09701 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/register_apm_rule_types.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/register_apm_rule_types.ts @@ -90,6 +90,7 @@ export const ApmRuleTypeAlertDefinition: IRuleTypeAlerts = { context: APM_RULE_TYPE_ALERT_CONTEXT, mappings: { fieldMap: apmRuleTypeAlertFieldMap }, useLegacyAlerts: true, + shouldWrite: false, }; export interface RegisterRuleDependencies { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.test.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.test.ts index 33aba72eb96be..e00c3bb1f2ec6 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.test.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.test.ts @@ -10,8 +10,7 @@ import { createRuleTypeMocks } from '../../test_utils'; describe('registerTransactionDurationRuleType', () => { it('sends alert when value is greater than threshold', async () => { - const { services, dependencies, executor, scheduleActions } = - createRuleTypeMocks(); + const { services, dependencies, executor } = createRuleTypeMocks(); registerTransactionDurationRuleType(dependencies); @@ -44,6 +43,7 @@ describe('registerTransactionDurationRuleType', () => { total: 1, }, }); + services.alertsClient.report.mockReturnValue({ uuid: 'test-uuid' }); const params = { threshold: 3000, @@ -55,28 +55,41 @@ describe('registerTransactionDurationRuleType', () => { transactionName: 'GET /orders', }; await executor({ params }); - expect(scheduleActions).toHaveBeenCalledTimes(1); - expect(scheduleActions).toHaveBeenCalledWith('threshold_met', { - alertDetailsUrl: expect.stringContaining( - 'http://localhost:5601/eyr/app/observability/alerts/' - ), - transactionName: 'GET /orders', - environment: 'development', - interval: `5 mins`, - reason: - 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request. Alert when > 3.0 s.', - transactionType: 'request', - serviceName: 'opbeans-java', - threshold: 3000, - triggerValue: '5,500 ms', - viewInAppUrl: - 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=development', + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + context: { + alertDetailsUrl: expect.stringContaining( + 'http://localhost:5601/eyr/app/observability/alerts/' + ), + environment: 'development', + interval: '5 mins', + reason: + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request. Alert when > 3.0 s.', + serviceName: 'opbeans-java', + threshold: 3000, + transactionName: 'GET /orders', + transactionType: 'request', + triggerValue: '5,500 ms', + viewInAppUrl: + 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=development', + }, + id: 'opbeans-java_development_request', + payload: { + 'kibana.alert.evaluation.threshold': 3000000, + 'kibana.alert.evaluation.value': 5500000, + 'kibana.alert.reason': + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request. Alert when > 3.0 s.', + 'processor.event': 'transaction', + 'service.environment': 'development', + 'service.name': 'opbeans-java', + 'transaction.name': 'GET /orders', + 'transaction.type': 'request', + }, }); }); it('sends alert when rule is configured with group by on transaction.name', async () => { - const { services, dependencies, executor, scheduleActions } = - createRuleTypeMocks(); + const { services, dependencies, executor } = createRuleTypeMocks(); registerTransactionDurationRuleType(dependencies); @@ -109,6 +122,7 @@ describe('registerTransactionDurationRuleType', () => { total: 1, }, }); + services.alertsClient.report.mockReturnValue({ uuid: 'test-uuid' }); const params = { threshold: 3000, @@ -125,28 +139,41 @@ describe('registerTransactionDurationRuleType', () => { ], }; await executor({ params }); - expect(scheduleActions).toHaveBeenCalledTimes(1); - expect(scheduleActions).toHaveBeenCalledWith('threshold_met', { - alertDetailsUrl: expect.stringContaining( - 'http://localhost:5601/eyr/app/observability/alerts/' - ), - environment: 'development', - interval: `5 mins`, - reason: - 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request, name: GET /products. Alert when > 3.0 s.', - transactionType: 'request', - serviceName: 'opbeans-java', - threshold: 3000, - triggerValue: '5,500 ms', - viewInAppUrl: - 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=development', - transactionName: 'GET /products', + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + context: { + alertDetailsUrl: expect.stringContaining( + 'http://localhost:5601/eyr/app/observability/alerts/' + ), + environment: 'development', + interval: '5 mins', + reason: + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request, name: GET /products. Alert when > 3.0 s.', + serviceName: 'opbeans-java', + threshold: 3000, + transactionName: 'GET /products', + transactionType: 'request', + triggerValue: '5,500 ms', + viewInAppUrl: + 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=development', + }, + id: 'opbeans-java_development_request_GET /products', + payload: { + 'kibana.alert.evaluation.threshold': 3000000, + 'kibana.alert.evaluation.value': 5500000, + 'kibana.alert.reason': + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request, name: GET /products. Alert when > 3.0 s.', + 'processor.event': 'transaction', + 'service.environment': 'development', + 'service.name': 'opbeans-java', + 'transaction.name': 'GET /products', + 'transaction.type': 'request', + }, }); }); it('sends alert when rule is configured with preselected group by', async () => { - const { services, dependencies, executor, scheduleActions } = - createRuleTypeMocks(); + const { services, dependencies, executor } = createRuleTypeMocks(); registerTransactionDurationRuleType(dependencies); @@ -179,6 +206,7 @@ describe('registerTransactionDurationRuleType', () => { total: 1, }, }); + services.alertsClient.report.mockReturnValue({ uuid: 'test-uuid' }); const params = { threshold: 3000, @@ -191,27 +219,41 @@ describe('registerTransactionDurationRuleType', () => { }; await executor({ params }); - expect(scheduleActions).toHaveBeenCalledTimes(1); - expect(scheduleActions).toHaveBeenCalledWith('threshold_met', { - alertDetailsUrl: expect.stringContaining( - 'http://localhost:5601/eyr/app/observability/alerts/' - ), - environment: 'development', - interval: `5 mins`, - reason: - 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request. Alert when > 3.0 s.', - transactionType: 'request', - serviceName: 'opbeans-java', - threshold: 3000, - triggerValue: '5,500 ms', - viewInAppUrl: - 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=development', + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + context: { + alertDetailsUrl: expect.stringContaining( + 'http://localhost:5601/eyr/app/observability/alerts/' + ), + environment: 'development', + interval: '5 mins', + reason: + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request. Alert when > 3.0 s.', + serviceName: 'opbeans-java', + threshold: 3000, + transactionName: undefined, + transactionType: 'request', + triggerValue: '5,500 ms', + viewInAppUrl: + 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=development', + }, + id: 'opbeans-java_development_request', + payload: { + 'kibana.alert.evaluation.threshold': 3000000, + 'kibana.alert.evaluation.value': 5500000, + 'kibana.alert.reason': + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request. Alert when > 3.0 s.', + 'processor.event': 'transaction', + 'service.environment': 'development', + 'service.name': 'opbeans-java', + 'transaction.name': undefined, + 'transaction.type': 'request', + }, }); }); it('sends alert when service.environment field does not exist in the source', async () => { - const { services, dependencies, executor, scheduleActions } = - createRuleTypeMocks(); + const { services, dependencies, executor } = createRuleTypeMocks(); registerTransactionDurationRuleType(dependencies); @@ -249,6 +291,7 @@ describe('registerTransactionDurationRuleType', () => { total: 1, }, }); + services.alertsClient.report.mockReturnValue({ uuid: 'test-uuid' }); const params = { threshold: 3000, @@ -265,28 +308,41 @@ describe('registerTransactionDurationRuleType', () => { ], }; await executor({ params }); - expect(scheduleActions).toHaveBeenCalledTimes(1); - expect(scheduleActions).toHaveBeenCalledWith('threshold_met', { - alertDetailsUrl: expect.stringContaining( - 'http://localhost:5601/eyr/app/observability/alerts/' - ), - environment: 'Not defined', - interval: `5 mins`, - reason: - 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: Not defined, type: request, name: tx-java. Alert when > 3.0 s.', - transactionType: 'request', - serviceName: 'opbeans-java', - threshold: 3000, - triggerValue: '5,500 ms', - viewInAppUrl: - 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=ENVIRONMENT_ALL', - transactionName: 'tx-java', + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + context: { + alertDetailsUrl: expect.stringContaining( + 'http://localhost:5601/eyr/app/observability/alerts/' + ), + environment: 'Not defined', + interval: '5 mins', + reason: + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: Not defined, type: request, name: tx-java. Alert when > 3.0 s.', + serviceName: 'opbeans-java', + threshold: 3000, + transactionName: 'tx-java', + transactionType: 'request', + triggerValue: '5,500 ms', + viewInAppUrl: + 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=ENVIRONMENT_ALL', + }, + id: 'opbeans-java_ENVIRONMENT_NOT_DEFINED_request_tx-java', + payload: { + 'kibana.alert.evaluation.threshold': 3000000, + 'kibana.alert.evaluation.value': 5500000, + 'kibana.alert.reason': + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: Not defined, type: request, name: tx-java. Alert when > 3.0 s.', + 'processor.event': 'transaction', + 'service.environment': 'ENVIRONMENT_NOT_DEFINED', + 'service.name': 'opbeans-java', + 'transaction.name': 'tx-java', + 'transaction.type': 'request', + }, }); }); it('sends alert when rule is configured with a filter query', async () => { - const { services, dependencies, executor, scheduleActions } = - createRuleTypeMocks(); + const { services, dependencies, executor } = createRuleTypeMocks(); registerTransactionDurationRuleType(dependencies); @@ -319,6 +375,7 @@ describe('registerTransactionDurationRuleType', () => { total: 1, }, }); + services.alertsClient.report.mockReturnValue({ uuid: 'test-uuid' }); const params = { threshold: 3000, @@ -337,21 +394,36 @@ describe('registerTransactionDurationRuleType', () => { }; await executor({ params }); - expect(scheduleActions).toHaveBeenCalledTimes(1); - expect(scheduleActions).toHaveBeenCalledWith('threshold_met', { - alertDetailsUrl: expect.stringContaining( - 'http://localhost:5601/eyr/app/observability/alerts/' - ), - environment: 'development', - interval: `5 mins`, - reason: - 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request. Alert when > 3.0 s.', - transactionType: 'request', - serviceName: 'opbeans-java', - threshold: 3000, - triggerValue: '5,500 ms', - viewInAppUrl: - 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=development', + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + context: { + alertDetailsUrl: expect.stringContaining( + 'http://localhost:5601/eyr/app/observability/alerts/' + ), + environment: 'development', + interval: '5 mins', + reason: + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request. Alert when > 3.0 s.', + serviceName: 'opbeans-java', + threshold: 3000, + transactionName: undefined, + transactionType: 'request', + triggerValue: '5,500 ms', + viewInAppUrl: + 'http://localhost:5601/eyr/app/apm/services/opbeans-java?transactionType=request&environment=development', + }, + id: 'opbeans-java_development_request', + payload: { + 'kibana.alert.evaluation.threshold': 3000000, + 'kibana.alert.evaluation.value': 5500000, + 'kibana.alert.reason': + 'Avg. latency is 5.5 s in the last 5 mins for service: opbeans-java, env: development, type: request. Alert when > 3.0 s.', + 'processor.event': 'transaction', + 'service.environment': 'development', + 'service.name': 'opbeans-java', + 'transaction.name': undefined, + 'transaction.type': 'request', + }, }); }); }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts index dc33d5380f705..580c22d094456 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts @@ -7,7 +7,16 @@ import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { GetViewInAppRelativeUrlFnOpts } from '@kbn/alerting-plugin/server'; +import { + AlertsClientError, + GetViewInAppRelativeUrlFnOpts, + ActionGroupIdsOf, + AlertInstanceContext as AlertContext, + AlertInstanceState as AlertState, + RuleTypeState, + RuleExecutorOptions, + IRuleTypeAlerts, +} from '@kbn/alerting-plugin/server'; import { asDuration, formatDurationFromTimeUnitChar, @@ -26,7 +35,7 @@ import { ALERT_REASON, ApmRuleType, } from '@kbn/rule-data-utils'; -import { createLifecycleRuleTypeFactory } from '@kbn/rule-registry-plugin/server'; +import { ObservabilityApmAlert } from '@kbn/alerts-as-data-utils'; import { addSpaceIdToPath } from '@kbn/spaces-plugin/common'; import { getGroupByTerms } from '../utils/get_groupby_terms'; import { SearchAggregatedTransactionSetting } from '../../../../../common/aggregated_transactions'; @@ -42,8 +51,12 @@ import { APM_SERVER_FEATURE_ID, formatTransactionDurationReason, RULE_TYPES_CONFIG, + THRESHOLD_MET_GROUP, } from '../../../../../common/rules/apm_rule_types'; -import { transactionDurationParamsSchema } from '../../../../../common/rules/schema'; +import { + transactionDurationParamsSchema, + ApmRuleParamsType, +} from '../../../../../common/rules/schema'; import { environmentQuery } from '../../../../../common/utils/environment_query'; import { getAlertUrlTransaction, @@ -85,20 +98,29 @@ export const transactionDurationActionVariables = [ apmActionVariables.viewInAppUrl, ]; +type TransactionDurationRuleTypeParams = + ApmRuleParamsType[ApmRuleType.TransactionDuration]; +type TransactionDurationActionGroups = ActionGroupIdsOf< + typeof THRESHOLD_MET_GROUP +>; +type TransactionDurationRuleTypeState = RuleTypeState; +type TransactionDurationAlertState = AlertState; +type TransactionDurationAlertContext = AlertContext; +type TransactionDurationAlert = ObservabilityApmAlert; + export function registerTransactionDurationRuleType({ alerting, apmConfig, - ruleDataClient, getApmIndices, - logger, basePath, }: RegisterRuleDependencies) { - const createLifecycleRuleType = createLifecycleRuleTypeFactory({ - ruleDataClient, - logger, - }); + if (!alerting) { + throw new Error( + 'Cannot register transaction duration rule type. Both the actions and alerting plugins need to be enabled.' + ); + } - const ruleType = createLifecycleRuleType({ + alerting.registerType({ id: ApmRuleType.TransactionDuration, name: ruleTypeConfig.name, actionGroups: ruleTypeConfig.actionGroups, @@ -117,20 +139,28 @@ export function registerTransactionDurationRuleType({ producer: APM_SERVER_FEATURE_ID, minimumLicenseRequired: 'basic', isExportable: true, - executor: async ({ - params: ruleParams, - services, - spaceId, - getTimeRange, - }) => { + executor: async ( + options: RuleExecutorOptions< + TransactionDurationRuleTypeParams, + TransactionDurationRuleTypeState, + TransactionDurationAlertState, + TransactionDurationAlertContext, + TransactionDurationActionGroups, + TransactionDurationAlert + > + ) => { + const { params: ruleParams, services, spaceId, getTimeRange } = options; + const { alertsClient, savedObjectsClient, scopedClusterClient } = + services; + if (!alertsClient) { + throw new AlertsClientError(); + } + const allGroupByFields = getAllGroupByFields( ApmRuleType.TransactionDuration, ruleParams.groupBy ); - const { getAlertUuid, savedObjectsClient, scopedClusterClient } = - services; - const indices = await getApmIndices(savedObjectsClient); // only query transaction events when set to 'never', @@ -275,25 +305,12 @@ export function registerTransactionDurationRuleType({ }); const alertId = bucketKey.join('_'); - const alert = services.alertWithLifecycle({ + const { uuid } = alertsClient.report({ id: alertId, - fields: { - [TRANSACTION_NAME]: ruleParams.transactionName, - [PROCESSOR_EVENT]: ProcessorEvent.transaction, - [ALERT_EVALUATION_VALUE]: transactionDuration, - [ALERT_EVALUATION_THRESHOLD]: thresholdMicroseconds, - [ALERT_REASON]: reason, - ...sourceFields, - ...groupByFields, - }, + actionGroup: ruleTypeConfig.defaultActionGroupId, }); - const alertUuid = getAlertUuid(alertId); - const alertDetailsUrl = getAlertDetailsUrl( - basePath, - spaceId, - alertUuid - ); + const alertDetailsUrl = getAlertDetailsUrl(basePath, spaceId, uuid); const viewInAppUrl = addSpaceIdToPath( basePath.publicBaseUrl, spaceId, @@ -306,7 +323,8 @@ export function registerTransactionDurationRuleType({ ) ); const groupByActionVariables = getGroupByActionVariables(groupByFields); - alert.scheduleActions(ruleTypeConfig.defaultActionGroupId, { + + const context = { alertDetailsUrl, interval: formatDurationFromTimeUnitChar( ruleParams.windowSize, @@ -319,15 +337,32 @@ export function registerTransactionDurationRuleType({ triggerValue: transactionDurationFormatted, viewInAppUrl, ...groupByActionVariables, + }; + + const payload = { + [TRANSACTION_NAME]: ruleParams.transactionName, + [PROCESSOR_EVENT]: ProcessorEvent.transaction, + [ALERT_EVALUATION_VALUE]: transactionDuration, + [ALERT_EVALUATION_THRESHOLD]: thresholdMicroseconds, + [ALERT_REASON]: reason, + ...sourceFields, + ...groupByFields, + }; + + alertsClient.setAlertData({ + id: alertId, + payload, + context, }); } return { state: {} }; }, - alerts: ApmRuleTypeAlertDefinition, + alerts: { + ...ApmRuleTypeAlertDefinition, + shouldWrite: true, + } as IRuleTypeAlerts, getViewInAppRelativeUrl: ({ rule }: GetViewInAppRelativeUrlFnOpts<{}>) => observabilityPaths.ruleDetails(rule.id), }); - - alerting.registerType(ruleType); } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/test_utils/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/test_utils/index.ts index a447ab2a75d4b..1f8ddeaff4620 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/test_utils/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/test_utils/index.ts @@ -47,6 +47,10 @@ export const createRuleTypeMocks = () => { alertWithLifecycle: jest.fn(), logger: loggerMock, shouldWriteAlerts: () => true, + alertsClient: { + report: jest.fn(), + setAlertData: jest.fn(), + }, }; const dependencies = { diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/kpis/host_kpi_charts.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/kpis/host_kpi_charts.tsx index febe2375b0316..7e58a1ab50e60 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/kpis/host_kpi_charts.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/kpis/host_kpi_charts.tsx @@ -9,10 +9,8 @@ import React from 'react'; import { EuiFlexItem, useEuiTheme } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { Filter, Query, TimeRange } from '@kbn/es-query'; -import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common'; -import useAsync from 'react-use/lib/useAsync'; -import { i18n } from '@kbn/i18n'; import { Kpi } from './kpi'; +import { useHostKpiCharts } from '../../hooks/use_metrics_charts'; export interface HostKpiChartsProps { dataView?: DataView; @@ -36,34 +34,13 @@ export const HostKpiCharts = ({ loading = false, }: HostKpiChartsProps) => { const { euiTheme } = useEuiTheme(); - - const { value: charts = [] } = useAsync(async () => { - const model = findInventoryModel('host'); - const { cpu, disk, memory } = await model.metrics.getCharts(); - - return [ - cpu.metric.cpuUsage, - cpu.metric.normalizedLoad1m, - memory.metric.memoryUsage, - disk.metric.diskUsage, - ].map((chart) => ({ - ...chart, + const charts = useHostKpiCharts({ + dataViewId: dataView?.id, + options: { + subtitle: options?.subtitle, seriesColor: euiTheme.colors.lightestShade, - decimals: 1, - subtitle: - options?.subtitle ?? - i18n.translate('xpack.infra.assetDetails.kpi.subtitle.average', { - defaultMessage: 'Average', - }), - ...(dataView?.id - ? { - dataset: { - index: dataView.id, - }, - } - : {}), - })); - }, [dataView?.id, euiTheme.colors.lightestShade, options?.subtitle]); + }, + }); return ( <> diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_metrics_charts.test.ts b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_metrics_charts.test.ts new file mode 100644 index 0000000000000..056f12575cf9e --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_metrics_charts.test.ts @@ -0,0 +1,157 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import type { LensXYConfig } from '@kbn/lens-embeddable-utils/config_builder'; +import { + useHostFlyoutViewMetricsCharts, + useHostKpiCharts, + useHostPageViewMetricsCharts, + useKubernetesSectionMetricsCharts, +} from './use_metrics_charts'; + +const metricsDataViewId = 'metricsDataViewId'; +const logsDataViewId = 'logsDataViewId'; + +describe('useHostFlyoutViewMetricsCharts', () => { + it('should return an array of charts with correct order', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useHostFlyoutViewMetricsCharts({ metricsDataViewId, logsDataViewId }) + ); + await waitForNextUpdate(); + + const expectedOrder = [ + 'cpuUsage', + 'memoryUsage', + 'normalizedLoad1m', + 'logRate', + 'diskSpaceUsageAvailable', + 'diskUsageByMountPoint', + 'diskThroughputReadWrite', + 'diskIOReadWrite', + 'rxTx', + ]; + + expect(result.current).toHaveLength(expectedOrder.length); + + result.current.forEach((chart, index) => { + expect(chart).toHaveProperty('id', expectedOrder[index]); + }); + }); + + it('should return a chart with id "logRate" using the logsDataViewId', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useHostFlyoutViewMetricsCharts({ metricsDataViewId, logsDataViewId }) + ); + await waitForNextUpdate(); + + const logRateChart = result.current.find((chart) => chart.id === 'logRate') as LensXYConfig; + expect(logRateChart).toBeDefined(); + expect(logRateChart.dataset).toHaveProperty('index', logsDataViewId); + }); +}); + +describe('useHostPageViewMetricsCharts', () => { + it('should return an array of charts with correct order', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useHostPageViewMetricsCharts({ metricsDataViewId, logsDataViewId }) + ); + await waitForNextUpdate(); + + const expectedOrder = [ + 'cpuUsage', + 'cpuUsageBreakdown', + 'memoryUsage', + 'memoryUsageBreakdown', + 'normalizedLoad1m', + 'loadBreakdown', + 'logRate', + 'diskSpaceUsageAvailable', + 'diskUsageByMountPoint', + 'diskThroughputReadWrite', + 'diskIOReadWrite', + 'rxTx', + ]; + + expect(result.current).toHaveLength(expectedOrder.length); + + result.current.forEach((chart, index) => { + expect(chart).toHaveProperty('id', expectedOrder[index]); + }); + }); + + it('should return a chart with id "logRate" using the logsDataViewId', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useHostPageViewMetricsCharts({ metricsDataViewId, logsDataViewId }) + ); + await waitForNextUpdate(); + + const logRateChart = result.current.find((chart) => chart.id === 'logRate') as LensXYConfig; + expect(logRateChart).toBeDefined(); + expect(logRateChart.dataset).toHaveProperty('index', logsDataViewId); + }); +}); + +describe('useKubernetesSectionMetricsCharts', () => { + it('should return an array of charts with correct order', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useKubernetesSectionMetricsCharts({ metricsDataViewId }) + ); + await waitForNextUpdate(); + + const expectedOrder = [ + 'nodeCpuCapacity', + 'nodeMemoryCapacity', + 'nodeDiskCapacity', + 'nodePodCapacity', + ]; + + expect(result.current).toHaveLength(expectedOrder.length); + + result.current.forEach((chart, index) => { + expect(chart).toHaveProperty('id', expectedOrder[index]); + }); + }); +}); + +describe('useHostKpiCharts', () => { + it('should return an array of charts with correct order', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useHostKpiCharts({ dataViewId: metricsDataViewId }) + ); + await waitForNextUpdate(); + + const expectedOrder = ['cpuUsage', 'normalizedLoad1m', 'memoryUsage', 'diskUsage']; + + expect(result.current).toHaveLength(expectedOrder.length); + + result.current.forEach((chart, index) => { + expect(chart).toHaveProperty('id', expectedOrder[index]); + expect(chart).toHaveProperty('subtitle', 'Average'); + expect(chart).toHaveProperty('decimals', 1); + }); + }); + + it('should return an array of charts with correct options', async () => { + const options = { + seriesColor: 'blue', + subtitle: 'Custom Subtitle', + }; + + const { result, waitForNextUpdate } = renderHook(() => + useHostKpiCharts({ dataViewId: metricsDataViewId, options }) + ); + await waitForNextUpdate(); + + expect(result.current).toHaveLength(4); + + result.current.forEach((chart) => { + expect(chart).toHaveProperty('seriesColor', options.seriesColor); + expect(chart).toHaveProperty('subtitle', options.subtitle); + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_metrics_charts.ts b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_metrics_charts.ts new file mode 100644 index 0000000000000..7df0bb429f538 --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_metrics_charts.ts @@ -0,0 +1,155 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common'; +import useAsync from 'react-use/lib/useAsync'; + +export const useHostFlyoutViewMetricsCharts = ({ + metricsDataViewId, + logsDataViewId, +}: { + metricsDataViewId?: string; + logsDataViewId?: string; +}) => { + const model = findInventoryModel('host'); + + const { value: charts = [] } = useAsync(async () => { + const { cpu, disk, memory, network, logs } = await model.metrics.getCharts(); + + return [ + cpu.xy.cpuUsage, + memory.xy.memoryUsage, + cpu.xy.normalizedLoad1m, + logs.xy.logRate, + disk.xy.diskSpaceUsageAvailable, + disk.xy.diskUsageByMountPoint, + disk.xy.diskThroughputReadWrite, + disk.xy.diskIOReadWrite, + network.xy.rxTx, + ].map((chart) => { + const dataViewId = chart.id === 'logRate' ? logsDataViewId : metricsDataViewId; + return { + ...chart, + ...(dataViewId && { + dataset: { + index: dataViewId, + }, + }), + }; + }); + }, [metricsDataViewId, logsDataViewId]); + + return charts; +}; + +export const useHostPageViewMetricsCharts = ({ + metricsDataViewId, + logsDataViewId, +}: { + metricsDataViewId?: string; + logsDataViewId?: string; +}) => { + const model = findInventoryModel('host'); + + const { value: charts = [] } = useAsync(async () => { + const { cpu, disk, memory, network, logs } = await model.metrics.getCharts(); + + return [ + cpu.xy.cpuUsage, + cpu.xy.cpuUsageBreakdown, + memory.xy.memoryUsage, + memory.xy.memoryUsageBreakdown, + cpu.xy.normalizedLoad1m, + cpu.xy.loadBreakdown, + logs.xy.logRate, + disk.xy.diskSpaceUsageAvailable, + disk.xy.diskUsageByMountPoint, + disk.xy.diskThroughputReadWrite, + disk.xy.diskIOReadWrite, + network.xy.rxTx, + ].map((chart) => { + const dataViewId = chart.id === 'logRate' ? logsDataViewId : metricsDataViewId; + return { + ...chart, + ...(dataViewId && { + dataset: { + index: dataViewId, + }, + }), + }; + }); + }, [metricsDataViewId, logsDataViewId]); + + return charts; +}; + +export const useKubernetesSectionMetricsCharts = ({ + metricsDataViewId, +}: { + metricsDataViewId?: string; +}) => { + const model = findInventoryModel('host'); + + const { value: charts = [] } = useAsync(async () => { + const { kibernetesNode } = await model.metrics.getCharts(); + + return [ + kibernetesNode.xy.nodeCpuCapacity, + kibernetesNode.xy.nodeMemoryCapacity, + kibernetesNode.xy.nodeDiskCapacity, + kibernetesNode.xy.nodePodCapacity, + ].map((chart) => { + return { + ...chart, + ...(metricsDataViewId && { + dataset: { + index: metricsDataViewId, + }, + }), + }; + }); + }, [metricsDataViewId]); + + return charts; +}; + +export const useHostKpiCharts = ({ + dataViewId, + options, +}: { + dataViewId?: string; + options?: { seriesColor: string; subtitle?: string }; +}) => { + const { value: charts = [] } = useAsync(async () => { + const model = findInventoryModel('host'); + const { cpu, disk, memory } = await model.metrics.getCharts(); + + return [ + cpu.metric.cpuUsage, + cpu.metric.normalizedLoad1m, + memory.metric.memoryUsage, + disk.metric.diskUsage, + ].map((chart) => ({ + ...chart, + seriesColor: options?.seriesColor, + decimals: 1, + subtitle: + options?.subtitle ?? + i18n.translate('xpack.infra.assetDetails.kpi.subtitle.average', { + defaultMessage: 'Average', + }), + ...(dataViewId && { + dataset: { + index: dataViewId, + }, + }), + })); + }, [dataViewId, options?.seriesColor, options?.subtitle]); + + return charts; +}; diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/metrics/metrics_section.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/metrics/metrics_section.tsx index 7f15c21e64293..72e414a5c266c 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/metrics/metrics_section.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/metrics/metrics_section.tsx @@ -10,7 +10,6 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { TimeRange } from '@kbn/es-query'; import { EuiFlexGroup } from '@elastic/eui'; import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common'; -import useAsync from 'react-use/lib/useAsync'; import { MetricsSectionTitle, KubernetesMetricsSectionTitle, @@ -18,6 +17,11 @@ import { import { useMetadataStateContext } from '../../../hooks/use_metadata_state'; import { MetricsGrid } from './metrics_grid'; import { CollapsibleSection } from '../section/collapsible_section'; +import { + useHostFlyoutViewMetricsCharts, + useHostPageViewMetricsCharts, + useKubernetesSectionMetricsCharts, +} from '../../../hooks/use_metrics_charts'; interface Props { assetName: string; @@ -42,34 +46,10 @@ export const MetricsSectionCompact = ({ dateRange, }: Props) => { const model = findInventoryModel('host'); - - const { value: charts = [] } = useAsync(async () => { - const { cpu, disk, memory, network, logs } = await model.metrics.getCharts(); - - return [ - cpu.xy.cpuUsage, - memory.xy.memoryUsage, - cpu.xy.normalizedLoad1m, - logs.xy.logRate, - disk.xy.diskSpaceUsageAvailable, - disk.xy.diskUsageByMountPoint, - disk.xy.diskThroughputReadWrite, - disk.xy.diskIOReadWrite, - network.xy.rxTx, - ].map((chart) => { - const dataViewId = chart.id === 'logRate' ? logsDataView?.id : metricsDataView?.id; - return { - ...chart, - ...(dataViewId - ? { - dataset: { - index: dataViewId, - }, - } - : {}), - }; - }); - }, [metricsDataView?.id, logsDataView?.id]); + const charts = useHostFlyoutViewMetricsCharts({ + metricsDataViewId: metricsDataView?.id, + logsDataViewId: logsDataView?.id, + }); return (
@@ -86,37 +66,10 @@ export const MetricsSectionCompact = ({ const HostMetricsSection = ({ assetName, metricsDataView, logsDataView, dateRange }: Props) => { const model = findInventoryModel('host'); - - const { value: charts = [] } = useAsync(async () => { - const { cpu, disk, memory, network, logs } = await model.metrics.getCharts(); - - return [ - cpu.xy.cpuUsage, - cpu.xy.cpuUsageBreakdown, - memory.xy.memoryUsage, - memory.xy.memoryUsageBreakdown, - cpu.xy.normalizedLoad1m, - cpu.xy.loadBreakdown, - logs.xy.logRate, - disk.xy.diskSpaceUsageAvailable, - disk.xy.diskUsageByMountPoint, - disk.xy.diskThroughputReadWrite, - disk.xy.diskIOReadWrite, - network.xy.rxTx, - ].map((chart) => { - const dataViewId = chart.id === 'logRate' ? logsDataView?.id : metricsDataView?.id; - return { - ...chart, - ...(dataViewId - ? { - dataset: { - index: dataViewId, - }, - } - : {}), - }; - }); - }, [metricsDataView?.id, logsDataView?.id]); + const charts = useHostPageViewMetricsCharts({ + metricsDataViewId: metricsDataView?.id, + logsDataViewId: logsDataView?.id, + }); return (
@@ -137,28 +90,7 @@ const KubenetesMetricsSection = ({ dateRange, }: Omit) => { const model = findInventoryModel('host'); - - const { value: charts = [] } = useAsync(async () => { - const { kibernetesNode } = await model.metrics.getCharts(); - - return [ - kibernetesNode.xy.nodeCpuCapacity, - kibernetesNode.xy.nodeMemoryCapacity, - kibernetesNode.xy.nodeDiskCapacity, - kibernetesNode.xy.nodePodCapacity, - ].map((chart) => { - return { - ...chart, - ...(metricsDataView?.id - ? { - dataset: { - index: metricsDataView.id, - }, - } - : {}), - }; - }); - }, [metricsDataView?.id]); + const charts = useKubernetesSectionMetricsCharts({ metricsDataViewId: metricsDataView?.id }); return (
diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/hosts_table.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/hosts_table.tsx index 7449be91aa029..eaa1a14f37380 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/hosts_table.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/hosts_table.tsx @@ -12,11 +12,9 @@ import { EuiEmptyPrompt } from '@elastic/eui'; import { HostNodeRow, useHostsTableContext } from '../hooks/use_hosts_table'; import { useHostsViewContext } from '../hooks/use_hosts_view'; import { FlyoutWrapper } from './host_details_flyout/flyout_wrapper'; -import { DEFAULT_PAGE_SIZE } from '../constants'; +import { DEFAULT_PAGE_SIZE, PAGE_SIZE_OPTIONS } from '../constants'; import { FilterAction } from './table/filter_action'; -const PAGE_SIZE_OPTIONS = [5, 10, 20]; - export const HostsTable = () => { const { loading } = useHostsViewContext(); diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx index 51d89184bf5b7..aafe961b7dc0b 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx @@ -7,43 +7,16 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFlexGrid, EuiFlexItem, EuiText, EuiFlexGroup, EuiSpacer } from '@elastic/eui'; -import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common'; -import useAsync from 'react-use/lib/useAsync'; import { HostMetricsExplanationContent } from '../../../../../../components/lens'; import { Chart } from './chart'; import { Popover } from '../../common/popover'; import { useMetricsDataViewContext } from '../../../hooks/use_metrics_data_view'; +import { useMetricsCharts } from '../../../hooks/use_metrics_charts'; export const MetricsGrid = () => { - const model = findInventoryModel('host'); const { dataView } = useMetricsDataViewContext(); - const { value: charts = [] } = useAsync(async () => { - const { cpu, disk, memory, network } = await model.metrics.getCharts(); - return [ - cpu.xy.cpuUsage, - cpu.xy.normalizedLoad1m, - memory.xy.memoryUsage, - memory.xy.memoryFree, - disk.xy.diskUsage, - disk.xy.diskSpaceAvailable, - disk.xy.diskIORead, - disk.xy.diskIOWrite, - disk.xy.diskReadThroughput, - disk.xy.diskWriteThroughput, - network.xy.rx, - network.xy.tx, - ].map((chart) => ({ - ...chart, - ...(dataView?.id - ? { - dataset: { - index: dataView.id, - }, - } - : {}), - })); - }, [dataView?.id]); + const charts = useMetricsCharts({ dataViewId: dataView?.id }); return ( <> diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/constants.ts b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/constants.ts index cba547f072a64..acd7e1e36cd81 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/constants.ts +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/constants.ts @@ -12,5 +12,7 @@ export const DEFAULT_PAGE_SIZE = 10; export const LOCAL_STORAGE_HOST_LIMIT_KEY = 'hostsView:hostLimitSelection'; export const LOCAL_STORAGE_PAGE_SIZE_KEY = 'hostsView:pageSizeSelection'; +export const PAGE_SIZE_OPTIONS = [5, 10, 20]; + export const HOST_LIMIT_OPTIONS = [50, 100, 500] as const; export const HOST_METRICS_DOC_HREF = 'https://ela.st/docs-infra-host-metrics'; diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_metrics_charts.test.ts b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_metrics_charts.test.ts new file mode 100644 index 0000000000000..4447edf35cef0 --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_metrics_charts.test.ts @@ -0,0 +1,58 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { LensSeriesLayer } from '@kbn/lens-embeddable-utils/config_builder'; +import { renderHook } from '@testing-library/react-hooks'; +import { PAGE_SIZE_OPTIONS } from '../constants'; +import { useMetricsCharts } from './use_metrics_charts'; + +describe('useMetricsCharts', () => { + it('should return an array of charts with breakdown config', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useMetricsCharts({ dataViewId: 'dataViewId' }) + ); + await waitForNextUpdate(); + + expect(result.current).toHaveLength(12); + + result.current.forEach((chart) => { + const seriesLayer = chart.layers.find((layer) => layer.type === 'series') as LensSeriesLayer; + expect(seriesLayer).toHaveProperty('breakdown'); + expect(seriesLayer.breakdown).toHaveProperty('type', 'topValues'); + expect(seriesLayer.breakdown).toHaveProperty('field', 'host.name'); + expect(seriesLayer.breakdown).toHaveProperty('size', PAGE_SIZE_OPTIONS.at(-1)); + }); + }); + + it('should return an array of charts with correct order', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useMetricsCharts({ dataViewId: 'dataViewId' }) + ); + await waitForNextUpdate(); + + const expectedOrder = [ + 'cpuUsage', + 'normalizedLoad1m', + 'memoryUsage', + 'memoryFree', + 'diskUsage', + 'diskSpaceAvailable', + 'diskIORead', + 'diskIOWrite', + 'diskReadThroughput', + 'diskWriteThroughput', + 'rx', + 'tx', + ]; + + expect(result.current).toHaveLength(expectedOrder.length); + + result.current.forEach((chart, index) => { + expect(chart).toHaveProperty('id', expectedOrder[index]); + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_metrics_charts.ts b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_metrics_charts.ts new file mode 100644 index 0000000000000..ab205cc15c14d --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_metrics_charts.ts @@ -0,0 +1,55 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import useAsync from 'react-use/lib/useAsync'; +import type { LensBreakdownConfig } from '@kbn/lens-embeddable-utils/config_builder'; +import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common'; +import { PAGE_SIZE_OPTIONS } from '../constants'; + +export const useMetricsCharts = ({ dataViewId }: { dataViewId?: string }) => { + const model = findInventoryModel('host'); + + const { value: charts = [] } = useAsync(async () => { + const { cpu, disk, memory, network } = await model.metrics.getCharts(); + + return [ + cpu.xy.cpuUsage, + cpu.xy.normalizedLoad1m, + memory.xy.memoryUsage, + memory.xy.memoryFree, + disk.xy.diskUsage, + disk.xy.diskSpaceAvailable, + disk.xy.diskIORead, + disk.xy.diskIOWrite, + disk.xy.diskReadThroughput, + disk.xy.diskWriteThroughput, + network.xy.rx, + network.xy.tx, + ].map((chart) => ({ + ...chart, + layers: chart.layers.map((layer) => + layer.type === 'series' + ? { + ...layer, + breakdown: { + type: 'topValues', + field: 'host.name', + size: PAGE_SIZE_OPTIONS.at(-1), + } as LensBreakdownConfig, + } + : layer + ), + ...(dataViewId && { + dataset: { + index: dataViewId, + }, + }), + })); + }, [dataViewId]); + + return charts; +}; diff --git a/x-pack/plugins/observability_solution/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts b/x-pack/plugins/observability_solution/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts index a6baca28ace1f..be38db04c3798 100644 --- a/x-pack/plugins/observability_solution/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts +++ b/x-pack/plugins/observability_solution/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts @@ -87,7 +87,7 @@ const mockOptions = { }; const setEvaluationResults = (response: Array>) => { - jest.requireMock('./lib/evaluate_rule').evaluateRule.mockImplementation(() => response); + return jest.requireMock('./lib/evaluate_rule').evaluateRule.mockImplementation(() => response); }; describe('The metric threshold rule type', () => { @@ -733,6 +733,148 @@ describe('The metric threshold rule type', () => { ); expect(stateResult3.missingGroups).toEqual(expect.arrayContaining([])); }); + + test('should remove a group from previous missing groups if the related alert is untracked', async () => { + setEvaluationResults([ + { + a: { + ...baseNonCountCriterion, + comparator: Comparator.GT, + threshold: [0.75], + metric: 'test.metric.2', + currentValue: 1.0, + timestamp: new Date().toISOString(), + shouldFire: true, + shouldWarn: false, + isNoData: false, + bucketKey: { groupBy0: 'a' }, + }, + b: { + ...baseNonCountCriterion, + comparator: Comparator.GT, + threshold: [0.75], + metric: 'test.metric.2', + currentValue: 3, + timestamp: new Date().toISOString(), + shouldFire: true, + shouldWarn: false, + isNoData: false, + bucketKey: { groupBy0: 'b' }, + }, + c: { + ...baseNonCountCriterion, + comparator: Comparator.GT, + threshold: [0.75], + metric: 'test.metric.2', + currentValue: 3, + timestamp: new Date().toISOString(), + shouldFire: true, + shouldWarn: false, + isNoData: false, + bucketKey: { groupBy0: 'c' }, + }, + }, + ]); + const { state: stateResult1 } = await executeWithFilter( + Comparator.GT, + [0.75], + JSON.stringify({ query: 'q' }), + 'test.metric.2' + ); + expect(stateResult1.missingGroups).toEqual(expect.arrayContaining([])); + setEvaluationResults([ + { + a: { + ...baseNonCountCriterion, + comparator: Comparator.GT, + threshold: [0.75], + metric: 'test.metric.1', + currentValue: 1.0, + timestamp: new Date().toISOString(), + shouldFire: true, + shouldWarn: false, + isNoData: false, + bucketKey: { groupBy0: 'a' }, + }, + b: { + ...baseNonCountCriterion, + comparator: Comparator.GT, + threshold: [0.75], + metric: 'test.metric.1', + currentValue: null, + timestamp: new Date().toISOString(), + shouldFire: true, + shouldWarn: false, + isNoData: true, + bucketKey: { groupBy0: 'b' }, + }, + c: { + ...baseNonCountCriterion, + comparator: Comparator.GT, + threshold: [0.75], + metric: 'test.metric.1', + currentValue: null, + timestamp: new Date().toISOString(), + shouldFire: false, + shouldWarn: false, + isNoData: true, + bucketKey: { groupBy0: 'c' }, + }, + }, + ]); + const { state: stateResult2 } = await executeWithFilter( + Comparator.GT, + [0.75], + JSON.stringify({ query: 'q' }), + 'test.metric.1', + stateResult1 + ); + expect(stateResult2.missingGroups).toEqual([ + { key: 'b', bucketKey: { groupBy0: 'b' } }, + { key: 'c', bucketKey: { groupBy0: 'c' } }, + ]); + const mockedEvaluateRule = setEvaluationResults([ + { + a: { + ...baseNonCountCriterion, + comparator: Comparator.GT, + threshold: [0.75], + metric: 'test.metric.1', + currentValue: 1.0, + timestamp: new Date().toISOString(), + shouldFire: true, + shouldWarn: false, + isNoData: false, + bucketKey: { groupBy0: 'a' }, + }, + b: { + ...baseNonCountCriterion, + comparator: Comparator.GT, + threshold: [0.75], + metric: 'test.metric.1', + currentValue: null, + timestamp: new Date().toISOString(), + shouldFire: true, + shouldWarn: false, + isNoData: true, + bucketKey: { groupBy0: 'b' }, + }, + }, + ]); + // Consider c as untracked + services.alertsClient.isTrackedAlert.mockImplementation((id: string) => id !== 'c'); + const { state: stateResult3 } = await executeWithFilter( + Comparator.GT, + [0.75], + JSON.stringify({ query: 'q' }), + 'test.metric.1', + stateResult2 + ); + expect(stateResult3.missingGroups).toEqual([{ key: 'b', bucketKey: { groupBy0: 'b' } }]); + expect(mockedEvaluateRule.mock.calls[2][8]).toEqual([ + { bucketKey: { groupBy0: 'b' }, key: 'b' }, + ]); + }); }); describe('querying with a groupBy parameter host.name and rule tags', () => { diff --git a/x-pack/plugins/observability_solution/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts b/x-pack/plugins/observability_solution/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts index a59e216748c33..090def7788313 100644 --- a/x-pack/plugins/observability_solution/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts +++ b/x-pack/plugins/observability_solution/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts @@ -224,7 +224,12 @@ export const createMetricThresholdExecutor = const groupByIsSame = isEqual(state.groupBy, params.groupBy); const previousMissingGroups = alertOnGroupDisappear && filterQueryIsSame && groupByIsSame && state.missingGroups - ? state.missingGroups + ? state.missingGroups.filter((missingGroup) => + // We use isTrackedAlert to remove missing groups that are untracked by the user + typeof missingGroup === 'string' + ? alertsClient.isTrackedAlert(missingGroup) + : alertsClient.isTrackedAlert(missingGroup.key) + ) : []; const alertResults = await evaluateRule( diff --git a/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts b/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts index a718f023525c8..aec0ad3b3adea 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts +++ b/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts @@ -92,5 +92,5 @@ export const FILTER_OUT_FIELDS_PREFIXES_FOR_CONTENT = [ 'service.', ]; -export const DEFAULT_ALLOWED_DATA_VIEWS = ['logs', 'auditbeat', 'filebeat', 'winbeat']; -export const DEFAULT_ALLOWED_LOGS_DATA_VIEWS = ['logs', 'auditbeat', 'filebeat', 'winbeat']; +export const DEFAULT_ALLOWED_DATA_VIEWS = ['logs', 'auditbeat', 'filebeat', 'winlogbeat']; +export const DEFAULT_ALLOWED_LOGS_DATA_VIEWS = ['logs', 'auditbeat', 'filebeat', 'winlogbeat']; diff --git a/x-pack/plugins/observability_solution/observability/common/index.ts b/x-pack/plugins/observability_solution/observability/common/index.ts index 6e29cf4009bc6..c8b65fe127d2a 100644 --- a/x-pack/plugins/observability_solution/observability/common/index.ts +++ b/x-pack/plugins/observability_solution/observability/common/index.ts @@ -53,6 +53,7 @@ export { profilingCostPervCPUPerHour, profilingAzureCostDiscountRate, apmEnableTransactionProfiling, + apmEnableServiceInventoryTableSearchBar, } from './ui_settings_keys'; export { diff --git a/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts b/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts index 74fd6cd09bac4..a95731ef8c67f 100644 --- a/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts +++ b/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts @@ -24,6 +24,8 @@ export const enableInfrastructureAssetCustomDashboards = export const enableAwsLambdaMetrics = 'observability:enableAwsLambdaMetrics'; export const enableAgentExplorerView = 'observability:apmAgentExplorerView'; export const apmEnableTableSearchBar = 'observability:apmEnableTableSearchBar'; +export const apmEnableServiceInventoryTableSearchBar = + 'observability:apmEnableServiceInventoryTableSearchBar'; export const apmAWSLambdaPriceFactor = 'observability:apmAWSLambdaPriceFactor'; export const apmAWSLambdaRequestCostPerMillion = 'observability:apmAWSLambdaRequestCostPerMillion'; export const enableCriticalPath = 'observability:apmEnableCriticalPath'; diff --git a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts index 61ae08864f308..7c9ced9e308ec 100644 --- a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts @@ -42,6 +42,7 @@ import { enableInfrastructureProfilingIntegration, apmEnableTransactionProfiling, enableInfrastructureAssetCustomDashboards, + apmEnableServiceInventoryTableSearchBar, } from '../common/ui_settings_keys'; const betaLabel = i18n.translate('xpack.observability.uiSettings.betaLabel', { @@ -314,7 +315,7 @@ export const uiSettings: Record = { }), description: i18n.translate('xpack.observability.apmEnableTableSearchBarDescription', { defaultMessage: - '{betaLabel} Enables faster searching in APM tables by adding a handy search bar with live filtering. Available for the following tables: Services, Transactions and Errors', + '{betaLabel} Enables faster searching in APM tables by adding a handy search bar with live filtering. Available for the following tables: Transactions and Errors', values: { betaLabel: `[${betaLabel}]`, }, @@ -324,6 +325,26 @@ export const uiSettings: Record = { requiresPageReload: true, type: 'boolean', }, + [apmEnableServiceInventoryTableSearchBar]: { + category: [observabilityFeatureId], + name: i18n.translate('xpack.observability.apmEnableServiceInventoryTableSearchBar', { + defaultMessage: 'Service Inventory instant table search', + }), + description: i18n.translate( + 'xpack.observability.apmEnableServiceInventoryTableSearchBarDescription', + { + defaultMessage: + '{technicalPreviewLabel} Enables faster searching in the APM Service inventory table by adding a handy search bar with live filtering.', + values: { + technicalPreviewLabel: `[${technicalPreviewLabel}]`, + }, + } + ), + schema: schema.boolean(), + value: false, + requiresPageReload: false, + type: 'boolean', + }, [apmAWSLambdaPriceFactor]: { category: [observabilityFeatureId], name: i18n.translate('xpack.observability.apmAWSLambdaPricePerGbSeconds', { diff --git a/x-pack/plugins/observability_solution/observability_shared/public/components/feature_feedback_button/feature_feedback_button.test.ts b/x-pack/plugins/observability_solution/observability_shared/public/components/feature_feedback_button/feature_feedback_button.test.ts new file mode 100644 index 0000000000000..890588a7f2928 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_shared/public/components/feature_feedback_button/feature_feedback_button.test.ts @@ -0,0 +1,108 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { type FormConfig, getSurveyFeedbackURL, NodeType } from './feature_feedback_button'; + +describe('getSurveyFeedbackURL', () => { + const formUrl = 'https://ela.st/foo'; + + it('should return the correct URL without any parameters', () => { + const expectedUrl = formUrl; + const actualUrl = getSurveyFeedbackURL({ formUrl }); + expect(actualUrl).toBe(`${expectedUrl}`); + }); + + it('should append kibana version parameter correctly', () => { + const kibanaVersion = '7.15.0'; + const expectedUrl = `${formUrl}?entry.548460210=${kibanaVersion}`; + const actualUrl = getSurveyFeedbackURL({ formUrl, kibanaVersion }); + expect(actualUrl).toBe(expectedUrl); + }); + + it('should append deployment type parameter correctly for cloud', () => { + const isCloudEnv = true; + const expectedUrl = `${formUrl}?entry.573002982=Elastic+Cloud+%28we+manage%29`; + const actualUrl = getSurveyFeedbackURL({ formUrl, isCloudEnv }); + expect(actualUrl).toBe(expectedUrl); + }); + + it('should append sanitized path parameter correctly', () => { + const sanitizedPath = '/path/to/something'; + const expectedUrl = `${formUrl}?entry.1876422621=%2Fpath%2Fto%2Fsomething`; + const actualUrl = getSurveyFeedbackURL({ formUrl, sanitizedPath }); + expect(actualUrl).toBe(expectedUrl); + }); + + it('should append ML job type parameter correctly for host', () => { + const nodeType: NodeType = 'host'; + const expectedUrl = `${formUrl}?entry.170406579=Host+Anomalies`; + const actualUrl = getSurveyFeedbackURL({ formUrl, nodeType }); + expect(actualUrl).toBe(expectedUrl); + }); + + it('should append ML job type parameter correctly for pod', () => { + const nodeType: NodeType = 'pod'; + const expectedUrl = `${formUrl}?entry.170406579=Pod+Anomalies`; + const actualUrl = getSurveyFeedbackURL({ formUrl, nodeType }); + expect(actualUrl).toBe(expectedUrl); + }); + + it('should use custom form configuration if provided', () => { + const customFormConfig: FormConfig = { + kibanaVersionQueryParam: 'v', + kibanaDeploymentTypeQueryParam: 'd', + sanitizedPathQueryParam: 's', + mlJobTypeParam: 'm', + }; + const kibanaVersion = '8.0.0'; + const expectedUrl = `${formUrl}?${customFormConfig.kibanaVersionQueryParam}=${kibanaVersion}`; + const actualUrl = getSurveyFeedbackURL({ + formUrl, + kibanaVersion, + formConfig: customFormConfig, + }); + expect(actualUrl).toBe(expectedUrl); + }); + + it('should ignore undefined parameters', () => { + const kibanaVersion = '8.0.0'; + const sanitizedPath = '/path/to/something'; + const isCloudEnv = true; + const expectedUrl = `${formUrl}?entry.548460210=8.0.0&entry.573002982=Elastic+Cloud+%28we+manage%29&entry.1876422621=%2Fpath%2Fto%2Fsomething`; + const actualUrl = getSurveyFeedbackURL({ formUrl, kibanaVersion, sanitizedPath, isCloudEnv }); + expect(actualUrl).toBe(expectedUrl); + }); + + it('should append deployment type parameter correctly for serverless', () => { + const kibanaVersion = '8.0.0'; + const sanitizedPath = '/path/to/something'; + const isServerlessEnv = true; + const expectedUrl = `${formUrl}?entry.548460210=8.0.0&entry.573002982=Serverless+%28fully-managed+projects%29&entry.1876422621=%2Fpath%2Fto%2Fsomething`; + const actualUrl = getSurveyFeedbackURL({ + formUrl, + kibanaVersion, + sanitizedPath, + isServerlessEnv, + }); + expect(actualUrl).toBe(expectedUrl); + }); + + it('should append deployment type parameter correctly for self-managed', () => { + const kibanaVersion = '8.0.0'; + const isServerlessEnv = false; + const isCloudEnv = false; + const sanitizedPath = '/path/to/something'; + const expectedUrl = `${formUrl}?entry.548460210=8.0.0&entry.573002982=Self-Managed+%28you+manage%29&entry.1876422621=%2Fpath%2Fto%2Fsomething`; + const actualUrl = getSurveyFeedbackURL({ + formUrl, + kibanaVersion, + sanitizedPath, + isServerlessEnv, + isCloudEnv, + }); + expect(actualUrl).toBe(expectedUrl); + }); +}); diff --git a/x-pack/plugins/observability_solution/observability_shared/public/components/feature_feedback_button/feature_feedback_button.tsx b/x-pack/plugins/observability_solution/observability_shared/public/components/feature_feedback_button/feature_feedback_button.tsx index 282dfbe35770c..2715fde529d11 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/components/feature_feedback_button/feature_feedback_button.tsx +++ b/x-pack/plugins/observability_solution/observability_shared/public/components/feature_feedback_button/feature_feedback_button.tsx @@ -14,7 +14,7 @@ const KIBANA_DEPLOYMENT_TYPE_PARAM = 'entry.573002982'; const SANITIZED_PATH_PARAM = 'entry.1876422621'; const ML_JOB_TYPE = 'entry.170406579'; -type NodeType = 'host' | 'pod'; +export type NodeType = 'host' | 'pod'; const getDeploymentType = (isCloudEnv?: boolean, isServerlessEnv?: boolean): string | undefined => { if (isServerlessEnv) { @@ -29,13 +29,14 @@ const getDeploymentType = (isCloudEnv?: boolean, isServerlessEnv?: boolean): str const getMLJobType = (mlJobType: NodeType) => mlJobType === 'pod' ? 'Pod Anomalies' : 'Host Anomalies'; -const getSurveyFeedbackURL = ({ +export const getSurveyFeedbackURL = ({ formUrl, formConfig, kibanaVersion, - deploymentType, sanitizedPath, - mlJobType, + isCloudEnv, + isServerlessEnv, + nodeType, }: { formUrl: string; formConfig?: FormConfig; @@ -43,7 +44,17 @@ const getSurveyFeedbackURL = ({ deploymentType?: string; sanitizedPath?: string; mlJobType?: string; + isCloudEnv?: boolean; + isServerlessEnv?: boolean; + nodeType?: NodeType; }) => { + const deploymentType = + isCloudEnv !== undefined || isServerlessEnv !== undefined + ? getDeploymentType(isCloudEnv, isServerlessEnv) + : undefined; + + const mlJobType = nodeType ? getMLJobType(nodeType) : undefined; + const url = new URL(formUrl); if (kibanaVersion) { url.searchParams.append( @@ -70,7 +81,7 @@ const getSurveyFeedbackURL = ({ return url.href; }; -interface FormConfig { +export interface FormConfig { kibanaVersionQueryParam?: string; kibanaDeploymentTypeQueryParam?: string; sanitizedPathQueryParam?: string; @@ -109,21 +120,16 @@ export const FeatureFeedbackButton = ({ /> ), }: FeatureFeedbackButtonProps) => { - const deploymentType = - isCloudEnv !== undefined || isServerlessEnv !== undefined - ? getDeploymentType(isCloudEnv, isServerlessEnv) - : undefined; - const mlJobType = nodeType ? getMLJobType(nodeType) : undefined; - return ( ['unsavedValue'] + ) { + if (settings) { + try { + setIsSaving(true); + await settings.client.set(id, change); + setForceReloadSettings((state) => ++state); + } finally { + setIsSaving(false); + } + } + } + return { fields, unsavedChanges, @@ -101,5 +116,6 @@ export function useEditableSettings(app: ObservabilityApp, settingsKeys: string[ saveAll, isSaving, cleanUnsavedChanges, + saveSingleSetting, }; } diff --git a/x-pack/plugins/observability_solution/observability_shared/public/index.ts b/x-pack/plugins/observability_solution/observability_shared/public/index.ts index 3dd3dd52055d2..b1d8f97425e3f 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/index.ts +++ b/x-pack/plugins/observability_solution/observability_shared/public/index.ts @@ -96,6 +96,9 @@ export { } from './components/profiling/embeddables'; export { ProfilingEmptyState } from './components/profiling/profiling_empty_state'; -export { FeatureFeedbackButton } from './components/feature_feedback_button/feature_feedback_button'; +export { + FeatureFeedbackButton, + getSurveyFeedbackURL, +} from './components/feature_feedback_button/feature_feedback_button'; export { BottomBarActions } from './components/bottom_bar_actions/bottom_bar_actions'; export { FieldValueSelection, FieldValueSuggestions } from './components'; diff --git a/x-pack/plugins/observability_solution/slo/dev_docs/slo.md b/x-pack/plugins/observability_solution/slo/dev_docs/slo.md index 135dd1a79f6c1..a12f8822fc9e9 100644 --- a/x-pack/plugins/observability_solution/slo/dev_docs/slo.md +++ b/x-pack/plugins/observability_solution/slo/dev_docs/slo.md @@ -36,7 +36,7 @@ Get help with the data forge tool: `node x-pack/scripts/data_forge.js --help` 2. Create SLOs > [!TIP] -> Using the API is possible, but to prevent this document of becoming out of date, we refer to the [openAPI](../docs/openapi/slo/bundled.yaml) specification instead. +> Using the API is possible, but to prevent this document of becoming out of date, we refer to the [openAPI](../docs/openapi/slo/bundled.yaml) specification instead. > Using the UI for developping/testing is the simpler approach. @@ -51,7 +51,7 @@ On this page, you'll be able to create SLOs. With the data generated from the above section, the easiest SLO you can setup would be: -> **Type**: Custom KQL +> **Type**: Custom Query > > **Index**: Admin Console > @@ -71,14 +71,14 @@ We currently support the following SLI: - APM Transaction Error Rate, known as APM Availability - APM Transaction Duration, known as APM Latency -- Custom KQL +- Custom Query - Custom Metric - Histogram Metric - Timeslice Metric For the APM SLIs, customer can provide the service, environment, transaction name and type to configure them. For the **APM Latency** SLI, a threshold in milliseconds needs to be provided to discriminate the good and bad responses (events). For the **APM Availability** SLI, we use the `event.outcome` as a way to discriminate the good and the bad responses(events). The API supports an optional kql filter to further filter the apm data. -The **Custom KQL** SLI requires an index pattern, an optional filter query, a numerator query, and denominator query. A custom `timestampField` can be provided to override the default @timestamp field. +The **Custom Query** SLI requires an index pattern, an optional filter query, a numerator query, and denominator query. A custom `timestampField` can be provided to override the default @timestamp field. The **Custom Metric** SLI requires an index pattern, an optional filter query, a set of metrics for the numerator, and a set of metrics for the denominator. A custom `timestampField` can be provided to override the default @timestamp field. @@ -347,7 +347,7 @@ curl --request POST \ -### Custom KQL +### Custom Query
98.5% of 'logs lantency < 300ms' for 'groupId: group-0' over the last 7 days @@ -481,4 +481,4 @@ curl --request POST \ } }' ``` -
+ \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.json b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.json index 04dd67b74b74d..ca30e6b29ae49 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.json +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.json @@ -1100,12 +1100,12 @@ ] }, "indicator_properties_custom_kql": { - "title": "Custom KQL", + "title": "Custom Query", "required": [ "type", "params" ], - "description": "Defines properties for a custom KQL indicator type", + "description": "Defines properties for a custom query indicator type", "type": "object", "properties": { "params": { @@ -2472,4 +2472,4 @@ } } } -} \ No newline at end of file +} diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.yaml b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.yaml index 18c4245a4ebd5..dc9e74407726f 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.yaml +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.yaml @@ -687,11 +687,11 @@ components: items: $ref: '#/components/schemas/filter' indicator_properties_custom_kql: - title: Custom KQL + title: Custom Query required: - type - params - description: Defines properties for a custom KQL indicator type + description: Defines properties for a custom query indicator type type: object properties: params: diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/indicator_properties_custom_kql.yaml b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/indicator_properties_custom_kql.yaml index 1f43a90c62033..429847630a7d2 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/indicator_properties_custom_kql.yaml +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/indicator_properties_custom_kql.yaml @@ -1,8 +1,8 @@ -title: Custom KQL +title: Custom Query required: - type - params -description: Defines properties for a custom KQL indicator type +description: Defines properties for a custom query indicator type type: object properties: params: diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_active_alerts_badge.tsx b/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_active_alerts_badge.tsx index 75a08174ac60b..3c01e57faa398 100644 --- a/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_active_alerts_badge.tsx +++ b/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_active_alerts_badge.tsx @@ -5,9 +5,9 @@ * 2.0. */ -import { EuiBadge, EuiFlexItem } from '@elastic/eui'; +import { EuiBadge, EuiFlexItem, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React from 'react'; +import React, { MouseEvent } from 'react'; import { SLOWithSummaryResponse } from '@kbn/slo-schema'; import { observabilityPaths } from '@kbn/observability-plugin/common'; import { useKibana } from '../../../utils/kibana_react'; @@ -43,22 +43,36 @@ export function SloActiveAlertsBadge({ slo, activeAlerts, viewMode = 'default' } return ( - - {viewMode !== 'default' - ? activeAlerts - : i18n.translate('xpack.slo.slo.activeAlertsBadge.label', { - defaultMessage: '{count, plural, one {# alert} other {# alerts}}', - values: { count: activeAlerts }, - })} - + ) => { + e.stopPropagation(); // stops propagation of metric onElementClick + }} + css={{ cursor: 'pointer' }} + > + {viewMode !== 'default' + ? activeAlerts + : i18n.translate('xpack.slo.slo.activeAlertsBadge.label', { + defaultMessage: '{count, plural, one {# alert} other {# alerts}}', + values: { count: activeAlerts }, + })} + + ); } diff --git a/x-pack/plugins/observability_solution/slo/public/hooks/use_fetch_rules_for_slo.ts b/x-pack/plugins/observability_solution/slo/public/hooks/use_fetch_rules_for_slo.ts index 80c3b315bfa48..51a8337e4dd82 100644 --- a/x-pack/plugins/observability_solution/slo/public/hooks/use_fetch_rules_for_slo.ts +++ b/x-pack/plugins/observability_solution/slo/public/hooks/use_fetch_rules_for_slo.ts @@ -5,42 +5,33 @@ * 2.0. */ -import type { Rule } from '@kbn/triggers-actions-ui-plugin/public'; +import type { Rule, AsApiContract } from '@kbn/triggers-actions-ui-plugin/public'; +import { transformRule } from '@kbn/triggers-actions-ui-plugin/public'; import { useQuery } from '@tanstack/react-query'; import { BurnRateRuleParams } from '../typings'; import { useKibana } from '../utils/kibana_react'; import { sloKeys } from './query_key_factory'; -type SloId = string; - interface Params { - sloIds?: SloId[]; + sloIds?: string[]; } interface RuleApiResponse { page: number; total: number; per_page: number; - data: Array>; -} - -export interface UseFetchRulesForSloResponse { - isLoading: boolean; - isSuccess: boolean; - isError: boolean; - data: Record>> | undefined; + data: Array>>; } -export function useFetchRulesForSlo({ sloIds = [] }: Params): UseFetchRulesForSloResponse { +export function useFetchRulesForSlo({ sloIds = [] }: Params) { const { http } = useKibana().services; - const { isLoading, isError, isSuccess, data } = useQuery({ + const { isLoading, isError, isSuccess, data, refetch } = useQuery({ queryKey: sloKeys.rule(sloIds), queryFn: async () => { try { const body = JSON.stringify({ filter: sloIds.map((sloId) => `alert.attributes.params.sloId:${sloId}`).join(' or '), - fields: ['params', 'name'], per_page: 1000, }); @@ -48,9 +39,13 @@ export function useFetchRulesForSlo({ sloIds = [] }: Params): UseFetchRulesForSl body, }); + const rules = response.data.map((rule) => transformRule(rule)) as Array< + Rule + >; + const init = sloIds.reduce((acc, sloId) => ({ ...acc, [sloId]: [] }), {}); - return response.data.reduce( + return rules.reduce( (acc, rule) => ({ ...acc, [rule.params.sloId]: acc[rule.params.sloId].concat(rule), @@ -66,10 +61,13 @@ export function useFetchRulesForSlo({ sloIds = [] }: Params): UseFetchRulesForSl keepPreviousData: true, }); + const refetchRules = refetch as () => void; + return { data, isLoading, isSuccess, isError, + refetchRules, }; } diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_control.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_control.tsx index 5e0652e85cdff..a84e1082050a9 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_control.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_control.tsx @@ -14,6 +14,8 @@ import type { RulesParams } from '@kbn/observability-plugin/public'; import { rulesLocatorID } from '@kbn/observability-plugin/common'; import { SLO_BURN_RATE_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { sloFeatureId } from '@kbn/observability-plugin/common'; +import { EditBurnRateRuleFlyout } from '../../slos/components/common/edit_burn_rate_rule_flyout'; +import { useFetchRulesForSlo } from '../../../hooks/use_fetch_rules_for_slo'; import { useKibana } from '../../../utils/kibana_react'; import { paths } from '../../../../common/locators/paths'; import { SloDeleteConfirmationModal } from '../../../components/slo/delete_confirmation_modal/slo_delete_confirmation_modal'; @@ -24,7 +26,7 @@ import { convertSliApmParamsToApmAppDeeplinkUrl } from '../../../utils/slo/conve import { isApmIndicatorType } from '../../../utils/slo/indicator'; export interface Props { - slo: SLOWithSummaryResponse | undefined; + slo?: SLOWithSummaryResponse; isLoading: boolean; } @@ -42,10 +44,18 @@ export function HeaderControl({ isLoading, slo }: Props) { const [isPopoverOpen, setIsPopoverOpen] = useState(false); const [isRuleFlyoutVisible, setRuleFlyoutVisibility] = useState(false); + const [isEditRuleFlyoutOpen, setIsEditRuleFlyoutOpen] = useState(false); + const [isDeleteConfirmationModalOpen, setDeleteConfirmationModalOpen] = useState(false); const { mutate: deleteSlo } = useDeleteSlo(); + const { data: rulesBySlo, refetchRules } = useFetchRulesForSlo({ + sloIds: slo ? [slo.id] : undefined, + }); + + const rules = slo ? rulesBySlo?.[slo?.id] ?? [] : []; + const handleActionsClick = () => setIsPopoverOpen((value) => !value); const closePopover = () => setIsPopoverOpen(false); @@ -65,10 +75,15 @@ export function HeaderControl({ isLoading, slo }: Props) { }; const handleNavigateToRules = async () => { - const locator = locators.get(rulesLocatorID); + if (rules.length === 1) { + setIsEditRuleFlyoutOpen(true); + setIsPopoverOpen(false); + } else { + const locator = locators.get(rulesLocatorID); - if (slo?.id && locator) { - locator.navigate({ params: { sloId: slo.id } }, { replace: false }); + if (slo?.id && locator) { + locator.navigate({ params: { sloId: slo.id } }, { replace: false }); + } } }; @@ -168,7 +183,8 @@ export function HeaderControl({ isLoading, slo }: Props) { data-test-subj="sloDetailsHeaderControlPopoverManageRules" > {i18n.translate('xpack.slo.sloDetails.headerControl.manageRules', { - defaultMessage: 'Manage rules', + defaultMessage: 'Manage burn rate {count, plural, one {rule} other {rules}}', + values: { count: rules.length }, })} , ] @@ -215,6 +231,12 @@ export function HeaderControl({ isLoading, slo }: Props) { )} /> + {slo && isRuleFlyoutVisible ? ( { }); }); - describe('when an Custom KQL SLO is loaded', () => { + describe('when an Custom Query SLO is loaded', () => { it("does not render a 'Explore in APM' button under actions menu", async () => { const slo = buildSlo(); jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/helpers/__snapshots__/process_slo_form_values.test.ts.snap b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/helpers/__snapshots__/process_slo_form_values.test.ts.snap index 480fd4d86fa2d..4ff4e452a3475 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/helpers/__snapshots__/process_slo_form_values.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/helpers/__snapshots__/process_slo_form_values.test.ts.snap @@ -257,7 +257,7 @@ Object { } `; -exports[`Transform partial URL state into form state with 'indicator' in URL state handles partial Custom KQL state 1`] = ` +exports[`Transform partial URL state into form state with 'indicator' in URL state handles partial Custom Query state 1`] = ` Object { "budgetingMethod": "occurrences", "description": "", diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/helpers/process_slo_form_values.test.ts b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/helpers/process_slo_form_values.test.ts index f146257118418..a69cd1152985c 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/helpers/process_slo_form_values.test.ts +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/helpers/process_slo_form_values.test.ts @@ -39,7 +39,7 @@ describe('Transform partial URL state into form state', () => { ).toMatchSnapshot(); }); - it('handles partial Custom KQL state', () => { + it('handles partial Custom Query state', () => { expect( transform({ indicator: { diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_rules_badge.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_rules_badge.tsx index 0f20ee3ef0b3a..9a275aad343c5 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_rules_badge.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_rules_badge.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { MouseEvent } from 'react'; import { EuiBadge, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; @@ -22,12 +22,19 @@ export function SloRulesBadge({ rules, onClick }: Props) { position="top" content={i18n.translate('xpack.slo.slo.rulesBadge.popover', { defaultMessage: - 'There are no rules configured for this SLO yet. You will not receive alerts when SLO is breached.', + 'There are no rules configured for this SLO yet. You will not receive alerts when SLO is breached. Click to create a rule.', })} display="block" > - + ) => { + e.stopPropagation(); // stops propagation of metric onElementClick + }} + /> ); diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item.tsx index 802faafc014ce..5f24aed1d8ca6 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item.tsx @@ -24,6 +24,7 @@ import { import { ALL_VALUE, HistoricalSummaryResponse, SLOWithSummaryResponse } from '@kbn/slo-schema'; import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; import React, { useState } from 'react'; +import { EditBurnRateRuleFlyout } from '../common/edit_burn_rate_rule_flyout'; import { SloDeleteConfirmationModal } from '../../../../components/slo/delete_confirmation_modal/slo_delete_confirmation_modal'; import { BurnRateRuleParams } from '../../../../typings'; import { useKibana } from '../../../../utils/kibana_react'; @@ -43,7 +44,7 @@ export interface Props { activeAlerts?: number; loading: boolean; error: boolean; - cardsPerRow: number; + refetchRules: () => void; } export const useSloCardColor = (status?: SLOWithSummaryResponse['summary']['status']) => { @@ -67,12 +68,13 @@ const getFirstGroupBy = (slo: SLOWithSummaryResponse) => { return slo.groupBy && ![slo.groupBy].flat().includes(ALL_VALUE) ? firstGroupBy : ''; }; -export function SloCardItem({ slo, rules, activeAlerts, historicalSummary, cardsPerRow }: Props) { +export function SloCardItem({ slo, rules, activeAlerts, historicalSummary, refetchRules }: Props) { const containerRef = React.useRef(null); const [isMouseOver, setIsMouseOver] = useState(false); const [isActionsPopoverOpen, setIsActionsPopoverOpen] = useState(false); const [isAddRuleFlyoutOpen, setIsAddRuleFlyoutOpen] = useState(false); + const [isEditRuleFlyoutOpen, setIsEditRuleFlyoutOpen] = useState(false); const [isDeleteConfirmationModalOpen, setDeleteConfirmationModalOpen] = useState(false); const [isDashboardAttachmentReady, setDashboardAttachmentReady] = useState(false); const historicalSliData = formatHistoricalData(historicalSummary, 'sli_value'); @@ -124,10 +126,12 @@ export function SloCardItem({ slo, rules, activeAlerts, historicalSummary, cards {(isMouseOver || isActionsPopoverOpen) && ( )} @@ -139,6 +143,13 @@ export function SloCardItem({ slo, rules, activeAlerts, historicalSummary, cards setIsAddRuleFlyoutOpen={setIsAddRuleFlyoutOpen} /> + + {isDeleteConfirmationModalOpen ? ( void; setDeleteConfirmationModalOpen: (value: boolean) => void; setIsAddRuleFlyoutOpen: (value: boolean) => void; + setIsEditRuleFlyoutOpen: (value: boolean) => void; setDashboardAttachmentReady: (value: boolean) => void; + rules?: Array>; } export function SloCardItemActions(props: Props) { diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_badges.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_badges.tsx index 078a706dcb52a..39eb9f4e0ce18 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_badges.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/card_view/slo_card_item_badges.tsx @@ -56,8 +56,8 @@ export function SloCardItemBadges({ slo, activeAlerts, rules, handleCreateRule } <> - + [slo.id, slo.instanceId ?? ALL_VALUE] as [string, string] ); const { data: activeAlertsBySlo } = useFetchActiveAlerts({ sloIdsAndInstanceIds }); - const { data: rulesBySlo } = useFetchRulesForSlo({ + const { data: rulesBySlo, refetchRules } = useFetchRulesForSlo({ sloIds: sloIdsAndInstanceIds.map((item) => item[0]), }); const { isLoading: historicalSummaryLoading, data: historicalSummaries = [] } = @@ -82,7 +82,7 @@ export function SloListCardView({ sloList, loading, error }: Props) { )?.data } historicalSummaryLoading={historicalSummaryLoading} - cardsPerRow={Number(columns)} + refetchRules={refetchRules} /> ))} diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/edit_burn_rate_rule_flyout.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/edit_burn_rate_rule_flyout.tsx new file mode 100644 index 0000000000000..1a8577e4a83fe --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/edit_burn_rate_rule_flyout.tsx @@ -0,0 +1,40 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; +import { useKibana } from '../../../../utils/kibana_react'; +import { BurnRateRuleParams } from '../../../../typings'; + +export function EditBurnRateRuleFlyout({ + refetchRules, + rule, + isEditRuleFlyoutOpen, + setIsEditRuleFlyoutOpen, +}: { + rule?: Rule; + isEditRuleFlyoutOpen: boolean; + setIsEditRuleFlyoutOpen: (value: boolean) => void; + refetchRules: () => void; +}) { + const { + triggersActionsUi: { getEditRuleFlyout: EditRuleFlyout }, + } = useKibana().services; + + const handleSavedRule = async () => { + refetchRules(); + setIsEditRuleFlyoutOpen(false); + }; + + const handleCloseRuleFlyout = async () => { + setIsEditRuleFlyoutOpen(false); + }; + + return isEditRuleFlyoutOpen && rule ? ( + + ) : null; +} diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_item_actions.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_item_actions.tsx index 26f4ba28546c2..97b55852d180c 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_item_actions.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_item_actions.tsx @@ -19,6 +19,8 @@ import { ALL_VALUE, SLOWithSummaryResponse } from '@kbn/slo-schema'; import styled from 'styled-components'; import { RulesParams } from '@kbn/observability-plugin/public'; import { rulesLocatorID } from '@kbn/observability-plugin/common'; +import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; +import { BurnRateRuleParams } from '../../../typings'; import { useKibana } from '../../../utils/kibana_react'; import { useCloneSlo } from '../../../hooks/use_clone_slo'; import { useCapabilities } from '../../../hooks/use_capabilities'; @@ -30,8 +32,10 @@ interface Props { setIsActionsPopoverOpen: (value: boolean) => void; setDeleteConfirmationModalOpen: (value: boolean) => void; setIsAddRuleFlyoutOpen: (value: boolean) => void; + setIsEditRuleFlyoutOpen: (value: boolean) => void; setDashboardAttachmentReady?: (value: boolean) => void; btnProps?: Partial; + rules?: Array>; } const CustomShadowPanel = styled(EuiPanel)<{ shadow: string }>` ${(props) => props.shadow} @@ -56,9 +60,11 @@ function IconPanel({ children, hasPanel }: { children: JSX.Element; hasPanel: bo export function SloItemActions({ slo, + rules, isActionsPopoverOpen, setIsActionsPopoverOpen, setIsAddRuleFlyoutOpen, + setIsEditRuleFlyoutOpen, setDeleteConfirmationModalOpen, setDashboardAttachmentReady, btnProps, @@ -98,8 +104,14 @@ export function SloItemActions({ }; const handleNavigateToRules = async () => { - const locator = locators.get(rulesLocatorID); - locator?.navigate({ params: { sloId: slo.id } }, { replace: false }); + if (rules?.length === 1) { + // if there is only one rule we can edit inline in flyout + setIsEditRuleFlyoutOpen(true); + setIsActionsPopoverOpen(false); + } else { + const locator = locators.get(rulesLocatorID); + locator?.navigate({ params: { sloId: slo.id } }, { replace: false }); + } }; const handleDelete = () => { @@ -185,8 +197,9 @@ export function SloItemActions({ onClick={handleNavigateToRules} data-test-subj="sloActionsManageRules" > - {i18n.translate('xpack.slo.item.actions.manageRules', { - defaultMessage: 'Manage rules', + {i18n.translate('xpack.slo.item.actions.manageBurnRateRules', { + defaultMessage: 'Manage burn rate {count, plural, one {rule} other {rules}}', + values: { count: rules?.length ?? 0 }, })} , > | undefined; + rules?: Array>; historicalSummary?: HistoricalSummaryResponse[]; historicalSummaryLoading: boolean; activeAlerts?: number; + refetchRules: () => void; } export function SloListItem({ slo, rules, + refetchRules, historicalSummary = [], historicalSummaryLoading, activeAlerts, }: SloListItemProps) { const [isActionsPopoverOpen, setIsActionsPopoverOpen] = useState(false); const [isAddRuleFlyoutOpen, setIsAddRuleFlyoutOpen] = useState(false); + const [isEditRuleFlyoutOpen, setIsEditRuleFlyoutOpen] = useState(false); const [isDeleteConfirmationModalOpen, setDeleteConfirmationModalOpen] = useState(false); const { sloDetailsUrl } = useSloFormattedSummary(slo); @@ -95,8 +99,10 @@ export function SloListItem({ @@ -108,6 +114,13 @@ export function SloListItem({ setIsAddRuleFlyoutOpen={setIsAddRuleFlyoutOpen} /> + + {isDeleteConfirmationModalOpen ? ( [slo.id, slo.instanceId ?? ALL_VALUE] as [string, string] ); const { data: activeAlertsBySlo } = useFetchActiveAlerts({ sloIdsAndInstanceIds }); - const { data: rulesBySlo } = useFetchRulesForSlo({ + const { data: rulesBySlo, refetchRules } = useFetchRulesForSlo({ sloIds: sloIdsAndInstanceIds.map((item) => item[0]), }); const { isLoading: historicalSummaryLoading, data: historicalSummaries = [] } = @@ -58,6 +58,7 @@ export function SloListView({ sloList, loading, error }: Props) { } historicalSummaryLoading={historicalSummaryLoading} slo={slo} + refetchRules={refetchRules} /> ))} diff --git a/x-pack/plugins/observability_solution/slo/public/utils/slo/labels.ts b/x-pack/plugins/observability_solution/slo/public/utils/slo/labels.ts index 5f41cec14a162..48a90abb90754 100644 --- a/x-pack/plugins/observability_solution/slo/public/utils/slo/labels.ts +++ b/x-pack/plugins/observability_solution/slo/public/utils/slo/labels.ts @@ -11,7 +11,7 @@ import { assertNever } from '@kbn/std'; import { toDuration } from './duration'; export const INDICATOR_CUSTOM_KQL = i18n.translate('xpack.slo.indicators.customKql', { - defaultMessage: 'Custom KQL', + defaultMessage: 'Custom Query', }); export const INDICATOR_CUSTOM_METRIC = i18n.translate('xpack.slo.indicators.customMetric', { diff --git a/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap b/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap index bb41711d8745a..0556a61dbf47b 100644 --- a/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap +++ b/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PromptPage renders as expected with additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; +exports[`PromptPage renders as expected with additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; -exports[`PromptPage renders as expected without additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; +exports[`PromptPage renders as expected without additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; diff --git a/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap b/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap index 89f47f333dbbe..05bd2204205e1 100644 --- a/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap +++ b/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`UnauthenticatedPage renders as expected 1`] = `"ElasticMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; +exports[`UnauthenticatedPage renders as expected 1`] = `"ElasticMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; -exports[`UnauthenticatedPage renders as expected with custom title 1`] = `"My Company NameMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; +exports[`UnauthenticatedPage renders as expected with custom title 1`] = `"My Company NameMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; diff --git a/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap b/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap index e7b46c6638513..7afca3ccb668c 100644 --- a/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap +++ b/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`ResetSessionPage renders as expected 1`] = `"ElasticMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; +exports[`ResetSessionPage renders as expected 1`] = `"ElasticMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; -exports[`ResetSessionPage renders as expected with custom page title 1`] = `"My Company NameMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; +exports[`ResetSessionPage renders as expected with custom page title 1`] = `"My Company NameMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index bdd2db598f938..a09d49723d75a 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -83,7 +83,7 @@ export const allowedExperimentalValues = Object.freeze({ * * Release: v8.13.0 */ - responseActionsSentinelOneV1Enabled: false, + responseActionsSentinelOneV1Enabled: true, /** * Enables use of SentinelOne response actions that complete asynchronously as well as support diff --git a/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/video.test.tsx b/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/video.test.tsx index ff891e1f1dd70..d8092c41781a6 100644 --- a/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/video.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/video.test.tsx @@ -17,6 +17,7 @@ jest.mock('../../context/step_context'); jest.mock('./content_wrapper'); jest.mock('@elastic/eui', () => ({ + ...jest.requireActual('@elastic/eui'), EuiFlexGroup: ({ children, onClick }: EuiFlexGroupProps) => { return ( // eslint-disable-next-line jsx-a11y/click-events-have-key-events diff --git a/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/video.tsx b/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/video.tsx index 23806c44ba0b6..c29f91b367e13 100644 --- a/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/video.tsx +++ b/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/video.tsx @@ -14,6 +14,8 @@ import { WATCH_VIDEO_BUTTON_TITLE } from '../../translations'; import { OverviewSteps, QuickStartSectionCardsId, SectionId } from '../../types'; import { ContentWrapper } from './content_wrapper'; +const VIDEO_CONTENT_HEIGHT = 320; + const VideoComponent: React.FC = () => { const { toggleTaskCompleteStatus, finishedSteps } = useStepContext(); const ref = React.useRef(null); @@ -37,7 +39,11 @@ const VideoComponent: React.FC = () => { return ( - <> +
{!isVideoPlaying && !isFinishedStep && ( { title={WATCH_VIDEO_BUTTON_TITLE} /> )} - +
); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.styles.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.styles.ts index 30439722cd18b..3e0aa03c0fd16 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.styles.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.styles.ts @@ -9,37 +9,29 @@ import { useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/css'; import { useMemo } from 'react'; -export const useFiltersStyles = () => { - return useMemo( - () => ({ - flexGroup: css` - max-width: 600px; - `, - }), - [] - ); +export const filtersStyles = { + flexGroup: css` + max-width: 600px; + `, }; -export const useQueryStyles = () => { - return useMemo( - () => ({ - content: css` - white-space: pre-wrap; - `, - }), - [] - ); +export const queryStyles = { + content: css` + white-space: pre-wrap; + `, }; export const useRequiredFieldsStyles = () => { const { euiTheme } = useEuiTheme(); + const { font } = euiTheme; + return useMemo( () => ({ - fieldTypeText: css({ - fontFamily: euiTheme.font.familyCode, - display: 'inline', - }), + fieldNameText: css` + font-family: ${font.familyCode ?? font.family}; + display: inline; + `, }), - [euiTheme.font.familyCode] + [font.familyCode, font.family] ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx index 56781726317fa..74edfd8a653d8 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx @@ -55,8 +55,8 @@ import { DEFAULT_DESCRIPTION_LIST_COLUMN_WIDTHS } from './constants'; import * as i18n from './translations'; import { useAlertSuppression } from '../../logic/use_alert_suppression'; import { - useFiltersStyles, - useQueryStyles, + filtersStyles, + queryStyles, useRequiredFieldsStyles, } from './rule_definition_section.styles'; @@ -86,7 +86,7 @@ const Filters = ({ filters, dataViewId, index, 'data-test-subj': dataTestSubj }: dataViewId, }); - const styles = useFiltersStyles(); + const styles = filtersStyles; return ( { - const styles = useQueryStyles(); + const styles = queryStyles; return (
{query} @@ -270,7 +270,7 @@ const RequiredFields = ({ requiredFields }: RequiredFieldsProps) => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.test.tsx index 0130dd3ca0afd..0b1ec1ce19c6e 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.test.tsx @@ -13,111 +13,128 @@ import { ALERT_DESCRIPTION_TITLE_TEST_ID, EVENT_KIND_DESCRIPTION_TEST_ID, EVENT_CATEGORY_DESCRIPTION_TEST_ID, + REASON_TITLE_TEST_ID, + MITRE_ATTACK_TITLE_TEST_ID, } from './test_ids'; import { TestProviders } from '../../../../common/mock'; import { AboutSection } from './about_section'; import { RightPanelContext } from '../context'; import { mockContextValue } from '../mocks/mock_context'; +import { useExpandSection } from '../hooks/use_expand_section'; jest.mock('../../../../common/components/link_to'); +jest.mock('../hooks/use_expand_section'); -const renderAboutSection = (expanded: boolean = false) => { - const mockGetFieldsData = (field: string) => { - switch (field) { - case 'event.kind': - return 'signal'; - } +const mockGetFieldsData: (field: string) => string = (field: string) => { + switch (field) { + case 'event.kind': + return 'signal'; + default: + return ''; + } +}; + +const renderAboutSection = (getFieldsData = mockGetFieldsData) => { + const contextValue = { + ...mockContextValue, + getFieldsData, }; return render( - - + + ); }; describe('', () => { - it('should render the component collapsed', async () => { + it('should render about component', async () => { const { getByTestId } = renderAboutSection(); await act(async () => { expect(getByTestId(ABOUT_SECTION_HEADER_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(ABOUT_SECTION_HEADER_TEST_ID)).toHaveTextContent('About'); + expect(getByTestId(ABOUT_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); }); }); - it('should render the component expanded', async () => { - const { getByTestId } = renderAboutSection(true); + it('should render the component collapsed if value is false in local storage', async () => { + (useExpandSection as jest.Mock).mockReturnValue(false); + + const { getByTestId } = renderAboutSection(); await act(async () => { - expect(getByTestId(ABOUT_SECTION_HEADER_TEST_ID)).toBeInTheDocument(); - expect(getByTestId(ABOUT_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(ABOUT_SECTION_CONTENT_TEST_ID)).not.toBeVisible(); }); }); - it('should expand the component when clicking on the arrow on header', async () => { + it('should render the component expanded if value is true in local storage', async () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + const { getByTestId } = renderAboutSection(); await act(async () => { - getByTestId(ABOUT_SECTION_HEADER_TEST_ID).click(); - expect(getByTestId(ABOUT_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(ABOUT_SECTION_CONTENT_TEST_ID)).toBeVisible(); }); }); it('should render about section for signal document', async () => { - const { getByTestId } = renderAboutSection(true); + (useExpandSection as jest.Mock).mockReturnValue(true); + + const { getByTestId } = renderAboutSection(); await act(async () => { expect(getByTestId(ALERT_DESCRIPTION_TITLE_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(REASON_TITLE_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(MITRE_ATTACK_TITLE_TEST_ID)).toBeInTheDocument(); }); }); it('should render event kind description if event.kind is not event', async () => { - const mockGetFieldsData = (field: string) => { + (useExpandSection as jest.Mock).mockReturnValue(true); + const _mockGetFieldsData = (field: string) => { switch (field) { case 'event.kind': return 'alert'; case 'event.category': return 'behavior'; + default: + return ''; } }; - const { getByTestId, queryByTestId } = render( - - - - - - ); + + const { getByTestId, queryByTestId } = renderAboutSection(_mockGetFieldsData); await act(async () => { expect(queryByTestId(ALERT_DESCRIPTION_TITLE_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(REASON_TITLE_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(MITRE_ATTACK_TITLE_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(EVENT_KIND_DESCRIPTION_TEST_ID)).toBeInTheDocument(); + + expect( + queryByTestId(`${EVENT_CATEGORY_DESCRIPTION_TEST_ID}-behavior`) + ).not.toBeInTheDocument(); }); }); it('should render event category description if event.kind is event', async () => { - const mockGetFieldsData = (field: string) => { + (useExpandSection as jest.Mock).mockReturnValue(true); + const _mockGetFieldsData = (field: string) => { switch (field) { case 'event.kind': return 'event'; case 'event.category': return 'behavior'; + default: + return ''; } }; - const { getByTestId, queryByTestId } = render( - - - - - - ); + + const { getByTestId, queryByTestId } = renderAboutSection(_mockGetFieldsData); await act(async () => { expect(queryByTestId(ALERT_DESCRIPTION_TITLE_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(REASON_TITLE_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(MITRE_ATTACK_TITLE_TEST_ID)).not.toBeInTheDocument(); + + expect(queryByTestId(EVENT_KIND_DESCRIPTION_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(`${EVENT_CATEGORY_DESCRIPTION_TEST_ID}-behavior`)).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.tsx index a91b04272c874..d7425501c6c89 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/about_section.tsx @@ -5,9 +5,10 @@ * 2.0. */ -import type { VFC } from 'react'; -import React from 'react'; +import type { FC } from 'react'; +import React, { memo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { useExpandSection } from '../hooks/use_expand_section'; import { ExpandableSection } from './expandable_section'; import { ABOUT_SECTION_TEST_ID } from './test_ids'; import { AlertDescription } from './alert_description'; @@ -19,14 +20,8 @@ import { useRightPanelContext } from '../context'; import { isEcsAllowedValue } from '../utils/event_utils'; import { EventCategoryDescription } from './event_category_description'; import { EventKindDescription } from './event_kind_description'; -import { EventRenderer } from './event_renderer'; -export interface AboutSectionProps { - /** - * Boolean to allow the component to be expanded or collapsed on first render - */ - expanded?: boolean; -} +const KEY = 'about'; /** * Most top section of the overview tab. @@ -34,30 +29,32 @@ export interface AboutSectionProps { * For generic events (event.kind is event), it shows the event category description and event renderer. * For all other events, it shows the event kind description, a list of event categories and event renderer. */ -export const AboutSection: VFC = ({ expanded = true }) => { +export const AboutSection: FC = memo(() => { const { getFieldsData } = useRightPanelContext(); const eventKind = getField(getFieldsData('event.kind')); const eventKindInECS = eventKind && isEcsAllowedValue('event.kind', eventKind); - if (eventKind === EventKind.signal) { - return ( - - } - data-test-subj={ABOUT_SECTION_TEST_ID} - gutterSize="s" - > + const expanded = useExpandSection({ title: KEY, defaultValue: true }); + + const content = + eventKind === EventKind.signal ? ( + <> - + + ) : ( + <> + {eventKindInECS && + (eventKind === 'event' ? ( + // if event kind is event, show a detailed description based on event category + + ) : ( + // if event kind is not event, show a higher level description on event kind + + ))} + ); - } return ( = ({ expanded = true }) => { defaultMessage="About" /> } - data-test-subj={ABOUT_SECTION_TEST_ID} + localStorageKey={KEY} gutterSize="s" + data-test-subj={ABOUT_SECTION_TEST_ID} > - {eventKindInECS && - (eventKind === 'event' ? ( - // if event kind is event, show a detailed description based on event category - - ) : ( - // if event kind is not event, show a higher level description on event kind - - ))} - + {content} ); -}; +}); AboutSection.displayName = 'AboutSection'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/expandable_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/expandable_section.test.tsx index 687fa89756c06..d8d04578d3457 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/expandable_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/expandable_section.test.tsx @@ -23,17 +23,24 @@ const renderExpandableSection = (expanded: boolean) => ); describe('', () => { - it('should render the component collapsed', () => { + it('should render ExpandableSection component', () => { const { getByTestId } = renderExpandableSection(false); expect(getByTestId(headerTestId)).toBeInTheDocument(); + expect(getByTestId(headerTestId)).toHaveTextContent('title'); + expect(getByTestId(contentTestId)).toBeInTheDocument(); + }); + + it('should render the component collapsed', () => { + const { getByTestId } = renderExpandableSection(false); + + expect(getByTestId(contentTestId)).not.toBeVisible(); }); it('should render the component expanded', () => { const { getByTestId } = renderExpandableSection(true); - expect(getByTestId(headerTestId)).toBeInTheDocument(); - expect(getByTestId(contentTestId)).toBeInTheDocument(); + expect(getByTestId(contentTestId)).toBeVisible(); }); it('should expand the component when clicking on the arrow on header', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/expandable_section.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/expandable_section.tsx index e7e2c846367c5..99faf10c04604 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/expandable_section.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/expandable_section.tsx @@ -14,7 +14,7 @@ import { useAccordionState } from '../hooks/use_accordion_state'; export const HEADER_TEST_ID = 'Header'; export const CONTENT_TEST_ID = 'Content'; -export interface DescriptionSectionProps { +export interface ExpandableSectionProps { /** * Boolean to allow the component to be expanded or collapsed on first render */ @@ -31,6 +31,10 @@ export interface DescriptionSectionProps { * React component to render in the expandable section of the accordion */ children: React.ReactNode; + /** + * Optional string, if provided it will be used as the key to store the expanded/collapsed state boolean in local storage + */ + localStorageKey?: string; /** * Prefix data-test-subj to use for the header and expandable section of the accordion */ @@ -38,22 +42,20 @@ export interface DescriptionSectionProps { } /** - * Component used to render multiple sections in the Overview tab - * - About - * - Investigation - * - Visualizations - * - Insights + * Component used to render multiple sections in the Overview tab. + * The state (expanded vs collapsed) can be saved in local storage if the localStorageKey is provided. + * This allows the state to be preserved when opening new flyouts or when refreshing the page. */ -export const ExpandableSection: VFC = ({ +export const ExpandableSection: VFC = ({ expanded, title, children, gutterSize = 'none', + localStorageKey, 'data-test-subj': dataTestSub, }) => { const accordionId = useGeneratedHtmlId({ prefix: 'accordion' }); - - const { renderContent, toggle, state } = useAccordionState(expanded); + const { renderContent, state, toggle } = useAccordionState(expanded); const headerDataTestSub = dataTestSub + HEADER_TEST_ID; const contentDataTestSub = dataTestSub + CONTENT_TEST_ID; @@ -65,7 +67,12 @@ export const ExpandableSection: VFC = ({ ); return ( - + toggle(localStorageKey)} + id={accordionId} + buttonContent={header} + > {renderContent && children} diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx index 25aa9a5ddc699..a0ac01cbb4ce3 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx @@ -12,6 +12,9 @@ import { INSIGHTS_HEADER_TEST_ID, INSIGHTS_THREAT_INTELLIGENCE_TEST_ID, CORRELATIONS_TEST_ID, + INSIGHTS_CONTENT_TEST_ID, + INSIGHTS_ENTITIES_TEST_ID, + PREVALENCE_TEST_ID, } from './test_ids'; import { TestProviders } from '../../../../common/mock'; import { useFirstLastSeen } from '../../../../common/containers/use_first_last_seen'; @@ -24,6 +27,7 @@ import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_f import { InsightsSection } from './insights_section'; import { useAlertPrevalence } from '../../../../common/containers/alerts/use_alert_prevalence'; import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; +import { useExpandSection } from '../hooks/use_expand_section'; jest.mock('../../../../common/containers/alerts/use_alert_prevalence'); @@ -55,6 +59,7 @@ const from = '2022-04-05T12:00:00.000Z'; const to = '2022-04-08T12:00:00.;000Z'; const selectedPatterns = 'alerts'; +jest.mock('../hooks/use_expand_section'); const mockUseGlobalTime = jest.fn().mockReturnValue({ from, to }); jest.mock('../../../../common/containers/use_global_time', () => { return { @@ -85,11 +90,11 @@ jest.mock('../hooks/use_fetch_threat_intelligence'); jest.mock('../../shared/hooks/use_prevalence'); -const renderInsightsSection = (contextValue: RightPanelContext, expanded: boolean) => +const renderInsightsSection = (contextValue: RightPanelContext) => render( - + ); @@ -118,28 +123,65 @@ describe('', () => { getFieldsData: mockGetFieldsData, } as unknown as RightPanelContext; - const wrapper = renderInsightsSection(contextValue, false); + const wrapper = renderInsightsSection(contextValue); expect(wrapper.getByTestId(INSIGHTS_HEADER_TEST_ID)).toBeInTheDocument(); - expect(wrapper.getAllByRole('button')[0]).toHaveAttribute('aria-expanded', 'false'); - expect(wrapper.getAllByRole('button')[0]).not.toHaveAttribute('disabled'); + expect(wrapper.getByTestId(INSIGHTS_HEADER_TEST_ID)).toHaveTextContent('Insights'); + expect(wrapper.getByTestId(INSIGHTS_CONTENT_TEST_ID)).toBeInTheDocument(); }); - it('should render insights component as expanded when expanded is true', () => { + it('should render the component collapsed if value is false in local storage', () => { + (useExpandSection as jest.Mock).mockReturnValue(false); + const contextValue = { eventId: 'some_Id', dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser, getFieldsData: mockGetFieldsData, } as unknown as RightPanelContext; - const wrapper = renderInsightsSection(contextValue, true); + const wrapper = renderInsightsSection(contextValue); + expect(wrapper.getByTestId(INSIGHTS_CONTENT_TEST_ID)).not.toBeVisible(); + }); + + it('should render the component expanded if value is true in local storage', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); - expect(wrapper.getByTestId(INSIGHTS_HEADER_TEST_ID)).toBeInTheDocument(); - expect(wrapper.getAllByRole('button')[0]).toHaveAttribute('aria-expanded', 'true'); - expect(wrapper.getAllByRole('button')[0]).not.toHaveAttribute('disabled'); + const contextValue = { + eventId: 'some_Id', + dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser, + getFieldsData: mockGetFieldsData, + } as unknown as RightPanelContext; + + const wrapper = renderInsightsSection(contextValue); + expect(wrapper.getByTestId(INSIGHTS_CONTENT_TEST_ID)).toBeVisible(); + }); + + it('should render all children when event kind is signal', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + + const getFieldsData = (field: string) => { + switch (field) { + case 'event.kind': + return 'signal'; + } + }; + const contextValue = { + eventId: 'some_Id', + getFieldsData, + documentIsSignal: true, + } as unknown as RightPanelContext; + + const { getByTestId } = renderInsightsSection(contextValue); + + expect(getByTestId(`${INSIGHTS_ENTITIES_TEST_ID}LeftSection`)).toBeInTheDocument(); + expect(getByTestId(`${INSIGHTS_THREAT_INTELLIGENCE_TEST_ID}LeftSection`)).toBeInTheDocument(); + expect(getByTestId(`${CORRELATIONS_TEST_ID}LeftSection`)).toBeInTheDocument(); + expect(getByTestId(`${PREVALENCE_TEST_ID}LeftSection`)).toBeInTheDocument(); }); it('should not render threat intel and correlations insights component when document is not signal', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + const getFieldsData = (field: string) => { switch (field) { case 'event.kind': @@ -152,10 +194,13 @@ describe('', () => { documentIsSignal: false, } as unknown as RightPanelContext; - const { getByTestId, queryByTestId } = renderInsightsSection(contextValue, false); + const { getByTestId, queryByTestId } = renderInsightsSection(contextValue); - expect(getByTestId(INSIGHTS_HEADER_TEST_ID)).toBeInTheDocument(); - expect(queryByTestId(INSIGHTS_THREAT_INTELLIGENCE_TEST_ID)).not.toBeInTheDocument(); - expect(queryByTestId(CORRELATIONS_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(`${INSIGHTS_ENTITIES_TEST_ID}LeftSection`)).toBeInTheDocument(); + expect( + queryByTestId(`${INSIGHTS_THREAT_INTELLIGENCE_TEST_ID}LeftSection`) + ).not.toBeInTheDocument(); + expect(queryByTestId(`${CORRELATIONS_TEST_ID}LeftSection`)).not.toBeInTheDocument(); + expect(getByTestId(`${PREVALENCE_TEST_ID}LeftSection`)).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.tsx index 4c1c12f5e1bd7..f06128ea75c00 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.tsx @@ -5,9 +5,11 @@ * 2.0. */ -import React from 'react'; +import type { FC } from 'react'; +import React, { memo } from 'react'; import { EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import { useExpandSection } from '../hooks/use_expand_section'; import { CorrelationsOverview } from './correlations_overview'; import { PrevalenceOverview } from './prevalence_overview'; import { ThreatIntelligenceOverview } from './threat_intelligence_overview'; @@ -18,29 +20,27 @@ import { useRightPanelContext } from '../context'; import { getField } from '../../shared/utils'; import { EventKind } from '../../shared/constants/event_kinds'; -export interface InsightsSectionProps { - /** - * Boolean to allow the component to be expanded or collapsed on first render - */ - expanded?: boolean; -} +const KEY = 'insights'; /** * Insights section under overview tab. It contains entities, threat intelligence, prevalence and correlations. */ -export const InsightsSection: React.FC = ({ expanded = false }) => { +export const InsightsSection: FC = memo(() => { const { getFieldsData } = useRightPanelContext(); const eventKind = getField(getFieldsData('event.kind')); + const expanded = useExpandSection({ title: KEY, defaultValue: false }); + return ( } - expanded={expanded} + localStorageKey={KEY} data-test-subj={INSIGHTS_TEST_ID} > @@ -56,6 +56,6 @@ export const InsightsSection: React.FC = ({ expanded = fal ); -}; +}); InsightsSection.displayName = 'InsightsSection'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_section.test.tsx index e240b1d5636be..192befd46f339 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_section.test.tsx @@ -20,8 +20,10 @@ import { useRuleWithFallback } from '../../../../detection_engine/rule_managemen import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_formatted_for_field_browser'; import { TestProvider } from '@kbn/expandable-flyout/src/test/provider'; import { mockContextValue } from '../mocks/mock_context'; +import { useExpandSection } from '../hooks/use_expand_section'; jest.mock('../../../../detection_engine/rule_management/logic/use_rule_with_fallback'); +jest.mock('../hooks/use_expand_section'); const panelContextValue = { ...mockContextValue, @@ -30,12 +32,12 @@ const panelContextValue = { ), }; -const renderInvestigationSection = (expanded: boolean = false, contextValue = panelContextValue) => +const renderInvestigationSection = (contextValue = panelContextValue) => render( - + @@ -47,37 +49,45 @@ describe('', () => { (useRuleWithFallback as jest.Mock).mockReturnValue({ rule: { note: 'test note' } }); }); - it('should render the component collapsed', () => { + it('should render investigation component', () => { const { getByTestId } = renderInvestigationSection(); expect(getByTestId(INVESTIGATION_SECTION_HEADER_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(INVESTIGATION_SECTION_HEADER_TEST_ID)).toHaveTextContent('Investigation'); + expect(getByTestId(INVESTIGATION_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); }); - it('should render the component expanded', () => { - const { getByTestId } = renderInvestigationSection(true); - expect(getByTestId(INVESTIGATION_SECTION_HEADER_TEST_ID)).toBeInTheDocument(); - expect(getByTestId(INVESTIGATION_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); + it('should render the component collapsed if value is false in local storage', () => { + (useExpandSection as jest.Mock).mockReturnValue(false); + + const { getByTestId } = renderInvestigationSection(); + expect(getByTestId(INVESTIGATION_SECTION_CONTENT_TEST_ID)).not.toBeVisible(); }); - it('should expand the component when clicking on the arrow on header', () => { + it('should render the component expanded if value is true in local storage', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + const { getByTestId } = renderInvestigationSection(); - getByTestId(INVESTIGATION_SECTION_HEADER_TEST_ID).click(); - expect(getByTestId(INVESTIGATION_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(INVESTIGATION_SECTION_CONTENT_TEST_ID)).toBeVisible(); }); it('should render investigation guide and highlighted fields when document is signal', () => { - const { getByTestId } = renderInvestigationSection(true); + (useExpandSection as jest.Mock).mockReturnValue(true); + + const { getByTestId } = renderInvestigationSection(); expect(getByTestId(INVESTIGATION_GUIDE_TEST_ID)).toBeInTheDocument(); expect(getByTestId(HIGHLIGHTED_FIELDS_TITLE_TEST_ID)).toBeInTheDocument(); }); it('should not render investigation guide when document is not signal', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + const mockGetFieldsData = (field: string) => { switch (field) { case 'event.kind': return 'alert'; } }; - const { getByTestId, queryByTestId } = renderInvestigationSection(true, { + const { getByTestId, queryByTestId } = renderInvestigationSection({ ...panelContextValue, getFieldsData: mockGetFieldsData, }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_section.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_section.tsx index 875858bbca2f7..9686f322c4fab 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_section.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_section.tsx @@ -5,10 +5,11 @@ * 2.0. */ -import type { VFC } from 'react'; -import React from 'react'; +import type { FC } from 'react'; +import React, { memo } from 'react'; import { EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import { useExpandSection } from '../hooks/use_expand_section'; import { ExpandableSection } from './expandable_section'; import { HighlightedFields } from './highlighted_fields'; import { INVESTIGATION_SECTION_TEST_ID } from './test_ids'; @@ -17,21 +18,18 @@ import { getField } from '../../shared/utils'; import { EventKind } from '../../shared/constants/event_kinds'; import { useRightPanelContext } from '../context'; -export interface DescriptionSectionProps { - /** - * Boolean to allow the component to be expanded or collapsed on first render - */ - expanded?: boolean; -} +const KEY = 'investigation'; /** * Second section of the overview tab in details flyout. * It contains investigation guide (alerts only) and highlighted fields */ -export const InvestigationSection: VFC = ({ expanded = true }) => { +export const InvestigationSection: FC = memo(() => { const { getFieldsData } = useRightPanelContext(); const eventKind = getField(getFieldsData('event.kind')); + const expanded = useExpandSection({ title: KEY, defaultValue: true }); + return ( = ({ expanded = defaultMessage="Investigation" /> } - data-test-subj={INVESTIGATION_SECTION_TEST_ID} + localStorageKey={KEY} gutterSize="s" + data-test-subj={INVESTIGATION_SECTION_TEST_ID} > {eventKind === EventKind.signal && ( <> @@ -53,6 +52,6 @@ export const InvestigationSection: VFC = ({ expanded = ); -}; +}); InvestigationSection.displayName = 'InvestigationSection'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.test.tsx index dc421aac72e0f..60ccf34154297 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.test.tsx @@ -8,11 +8,18 @@ import React from 'react'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import { render } from '@testing-library/react'; -import { RESPONSE_SECTION_CONTENT_TEST_ID, RESPONSE_SECTION_HEADER_TEST_ID } from './test_ids'; +import { + RESPONSE_BUTTON_TEST_ID, + RESPONSE_SECTION_CONTENT_TEST_ID, + RESPONSE_SECTION_HEADER_TEST_ID, +} from './test_ids'; import { RightPanelContext } from '../context'; import { mockContextValue } from '../mocks/mock_context'; import { ResponseSection } from './response_section'; import { TestProvider } from '@kbn/expandable-flyout/src/test/provider'; +import { useExpandSection } from '../hooks/use_expand_section'; + +jest.mock('../hooks/use_expand_section'); const PREVIEW_MESSAGE = 'Response is not available in alert preview.'; @@ -28,27 +35,58 @@ const renderResponseSection = () => ); describe('', () => { - it('should render the component collapsed', () => { + it('should render response component', () => { const { getByTestId } = renderResponseSection(); expect(getByTestId(RESPONSE_SECTION_HEADER_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(RESPONSE_SECTION_HEADER_TEST_ID)).toHaveTextContent('Response'); + expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); }); - it('should render the component expanded', () => { - const { getByTestId } = renderResponseSection(); + it('should render the component collapsed if value is false in local storage', () => { + (useExpandSection as jest.Mock).mockReturnValue(false); - expect(getByTestId(RESPONSE_SECTION_HEADER_TEST_ID)).toBeInTheDocument(); - expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); + const { getByTestId } = renderResponseSection(); + expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).not.toBeVisible(); }); - it('should expand the component when clicking on the arrow on header', () => { + it('should render the component expanded if value is true in local storage', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + const { getByTestId } = renderResponseSection(); + expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).toBeVisible(); + }); - getByTestId(RESPONSE_SECTION_HEADER_TEST_ID).click(); - expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); + it('should render response button for event kind signal', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + + const mockGetFieldsData = (field: string) => { + switch (field) { + case 'event.kind': + return 'signal'; + } + }; + + const { getByTestId } = render( + + + + + + + + ); + expect(getByTestId(RESPONSE_BUTTON_TEST_ID)).toBeInTheDocument(); }); it('should render preview message if flyout is in preview', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + const { getByTestId } = render( @@ -58,11 +96,12 @@ describe('', () => { ); - getByTestId(RESPONSE_SECTION_HEADER_TEST_ID).click(); expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).toHaveTextContent(PREVIEW_MESSAGE); }); it('should render empty component if document is not signal', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + const mockGetFieldsData = (field: string) => { switch (field) { case 'event.kind': diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.tsx index 0f5951d2a4952..4e82f450e0e80 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.tsx @@ -5,9 +5,10 @@ * 2.0. */ -import type { VFC } from 'react'; -import React from 'react'; +import type { FC } from 'react'; +import React, { memo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { useExpandSection } from '../hooks/use_expand_section'; import { ResponseButton } from './response_button'; import { ExpandableSection } from './expandable_section'; import { useRightPanelContext } from '../context'; @@ -15,18 +16,16 @@ import { getField } from '../../shared/utils'; import { EventKind } from '../../shared/constants/event_kinds'; import { RESPONSE_SECTION_TEST_ID } from './test_ids'; -export interface ResponseSectionProps { - /** - * Boolean to allow the component to be expanded or collapsed on first render - */ - expanded?: boolean; -} +const KEY = 'response'; /** * Most bottom section of the overview tab. It contains a summary of the response tab. */ -export const ResponseSection: VFC = ({ expanded = false }) => { +export const ResponseSection: FC = memo(() => { const { isPreview, getFieldsData } = useRightPanelContext(); + + const expanded = useExpandSection({ title: KEY, defaultValue: false }); + const eventKind = getField(getFieldsData('event.kind')); if (eventKind !== EventKind.signal) { return null; @@ -41,6 +40,7 @@ export const ResponseSection: VFC = ({ expanded = false }) defaultMessage="Response" /> } + localStorageKey={KEY} data-test-subj={RESPONSE_SECTION_TEST_ID} > {isPreview ? ( @@ -53,6 +53,6 @@ export const ResponseSection: VFC = ({ expanded = false }) )} ); -}; +}); ResponseSection.displayName = 'ResponseSection'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts index 26a252e19a050..fcee244889213 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts @@ -80,7 +80,8 @@ export const HIGHLIGHTED_FIELDS_AGENT_STATUS_CELL_TEST_ID = /* Insights section */ export const INSIGHTS_TEST_ID = `${PREFIX}Insights` as const; -export const INSIGHTS_HEADER_TEST_ID = `${INSIGHTS_TEST_ID}Header` as const; +export const INSIGHTS_HEADER_TEST_ID = INSIGHTS_TEST_ID + HEADER_TEST_ID; +export const INSIGHTS_CONTENT_TEST_ID = INSIGHTS_TEST_ID + CONTENT_TEST_ID; /* Summary row */ @@ -140,7 +141,8 @@ export const PREVALENCE_TEST_ID = `${PREFIX}InsightsPrevalence` as const; /* Visualizations section */ export const VISUALIZATIONS_TEST_ID = `${PREFIX}Visualizations` as const; -export const VISUALIZATIONS_SECTION_HEADER_TEST_ID = `${VISUALIZATIONS_TEST_ID}Header` as const; +export const VISUALIZATIONS_SECTION_HEADER_TEST_ID = VISUALIZATIONS_TEST_ID + HEADER_TEST_ID; +export const VISUALIZATIONS_SECTION_CONTENT_TEST_ID = VISUALIZATIONS_TEST_ID + CONTENT_TEST_ID; export const ANALYZER_PREVIEW_TEST_ID = `${PREFIX}AnalyzerPreview` as const; export const ANALYZER_PREVIEW_LOADING_TEST_ID = `${ANALYZER_PREVIEW_TEST_ID}Loading` as const; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.test.tsx index 14e7e5c7c2fd9..766f73d7f98e6 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.test.tsx @@ -8,8 +8,12 @@ import React from 'react'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import { render } from '@testing-library/react'; -import { VISUALIZATIONS_SECTION_HEADER_TEST_ID } from './test_ids'; -import { TestProviders } from '../../../../common/mock'; +import { + ANALYZER_PREVIEW_TEST_ID, + SESSION_PREVIEW_TEST_ID, + VISUALIZATIONS_SECTION_CONTENT_TEST_ID, + VISUALIZATIONS_SECTION_HEADER_TEST_ID, +} from './test_ids'; import { VisualizationsSection } from './visualizations_section'; import { mockContextValue } from '../mocks/mock_context'; import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_formatted_for_field_browser'; @@ -17,7 +21,11 @@ import { RightPanelContext } from '../context'; import { useAlertPrevalenceFromProcessTree } from '../../../../common/containers/alerts/use_alert_prevalence_from_process_tree'; import { useTimelineDataFilters } from '../../../../timelines/containers/use_timeline_data_filters'; import { TestProvider } from '@kbn/expandable-flyout/src/test/provider'; +import { useExpandSection } from '../hooks/use_expand_section'; +import { useInvestigateInTimeline } from '../../../../detections/components/alerts_table/timeline_actions/use_investigate_in_timeline'; +import { useIsInvestigateInResolverActionEnabled } from '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver'; +jest.mock('../hooks/use_expand_section'); jest.mock('../../../../common/containers/alerts/use_alert_prevalence_from_process_tree', () => ({ useAlertPrevalenceFromProcessTree: jest.fn(), })); @@ -27,12 +35,37 @@ jest.mock('../../../../timelines/containers/use_timeline_data_filters', () => ({ useTimelineDataFilters: jest.fn(), })); const mockUseTimelineDataFilters = useTimelineDataFilters as jest.Mock; +jest.mock('react-redux', () => { + const original = jest.requireActual('react-redux'); -const contextValue = { + return { + ...original, + useDispatch: () => jest.fn(), + }; +}); +jest.mock( + '../../../../detections/components/alerts_table/timeline_actions/use_investigate_in_timeline' +); +jest.mock( + '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver' +); + +const panelContextValue = { ...mockContextValue, dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser, }; +const renderVisualizationsSection = (contextValue = panelContextValue) => + render( + + + + + + + + ); + describe('', () => { beforeEach(() => { mockUseTimelineDataFilters.mockReturnValue({ selectedPatterns: ['index'] }); @@ -45,32 +78,31 @@ describe('', () => { }); it('should render visualizations component', () => { - const { getByTestId, getAllByRole } = render( - - - - - - - - ); + const { getByTestId } = renderVisualizationsSection(); expect(getByTestId(VISUALIZATIONS_SECTION_HEADER_TEST_ID)).toBeInTheDocument(); - expect(getAllByRole('button')[0]).toHaveAttribute('aria-expanded', 'false'); - expect(getAllByRole('button')[0]).not.toHaveAttribute('disabled'); + expect(getByTestId(VISUALIZATIONS_SECTION_HEADER_TEST_ID)).toHaveTextContent('Visualizations'); + expect(getByTestId(VISUALIZATIONS_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); }); - it('should render visualization component as expanded when expanded is true', () => { - const { getByTestId, getAllByRole } = render( - - - - - - ); + it('should render the component collapsed if value is false in local storage', () => { + (useExpandSection as jest.Mock).mockReturnValue(false); - expect(getByTestId(VISUALIZATIONS_SECTION_HEADER_TEST_ID)).toBeInTheDocument(); - expect(getAllByRole('button')[0]).toHaveAttribute('aria-expanded', 'true'); - expect(getAllByRole('button')[0]).not.toHaveAttribute('disabled'); + const { getByTestId } = renderVisualizationsSection(); + expect(getByTestId(VISUALIZATIONS_SECTION_CONTENT_TEST_ID)).not.toBeVisible(); + }); + + it('should render the component expanded if value is true in local storage', () => { + (useInvestigateInTimeline as jest.Mock).mockReturnValue({ + investigateInTimelineAlertClick: jest.fn(), + }); + (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); + (useExpandSection as jest.Mock).mockReturnValue(true); + + const { getByTestId } = renderVisualizationsSection(); + expect(getByTestId(VISUALIZATIONS_SECTION_CONTENT_TEST_ID)).toBeVisible(); + + expect(getByTestId(`${SESSION_PREVIEW_TEST_ID}LeftSection`)).toBeInTheDocument(); + expect(getByTestId(`${ANALYZER_PREVIEW_TEST_ID}LeftSection`)).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.tsx index 000e1c11528cc..ac046117fab74 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.tsx @@ -5,27 +5,24 @@ * 2.0. */ -import React from 'react'; +import type { FC } from 'react'; +import React, { memo } from 'react'; import { EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import { useExpandSection } from '../hooks/use_expand_section'; import { AnalyzerPreviewContainer } from './analyzer_preview_container'; import { SessionPreviewContainer } from './session_preview_container'; import { ExpandableSection } from './expandable_section'; import { VISUALIZATIONS_TEST_ID } from './test_ids'; -export interface VisualizationsSectionProps { - /** - * Boolean to allow the component to be expanded or collapsed on first render - */ - expanded?: boolean; -} +const KEY = 'visualizations'; /** * Visualizations section in overview. It contains analyzer preview and session view preview. */ -export const VisualizationsSection: React.FC = ({ - expanded = false, -}) => { +export const VisualizationsSection: FC = memo(() => { + const expanded = useExpandSection({ title: KEY, defaultValue: false }); + return ( = ({ defaultMessage="Visualizations" /> } + localStorageKey={KEY} data-test-subj={VISUALIZATIONS_TEST_ID} > - - ); -}; +}); VisualizationsSection.displayName = 'VisualizationsSection'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.test.ts new file mode 100644 index 0000000000000..ac3c9c8a6be0d --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.test.ts @@ -0,0 +1,67 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ToggleReducerAction, UseAccordionStateValue } from './use_accordion_state'; +import { useAccordionState, toggleReducer } from './use_accordion_state'; +import type { RenderHookResult } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react-hooks'; +import { FLYOUT_STORAGE_KEYS } from '../../shared/constants/local_storage'; + +const mockSet = jest.fn(); + +describe('useAccordionState', () => { + let hookResult: RenderHookResult; + + it('should return initial value', () => { + hookResult = renderHook((props: boolean) => useAccordionState(props), { + initialProps: true, + }); + + expect(hookResult.result.current.renderContent).toBe(true); + expect(hookResult.result.current.state).toBe('open'); + }); +}); + +describe('toggleReducer', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should return correct state and pass values to localStorage', () => { + const mockStorage = { + get: jest.fn(), + set: mockSet, + }; + const mockLocalStorageKey = 'test'; + const mockAction = { + storage: mockStorage, + title: mockLocalStorageKey, + } as unknown as ToggleReducerAction; + const mockState = 'closed'; + + const result = toggleReducer(mockState, mockAction); + expect(result).toBe('open'); + expect(mockSet).toHaveBeenCalledWith(FLYOUT_STORAGE_KEYS.OVERVIEW_TAB_EXPANDED_SECTIONS, { + [mockLocalStorageKey]: true, + }); + }); + + it(`should not pass values to localStorage if key isn't provided`, () => { + const mockStorage = { + get: jest.fn(), + set: mockSet, + }; + const mockAction = { + storage: mockStorage, + } as unknown as ToggleReducerAction; + const mockState = 'open'; + + const result = toggleReducer(mockState, mockAction); + expect(result).toBe('closed'); + expect(mockSet).not.toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.ts index f3ad414c90843..d7532e8dcfc5a 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.ts @@ -6,12 +6,40 @@ */ import { useReducer } from 'react'; +import type { Storage } from '@kbn/kibana-utils-plugin/public'; +import { useKibana } from '../../../../common/lib/kibana'; +import { FLYOUT_STORAGE_KEYS } from '../../shared/constants/local_storage'; const CLOSED = 'closed' as const; const OPEN = 'open' as const; - type ToggleReducerState = typeof CLOSED | typeof OPEN; -const toggleReducer = (state: ToggleReducerState) => { + +export interface ToggleReducerAction { + /** + * From useKibana().services.storage + */ + storage: Storage | undefined; + /** + * Title to save expanded value in local storage + */ + title: string | undefined; +} + +/** + * Reducer for toggling between expanded and collapsed states. + * Every time the user takes an action, we store the new state in local storage. This allows to preserve the state when opening new flyouts or when refreshing the page. + * The object stored is a map of section names to expanded boolean values. + */ +export const toggleReducer = (state: ToggleReducerState, action: ToggleReducerAction) => { + const { storage, title } = action; + if (storage && title) { + const localStorage = storage.get(FLYOUT_STORAGE_KEYS.OVERVIEW_TAB_EXPANDED_SECTIONS); + storage.set(FLYOUT_STORAGE_KEYS.OVERVIEW_TAB_EXPANDED_SECTIONS, { + ...localStorage, + [title]: state !== OPEN, + }); + } + return state === CLOSED ? OPEN : CLOSED; }; @@ -24,22 +52,27 @@ export interface UseAccordionStateValue { * Use this to control the accordion visual state */ state: ToggleReducerState; - /** * Handler function for cycling between the states */ - toggle: VoidFunction; + toggle: (title: string | undefined) => void; } /** - * Tiny hook for controlled AccordionState + * Hook to control the state of the EuiAccordion. It will store the state in local storage if the localStorageKey is provided. * @param expandedInitially - is accordion expanded on first render */ export const useAccordionState = (expandedInitially: boolean): UseAccordionStateValue => { + const { storage } = useKibana().services; + const initialState = expandedInitially ? OPEN : CLOSED; - const [state, toggle] = useReducer(toggleReducer, initialState); + const [state, toggleState] = useReducer(toggleReducer, initialState); const renderContent = state === OPEN; + const toggle = (title: string | undefined) => { + toggleState({ storage, title }); + }; + return { renderContent, state, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.test.ts new file mode 100644 index 0000000000000..998f56312b0f0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.test.ts @@ -0,0 +1,99 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RenderHookResult } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react-hooks'; +import type { UseExpandSectionParams } from './use_expand_section'; +import { useExpandSection } from './use_expand_section'; +import { useKibana } from '../../../../common/lib/kibana'; + +jest.mock('../../../../common/lib/kibana'); + +describe('useExpandSection', () => { + let hookResult: RenderHookResult; + + it('should return default value if nothing in localStorage', () => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + storage: { + get: () => undefined, + }, + }, + }); + + const initialProps: UseExpandSectionParams = { + title: 'test', + defaultValue: true, + }; + + hookResult = renderHook((props: UseExpandSectionParams) => useExpandSection(props), { + initialProps, + }); + + expect(hookResult.result.current).toBe(true); + }); + + it(`should return default value if localStorage doesn't have the correct key`, () => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + storage: { + get: () => ({ other: false }), + }, + }, + }); + const initialProps: UseExpandSectionParams = { + title: 'test', + defaultValue: true, + }; + + hookResult = renderHook((props: UseExpandSectionParams) => useExpandSection(props), { + initialProps, + }); + + expect(hookResult.result.current).toBe(true); + }); + + it('should return value from local storage', () => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + storage: { + get: () => ({ test: false }), + }, + }, + }); + const initialProps: UseExpandSectionParams = { + title: 'test', + defaultValue: true, + }; + + hookResult = renderHook((props: UseExpandSectionParams) => useExpandSection(props), { + initialProps, + }); + + expect(hookResult.result.current).toBe(false); + }); + + it('should check against lowercase values', () => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + storage: { + get: () => ({ test: false }), + }, + }, + }); + const initialProps: UseExpandSectionParams = { + title: 'Test', + defaultValue: true, + }; + + hookResult = renderHook((props: UseExpandSectionParams) => useExpandSection(props), { + initialProps, + }); + + expect(hookResult.result.current).toBe(false); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.ts new file mode 100644 index 0000000000000..cf21ca52f2a44 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.ts @@ -0,0 +1,34 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useKibana } from '../../../../common/lib/kibana'; +import { FLYOUT_STORAGE_KEYS } from '../../shared/constants/local_storage'; + +export interface UseExpandSectionParams { + /** + * Title of the section + */ + title: string; + /** + * Default value for the section + */ + defaultValue: boolean; +} + +/** + * Hook to get the expanded state of a section from local storage. + */ +export const useExpandSection = ({ title, defaultValue }: UseExpandSectionParams): boolean => { + const { storage } = useKibana().services; + + const localStorage = storage.get(FLYOUT_STORAGE_KEYS.OVERVIEW_TAB_EXPANDED_SECTIONS); + const key = title.toLowerCase(); + const expanded = + localStorage && localStorage[key] !== undefined ? localStorage[key] : defaultValue; + + return expanded; +}; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/constants/local_storage.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/constants/local_storage.ts new file mode 100644 index 0000000000000..cce9e1bcea904 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/constants/local_storage.ts @@ -0,0 +1,11 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const FLYOUT_STORAGE_KEYS = { + OVERVIEW_TAB_EXPANDED_SECTIONS: + 'securitySolution.documentDetailsFlyout.overviewSectionExpanded.v8.14', +}; diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx index 3486da1191b4c..614bcc5924aaa 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx @@ -568,6 +568,7 @@ describe('Response actions history', () => { 'Parameters', 'Comment', 'Hostname', + 'Agent type', 'Output:', ] ); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts index 8de8ca22ae8bf..47d30ad96699c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts @@ -62,7 +62,8 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => { } }); - describe('Host Isolation:', () => { + // FLAKY: https://github.com/elastic/kibana/issues/172418 + describe.skip('Host Isolation:', () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts index 44356d88e8ba4..87321f6ce108a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts @@ -1110,6 +1110,17 @@ export const AdvancedPolicySchema: AdvancedPolicySchemaType[] = [ } ), }, + { + key: 'linux.advanced.fanotify.seccomp_restricted', + first_supported_version: '8.13.1', + documentation: i18n.translate( + 'xpack.securitySolution.endpoint.policy.advanced.linux.advanced.fanotify.seccomp_restricted', + { + defaultMessage: + 'Prevent the Defend permission checking thread from calling the open/openat syscalls when running on kernels which require FAN_OPEN_PERM (older than 5.0). Will avoid potential deadlocks with other anti-virus vendors at the cost of racy hash-based trusted application entries. Ignored when running on newer kernels. Default: false', + } + ), + }, { key: 'windows.advanced.memory_protection.context_manipulation_detection', first_supported_version: '8.4', diff --git a/x-pack/plugins/security_solution/public/management/pages/response_actions/view/response_actions_list_page.test.tsx b/x-pack/plugins/security_solution/public/management/pages/response_actions/view/response_actions_list_page.test.tsx index 65cd4ffc09908..0ec00c1a0a691 100644 --- a/x-pack/plugins/security_solution/public/management/pages/response_actions/view/response_actions_list_page.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/response_actions/view/response_actions_list_page.test.tsx @@ -671,26 +671,6 @@ describe('Response actions history page', () => { expect(history.location.search).toEqual(''); }); - it('should clear `actionTypes` selected options on `types` filter', () => { - const filterPrefix = 'types-filter'; - render(); - const { getAllByTestId, getByTestId } = renderResult; - userEvent.click(getByTestId(`${testPrefix}-${filterPrefix}-popoverButton`)); - const allFilterOptions = getAllByTestId(`${filterPrefix}-option`); - - allFilterOptions.forEach((option) => { - option.style.pointerEvents = 'all'; - userEvent.click(option); - }); - - expect(history.location.search).toEqual('?types=automated%2Cmanual'); - - const clearAllButton = getByTestId(`${testPrefix}-${filterPrefix}-clearAllButton`); - clearAllButton.style.pointerEvents = 'all'; - userEvent.click(clearAllButton); - expect(history.location.search).toEqual(''); - }); - it('should clear `agentTypes` and `actionTypes` selected options on `types` filter', () => { mockedContext.setExperimentalFlag({ responseActionsSentinelOneV1Enabled: true, diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts index bd8ed990bac13..c208e87ab166e 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts @@ -90,6 +90,12 @@ const randomAgentPolicyName = (() => { }; })(); +/** + * Check if the given version string is a valid artifact version + * @param version Version string + */ +const isValidArtifactVersion = (version: string) => !!version.match(/^\d+\.\d+\.\d+(-SNAPSHOT)?$/); + export const checkInFleetAgent = async ( esClient: Client, agentId: string, @@ -396,7 +402,12 @@ export const getAgentVersionMatchingCurrentStack = async ( const kbnStatus = await fetchKibanaStatus(kbnClient); const agentVersions = await axios .get('https://artifacts-api.elastic.co/v1/versions') - .then((response) => map(response.data.versions, (version) => version.split('-SNAPSHOT')[0])); + .then((response) => + map( + response.data.versions.filter(isValidArtifactVersion), + (version) => version.split('-SNAPSHOT')[0] + ) + ); let version = semver.maxSatisfying(agentVersions, `<=${kbnStatus.version.number}`) ?? @@ -519,8 +530,9 @@ export const getLatestAgentDownloadVersion = async ( } ); - const stackVersionToArtifactVersion: Record = - artifactVersionsResponse.versions.reduce((acc, artifactVersion) => { + const stackVersionToArtifactVersion: Record = artifactVersionsResponse.versions + .filter(isValidArtifactVersion) + .reduce((acc, artifactVersion) => { const stackVersion = artifactVersion.split('-SNAPSHOT')[0]; acc[stackVersion] = artifactVersion; return acc; diff --git a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts index ece544ed836d9..adb07a228d528 100644 --- a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts +++ b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts @@ -140,7 +140,8 @@ async function createSecurityProject( }; } catch (error) { if (error instanceof AxiosError) { - log.error(`${error.response?.status}:${error.response?.data}`); + const errorData = JSON.stringify(error.response?.data); + log.error(`${error.response?.status}:${errorData}`); } else { log.error(`${error.message}`); } diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/list_handler.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/list_handler.test.ts index 4e0eb256fa7c6..43d1f02196d2e 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/list_handler.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/list_handler.test.ts @@ -15,13 +15,11 @@ import { } from '@kbn/core/server/mocks'; import type { EndpointActionListRequestQuery } from '../../../../common/api/endpoint'; import { BASE_ENDPOINT_ACTION_ROUTE } from '../../../../common/endpoint/constants'; -import { EndpointAppContextService } from '../../endpoint_app_context_services'; +import type { HttpApiTestSetupMock } from '../../mocks'; import { - createMockEndpointAppContext, - createMockEndpointAppContextServiceSetupContract, - createMockEndpointAppContextServiceStartContract, createRouteHandlerContext, getRegisteredVersionedRouteMock, + createHttpApiTestSetupMock, } from '../../mocks'; import { registerActionListRoutes } from './list'; import type { SecuritySolutionRequestHandlerContext } from '../../../types'; @@ -37,8 +35,8 @@ const mockGetActionList = getActionList as jest.Mock; const mockGetActionListByStatus = getActionListByStatus as jest.Mock; describe('Action List Handler', () => { - let endpointAppContextService: EndpointAppContextService; let mockResponse: jest.Mocked; + let apiTestSetup: HttpApiTestSetupMock; let actionListHandler: ( query?: EndpointActionListRequestQuery @@ -47,12 +45,11 @@ describe('Action List Handler', () => { beforeEach(() => { const esClientMock = elasticsearchServiceMock.createScopedClusterClient(); const routerMock = httpServiceMock.createRouter(); - endpointAppContextService = new EndpointAppContextService(); - endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); - endpointAppContextService.start(createMockEndpointAppContextServiceStartContract()); + apiTestSetup = createHttpApiTestSetupMock(); + mockDoesLogsEndpointActionsIndexExist.mockResolvedValue(true); - registerActionListRoutes(routerMock, createMockEndpointAppContext()); + registerActionListRoutes(routerMock, apiTestSetup.endpointAppContextMock); actionListHandler = async ( query?: EndpointActionListRequestQuery @@ -81,10 +78,6 @@ describe('Action List Handler', () => { }; }); - afterEach(() => { - endpointAppContextService.stop(); - }); - describe('Internals', () => { const defaultParams = { pageSize: 10, page: 1 }; it('should return `notFound` when actions index does not exist', async () => { @@ -96,8 +89,10 @@ describe('Action List Handler', () => { }); it('should return `badRequest` when sentinel_one feature flag is not enabled and agentType is `sentinel_one`', async () => { - // @ts-expect-error We're writing to a readonly property just for the purpose of the test - endpointAppContextService.experimentalFeatures.responseActionsSentinelOneV1Enabled = false; + apiTestSetup.endpointAppContextMock.experimentalFeatures = { + ...apiTestSetup.endpointAppContextMock.experimentalFeatures, + responseActionsSentinelOneV1Enabled: false, + }; await actionListHandler({ ...defaultParams, agentTypes: 'sentinel_one' }); expect(mockResponse.customError).toHaveBeenCalledWith({ statusCode: 400, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/utils.ts index 64fa7995182c5..5b0e859052500 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/utils.ts @@ -12,6 +12,8 @@ import type { RouteValidationFunction, KibanaResponseFactory, CustomHttpResponseOptions, + HttpResponsePayload, + ResponseError, } from '@kbn/core/server'; import { CustomHttpRequestError } from '../../../utils/custom_http_request_error'; @@ -160,13 +162,14 @@ const statusToErrorMessage = (statusCode: number) => { export class SiemResponseFactory { constructor(private response: KibanaResponseFactory) {} - // @ts-expect-error upgrade typescript v4.9.5 - error({ statusCode, body, headers }: CustomHttpResponseOptions) { - // @ts-expect-error upgrade typescript v4.9.5 + error({ + statusCode, + body, + headers, + }: CustomHttpResponseOptions) { const contentType: CustomHttpResponseOptions['headers'] = { 'content-type': 'application/json', }; - // @ts-expect-error upgrade typescript v4.9.5 const defaultedHeaders: CustomHttpResponseOptions['headers'] = { ...contentType, ...(headers ?? {}), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/utils.ts index 42c062aba5d74..18634fb7162b7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/utils.ts @@ -13,10 +13,11 @@ import { BulkActionEditTypeEnum } from '../../../../../../common/api/detection_e * @param editAction {@link BulkActionEditType} * @returns {boolean} */ -export const isIndexPatternsBulkEditAction = (editAction: BulkActionEditType) => - [ +export const isIndexPatternsBulkEditAction = (editAction: BulkActionEditType) => { + const indexPatternsActions: BulkActionEditType[] = [ BulkActionEditTypeEnum.add_index_patterns, BulkActionEditTypeEnum.delete_index_patterns, BulkActionEditTypeEnum.set_index_patterns, - // @ts-expect-error upgrade typescript v4.9.5 - ].includes(editAction); + ]; + return indexPatternsActions.includes(editAction); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/validations.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/validations.ts index f387de9e3525f..74fc6f91d37c4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/validations.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/bulk_actions/validations.ts @@ -10,7 +10,10 @@ import { invariant } from '../../../../../../common/utils/invariant'; import { isMlRule } from '../../../../../../common/machine_learning/helpers'; import { isEsqlRule } from '../../../../../../common/detection_engine/utils'; import { BulkActionsDryRunErrCode } from '../../../../../../common/constants'; -import type { BulkActionEditPayload } from '../../../../../../common/api/detection_engine/rule_management'; +import type { + BulkActionEditPayload, + BulkActionEditType, +} from '../../../../../../common/api/detection_engine/rule_management'; import { BulkActionEditTypeEnum } from '../../../../../../common/api/detection_engine/rule_management'; import type { RuleAlertType } from '../../../rule_schema'; import { isIndexPatternsBulkEditAction } from './utils'; @@ -99,12 +102,11 @@ export const validateBulkEditRule = async ({ * add_rule_actions, set_rule_actions can be applied to prebuilt/immutable rules */ const istEditApplicableToImmutableRule = (edit: BulkActionEditPayload[]): boolean => { - return edit.every(({ type }) => - [BulkActionEditTypeEnum.set_rule_actions, BulkActionEditTypeEnum.add_rule_actions].includes( - // @ts-expect-error upgrade typescript v4.9.5 - type - ) - ); + const applicableActions: BulkActionEditType[] = [ + BulkActionEditTypeEnum.set_rule_actions, + BulkActionEditTypeEnum.add_rule_actions, + ]; + return edit.every(({ type }) => applicableActions.includes(type)); }; /** diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts b/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts index 48afbddc4e1d7..a66aa855a73c9 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts @@ -21,7 +21,8 @@ import { TelemetryChannel, TelemetryCounter } from './types'; import * as collections from './collections_helpers'; import { CachedSubject, retryOnError$ } from './rxjs_helpers'; import { SenderUtils } from './sender_helpers'; -import { newTelemetryLogger, type TelemetryLogger } from './helpers'; +import { newTelemetryLogger } from './helpers'; +import { type TelemetryLogger } from './telemetry_logger'; export const DEFAULT_QUEUE_CONFIG: QueueConfig = { bufferTimeSpanMillis: 30 * 1_000, diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts index de49dad3b1c26..4ab3a68582954 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts @@ -9,7 +9,7 @@ import moment from 'moment'; import type { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; import type { PackagePolicy } from '@kbn/fleet-plugin/common/types/models/package_policy'; import { merge, set } from 'lodash'; -import type { Logger } from '@kbn/core/server'; +import type { Logger, LogMeta } from '@kbn/core/server'; import { sha256 } from 'js-sha256'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { copyAllowlistedFields, filterList } from './filterlists'; @@ -22,6 +22,7 @@ import type { ExceptionListItem, ExtraInfo, ListTemplate, + Nullable, TelemetryEvent, TimeFrame, TimelineResult, @@ -38,6 +39,11 @@ import { } from './constants'; import { tagsToEffectScope } from '../../../common/endpoint/service/trusted_apps/mapping'; import { resolverEntity } from '../../endpoint/routes/resolver/entity/utils/build_resolver_entity'; +import { + type TelemetryLogger, + TelemetryLoggerImpl, + tlog as telemetryLogger, +} from './telemetry_logger'; /** * Determines the when the last run was in order to execute to. @@ -281,31 +287,23 @@ export const formatValueListMetaData = ( }); export let isElasticCloudDeployment = false; +export let clusterInfo: Nullable; export const setIsElasticCloudDeployment = (value: boolean) => { isElasticCloudDeployment = value; }; - -export const tlog = (logger: Logger, message: string) => { - if (isElasticCloudDeployment) { - logger.info(message); - } else { - logger.debug(message); - } +export const setClusterInfo = (info: Nullable) => { + clusterInfo = info; }; -export interface TelemetryLogger extends Logger { - l: (message: string) => void; -} +/** + * @deprecated use `new TelemetryLoggerImpl(...)` instead + */ +export const tlog = (logger: Logger, message: string, meta?: LogMeta) => { + telemetryLogger(logger, message, meta); +}; export const newTelemetryLogger = (logger: Logger): TelemetryLogger => { - return { - ...logger, - error: logger.error, - info: logger.info, - debug: logger.debug, - warn: logger.warn, - l: (message: string) => tlog(logger, message), - }; + return new TelemetryLoggerImpl(logger); }; function obfuscateString(clusterId: string, toHash: string): string { @@ -402,13 +400,13 @@ export class TelemetryTimelineFetcher { let record; if (telemetryTimeline.length >= 1) { - const { clusterInfo, licenseInfo } = await this.extraInfo; + const extraInfo = await this.extraInfo; record = { '@timestamp': moment().toISOString(), - version: clusterInfo.version?.number, - cluster_name: clusterInfo.cluster_name, - cluster_uuid: clusterInfo.cluster_uuid, - license_uuid: licenseInfo?.uid, + version: extraInfo.clusterInfo.version?.number, + cluster_name: extraInfo.clusterInfo.cluster_name, + cluster_uuid: extraInfo.clusterInfo.cluster_uuid, + license_uuid: extraInfo.licenseInfo?.uid, alert_id: alertUUID, event_id: eventId, timeline: telemetryTimeline, @@ -444,13 +442,13 @@ export class TelemetryTimelineFetcher { this.receiver.fetchLicenseInfo(), ]); - const clusterInfo: ESClusterInfo = + const _clusterInfo: ESClusterInfo = clusterInfoPromise.status === 'fulfilled' ? clusterInfoPromise.value : ({} as ESClusterInfo); const licenseInfo: ESLicense | undefined = licenseInfoPromise.status === 'fulfilled' ? licenseInfoPromise.value : ({} as ESLicense); - return { clusterInfo, licenseInfo }; + return { clusterInfo: _clusterInfo, licenseInfo }; } private calculateTimeFrame(): TimeFrame { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts index 6571822e57461..aa7f012b55027 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts @@ -51,6 +51,7 @@ import { trustedApplicationToTelemetryEntry, ruleExceptionListItemToTelemetryEvent, tlog, + setClusterInfo, } from './helpers'; import { Fetcher } from '../../endpoint/routes/resolver/tree/utils/fetch'; import type { TreeOptions, TreeResponse } from '../../endpoint/routes/resolver/tree/utils/fetch'; @@ -242,6 +243,8 @@ export class TelemetryReceiver implements ITelemetryReceiver { this.experimentalFeatures = endpointContextService?.experimentalFeatures; const elasticsearch = core?.elasticsearch.client as unknown as IScopedClusterClient; this.processTreeFetcher = new Fetcher(elasticsearch); + + setClusterInfo(this.clusterInfo); } public getClusterInfo(): ESClusterInfo | undefined { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/task_metrics.ts b/x-pack/plugins/security_solution/server/lib/telemetry/task_metrics.ts index 10041f46c4196..3306633bcfbb2 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/task_metrics.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/task_metrics.ts @@ -5,7 +5,8 @@ * 2.0. */ import type { Logger } from '@kbn/core/server'; -import { newTelemetryLogger, type TelemetryLogger } from './helpers'; +import { newTelemetryLogger } from './helpers'; +import { type TelemetryLogger } from './telemetry_logger'; import type { TaskMetric, ITaskMetricsService, Trace } from './task_metrics.types'; import type { ITelemetryEventsSender } from './sender'; import { TelemetryChannel } from './types'; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts index fdddc67b84d07..b666355e3d94c 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts @@ -32,10 +32,10 @@ export function createTelemetryConfigurationTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('configuration')).l; + const log = newTelemetryLogger(logger.get('configuration')); const trace = taskMetricsService.start(taskType); - log( + log.l( `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` ); @@ -44,14 +44,14 @@ export function createTelemetryConfigurationTaskConfig() { const manifest = await artifactService.getArtifact(artifactName); if (manifest.notModified) { - log('No new configuration artifact found, skipping...'); + log.l('No new configuration artifact found, skipping...'); taskMetricsService.end(trace); return 0; } const configArtifact = manifest.data as unknown as TelemetryConfiguration; - log(`Got telemetry configuration artifact: ${JSON.stringify(configArtifact)}`); + log.l(`Got telemetry configuration artifact: ${JSON.stringify(configArtifact)}`); telemetryConfiguration.max_detection_alerts_batch = configArtifact.max_detection_alerts_batch; @@ -68,7 +68,7 @@ export function createTelemetryConfigurationTaskConfig() { } if (configArtifact.sender_channels) { - log('Updating sender channels configuration'); + log.l('Updating sender channels configuration'); telemetryConfiguration.sender_channels = configArtifact.sender_channels; const channelsDict = Object.values(TelemetryChannel).reduce( (acc, channel) => acc.set(channel as string, channel), @@ -77,7 +77,7 @@ export function createTelemetryConfigurationTaskConfig() { Object.entries(configArtifact.sender_channels).forEach(([channelName, config]) => { if (channelName === 'default') { - log('Updating default configuration'); + log.l('Updating default configuration'); sender.updateDefaultQueueConfig({ bufferTimeSpanMillis: config.buffer_time_span_millis, inflightEventsThreshold: config.inflight_events_threshold, @@ -86,9 +86,9 @@ export function createTelemetryConfigurationTaskConfig() { } else { const channel = channelsDict.get(channelName); if (!channel) { - log(`Ignoring unknown channel "${channelName}"`); + log.l(`Ignoring unknown channel "${channelName}"`); } else { - log(`Updating configuration for channel "${channelName}`); + log.l(`Updating configuration for channel "${channelName}`); sender.updateQueueConfig(channel, { bufferTimeSpanMillis: config.buffer_time_span_millis, inflightEventsThreshold: config.inflight_events_threshold, @@ -101,10 +101,10 @@ export function createTelemetryConfigurationTaskConfig() { taskMetricsService.end(trace); - log(`Updated TelemetryConfiguration: ${JSON.stringify(telemetryConfiguration)}`); + log.l(`Updated TelemetryConfiguration: ${JSON.stringify(telemetryConfiguration)}`); return 0; } catch (err) { - log(`Failed to set telemetry configuration due to ${err.message}`); + log.l(`Failed to set telemetry configuration due to ${err.message}`); telemetryConfiguration.resetAllToDefault(); taskMetricsService.end(trace, err); return 0; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts index e8acc4e222958..785bf172d19e0 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts @@ -37,12 +37,12 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('detection_rule')).l; + const log = newTelemetryLogger(logger.get('detection_rule')); const usageCollector = sender.getTelemetryUsageCluster(); const usageLabelPrefix: string[] = ['security_telemetry', 'detection-rules']; const trace = taskMetricsService.start(taskType); - log( + log.l( `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` ); @@ -66,7 +66,7 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n const { body: prebuiltRules } = await receiver.fetchDetectionRules(); if (!prebuiltRules) { - log('no prebuilt rules found'); + log.l('no prebuilt rules found'); taskMetricsService.end(trace); return 0; } @@ -108,7 +108,7 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n licenseInfo, LIST_DETECTION_RULE_EXCEPTION ); - log(`Detection rule exception json length ${detectionRuleExceptionsJson.length}`); + log.l(`Detection rule exception json length ${detectionRuleExceptionsJson.length}`); usageCollector?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix), @@ -125,7 +125,7 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n } taskMetricsService.end(trace); - log( + log.l( `Task: ${taskId} executed. Processed ${detectionRuleExceptionsJson.length} exceptions` ); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts index 9b91dd557526e..85ac4d744feae 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts @@ -33,10 +33,10 @@ export function createTelemetryDiagnosticsTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('diagnostic')).l; + const log = newTelemetryLogger(logger.get('diagnostic')); const trace = taskMetricsService.start(taskType); - log( + log.l( `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` ); @@ -57,13 +57,13 @@ export function createTelemetryDiagnosticsTaskConfig() { ); if (alerts.length === 0) { - log('no diagnostic alerts retrieved'); + log.l('no diagnostic alerts retrieved'); taskMetricsService.end(trace); return alertCount; } alertCount += alerts.length; - log(`Sending ${alerts.length} diagnostic alerts`); + log.l(`Sending ${alerts.length} diagnostic alerts`); await sender.sendOnDemand(TELEMETRY_CHANNEL_ENDPOINT_ALERTS, processedAlerts); } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts index 4455ae1833e4b..89d9b954db231 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts @@ -64,10 +64,10 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('endpoint')).l; + const log = newTelemetryLogger(logger.get('endpoint')); const trace = taskMetricsService.start(taskType); - log( + log.l( `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` ); @@ -103,7 +103,7 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { * a metric document(s) exists for an EP agent we map to fleet agent and policy */ if (endpointData.endpointMetrics === undefined) { - log('no endpoint metrics to report'); + log.l('no endpoint metrics to report'); taskMetricsService.end(trace); return 0; } @@ -113,7 +113,7 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { }; if (endpointMetricsResponse.aggregations === undefined) { - log(`no endpoint metrics to report`); + log.l(`no endpoint metrics to report`); taskMetricsService.end(trace); return 0; } @@ -147,7 +147,7 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { const agentsResponse = endpointData.fleetAgentsResponse; if (agentsResponse === undefined) { - log('no fleet agent information available'); + log.l('no fleet agent information available'); taskMetricsService.end(trace); return 0; } @@ -175,7 +175,7 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { try { agentPolicy = await receiver.fetchPolicyConfigs(policyInfo); } catch (err) { - log(`error fetching policy config due to ${err?.message}`); + log.l(`error fetching policy config due to ${err?.message}`); } const packagePolicies = agentPolicy?.package_policies; @@ -236,7 +236,7 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { * a metadata document(s) exists for an EP agent we map to fleet agent and policy */ if (endpointData.endpointMetadata === undefined) { - log(`no endpoint metadata to report`); + log.l(`no endpoint metadata to report`); } const { body: endpointMetadataResponse } = endpointData.endpointMetadata as unknown as { @@ -244,7 +244,7 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { }; if (endpointMetadataResponse.aggregations === undefined) { - log(`no endpoint metadata to report`); + log.l(`no endpoint metadata to report`); } const endpointMetadata = diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/filterlists.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/filterlists.ts index c09a5ec497a01..5a869ecade992 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/filterlists.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/filterlists.ts @@ -32,10 +32,10 @@ export function createTelemetryFilterListArtifactTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('filterlists')).l; + const log = newTelemetryLogger(logger.get('filterlists')); const trace = taskMetricsService.start(taskType); - log( + log.l( `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` ); @@ -43,20 +43,20 @@ export function createTelemetryFilterListArtifactTaskConfig() { const artifactName = 'telemetry-filterlists-v1'; const manifest = await artifactService.getArtifact(artifactName); if (manifest.notModified) { - log('No new filterlist artifact found, skipping...'); + log.l('No new filterlist artifact found, skipping...'); taskMetricsService.end(trace); return 0; } const artifact = manifest.data as unknown as TelemetryFilterListArtifact; - log(`New filterlist artifact: ${JSON.stringify(artifact)}`); + log.l(`New filterlist artifact: ${JSON.stringify(artifact)}`); filterList.endpointAlerts = artifact.endpoint_alerts; filterList.exceptionLists = artifact.exception_lists; filterList.prebuiltRulesAlerts = artifact.prebuilt_rules_alerts; taskMetricsService.end(trace); return 0; } catch (err) { - log(`Failed to set telemetry filterlist artifact due to ${err.message}`); + log.l(`Failed to set telemetry filterlist artifact due to ${err.message}`); filterList.resetAllToDefault(); taskMetricsService.end(trace, err); return 0; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts index 9d0324b8144c2..27285e906d136 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts @@ -34,10 +34,10 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('prebuilt_rule_alerts')).l; + const log = newTelemetryLogger(logger.get('prebuilt_rule_alerts')); const trace = taskMetricsService.start(taskType); - log( + log.l( `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` ); @@ -61,7 +61,7 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n const index = receiver.getAlertsIndex(); if (index === undefined) { - log(`alerts index is not ready yet, skipping telemetry task`); + log.l(`alerts index is not ready yet, skipping telemetry task`); taskMetricsService.end(trace); return 0; } @@ -104,7 +104,7 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n }) ); - log(`sending ${enrichedAlerts.length} elastic prebuilt alerts`); + log.l(`sending ${enrichedAlerts.length} elastic prebuilt alerts`); const batches = batchTelemetryRecords(enrichedAlerts, maxTelemetryBatch); const promises = batches.map(async (batch) => { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts index 45fe385e76329..35181b0f73f7f 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts @@ -43,10 +43,10 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('security_lists')).l; + const log = newTelemetryLogger(logger.get('security_lists')); const trace = taskMetricsService.start(taskType); - log( + log.l( `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` ); @@ -82,7 +82,7 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) LIST_TRUSTED_APPLICATION ); trustedApplicationsCount = trustedAppsJson.length; - log(`Trusted Apps: ${trustedApplicationsCount}`); + log.l(`Trusted Apps: ${trustedApplicationsCount}`); usageCollector?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix), @@ -107,7 +107,7 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) LIST_ENDPOINT_EXCEPTION ); endpointExceptionsCount = epExceptionsJson.length; - log(`EP Exceptions: ${endpointExceptionsCount}`); + log.l(`EP Exceptions: ${endpointExceptionsCount}`); usageCollector?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix), @@ -132,7 +132,7 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) LIST_ENDPOINT_EVENT_FILTER ); endpointEventFiltersCount = epFiltersJson.length; - log(`EP Event Filters: ${endpointEventFiltersCount}`); + log.l(`EP Event Filters: ${endpointEventFiltersCount}`); usageCollector?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix), diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts index 63e483cb77376..fa0a280fb7026 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts @@ -30,11 +30,11 @@ export function createTelemetryTimelineTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('timelines')).l; + const log = newTelemetryLogger(logger.get('timelines')); const fetcher = new TelemetryTimelineFetcher(receiver); const trace = taskMetricsService.start(taskType); - log( + log.l( `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` ); @@ -49,7 +49,7 @@ export function createTelemetryTimelineTaskConfig() { } const alerts = await receiver.fetchTimelineAlerts(alertsIndex, rangeFrom, rangeTo); - log(`found ${alerts.length} alerts to process`); + log.l(`found ${alerts.length} alerts to process`); for (const alert of alerts) { const result = await fetcher.fetchTimeline(alert); @@ -70,11 +70,11 @@ export function createTelemetryTimelineTaskConfig() { sender.sendOnDemand(TELEMETRY_CHANNEL_TIMELINE, [result.timeline]); counter += 1; } else { - log('no events in timeline'); + log.l('no events in timeline'); } } - log(`sent ${counter} timelines. Concluding timeline task.`); + log.l(`sent ${counter} timelines. Concluding timeline task.`); taskMetricsService.end(trace); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts index 46b248a36f63c..9207adf7ae748 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts @@ -30,11 +30,11 @@ export function createTelemetryDiagnosticTimelineTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('timelines_diagnostic')).l; + const log = newTelemetryLogger(logger.get('timelines_diagnostic')); const trace = taskMetricsService.start(taskType); const fetcher = new TelemetryTimelineFetcher(receiver); - log( + log.l( `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` ); @@ -49,7 +49,7 @@ export function createTelemetryDiagnosticTimelineTaskConfig() { rangeTo ); - log(`found ${alerts.length} alerts to process`); + log.l(`found ${alerts.length} alerts to process`); for (const alert of alerts) { const result = await fetcher.fetchTimeline(alert); @@ -70,11 +70,11 @@ export function createTelemetryDiagnosticTimelineTaskConfig() { sender.sendOnDemand(TELEMETRY_CHANNEL_TIMELINE, [result.timeline]); counter += 1; } else { - log('no events in timeline'); + log.l('no events in timeline'); } } - log(`sent ${counter} timelines. Concluding timeline task.`); + log.l(`sent ${counter} timelines. Concluding timeline task.`); taskMetricsService.end(trace); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/telemetry_logger.ts b/x-pack/plugins/security_solution/server/lib/telemetry/telemetry_logger.ts new file mode 100644 index 0000000000000..b457cea89d36e --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/telemetry/telemetry_logger.ts @@ -0,0 +1,103 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { Logger, LogMeta } from '@kbn/core/server'; +import type { LogLevelId, LogRecord } from '@kbn/logging'; +import { clusterInfo, isElasticCloudDeployment } from './helpers'; + +export interface TelemetryLogger extends Logger { + l(message: string, meta?: Meta | object): void; +} + +/** + * This custom logger extends the base kibana Logger with the following functionality: + * - Exposes a helper `TelemetryLogger::l` method that logs at the + * info or debug level depending on whether the instance is a cloud deployment or not. + * - For the above method as well as the regular debug, info, warn, error, etc. + * it includes the cluster uuid and name as part of the metadata structured fields. + * + * Please try to use a meaningful logger name, e.g.: + * + * ```js + * const log = new TelemetryLoggerImpl(logger.get('tasks.endpoint'), ...); + * ```` + * instead of + * + * ```js + * const log = new TelemetryLoggerImpl(logger, ...); + * ```` + * + * It makes easier to browse the logs by filtering by the structured argument `logger`. + */ +export class TelemetryLoggerImpl implements TelemetryLogger { + constructor(private readonly delegate: Logger) {} + + l(message: string, meta?: Meta | object | undefined): void { + if (isElasticCloudDeployment) { + this.info(message, meta); + } else { + this.debug(message, meta); + } + } + + trace(message: string, meta?: Meta): void { + this.delegate.trace(message, logMeta(meta)); + } + + debug(message: string, meta?: Meta): void { + this.delegate.debug(message, logMeta(meta)); + } + + info(message: string, meta?: Meta): void { + this.delegate.info(message, logMeta(meta)); + } + + warn(errorOrMessage: string | Error, meta?: Meta): void { + this.delegate.warn(errorOrMessage, logMeta(meta)); + } + + error(errorOrMessage: string | Error, meta?: Meta): void { + this.delegate.error(errorOrMessage, logMeta(meta)); + } + + fatal(errorOrMessage: string | Error, meta?: Meta): void { + this.delegate.fatal(errorOrMessage, logMeta(meta)); + } + + log(record: LogRecord): void { + this.delegate.log(record); + } + + isLevelEnabled(level: LogLevelId): boolean { + return this.delegate.isLevelEnabled(level); + } + + get(...childContextPaths: string[]): Logger { + return this.delegate.get(...childContextPaths); + } +} + +export const tlog = (logger: Logger, message: string, meta?: LogMeta) => { + if (isElasticCloudDeployment) { + logger.info(message, logMeta(meta)); + } else { + logger.debug(message, logMeta(meta)); + } +}; + +// helper method to merge a given LogMeta with the cluster info (if exists) +function logMeta(meta?: LogMeta | undefined): LogMeta { + const clusterInfoMeta = clusterInfo + ? { + cluster_uuid: clusterInfo?.cluster_uuid, + cluster_name: clusterInfo?.cluster_name, + } + : {}; + return { + ...clusterInfoMeta, + ...(meta ?? {}), + }; +} diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/readme.md b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/readme.md deleted file mode 100644 index 0ee0c19f0d432..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/readme.md +++ /dev/null @@ -1,121 +0,0 @@ -## Instructions for loading & observing data - -There are several steps required to set up geo containment alerts for testing in a way -that allows you to view triggered alerts as they happen. These instructions outline -how to load test data, but really these steps can be used to load any data for geo -containment alerts so long as you have the following data: -- An index containing a`geo_point` or `geo_shape` field and a `date` field. This data is presumed to -be dynamic (updated). -- An index containing `geo_shape` data, such as boundary data, bounding box data, etc. -This data is presumed to be static (not updated). Shape data matching the query is -harvested once when the alert is created and anytime after when alert is re-enabled -after disablement -The ability for containment alerts to monitor data requires there be somewhat "real time" -data streaming in as indicated by the `date` field. - -### 1. Set experimental flag to enable containment alerts -- Your `kibana.yml` config file is located in the `config/` dir in the base of your kibana -project. To edit it, open this file in your editor of choice, add the line described in -the next step to the bottom of the file (or really anywhere) and save. For more details -on different config modifications or on how to make production config modifications, -see [the current docs](https://www.elastic.co/guide/en/kibana/current/settings.html) - -### 2. Run ES/Kibana dev env with ssl enabled -- In two terminals, run the normal commands to launch both elasticsearch and kibana but -append `--ssl` to the end of each as an arg, i.e.: - - `yarn es snapshot --ssl # Runs Elasticsearch` - - `yarn start --ssl # Runs Kibana` - -### 3. Get an MTA data api key -- You'll need to obtain an NYC MTA api key, you can request this - key [here](https://docs.google.com/forms/d/e/1FAIpQLSfGUZA6h4eHd2-ImaK5Q_I5Gb7C3UEP5vYDALyGd7r3h08YKg/viewform?hl=en&formkey=dG9kcGIxRFpSS0NhQWM4UjA0V0VkNGc6MQ#gid=0) - -### 4. Get trackable point data (MTA bus data) into elasticsearch -- You'll be using the script: `https://github.com/thomasneirynck/mtatracks` to harvest -live bus data to populate the system. Clone the repo and follow the instructions in -the readme to set up. -- Using the MTA key you obtained in the previous step, the final command to run -in a local terminal should look something like the following. This script loads large -quantities of data the frequency listed below (20000ms = 20s) or higher: -`node ./load_tracks.js -a -f 20000` - -### 5. Open required Kibana tabs -There are 3 separate tabs you'll need for a combination of loading and viewing the -data. Since you'll be jumping between them, it might be easiest to just open them -upfront. Each is preceded by `https://localhost:5601//app/`: -- Stack Management > Data Views: `management/kibana/dataViews` -- Stack Management > Alerts & Actions: `management/insightsAndAlerting/triggersActions/alerts` -- Maps: `maps` - -### 6 Create map to monitor alerts -- Go to the Maps app and create a new map -- Using GeoJSON Upload, upload the GeoJSON file located in the folder of the previously -cloned `mta_tracks` repo: `nyc-neighborhoods.geo.json`. Accept all of the default -settings and add the layer. -- You may want to click your newly added layer and select "Fit to data" so you can see the -boundaries you've added. -_ When finished uploading and adding the layer, save the map using a name of your -choice. -- Keep the Maps tab open, you'll come back to this - -### 7. Create data view for generated tracks -- Go to the data view tab to create a new data view. -- Give it the index name `mtatracks*` -- For `Time field` select `@timestamp` -- Click `Create data view` -- Leave this tab open, you'll come back to this - -### 8. Create containment alert -- Go to the Alerts tab and click `Create Alert` > `Tracking containment` -- Fill the side bar form top to bottom. This _should_ flow somewhat logically. In the top -section, set both `Check every` and `Notify every` to `1 minute`. - For `Notify`, leave -on default selected option `Only on status change`, this will notify only on newly -contained entities. - **Please note that `2 seconds` is an unusually quick interval but done here for demo - purposes. With real world data, setting an appropriate interval speed is highly dependent - upon the quantity, update frequency and complexity of data handled.** -- The default settings for `Select Entity` will mostly be correct. Select `mta_tracks*` -as the index you'd like to track. Use the defaults populated under -`Select entity` > `INDEX`, update `Select entity` > `BY` to `vehicle_ref`. -- For `Select boundary` > `INDEX`, select `nyc-neighborhoods` and all populated defaults. -- Under `Actions`, create an `Server log` action, then create a `Connector` which you can simply name -`Log test`. -- For `Run when`, the default `Tracking containment met` will work here. This will track -only points that are newly contained in the boundaries. -- Leave the log level at `Info` -- For the message, use the following sample message or one of your own: -``` -Entity: {{context.entityId}} with document ID: {{context.entityDocumentId}} has been recorded at location: {{context.entityLocation}} in boundary: {{context.containingBoundaryName}}({{context.containingBoundaryId}}) at {{context.entityDateTime}}. This was detected by the alerting framework at: {{context.detectionDateTime}}. -``` -- At the bottom right, click `Save`. Your alert should now be created! -- You should now be able to see alerts generated in your Kibana console log. - -### 9. Visually confirm your alerts with Maps -- Creating layers - - Using the source data below, you can create the following layers: - - Boundary data (`nyc-neighborhoods`) - - Boundary layer - - Original tracks data (`mtatracks*`) - - Last known location - - Geo-line track - - Boundary layer - - This layer should already be added from when you uploaded the GeoJSON - file earlier. If it's not already added, it can be added by selecting `Documents` - > `Data views` > `nyc-neighborhoods` then accept the defaults and add the layer. - - Vehicle tracks - - Add `Tracks` > `Data views` > `mtatracks*`, accept the defaults selected and set `Entity` > `entity_id`. Add the layer and style appropriately. - - Last known location - - Add `Documents` > `Data views` > `mtatracks*` and select `Show top hits per entity` - - For `Entity` select `entity_id` and add the layer. - - The only required setting on the following screen is to set `Sorting` to sort on `@timestamp` -- Update time scope of data - - Changing the refresh rate `Refresh every`: `4 seconds` keeps the layers updated and in particular - shows the latest values obtained in the `Top hits` layer - - The time picker should already be set to the default `15 minutes`, this is a good default but - can be adjusted up or down to see more or less data respectively -- General tips - - Style layers with contrasting colors to clearly see each - - Consider using icons for the `Top hits` vehicle movement layer - - Consider adding tooltips to layers to better understand the data in your layers. - - Save your Map anytime you've made any layer adjustments diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.test.ts index ae12f8079a876..16725769fa345 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.test.ts @@ -526,6 +526,7 @@ describe('fetchSearchSourceQuery', () => { }, test3: { count: 30, + customDescription: 'test3', }, }, }, diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.ts index 0ed3e146e43be..c37c547b040ea 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.ts @@ -248,5 +248,5 @@ export function updateFilterReferences( export function getSmallerDataViewSpec( dataView: DataView ): DiscoverAppLocatorParams['dataViewSpec'] { - return dataView.toMinimalSpec(); + return dataView.toMinimalSpec({ keepFieldAttrs: ['customLabel'] }); } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index f1fc60a9266f8..2e8ffba6e1d79 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -5011,204 +5011,205 @@ "management.settings.spaceCalloutSubtitle": "Les modifications seront uniquement appliquées à l'espace actuel. Ces paramètres sont destinés aux utilisateurs avancés, car des configurations incorrectes peuvent avoir une incidence négative sur des aspects de Kibana.", "management.settings.spaceCalloutTitle": "Les modifications affecteront l'espace actuel.", "management.settings.spaceSettingsTabTitle": "Paramètres de l'espace", - "monaco.esql.autocomplete.matchingFieldDefinition": "Utiliser pour correspondance avec {matchingField} de la politique", - "monaco.esql.divide.warning.divideByZero": "Impossible de diviser par zéro : {left}/{right}", - "monaco.esql.divide.warning.logOfNegativeValue": "Le log d'un nombre négatif est null : {value}", - "monaco.esql.divide.warning.zeroModule": "Le module par zéro peut renvoyer une valeur null : {left} % {right}", - "monaco.esql.quickfix.replaceWithSolution": "Vouliez-vous dire {solution} ?", - "monaco.esql.validation.expectedConstantValue": "L'argument de [{fn}] doit être une constante, reçu [{given}]", - "monaco.esql.validation.missingFunction": "Fonction inconnue [{name}]", - "monaco.esql.validation.noCombinationOfAggAndNonAggValues": "Impossible de combiner les valeurs agrégées et non agrégées dans [STATS], [{expression}] trouvé", - "monaco.esql.validation.noNestedArgumentSupport": "Les paramètres de la fonction agrégée doivent être un attribut, un littéral ou une fonction non agrégée ; trouvé [{name}] de type [{argType}]", - "monaco.esql.validation.statsNoAggFunction": "Au moins une fonction d'agrégation requise dans [STATS], [{expression}] trouvé", - "monaco.esql.validation.typeOverwrite": "La colonne [{field}] de type {fieldType} a été écrasée par un nouveau type : {newType}", - "monaco.esql.validation.unknowAggregateFunction": "Attendait une fonction ou un groupe agrégé mais a obtenu [{value}] de type [{type}]", - "monaco.esql.validation.unknownColumn": "Colonne inconnue[{name}]", - "monaco.esql.validation.unknownIndex": "Index inconnu [{name}]", - "monaco.esql.validation.unknownOption": "Option non valide pour {command} : [{option}]", - "monaco.esql.validation.unknownPolicy": "Politique [{name}] inconnue", - "monaco.esql.validation.unsupportedColumnTypeForCommand": "{command} ne prend en charge que les valeurs {type} {typeCount, plural, one {type} other {types}}, [{column}] de type [{givenType}] trouvé", - "monaco.esql.validation.unsupportedFieldType": "Le champ [{field}] ne peut pas être récupéré, il n'est pas pris en charge ou n'est pas indexé ; renvoi de valeur null", - "monaco.esql.validation.unsupportedFunctionForCommand": "{command} n'est pas compatible avec la fonction {name}", - "monaco.esql.validation.unsupportedFunctionforCommandOption": "{command} {option} n'est pas compatible avec la fonction {name}", - "monaco.esql.validation.unsupportedSetting": "Paramètre non pris en charge [{setting}], [{expected}] attendu", - "monaco.esql.validation.unsupportedSettingValue": "Valeur [{value}] non reconnue pour {command}, le mode doit être l'un de [{expected}]", - "monaco.esql.validation.unsupportedTypeForCommand": "{command} n'est pas compatible avec [{type}] dans l'expression [{value}]", - "monaco.esql.validation.wildcardNotSupportedForCommand": "L'utilisation de caractères génériques (*) dans {command} n'est pas autorisée [{value}]", - "monaco.esql.validation.wildcardNotSupportedForFunction": "L'utilisation de caractères génériques (*) dans {name} n'est pas autorisée", - "monaco.esql.validation.wrongArgumentType": "L'argument de [{name}] doit être [{argType}], valeur [{value}] trouvée de type [{givenType}]", - "monaco.esql.validation.wrongDissectOptionArgumentType": "Valeur non valide pour DISSECT append_separator : une chaîne était attendue mais il s'agissait de [{value}]", - "monaco.esql.validation.wrongMetadataArgumentType": "Le champ de métadonnées [{value}] n'est pas disponible. Les champs de métadonnées disponibles sont : [{availableFields}]", - "monaco.esql.autocomplete.aPatternString": "Une chaîne modèle", - "monaco.esql.autocomplete.colonDoc": "Deux points (:)", - "monaco.esql.autocomplete.commaDoc": "Virgule (,)", - "monaco.esql.autocomplete.constantDefinition": "Constant", - "monaco.esql.autocomplete.createNewPolicy": "Cliquez pour créer", - "monaco.esql.autocomplete.declarationLabel": "Déclaration :", - "monaco.esql.autocomplete.examplesLabel": "Exemples :", - "monaco.esql.autocomplete.fieldDefinition": "Champ spécifié par le tableau d'entrée", - "monaco.esql.autocomplete.listDoc": "Liste d'éléments (…)", - "monaco.esql.autocomplete.newVarDoc": "Définir une nouvelle variable", - "monaco.esql.autocomplete.noPoliciesLabel": "Pas de stratégie disponible", - "monaco.esql.autocomplete.noPoliciesLabelsFound": "Cliquez pour créer", - "monaco.esql.autocomplete.pipeDoc": "Barre verticale (|)", - "monaco.esql.autocomplete.semiColonDoc": "Point-virgule (;)", - "monaco.esql.autocomplete.sourceDefinition": "Index", - "monaco.esql.autocomplete.variableDefinition": "Variable spécifiée par l'utilisateur dans la requête ES|QL", - "monaco.esql.definition.addDoc": "Ajouter (+)", - "monaco.esql.definition.andDoc": "et", - "monaco.esql.definition.assignDoc": "Affecter (=)", - "monaco.esql.definition.divideDoc": "Diviser (/)", - "monaco.esql.definition.equalToDoc": "Égal à", - "monaco.esql.definition.functionsDoc": "Afficher les fonctions ES|QL disponibles avec signatures", - "monaco.esql.definition.greaterThanDoc": "Supérieur à", - "monaco.esql.definition.greaterThanOrEqualToDoc": "Supérieur ou égal à", - "monaco.esql.definition.inDoc": "Teste si la valeur d'une expression est contenue dans une liste d'autres expressions", - "monaco.esql.definition.infoDoc": "Afficher des informations sur le nœud ES actuel", - "monaco.esql.definition.isNotNullDoc": "Prédicat pour la comparaison NULL : renvoie \"true\" si la valeur n'est pas NULL", - "monaco.esql.definition.isNullDoc": "Prédicat pour la comparaison NULL : renvoie \"true\" si la valeur est NULL", - "monaco.esql.definition.lessThanDoc": "Inférieur à", - "monaco.esql.definition.lessThanOrEqualToDoc": "Inférieur ou égal à", - "monaco.esql.definition.likeDoc": "Filtrer les données en fonction des modèles de chaînes", - "monaco.esql.definition.moduleDoc": "Module (%)", - "monaco.esql.definition.multiplyDoc": "Multiplier (*)", - "monaco.esql.definition.notDoc": "Non", - "monaco.esql.definition.notEqualToDoc": "Différent de", - "monaco.esql.definition.orDoc": "ou", - "monaco.esql.definition.rlikeDoc": "Filtrer les données en fonction des expressions régulières des chaînes", - "monaco.esql.definition.subtractDoc": "Subtract (-)", - "monaco.esql.definitions.absDoc": "Renvoie la valeur absolue.", - "monaco.esql.definitions.acosDoc": "Fonction trigonométrique cosinus inverse", - "monaco.esql.definitions.appendSeparatorDoc": "Le ou les caractères qui séparent les champs ajoutés. A pour valeur par défaut une chaîne vide (\"\").", - "monaco.esql.definitions.asDoc": "En tant que", - "monaco.esql.definitions.asinDoc": "Fonction trigonométrique sinus inverse", - "monaco.esql.definitions.atan2Doc": "L'angle entre l'axe positif des x et le rayon allant de l'origine au point (x , y) dans le plan cartésien", - "monaco.esql.definitions.atanDoc": "Fonction trigonométrique tangente inverse", - "monaco.esql.definitions.autoBucketDoc": "Groupement automatique des dates en fonction d'une plage et d'un compartiment cible donnés.", - "monaco.esql.definitions.avgDoc": "Renvoie la moyenne des valeurs dans un champ", - "monaco.esql.definitions.byDoc": "Par", - "monaco.esql.definitions.caseDoc": "Accepte les paires de conditions et de valeurs. La fonction renvoie la valeur correspondant à la première condition évaluée à `true` (vraie). Si le nombre d'arguments est impair, le dernier argument est la valeur par défaut qui est renvoyée si aucune condition ne correspond.", - "monaco.esql.definitions.ccqAnyDoc": "L'enrichissement a lieu sur n'importe quel cluster", - "monaco.esql.definitions.ccqCoordinatorDoc": "L'enrichissement a lieu sur le cluster de coordination qui reçoit une requête ES|QL", - "monaco.esql.definitions.ccqModeDoc": "Mode de requête inter-clusters", - "monaco.esql.definitions.ccqRemoteDoc": "L'enrichissement a lieu sur le cluster qui héberge l'index cible.", - "monaco.esql.definitions.ceilDoc": "Arrondir un nombre à l'entier supérieur.", - "monaco.esql.definitions.cidrMatchDoc": "La fonction utilise un premier paramètre de type adresse IP, puis un ou plusieurs paramètres évalués en fonction d'une spécification CIDR.", - "monaco.esql.definitions.coalesceDoc": "Renvoie la première valeur non nulle.", - "monaco.esql.definitions.concatDoc": "Concatène deux ou plusieurs chaînes.", - "monaco.esql.definitions.cosDoc": "Fonction trigonométrique cosinus", - "monaco.esql.definitions.coshDoc": "Fonction hyperbolique cosinus", - "monaco.esql.definitions.countDistinctDoc": "Renvoie le décompte des valeurs distinctes dans un champ.", - "monaco.esql.definitions.countDoc": "Renvoie le décompte des valeurs dans un champ.", - "monaco.esql.definitions.dateDurationDefinition.day": "Jour", - "monaco.esql.definitions.dateDurationDefinition.days": "Jours (pluriel)", - "monaco.esql.definitions.dateDurationDefinition.hour": "Heure", - "monaco.esql.definitions.dateDurationDefinition.hours": "Heures (pluriel)", - "monaco.esql.definitions.dateDurationDefinition.millisecond": "Milliseconde", - "monaco.esql.definitions.dateDurationDefinition.milliseconds": "Millisecondes (pluriel)", - "monaco.esql.definitions.dateDurationDefinition.minute": "Minute", - "monaco.esql.definitions.dateDurationDefinition.minutes": "Minutes (pluriel)", - "monaco.esql.definitions.dateDurationDefinition.month": "Mois", - "monaco.esql.definitions.dateDurationDefinition.months": "Mois (pluriel)", - "monaco.esql.definitions.dateDurationDefinition.second": "Seconde", - "monaco.esql.definitions.dateDurationDefinition.seconds": "Secondes (pluriel)", - "monaco.esql.definitions.dateDurationDefinition.week": "Semaine", - "monaco.esql.definitions.dateDurationDefinition.weeks": "Semaines (pluriel)", - "monaco.esql.definitions.dateDurationDefinition.year": "An", - "monaco.esql.definitions.dateDurationDefinition.years": "Ans (pluriel)", - "monaco.esql.definitions.dateExtractDoc": "Extrait des parties d'une date, telles que l'année, le mois, le jour, l'heure. Les types de champs pris en charge sont ceux fournis par la fonction \"java.time.temporal.ChronoField\"", - "monaco.esql.definitions.dateFormatDoc": "Renvoie une représentation sous forme de chaîne d'une date dans le format fourni. Si aucun format n'est indiqué, le format \"yyyy-MM-dd'T'HH:mm:ss.SSSZ\" est utilisé.", - "monaco.esql.definitions.dateParseDoc": "Analyser les dates à partir de chaînes.", - "monaco.esql.definitions.dateTruncDoc": "Arrondit une date à l'intervalle le plus proche. Les intervalles peuvent être exprimés à l'aide de la syntaxe littérale timespan.", - "monaco.esql.definitions.dissectDoc": "Extrait de multiples valeurs de chaîne à partir d'une entrée de chaîne unique, suivant un modèle", - "monaco.esql.definitions.dropDoc": "Supprime les colonnes", - "monaco.esql.definitions.eDoc": "Nombre d'Euler.", - "monaco.esql.definitions.endsWithDoc": "Renvoie une valeur booléenne qui indique si une chaîne de mots-clés se termine par une autre chaîne :", - "monaco.esql.definitions.enrichDoc": "Enrichissez le tableau à l'aide d'un autre tableau. Avant de pouvoir utiliser l'enrichissement, vous devez créer et exécuter une politique d'enrichissement.", - "monaco.esql.definitions.evalDoc": "Calcule une expression et place la valeur résultante dans un champ de résultats de recherche.", - "monaco.esql.definitions.floorDoc": "Arrondir un nombre à l'entier inférieur.", - "monaco.esql.definitions.fromDoc": "Récupère les données à partir d'un ou plusieurs flux de données, index ou alias. Dans une requête ou une sous-requête, vous devez utiliser d'abord la commande from, et cette dernière ne nécessite pas de barre verticale au début. Par exemple, pour récupérer des données d'un index :", - "monaco.esql.definitions.greatestDoc": "Renvoie la valeur maximale de plusieurs colonnes.", - "monaco.esql.definitions.grokDoc": "Extrait de multiples valeurs de chaîne à partir d'une entrée de chaîne unique, suivant un modèle", - "monaco.esql.definitions.keepDoc": "Réarrange les champs dans le tableau d'entrée en appliquant les clauses \"KEEP\" dans les champs", - "monaco.esql.definitions.leastDoc": "Renvoie la valeur minimale de plusieurs colonnes.", - "monaco.esql.definitions.leftDoc": "Renvoyer la sous-chaîne qui extrait la longueur des caractères de la chaîne en partant de la gauche.", - "monaco.esql.definitions.lengthDoc": "Renvoie la longueur des caractères d'une chaîne.", - "monaco.esql.definitions.limitDoc": "Renvoie les premiers résultats de recherche, dans l'ordre de recherche, en fonction de la \"limite\" spécifiée.", - "monaco.esql.definitions.log10Doc": "Renvoie le log de base 10.", - "monaco.esql.definitions.logDoc": "La fonction scalaire log(based, value) renvoie le logarithme d'une valeur pour une base spécifique, comme défini dans l'argument", - "monaco.esql.definitions.ltrimDoc": "Retire les espaces au début des chaînes.", - "monaco.esql.definitions.maxDoc": "Renvoie la valeur maximale dans un champ.", - "monaco.esql.definitions.medianDeviationDoc": "Renvoie la médiane de chaque écart de point de données par rapport à la médiane de l'ensemble de l'échantillon.", - "monaco.esql.definitions.medianDoc": "Renvoie le 50centile.", - "monaco.esql.definitions.metadataDoc": "Métadonnées", - "monaco.esql.definitions.minDoc": "Renvoie la valeur minimale dans un champ.", - "monaco.esql.definitions.mvAvgDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la moyenne de toutes les valeurs.", - "monaco.esql.definitions.mvConcatDoc": "Convertit un champ de type chaîne multivalué en un champ à valeur unique comprenant la concaténation de toutes les valeurs, séparées par un délimiteur", - "monaco.esql.definitions.mvCountDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant le total du nombre de valeurs", - "monaco.esql.definitions.mvDedupeDoc": "Supprime les doublons d'un champ multivalué", - "monaco.esql.definitions.mvExpandDoc": "Développe des champs comportant des valeurs multiples en indiquant une valeur par ligne et en dupliquant les autres champs", - "monaco.esql.definitions.mvFirstDoc": "Réduit un champ multivalué en un champ à valeur unique comprenant la première valeur.", - "monaco.esql.definitions.mvLastDoc": "Réduit un champ multivalué en un champ à valeur unique comprenant la dernière valeur.", - "monaco.esql.definitions.mvMaxDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la valeur maximale.", - "monaco.esql.definitions.mvMedianDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la valeur médiane.", - "monaco.esql.definitions.mvMinDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la valeur minimale.", - "monaco.esql.definitions.mvSumDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la somme de toutes les valeurs.", - "monaco.esql.definitions.nowDoc": "Renvoie la date et l'heure actuelles.", - "monaco.esql.definitions.onDoc": "Activé", - "monaco.esql.definitions.percentiletDoc": "Renvoie le n-ième centile d'un champ.", - "monaco.esql.definitions.piDoc": "Le rapport entre la circonférence et le diamètre d'un cercle.", - "monaco.esql.definitions.powDoc": "Renvoie la valeur d'une base (premier argument) élevée à une puissance (deuxième argument).", - "monaco.esql.definitions.renameDoc": "Attribue un nouveau nom à une ancienne colonne", - "monaco.esql.definitions.replaceDoc": "La fonction remplace dans la chaîne (1er argument) toutes les correspondances avec l'expression régulière (2e argument) par la chaîne de remplacement (3e argument). Si l'un des arguments est NULL, le résultat est NULL.", - "monaco.esql.definitions.rightDoc": "Renvoyer la sous-chaîne qui extrait la longueur des caractères de la chaîne en partant de la droite.", - "monaco.esql.definitions.roundDoc": "Renvoie un nombre arrondi à la décimale, spécifié par la valeur entière la plus proche. La valeur par défaut est arrondie à un entier.", - "monaco.esql.definitions.rowDoc": "Renvoie une ligne contenant une ou plusieurs colonnes avec les valeurs que vous spécifiez. Cette commande peut s'avérer utile pour les tests.", - "monaco.esql.definitions.rtrimDoc": "Supprime les espaces à la fin des chaînes.", - "monaco.esql.definitions.showDoc": "Renvoie des informations sur le déploiement et ses capacités", - "monaco.esql.definitions.sinDoc": "Fonction trigonométrique sinus.", - "monaco.esql.definitions.sinhDoc": "Fonction hyperbolique sinus.", - "monaco.esql.definitions.sortDoc": "Trie tous les résultats en fonction des champs spécifiés. Par défaut, les valeurs null sont considérées comme supérieures à toutes les autres valeurs. Avec l'ordre de tri croissant, les valeurs null sont classées en dernier. Avec l'ordre de tri décroissant, elles sont classées en premier. Pour modifier cet ordre, utilisez NULLS FIRST ou NULLS LAST", - "monaco.esql.definitions.splitDoc": "Divise une chaîne de valeur unique en plusieurs chaînes.", - "monaco.esql.definitions.sqrtDoc": "Renvoie la racine carrée d'un nombre. ", - "monaco.esql.definitions.startsWithDoc": "Renvoie un booléen qui indique si une chaîne de mot-clés débute par une autre chaîne.", - "monaco.esql.definitions.statsDoc": "Calcule les statistiques agrégées, telles que la moyenne, le décompte et la somme, sur l'ensemble des résultats de recherche entrants. Comme pour l'agrégation SQL, si la commande stats est utilisée sans clause BY, une seule ligne est renvoyée, qui est l'agrégation de tout l'ensemble des résultats de recherche entrants. Lorsque vous utilisez une clause BY, une ligne est renvoyée pour chaque valeur distincte dans le champ spécifié dans la clause BY. La commande stats renvoie uniquement les champs dans l'agrégation, et vous pouvez utiliser un large éventail de fonctions statistiques avec la commande stats. Lorsque vous effectuez plusieurs agrégations, séparez chacune d'entre elle par une virgule.", - "monaco.esql.definitions.stCentroidDoc": "Renvoie le décompte des valeurs distinctes dans un champ.", - "monaco.esql.definitions.substringDoc": "Renvoie la sous-chaîne d'une chaîne, délimitée en fonction d'une position de départ et d'une longueur facultative.", - "monaco.esql.definitions.sumDoc": "Renvoie la somme des valeurs dans un champ.", - "monaco.esql.definitions.tanDoc": "Fonction trigonométrique tangente.", - "monaco.esql.definitions.tanhDoc": "Fonction hyperbolique tangente.", - "monaco.esql.definitions.tauDoc": "Le rapport entre la circonférence et le rayon d'un cercle.", - "monaco.esql.definitions.toBooleanDoc": "Convertit en booléen.", - "monaco.esql.definitions.toCartesianPointDoc": "Convertit la valeur d'une entrée en une valeur \"point\".", - "monaco.esql.definitions.toCartesianshapeDoc": "Convertit la valeur d'une entrée en une valeur cartesian_shape.", - "monaco.esql.definitions.toDateTimeDoc": "Convertit en date.", - "monaco.esql.definitions.toDegreesDoc": "Convertit en degrés", - "monaco.esql.definitions.toDoubleDoc": "Convertit en double.", - "monaco.esql.definitions.toGeopointDoc": "Convertit en une valeur geo_point.", - "monaco.esql.definitions.toGeoshapeDoc": "Convertit la valeur d'une entrée en une valeur geo_shape.", - "monaco.esql.definitions.toIntegerDoc": "Convertit en nombre entier.", - "monaco.esql.definitions.toIpDoc": "Convertit en ip.", - "monaco.esql.definitions.toLongDoc": "Convertit en long.", - "monaco.esql.definitions.toLowerDoc": "Renvoie une nouvelle chaîne représentant la chaîne d'entrée convertie en minuscules.", - "monaco.esql.definitions.toRadiansDoc": "Convertit en radians", - "monaco.esql.definitions.toStringDoc": "Convertit en chaîne.", - "monaco.esql.definitions.toUnsignedLongDoc": "Convertit en long non signé.", - "monaco.esql.definitions.toUpperDoc": "Renvoie une nouvelle chaîne représentant la chaîne d'entrée convertie en majuscules.", - "monaco.esql.definitions.toVersionDoc": "Convertit en version.", - "monaco.esql.definitions.trimDoc": "Supprime les espaces de début et de fin d'une chaîne.", - "monaco.esql.definitions.whereDoc": "Utilise \"predicate-expressions\" pour filtrer les résultats de recherche. Une expression predicate, lorsqu'elle est évaluée, renvoie TRUE ou FALSE. La commande where renvoie uniquement les résultats qui donnent la valeur TRUE. Par exemple, pour filtrer les résultats pour une valeur de champ spécifique", - "monaco.esql.definitions.withDoc": "Avec", + "kbn-esql-validation-autocomplete.esql.autocomplete.matchingFieldDefinition": "Utiliser pour correspondance avec {matchingField} de la politique", + "kbn-esql-validation-autocomplete.esql.divide.warning.divideByZero": "Impossible de diviser par zéro : {left}/{right}", + "kbn-esql-validation-autocomplete.esql.divide.warning.logOfNegativeValue": "Le log d'un nombre négatif est null : {value}", + "kbn-esql-validation-autocomplete.esql.divide.warning.zeroModule": "Le module par zéro peut renvoyer une valeur null : {left} % {right}", + "kbn-esql-validation-autocomplete.esql.quickfix.replaceWithSolution": "Vouliez-vous dire {solution} ?", + "kbn-esql-validation-autocomplete.esql.validation.expectedConstantValue": "L'argument de [{fn}] doit être une constante, reçu [{given}]", + "kbn-esql-validation-autocomplete.esql.validation.missingFunction": "Fonction inconnue [{name}]", + "kbn-esql-validation-autocomplete.esql.validation.noCombinationOfAggAndNonAggValues": "Impossible de combiner les valeurs agrégées et non agrégées dans [STATS], [{expression}] trouvé", + "kbn-esql-validation-autocomplete.esql.validation.noNestedArgumentSupport": "Les paramètres de la fonction agrégée doivent être un attribut, un littéral ou une fonction non agrégée ; trouvé [{name}] de type [{argType}]", + "kbn-esql-validation-autocomplete.esql.validation.statsNoAggFunction": "Au moins une fonction d'agrégation requise dans [STATS], [{expression}] trouvé", + "kbn-esql-validation-autocomplete.esql.validation.typeOverwrite": "La colonne [{field}] de type {fieldType} a été écrasée par un nouveau type : {newType}", + "kbn-esql-validation-autocomplete.esql.validation.unknowAggregateFunction": "Attendait une fonction ou un groupe agrégé mais a obtenu [{value}] de type [{type}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownColumn": "Colonne inconnue[{name}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownIndex": "Index inconnu [{name}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownOption": "Option non valide pour {command} : [{option}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownPolicy": "Politique [{name}] inconnue", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedColumnTypeForCommand": "{command} ne prend en charge que les valeurs {type} {typeCount, plural, one {type} other {types}}, [{column}] de type [{givenType}] trouvé", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedFieldType": "Le champ [{field}] ne peut pas être récupéré, il n'est pas pris en charge ou n'est pas indexé ; renvoi de valeur null", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedFunctionForCommand": "{command} n'est pas compatible avec la fonction {name}", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedFunctionforCommandOption": "{command} {option} n'est pas compatible avec la fonction {name}", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedSetting": "Paramètre non pris en charge [{setting}], [{expected}] attendu", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedSettingValue": "Valeur [{value}] non reconnue pour {command}, le mode doit être l'un de [{expected}]", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedTypeForCommand": "{command} n'est pas compatible avec [{type}] dans l'expression [{value}]", + "kbn-esql-validation-autocomplete.esql.validation.wildcardNotSupportedForCommand": "L'utilisation de caractères génériques (*) dans {command} n'est pas autorisée [{value}]", + "kbn-esql-validation-autocomplete.esql.validation.wildcardNotSupportedForFunction": "L'utilisation de caractères génériques (*) dans {name} n'est pas autorisée", + "kbn-esql-validation-autocomplete.esql.validation.wrongArgumentType": "L'argument de [{name}] doit être [{argType}], valeur [{value}] trouvée de type [{givenType}]", + "kbn-esql-validation-autocomplete.esql.validation.wrongDissectOptionArgumentType": "Valeur non valide pour DISSECT append_separator : une chaîne était attendue mais il s'agissait de [{value}]", + "kbn-esql-validation-autocomplete.esql.validation.wrongMetadataArgumentType": "Le champ de métadonnées [{value}] n'est pas disponible. Les champs de métadonnées disponibles sont : [{availableFields}]", + "kbn-esql-validation-autocomplete.esql.autocomplete.aPatternString": "Une chaîne modèle", + "kbn-esql-validation-autocomplete.esql.autocomplete.colonDoc": "Deux points (:)", + "kbn-esql-validation-autocomplete.esql.autocomplete.commaDoc": "Virgule (,)", + "kbn-esql-validation-autocomplete.esql.autocomplete.constantDefinition": "Constant", + "kbn-esql-validation-autocomplete.esql.autocomplete.createNewPolicy": "Cliquez pour créer", + "kbn-esql-validation-autocomplete.esql.autocomplete.declarationLabel": "Déclaration :", + "kbn-esql-validation-autocomplete.esql.autocomplete.examplesLabel": "Exemples :", + "kbn-esql-validation-autocomplete.esql.autocomplete.fieldDefinition": "Champ spécifié par le tableau d'entrée", + "kbn-esql-validation-autocomplete.esql.autocomplete.listDoc": "Liste d'éléments (…)", + "kbn-esql-validation-autocomplete.esql.autocomplete.newVarDoc": "Définir une nouvelle variable", + "kbn-esql-validation-autocomplete.esql.autocomplete.policyDefinition": "Politique définie selon {count, plural, one {index} many {index système non migrés} other {des index}} : {indices}", + "kbn-esql-validation-autocomplete.esql.autocomplete.noPoliciesLabel": "Pas de stratégie disponible", + "kbn-esql-validation-autocomplete.esql.autocomplete.noPoliciesLabelsFound": "Cliquez pour créer", + "kbn-esql-validation-autocomplete.esql.autocomplete.pipeDoc": "Barre verticale (|)", + "kbn-esql-validation-autocomplete.esql.autocomplete.semiColonDoc": "Point-virgule (;)", + "kbn-esql-validation-autocomplete.esql.autocomplete.sourceDefinition": "Index", + "kbn-esql-validation-autocomplete.esql.autocomplete.variableDefinition": "Variable spécifiée par l'utilisateur dans la requête ES|QL", + "kbn-esql-validation-autocomplete.esql.definition.addDoc": "Ajouter (+)", + "kbn-esql-validation-autocomplete.esql.definition.andDoc": "et", + "kbn-esql-validation-autocomplete.esql.definition.assignDoc": "Affecter (=)", + "kbn-esql-validation-autocomplete.esql.definition.divideDoc": "Diviser (/)", + "kbn-esql-validation-autocomplete.esql.definition.equalToDoc": "Égal à", + "kbn-esql-validation-autocomplete.esql.definition.functionsDoc": "Afficher les fonctions ES|QL disponibles avec signatures", + "kbn-esql-validation-autocomplete.esql.definition.greaterThanDoc": "Supérieur à", + "kbn-esql-validation-autocomplete.esql.definition.greaterThanOrEqualToDoc": "Supérieur ou égal à", + "kbn-esql-validation-autocomplete.esql.definition.inDoc": "Teste si la valeur d'une expression est contenue dans une liste d'autres expressions", + "kbn-esql-validation-autocomplete.esql.definition.infoDoc": "Afficher des informations sur le nœud ES actuel", + "kbn-esql-validation-autocomplete.esql.definition.isNotNullDoc": "Prédicat pour la comparaison NULL : renvoie \"true\" si la valeur n'est pas NULL", + "kbn-esql-validation-autocomplete.esql.definition.isNullDoc": "Prédicat pour la comparaison NULL : renvoie \"true\" si la valeur est NULL", + "kbn-esql-validation-autocomplete.esql.definition.lessThanDoc": "Inférieur à", + "kbn-esql-validation-autocomplete.esql.definition.lessThanOrEqualToDoc": "Inférieur ou égal à", + "kbn-esql-validation-autocomplete.esql.definition.likeDoc": "Filtrer les données en fonction des modèles de chaînes", + "kbn-esql-validation-autocomplete.esql.definition.moduleDoc": "Module (%)", + "kbn-esql-validation-autocomplete.esql.definition.multiplyDoc": "Multiplier (*)", + "kbn-esql-validation-autocomplete.esql.definition.notDoc": "Non", + "kbn-esql-validation-autocomplete.esql.definition.notEqualToDoc": "Différent de", + "kbn-esql-validation-autocomplete.esql.definition.orDoc": "ou", + "kbn-esql-validation-autocomplete.esql.definition.rlikeDoc": "Filtrer les données en fonction des expressions régulières des chaînes", + "kbn-esql-validation-autocomplete.esql.definition.subtractDoc": "Subtract (-)", + "kbn-esql-validation-autocomplete.esql.definitions.absDoc": "Renvoie la valeur absolue.", + "kbn-esql-validation-autocomplete.esql.definitions.acosDoc": "Fonction trigonométrique cosinus inverse", + "kbn-esql-validation-autocomplete.esql.definitions.appendSeparatorDoc": "Le ou les caractères qui séparent les champs ajoutés. A pour valeur par défaut une chaîne vide (\"\").", + "kbn-esql-validation-autocomplete.esql.definitions.asDoc": "En tant que", + "kbn-esql-validation-autocomplete.esql.definitions.asinDoc": "Fonction trigonométrique sinus inverse", + "kbn-esql-validation-autocomplete.esql.definitions.atan2Doc": "L'angle entre l'axe positif des x et le rayon allant de l'origine au point (x , y) dans le plan cartésien", + "kbn-esql-validation-autocomplete.esql.definitions.atanDoc": "Fonction trigonométrique tangente inverse", + "kbn-esql-validation-autocomplete.esql.definitions.autoBucketDoc": "Groupement automatique des dates en fonction d'une plage et d'un compartiment cible donnés.", + "kbn-esql-validation-autocomplete.esql.definitions.avgDoc": "Renvoie la moyenne des valeurs dans un champ", + "kbn-esql-validation-autocomplete.esql.definitions.byDoc": "Par", + "kbn-esql-validation-autocomplete.esql.definitions.caseDoc": "Accepte les paires de conditions et de valeurs. La fonction renvoie la valeur correspondant à la première condition évaluée à `true` (vraie). Si le nombre d'arguments est impair, le dernier argument est la valeur par défaut qui est renvoyée si aucune condition ne correspond.", + "kbn-esql-validation-autocomplete.esql.definitions.ccqAnyDoc": "L'enrichissement a lieu sur n'importe quel cluster", + "kbn-esql-validation-autocomplete.esql.definitions.ccqCoordinatorDoc": "L'enrichissement a lieu sur le cluster de coordination qui reçoit une requête ES|QL", + "kbn-esql-validation-autocomplete.esql.definitions.ccqModeDoc": "Mode de requête inter-clusters", + "kbn-esql-validation-autocomplete.esql.definitions.ccqRemoteDoc": "L'enrichissement a lieu sur le cluster qui héberge l'index cible.", + "kbn-esql-validation-autocomplete.esql.definitions.ceilDoc": "Arrondir un nombre à l'entier supérieur.", + "kbn-esql-validation-autocomplete.esql.definitions.cidrMatchDoc": "La fonction utilise un premier paramètre de type adresse IP, puis un ou plusieurs paramètres évalués en fonction d'une spécification CIDR.", + "kbn-esql-validation-autocomplete.esql.definitions.coalesceDoc": "Renvoie la première valeur non nulle.", + "kbn-esql-validation-autocomplete.esql.definitions.concatDoc": "Concatène deux ou plusieurs chaînes.", + "kbn-esql-validation-autocomplete.esql.definitions.cosDoc": "Fonction trigonométrique cosinus", + "kbn-esql-validation-autocomplete.esql.definitions.coshDoc": "Fonction hyperbolique cosinus", + "kbn-esql-validation-autocomplete.esql.definitions.countDistinctDoc": "Renvoie le décompte des valeurs distinctes dans un champ.", + "kbn-esql-validation-autocomplete.esql.definitions.countDoc": "Renvoie le décompte des valeurs dans un champ.", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.day": "Jour", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.days": "Jours (pluriel)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.hour": "Heure", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.hours": "Heures (pluriel)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.millisecond": "Milliseconde", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.milliseconds": "Millisecondes (pluriel)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.minute": "Minute", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.minutes": "Minutes (pluriel)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.month": "Mois", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.months": "Mois (pluriel)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.second": "Seconde", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.seconds": "Secondes (pluriel)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.week": "Semaine", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.weeks": "Semaines (pluriel)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.year": "An", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.years": "Ans (pluriel)", + "kbn-esql-validation-autocomplete.esql.definitions.dateExtractDoc": "Extrait des parties d'une date, telles que l'année, le mois, le jour, l'heure. Les types de champs pris en charge sont ceux fournis par la fonction \"java.time.temporal.ChronoField\"", + "kbn-esql-validation-autocomplete.esql.definitions.dateFormatDoc": "Renvoie une représentation sous forme de chaîne d'une date dans le format fourni. Si aucun format n'est indiqué, le format \"yyyy-MM-dd'T'HH:mm:ss.SSSZ\" est utilisé.", + "kbn-esql-validation-autocomplete.esql.definitions.dateParseDoc": "Analyser les dates à partir de chaînes.", + "kbn-esql-validation-autocomplete.esql.definitions.dateTruncDoc": "Arrondit une date à l'intervalle le plus proche. Les intervalles peuvent être exprimés à l'aide de la syntaxe littérale timespan.", + "kbn-esql-validation-autocomplete.esql.definitions.dissectDoc": "Extrait de multiples valeurs de chaîne à partir d'une entrée de chaîne unique, suivant un modèle", + "kbn-esql-validation-autocomplete.esql.definitions.dropDoc": "Supprime les colonnes", + "kbn-esql-validation-autocomplete.esql.definitions.eDoc": "Nombre d'Euler.", + "kbn-esql-validation-autocomplete.esql.definitions.endsWithDoc": "Renvoie une valeur booléenne qui indique si une chaîne de mots-clés se termine par une autre chaîne :", + "kbn-esql-validation-autocomplete.esql.definitions.enrichDoc": "Enrichissez le tableau à l'aide d'un autre tableau. Avant de pouvoir utiliser l'enrichissement, vous devez créer et exécuter une politique d'enrichissement.", + "kbn-esql-validation-autocomplete.esql.definitions.evalDoc": "Calcule une expression et place la valeur résultante dans un champ de résultats de recherche.", + "kbn-esql-validation-autocomplete.esql.definitions.floorDoc": "Arrondir un nombre à l'entier inférieur.", + "kbn-esql-validation-autocomplete.esql.definitions.fromDoc": "Récupère les données à partir d'un ou plusieurs flux de données, index ou alias. Dans une requête ou une sous-requête, vous devez utiliser d'abord la commande from, et cette dernière ne nécessite pas de barre verticale au début. Par exemple, pour récupérer des données d'un index :", + "kbn-esql-validation-autocomplete.esql.definitions.greatestDoc": "Renvoie la valeur maximale de plusieurs colonnes.", + "kbn-esql-validation-autocomplete.esql.definitions.grokDoc": "Extrait de multiples valeurs de chaîne à partir d'une entrée de chaîne unique, suivant un modèle", + "kbn-esql-validation-autocomplete.esql.definitions.keepDoc": "Réarrange les champs dans le tableau d'entrée en appliquant les clauses \"KEEP\" dans les champs", + "kbn-esql-validation-autocomplete.esql.definitions.leastDoc": "Renvoie la valeur minimale de plusieurs colonnes.", + "kbn-esql-validation-autocomplete.esql.definitions.leftDoc": "Renvoyer la sous-chaîne qui extrait la longueur des caractères de la chaîne en partant de la gauche.", + "kbn-esql-validation-autocomplete.esql.definitions.lengthDoc": "Renvoie la longueur des caractères d'une chaîne.", + "kbn-esql-validation-autocomplete.esql.definitions.limitDoc": "Renvoie les premiers résultats de recherche, dans l'ordre de recherche, en fonction de la \"limite\" spécifiée.", + "kbn-esql-validation-autocomplete.esql.definitions.log10Doc": "Renvoie le log de base 10.", + "kbn-esql-validation-autocomplete.esql.definitions.logDoc": "La fonction scalaire log(based, value) renvoie le logarithme d'une valeur pour une base spécifique, comme défini dans l'argument", + "kbn-esql-validation-autocomplete.esql.definitions.ltrimDoc": "Retire les espaces au début des chaînes.", + "kbn-esql-validation-autocomplete.esql.definitions.maxDoc": "Renvoie la valeur maximale dans un champ.", + "kbn-esql-validation-autocomplete.esql.definitions.medianDeviationDoc": "Renvoie la médiane de chaque écart de point de données par rapport à la médiane de l'ensemble de l'échantillon.", + "kbn-esql-validation-autocomplete.esql.definitions.medianDoc": "Renvoie le 50centile.", + "kbn-esql-validation-autocomplete.esql.definitions.metadataDoc": "Métadonnées", + "kbn-esql-validation-autocomplete.esql.definitions.minDoc": "Renvoie la valeur minimale dans un champ.", + "kbn-esql-validation-autocomplete.esql.definitions.mvAvgDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la moyenne de toutes les valeurs.", + "kbn-esql-validation-autocomplete.esql.definitions.mvConcatDoc": "Convertit un champ de type chaîne multivalué en un champ à valeur unique comprenant la concaténation de toutes les valeurs, séparées par un délimiteur", + "kbn-esql-validation-autocomplete.esql.definitions.mvCountDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant le total du nombre de valeurs", + "kbn-esql-validation-autocomplete.esql.definitions.mvDedupeDoc": "Supprime les doublons d'un champ multivalué", + "kbn-esql-validation-autocomplete.esql.definitions.mvExpandDoc": "Développe des champs comportant des valeurs multiples en indiquant une valeur par ligne et en dupliquant les autres champs", + "kbn-esql-validation-autocomplete.esql.definitions.mvFirstDoc": "Réduit un champ multivalué en un champ à valeur unique comprenant la première valeur.", + "kbn-esql-validation-autocomplete.esql.definitions.mvLastDoc": "Réduit un champ multivalué en un champ à valeur unique comprenant la dernière valeur.", + "kbn-esql-validation-autocomplete.esql.definitions.mvMaxDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la valeur maximale.", + "kbn-esql-validation-autocomplete.esql.definitions.mvMedianDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la valeur médiane.", + "kbn-esql-validation-autocomplete.esql.definitions.mvMinDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la valeur minimale.", + "kbn-esql-validation-autocomplete.esql.definitions.mvSumDoc": "Convertit un champ multivalué en un champ à valeur unique comprenant la somme de toutes les valeurs.", + "kbn-esql-validation-autocomplete.esql.definitions.nowDoc": "Renvoie la date et l'heure actuelles.", + "kbn-esql-validation-autocomplete.esql.definitions.onDoc": "Activé", + "kbn-esql-validation-autocomplete.esql.definitions.percentiletDoc": "Renvoie le n-ième centile d'un champ.", + "kbn-esql-validation-autocomplete.esql.definitions.piDoc": "Le rapport entre la circonférence et le diamètre d'un cercle.", + "kbn-esql-validation-autocomplete.esql.definitions.powDoc": "Renvoie la valeur d'une base (premier argument) élevée à une puissance (deuxième argument).", + "kbn-esql-validation-autocomplete.esql.definitions.renameDoc": "Attribue un nouveau nom à une ancienne colonne", + "kbn-esql-validation-autocomplete.esql.definitions.replaceDoc": "La fonction remplace dans la chaîne (1er argument) toutes les correspondances avec l'expression régulière (2e argument) par la chaîne de remplacement (3e argument). Si l'un des arguments est NULL, le résultat est NULL.", + "kbn-esql-validation-autocomplete.esql.definitions.rightDoc": "Renvoyer la sous-chaîne qui extrait la longueur des caractères de la chaîne en partant de la droite.", + "kbn-esql-validation-autocomplete.esql.definitions.roundDoc": "Renvoie un nombre arrondi à la décimale, spécifié par la valeur entière la plus proche. La valeur par défaut est arrondie à un entier.", + "kbn-esql-validation-autocomplete.esql.definitions.rowDoc": "Renvoie une ligne contenant une ou plusieurs colonnes avec les valeurs que vous spécifiez. Cette commande peut s'avérer utile pour les tests.", + "kbn-esql-validation-autocomplete.esql.definitions.rtrimDoc": "Supprime les espaces à la fin des chaînes.", + "kbn-esql-validation-autocomplete.esql.definitions.showDoc": "Renvoie des informations sur le déploiement et ses capacités", + "kbn-esql-validation-autocomplete.esql.definitions.sinDoc": "Fonction trigonométrique sinus.", + "kbn-esql-validation-autocomplete.esql.definitions.sinhDoc": "Fonction hyperbolique sinus.", + "kbn-esql-validation-autocomplete.esql.definitions.sortDoc": "Trie tous les résultats en fonction des champs spécifiés. Par défaut, les valeurs null sont considérées comme supérieures à toutes les autres valeurs. Avec l'ordre de tri croissant, les valeurs null sont classées en dernier. Avec l'ordre de tri décroissant, elles sont classées en premier. Pour modifier cet ordre, utilisez NULLS FIRST ou NULLS LAST", + "kbn-esql-validation-autocomplete.esql.definitions.splitDoc": "Divise une chaîne de valeur unique en plusieurs chaînes.", + "kbn-esql-validation-autocomplete.esql.definitions.sqrtDoc": "Renvoie la racine carrée d'un nombre. ", + "kbn-esql-validation-autocomplete.esql.definitions.startsWithDoc": "Renvoie un booléen qui indique si une chaîne de mot-clés débute par une autre chaîne.", + "kbn-esql-validation-autocomplete.esql.definitions.statsDoc": "Calcule les statistiques agrégées, telles que la moyenne, le décompte et la somme, sur l'ensemble des résultats de recherche entrants. Comme pour l'agrégation SQL, si la commande stats est utilisée sans clause BY, une seule ligne est renvoyée, qui est l'agrégation de tout l'ensemble des résultats de recherche entrants. Lorsque vous utilisez une clause BY, une ligne est renvoyée pour chaque valeur distincte dans le champ spécifié dans la clause BY. La commande stats renvoie uniquement les champs dans l'agrégation, et vous pouvez utiliser un large éventail de fonctions statistiques avec la commande stats. Lorsque vous effectuez plusieurs agrégations, séparez chacune d'entre elle par une virgule.", + "kbn-esql-validation-autocomplete.esql.definitions.stCentroidDoc": "Renvoie le décompte des valeurs distinctes dans un champ.", + "kbn-esql-validation-autocomplete.esql.definitions.substringDoc": "Renvoie la sous-chaîne d'une chaîne, délimitée en fonction d'une position de départ et d'une longueur facultative.", + "kbn-esql-validation-autocomplete.esql.definitions.sumDoc": "Renvoie la somme des valeurs dans un champ.", + "kbn-esql-validation-autocomplete.esql.definitions.tanDoc": "Fonction trigonométrique tangente.", + "kbn-esql-validation-autocomplete.esql.definitions.tanhDoc": "Fonction hyperbolique tangente.", + "kbn-esql-validation-autocomplete.esql.definitions.tauDoc": "Le rapport entre la circonférence et le rayon d'un cercle.", + "kbn-esql-validation-autocomplete.esql.definitions.toBooleanDoc": "Convertit en booléen.", + "kbn-esql-validation-autocomplete.esql.definitions.toCartesianPointDoc": "Convertit la valeur d'une entrée en une valeur \"point\".", + "kbn-esql-validation-autocomplete.esql.definitions.toCartesianshapeDoc": "Convertit la valeur d'une entrée en une valeur cartesian_shape.", + "kbn-esql-validation-autocomplete.esql.definitions.toDateTimeDoc": "Convertit en date.", + "kbn-esql-validation-autocomplete.esql.definitions.toDegreesDoc": "Convertit en degrés", + "kbn-esql-validation-autocomplete.esql.definitions.toDoubleDoc": "Convertit en double.", + "kbn-esql-validation-autocomplete.esql.definitions.toGeopointDoc": "Convertit en une valeur geo_point.", + "kbn-esql-validation-autocomplete.esql.definitions.toGeoshapeDoc": "Convertit la valeur d'une entrée en une valeur geo_shape.", + "kbn-esql-validation-autocomplete.esql.definitions.toIntegerDoc": "Convertit en nombre entier.", + "kbn-esql-validation-autocomplete.esql.definitions.toIpDoc": "Convertit en ip.", + "kbn-esql-validation-autocomplete.esql.definitions.toLongDoc": "Convertit en long.", + "kbn-esql-validation-autocomplete.esql.definitions.toLowerDoc": "Renvoie une nouvelle chaîne représentant la chaîne d'entrée convertie en minuscules.", + "kbn-esql-validation-autocomplete.esql.definitions.toRadiansDoc": "Convertit en radians", + "kbn-esql-validation-autocomplete.esql.definitions.toStringDoc": "Convertit en chaîne.", + "kbn-esql-validation-autocomplete.esql.definitions.toUnsignedLongDoc": "Convertit en long non signé.", + "kbn-esql-validation-autocomplete.esql.definitions.toUpperDoc": "Renvoie une nouvelle chaîne représentant la chaîne d'entrée convertie en majuscules.", + "kbn-esql-validation-autocomplete.esql.definitions.toVersionDoc": "Convertit en version.", + "kbn-esql-validation-autocomplete.esql.definitions.trimDoc": "Supprime les espaces de début et de fin d'une chaîne.", + "kbn-esql-validation-autocomplete.esql.definitions.whereDoc": "Utilise \"predicate-expressions\" pour filtrer les résultats de recherche. Une expression predicate, lorsqu'elle est évaluée, renvoie TRUE ou FALSE. La commande where renvoie uniquement les résultats qui donnent la valeur TRUE. Par exemple, pour filtrer les résultats pour une valeur de champ spécifique", + "kbn-esql-validation-autocomplete.esql.definitions.withDoc": "Avec", "monaco.esql.hover.policyEnrichedFields": "**Champs**", "monaco.esql.hover.policyIndexes": "**Indexes**", "monaco.esql.hover.policyMatchingField": "**Champ correspondant**", - "monaco.esql.quickfix.replaceWithQuote": "Remplacer les guillemets par le signe \" (double)", - "monaco.esql.validation.dropAllColumnsError": "Il est interdit de supprimer tous les champs [*]", - "monaco.esql.validation.dropTimestampWarning": "La suppression de [@timestamp] effacera tous les filtres de temps des résultats de la recherche", - "monaco.esql.validation.metadataBracketsDeprecation": "Les crochets \"[]\" doivent être supprimés de la déclaration FROM METADATA", - "monaco.esql.validation.statsNoArguments": "[STATS] doit contenir au moins une expression d'agrégation ou de regroupement", - "monaco.esql.validation.unknownColumnType": "Type inconnu", - "monaco.esql.validation.unknownInterval": "Qualificatif d'intervalle de temps inattendu : \"{value}\"", + "kbn-esql-validation-autocomplete.esql.quickfix.replaceWithQuote": "Remplacer les guillemets par le signe \" (double)", + "kbn-esql-validation-autocomplete.esql.validation.dropAllColumnsError": "Il est interdit de supprimer tous les champs [*]", + "kbn-esql-validation-autocomplete.esql.validation.dropTimestampWarning": "La suppression de [@timestamp] effacera tous les filtres de temps des résultats de la recherche", + "kbn-esql-validation-autocomplete.esql.validation.metadataBracketsDeprecation": "Les crochets \"[]\" doivent être supprimés de la déclaration FROM METADATA", + "kbn-esql-validation-autocomplete.esql.validation.statsNoArguments": "[STATS] doit contenir au moins une expression d'agrégation ou de regroupement", + "kbn-esql-validation-autocomplete.esql.validation.unknownColumnType": "Type inconnu", + "kbn-esql-validation-autocomplete.esql.validation.unknownInterval": "Qualificatif d'intervalle de temps inattendu : \"{value}\"", "monaco.painlessLanguage.autocomplete.docKeywordDescription": "Accéder à une valeur de champ dans un script au moyen de la syntaxe doc['field_name']", "monaco.painlessLanguage.autocomplete.emitKeywordDescription": "Émettre une valeur sans rien renvoyer", "monaco.painlessLanguage.autocomplete.fieldValueDescription": "Récupérer la valeur du champ \"{fieldName}\"", @@ -13595,7 +13596,6 @@ "xpack.dataVisualizer.removeCombinedFieldsLabel": "Retirer le champ combiné", "xpack.dataVisualizer.samplingOptionsButton": "Options d’échantillonnage", "xpack.dataVisualizer.searchPanel.allFieldsLabel": "Tous les champs", - "xpack.dataVisualizer.searchPanel.esql.analyzeAll": "Tout analyser", "xpack.dataVisualizer.searchPanel.esql.limitSizeAriaLabel": "Limiter la taille", "xpack.dataVisualizer.searchPanel.esql.limitSizeLabel": "Limiter l'analyse à", "xpack.dataVisualizer.searchPanel.invalidSyntax": "Syntaxe non valide", @@ -17561,7 +17561,6 @@ "xpack.fleet.agentEnrollment.loading.instructions": "Une fois l'agent démarré, la Suite Elastic écoute l'agent et confirme son enregistrement dans Fleet. Si vous rencontrez des problèmes lors de la connexion, consultez {link}.", "xpack.fleet.agentEnrollment.missingFleetHostCalloutText": "L'enregistrement d'agents dans Fleet nécessite l'URL de l'hôte de votre serveur Fleet. Vous pouvez ajouter ces informations dans Paramètres de Fleet. Pour en savoir plus, consultez {link}.", "xpack.fleet.agentEnrollment.stepConfigureAgentDescription": "Copiez cette politique dans le fichier {fileName} de l'hôte sur lequel l'agent Elastic Agent est installé. Modifiez {ESUsernameVariable} et {ESPasswordVariable} dans la section {outputSection} du fichier {fileName} pour utiliser vos identifiants de connexion Elasticsearch.", - "xpack.fleet.agentEnrollment.stepConfigureAgentDescriptionk8s": "Copiez ou téléchargez le manifeste Kubernetes à l'intérieur du cluster Kubernetes. Mettez à jour les variables d'environnement {ESUsernameVariable} et {ESPasswordVariable} dans le Daemonset pour qu'elles correspondent à vos informations d'identification Elasticsearch.", "xpack.fleet.agentFlyout.managedRadioOption": "{managed} – L'enregistrement d'un agent Elastic Agent dans Fleet permet de centraliser la gestion de ce dernier tout en déployant automatiquement les mises à jour.", "xpack.fleet.agentFlyout.standaloneRadioOption": "{standaloneMessage} – Exécutez un agent Elastic Agent de façon autonome pour le configurer et le mettre à jour manuellement sur l'hôte sur lequel il est installé.", "xpack.fleet.agentHealth.checkinMessageText": "Dernier message de vérification : {lastCheckinMessage}", @@ -17933,7 +17932,6 @@ "xpack.fleet.agentEnrollment.cloudShell.stepEnrollAndRunAgentTitle": "Installer Elastic Agent sur votre cloud", "xpack.fleet.agentEnrollment.confirmation.button": "Voir les agents inscrits", "xpack.fleet.agentEnrollment.copyPolicyButton": "Copier dans le presse-papiers", - "xpack.fleet.agentEnrollment.downloadDescriptionForK8s": "Copiez ou téléchargez le manifeste Kubernetes.", "xpack.fleet.agentEnrollment.downloadManifestButtonk8sClicked": "Téléchargé", "xpack.fleet.agentEnrollment.downloadPolicyButton": "Télécharger la politique", "xpack.fleet.agentEnrollment.downloadPolicyButtonk8s": "Télécharger le manifeste", @@ -23204,7 +23202,6 @@ "xpack.lens.chart.labelVisibility.auto": "Auto", "xpack.lens.chart.labelVisibility.custom": "Personnalisé", "xpack.lens.chart.labelVisibility.none": "Aucun", - "xpack.lens.chartSwitch.dataLossLabel": "Avertissement", "xpack.lens.chartSwitch.experimentalLabel": "Version d'évaluation technique", "xpack.lens.chartTitle.unsaved": "Visualisation non enregistrée", "xpack.lens.cloneLayerAriaLabel": "Dupliquer le calque", @@ -23686,7 +23683,6 @@ "xpack.lens.layer.unlinkConfirm": "Restaurer les modifications", "xpack.lens.layerActions.layerSettingsAction": "Paramètres du calque", "xpack.lens.layerPanel.ignoreGlobalFilters": "Ignorer les filtres globaux", - "xpack.lens.layerPanel.layerVisualizationType": "Type de visualisation du calque", "xpack.lens.layerPanel.missingDataView": "Vue de données introuvable", "xpack.lens.layerSettings.ignoreGlobalFilters": "Utiliser les filtres globaux", "xpack.lens.layerTitle.fallbackLabel": "Calque", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 2894ac22ee8b4..5f2a41f768aa6 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -5005,203 +5005,203 @@ "management.settings.spaceCalloutSubtitle": "変更は現在のスペースにのみ適用されます。これらの設定は上級ユーザー向けです。構成が正しくない場合は、Kibanaの動作に悪影響を及ぼすおそれがあります。", "management.settings.spaceCalloutTitle": "変更は現在のスペースに影響します。", "management.settings.spaceSettingsTabTitle": "スペース設定", - "monaco.esql.autocomplete.matchingFieldDefinition": "ポリシーの{matchingField}で照合するために使用", - "monaco.esql.autocomplete.policyDefinition": "{count, plural, other {インデックス}}で定義されたポリシー:{indices}", - "monaco.esql.divide.warning.divideByZero": "ゼロで除算できません:{left}/{right}", - "monaco.esql.divide.warning.logOfNegativeValue": "負数の対数はNULLになります:{value}", - "monaco.esql.divide.warning.zeroModule": "ゼロによる加群はNULL値を返すことがあります:{left}%{right}", - "monaco.esql.quickfix.replaceWithSolution": "次の結果を表示しています:{solution}", - "monaco.esql.validation.expectedConstantValue": "[{fn}]の引数は定数でなければなりません。[{given}]が渡されました", - "monaco.esql.validation.missingFunction": "不明な関数[{name}]", - "monaco.esql.validation.noCombinationOfAggAndNonAggValues": "[STATS]では集計値と非集計値を結合できません。[{expression}]が見つかりました", - "monaco.esql.validation.noNestedArgumentSupport": "集計関数のパラメーターは属性、リテラル、または非集計関数でなければなりません。タイプ[{argType}]の[{name}]が見つかりました", - "monaco.esql.validation.statsNoAggFunction": "[STATS]では1つ以上の集計関数が必要です。[{expression}]が見つかりました", - "monaco.esql.validation.typeOverwrite": "{fieldType}型の列[{field}]が新しい型の{newType}として上書きされました", - "monaco.esql.validation.unknowAggregateFunction": "集計関数またはグループが想定されていますが、[{type}]型の[{value}]が渡されました", - "monaco.esql.validation.unknownColumn": "不明な列[{name}]", - "monaco.esql.validation.unknownIndex": "不明なインデックス[{name}]", - "monaco.esql.validation.unknownOption": "{command}の無効なオプション:[{option}]", - "monaco.esql.validation.unknownPolicy": "不明なポリシー[{name}]", - "monaco.esql.validation.unsupportedColumnTypeForCommand": "{command}は{type} {typeCount, plural, other {型}}の値のみをサポートしていますが、[{givenType}]型の[{column}]が見つかりました", - "monaco.esql.validation.unsupportedFieldType": "フィールド[{field}]を取得できません。サポートされていないか、インデックス化されていません。NULLが返されます", - "monaco.esql.validation.unsupportedSetting": "サポートされていない設定[{setting}]です。[{expected}]でなければなりません", - "monaco.esql.validation.unsupportedSettingValue": "{command}の認識されていない値[{value}]です。モードは[{expected}]のいずれかでなければなりません", - "monaco.esql.validation.unsupportedTypeForCommand": "{command}は式[{value}]で[{type}]をサポートしていません", - "monaco.esql.validation.wildcardNotSupportedForCommand": "{command}でのワイルドカード(*)の使用は許可されていません[{value}]", - "monaco.esql.validation.wildcardNotSupportedForFunction": "{name}でのワイルドカード(*)の使用は許可されていません", - "monaco.esql.validation.wrongArgumentType": "[{name}]の引数は[{argType}]でなければなりません。値[{value}]型[{givenType}]が見つかりました", - "monaco.esql.validation.wrongDissectOptionArgumentType": "DISSECT append_separatorの無効な値:文字列でなければなりませんが、[{value}]でした", - "monaco.esql.validation.wrongMetadataArgumentType": "メタデータフィールド[{value}]がありません。使用可能なメタデータフィールド:[{availableFields}]", - "monaco.esql.autocomplete.aPatternString": "パターン文字列", - "monaco.esql.autocomplete.colonDoc": "コロン(:)", - "monaco.esql.autocomplete.commaDoc": "カンマ(,)", - "monaco.esql.autocomplete.constantDefinition": "定数", - "monaco.esql.autocomplete.createNewPolicy": "クリックして作成", - "monaco.esql.autocomplete.declarationLabel": "宣言:", - "monaco.esql.autocomplete.examplesLabel": "例:", - "monaco.esql.autocomplete.fieldDefinition": "入力テーブルで指定されたフィールド", - "monaco.esql.autocomplete.listDoc": "項目のリスト(...)", - "monaco.esql.autocomplete.newVarDoc": "新しい変数を定義", - "monaco.esql.autocomplete.noPoliciesLabel": "ポリシーがありません", - "monaco.esql.autocomplete.noPoliciesLabelsFound": "クリックして作成", - "monaco.esql.autocomplete.pipeDoc": "パイプ(|)", - "monaco.esql.autocomplete.semiColonDoc": "セミコロン(;)", - "monaco.esql.autocomplete.sourceDefinition": "インデックス", - "monaco.esql.autocomplete.variableDefinition": "ES|QLクエリでユーザーが指定した変数", - "monaco.esql.definition.addDoc": "加算(+)", - "monaco.esql.definition.andDoc": "AND", - "monaco.esql.definition.assignDoc": "割り当て(=)", - "monaco.esql.definition.divideDoc": "除算(/)", - "monaco.esql.definition.equalToDoc": "等しい", - "monaco.esql.definition.functionsDoc": "ES|QLで使用可能な関数と署名を表示", - "monaco.esql.definition.greaterThanDoc": "より大きい", - "monaco.esql.definition.greaterThanOrEqualToDoc": "よりも大きいまたは等しい", - "monaco.esql.definition.inDoc": "ある式が取る値が、他の式のリストに含まれているかどうかをテストします", - "monaco.esql.definition.infoDoc": "現在のESノードに関する情報を表示", - "monaco.esql.definition.isNotNullDoc": "NULL比較の述部:値がNULLではない場合にTrueを返します", - "monaco.esql.definition.isNullDoc": "NULL比較の述部:値がNULLである場合にTrueを返します", - "monaco.esql.definition.lessThanDoc": "より小さい", - "monaco.esql.definition.lessThanOrEqualToDoc": "以下", - "monaco.esql.definition.likeDoc": "文字列パターンに基づいてデータをフィルター", - "monaco.esql.definition.moduleDoc": "モジュール(%)", - "monaco.esql.definition.multiplyDoc": "乗算(*)", - "monaco.esql.definition.notDoc": "NOT", - "monaco.esql.definition.notEqualToDoc": "Not equal to", - "monaco.esql.definition.orDoc": "または", - "monaco.esql.definition.rlikeDoc": "文字列の正規表現に基づいてデータをフィルター", - "monaco.esql.definition.subtractDoc": "減算(-)", - "monaco.esql.definitions.absDoc": "絶対値を返します。", - "monaco.esql.definitions.acosDoc": "逆余弦三角関数", - "monaco.esql.definitions.appendSeparatorDoc": "追加されたフィールドを区切る文字。デフォルトは空の文字列(\"\")です。", - "monaco.esql.definitions.asDoc": "として", - "monaco.esql.definitions.asinDoc": "逆正弦三角関数", - "monaco.esql.definitions.atan2Doc": "直交平面上の原点から点(x , y)に向かう光線と正のx軸のなす角", - "monaco.esql.definitions.atanDoc": "逆正接三角関数", - "monaco.esql.definitions.autoBucketDoc": "指定された範囲とバケット目標に基づいて、日付を自動的にバケット化します。", - "monaco.esql.definitions.avgDoc": "フィールドの値の平均を返します", - "monaco.esql.definitions.byDoc": "グループ基準", - "monaco.esql.definitions.caseDoc": "条件と値のペアを指定できます。この関数は、最初にtrueと評価された条件に属する値を返します。引数の数が奇数の場合、最後の引数は条件に一致しない場合に返されるデフォルト値になります。", - "monaco.esql.definitions.ccqAnyDoc": "エンリッチは任意のクラスターで発生します", - "monaco.esql.definitions.ccqCoordinatorDoc": "エンリッチは、ES|QLを受信する調整クラスターで実行されます", - "monaco.esql.definitions.ccqModeDoc": "クラスター横断クエリモード", - "monaco.esql.definitions.ccqRemoteDoc": "エンリッチはターゲットインデックスをホスティングするクラスターで発生します。", - "monaco.esql.definitions.ceilDoc": "最も近い整数に数値を切り上げます。", - "monaco.esql.definitions.cidrMatchDoc": "この関数は、IP型の最初のパラメーターを取り、その後にCIDR指定に対して評価された1つ以上のパラメーターを取ります。", - "monaco.esql.definitions.coalesceDoc": "最初のNULL以外の値を返します。", - "monaco.esql.definitions.concatDoc": "2つ以上の文字列を連結します。", - "monaco.esql.definitions.cosDoc": "余弦三角関数", - "monaco.esql.definitions.coshDoc": "余弦双曲線関数", - "monaco.esql.definitions.countDistinctDoc": "フィールド内の異なる値の数を返します。", - "monaco.esql.definitions.countDoc": "フィールドの値の数を返します。", - "monaco.esql.definitions.dateDurationDefinition.day": "日", - "monaco.esql.definitions.dateDurationDefinition.days": "日(複数)", - "monaco.esql.definitions.dateDurationDefinition.hour": "時間", - "monaco.esql.definitions.dateDurationDefinition.hours": "時間(複数)", - "monaco.esql.definitions.dateDurationDefinition.millisecond": "ミリ秒", - "monaco.esql.definitions.dateDurationDefinition.milliseconds": "ミリ秒(複数)", - "monaco.esql.definitions.dateDurationDefinition.minute": "分", - "monaco.esql.definitions.dateDurationDefinition.minutes": "分(複数)", - "monaco.esql.definitions.dateDurationDefinition.month": "月", - "monaco.esql.definitions.dateDurationDefinition.months": "月(複数)", - "monaco.esql.definitions.dateDurationDefinition.second": "秒", - "monaco.esql.definitions.dateDurationDefinition.seconds": "秒(複数)", - "monaco.esql.definitions.dateDurationDefinition.week": "週", - "monaco.esql.definitions.dateDurationDefinition.weeks": "週(複数)", - "monaco.esql.definitions.dateDurationDefinition.year": "年", - "monaco.esql.definitions.dateDurationDefinition.years": "年(複数)", - "monaco.esql.definitions.dateExtractDoc": "年、月、日、時間など、日付の一部を抽出します。サポートされているフィールド型はjava.time.temporal.ChronoFieldで提供されている型です。", - "monaco.esql.definitions.dateFormatDoc": "指定した書式の日付の文字列表現を返します。書式が指定されていない場合は、yyyy-MM-dd'T'HH:mm:ss.SSSZの書式が使用されます。", - "monaco.esql.definitions.dateParseDoc": "文字列から日付を解析します。", - "monaco.esql.definitions.dateTruncDoc": "最も近い区間まで日付を切り捨てます。区間はtimespanリテラル構文を使って表現できます。", - "monaco.esql.definitions.dissectDoc": "単一の文字列入力から、パターンに基づいて複数の文字列値を抽出", - "monaco.esql.definitions.dropDoc": "列を削除", - "monaco.esql.definitions.eDoc": "Eulerの数値。", - "monaco.esql.definitions.endsWithDoc": "キーワード文字列が他の文字列で終わるかどうかを示すブール値を返します。", - "monaco.esql.definitions.enrichDoc": "別のテーブルでテーブルをエンリッチします。エンリッチを使用する前に、エンリッチポリシーを作成して実行する必要があります。", - "monaco.esql.definitions.evalDoc": "式を計算し、結果の値を検索結果フィールドに入力します。", - "monaco.esql.definitions.floorDoc": "最も近い整数に数値を切り捨てます。", - "monaco.esql.definitions.fromDoc": "1つ以上のデータストリーム、インデックス、またはエイリアスからデータを取得します。クエリまたはサブクエリでは、最初にコマンドから使用する必要があります。先頭のパイプは不要です。たとえば、インデックスからデータを取得します。", - "monaco.esql.definitions.greatestDoc": "多数の列から最大値を返します。", - "monaco.esql.definitions.grokDoc": "単一の文字列入力から、パターンに基づいて複数の文字列値を抽出", - "monaco.esql.definitions.keepDoc": "フィールドでkeep句を適用して、入力テーブルのフィールドを並べ替えます", - "monaco.esql.definitions.leastDoc": "多数の列から最小値を返します。", - "monaco.esql.definitions.leftDoc": "stringから左から順にlength文字を抜き出したサブ文字列を返します。", - "monaco.esql.definitions.lengthDoc": "文字列の文字数を返します。", - "monaco.esql.definitions.limitDoc": "指定された「制限」に基づき、検索順序で、最初の検索結果を返します。", - "monaco.esql.definitions.log10Doc": "底が10の対数を返します。", - "monaco.esql.definitions.logDoc": "スカラー関数対数(底、値)は、引数で指定されている特定の底の値の対数を返します", - "monaco.esql.definitions.ltrimDoc": "文字列から先頭の空白を取り除きます。", - "monaco.esql.definitions.maxDoc": "フィールドの最大値を返します。", - "monaco.esql.definitions.medianDeviationDoc": "サンプル全体の中央値からの各データポイントの偏差の中央値を返します。", - "monaco.esql.definitions.medianDoc": "50%パーセンタイルを返します。", - "monaco.esql.definitions.metadataDoc": "メタデータ", - "monaco.esql.definitions.minDoc": "フィールドの最小値を返します。", - "monaco.esql.definitions.mvAvgDoc": "複数値フィールドを、すべての値の平均を含む単一値フィールドに変換します。", - "monaco.esql.definitions.mvConcatDoc": "複数値文字列フィールドを、区切り文字で区切られたすべての値を連結した単一値フィールドに変換します。", - "monaco.esql.definitions.mvCountDoc": "複数値フィールドを、値の数をカウントする単一値フィールドに変換します。", - "monaco.esql.definitions.mvDedupeDoc": "複数値フィールドから重複を削除します。", - "monaco.esql.definitions.mvExpandDoc": "複数値フィールドを値ごとに1行に展開し、他のフィールドを複製します", - "monaco.esql.definitions.mvFirstDoc": "複数値フィールドを、最初の値を含む単一値フィールドに縮小します。", - "monaco.esql.definitions.mvLastDoc": "複数値フィールドを、最後の値を含む単一値フィールドに縮小します。", - "monaco.esql.definitions.mvMaxDoc": "複数値フィールドを、最大値を含む単一値フィールドに変換します。", - "monaco.esql.definitions.mvMedianDoc": "複数値フィールドを、中央値を含む単一値フィールドに変換します。", - "monaco.esql.definitions.mvMinDoc": "複数値フィールドを、最小値を含む単一値フィールドに変換します。", - "monaco.esql.definitions.mvSumDoc": "複数値フィールドを、すべての値の合計を含む単一値フィールドに変換します。", - "monaco.esql.definitions.nowDoc": "現在の日付と時刻を返します。", - "monaco.esql.definitions.onDoc": "オン", - "monaco.esql.definitions.percentiletDoc": "フィールドのnパーセンタイルを返します。", - "monaco.esql.definitions.piDoc": "円の円周と直径の比率。", - "monaco.esql.definitions.powDoc": "底(第1引数)を累乗(第2引数)した値を返します。", - "monaco.esql.definitions.renameDoc": "古い列の名前を新しい列に変更", - "monaco.esql.definitions.replaceDoc": "この関数は、文字列(第1引数)で、正規表現(第2引数)の任意の一致に置換文字列(第3引数)を代入します。いずれかの引数がNULLの場合、結果はNULLになります。", - "monaco.esql.definitions.rightDoc": "stringのうち右から数えてlength文字までのサブ文字列を返します。", - "monaco.esql.definitions.roundDoc": "最も近い整数値で指定された数字まで端数処理された数値を返します。デフォルトは整数になるように四捨五入されます。", - "monaco.esql.definitions.rowDoc": "指定した値の列を1つ以上含む行を作成します。これはテストの場合に便利です。", - "monaco.esql.definitions.rtrimDoc": "文字列から末尾の空白を取り除きます。", - "monaco.esql.definitions.showDoc": "デプロイとその能力に関する情報を返します。", - "monaco.esql.definitions.sinDoc": "正弦三角関数。", - "monaco.esql.definitions.sinhDoc": "正弦双曲線関数。", - "monaco.esql.definitions.sortDoc": "すべての結果を指定されたフィールドで並べ替えます。デフォルトでは、null値は他のどの値よりも大きい値として扱われます。昇順のソートではnull値は最後にソートされ、降順のソートではnull値は最初にソートされます。NULLS FIRSTまたはNULLS LASTを指定することで変更できます。", - "monaco.esql.definitions.splitDoc": "単一の値の文字列を複数の文字列に分割します。", - "monaco.esql.definitions.sqrtDoc": "数値の平方根を返します。", - "monaco.esql.definitions.startsWithDoc": "キーワード文字列が他の文字列で始まるかどうかを示すブール値を返します。", - "monaco.esql.definitions.statsDoc": "受信検索結果セットで、平均、カウント、合計などの集約統計情報を計算します。SQL集約と同様に、statsコマンドをBY句なしで使用した場合は、1行のみが返されます。これは、受信検索結果セット全体に対する集約です。BY句を使用すると、BY句で指定したフィールドの1つの値ごとに1行が返されます。statsコマンドは集約のフィールドのみを返します。statsコマンドではさまざまな統計関数を使用できます。複数の集約を実行するときには、各集約をカンマで区切ります。", - "monaco.esql.definitions.stCentroidDoc": "フィールド内の異なる値の数を返します。", - "monaco.esql.definitions.substringDoc": "文字列のサブ文字列を、開始位置とオプションの長さで指定して返します。", - "monaco.esql.definitions.sumDoc": "フィールドの値の合計を返します。", - "monaco.esql.definitions.tanDoc": "正接三角関数。", - "monaco.esql.definitions.tanhDoc": "正接双曲線関数。", - "monaco.esql.definitions.tauDoc": "円の円周と半径の比率。", - "monaco.esql.definitions.toBooleanDoc": "ブール値に変換します。", - "monaco.esql.definitions.toCartesianPointDoc": "入力値をpoint値に変換します。", - "monaco.esql.definitions.toCartesianshapeDoc": "入力値をcartesian_shape値に変換します。", - "monaco.esql.definitions.toDateTimeDoc": "日付に変換します。", - "monaco.esql.definitions.toDegreesDoc": "度に変換します", - "monaco.esql.definitions.toDoubleDoc": "doubleに変換します。", - "monaco.esql.definitions.toGeopointDoc": "geo_pointに変換します。", - "monaco.esql.definitions.toGeoshapeDoc": "入力値をgeo_shape値に変換します。", - "monaco.esql.definitions.toIntegerDoc": "整数に変換します。", - "monaco.esql.definitions.toIpDoc": "IPに変換します。", - "monaco.esql.definitions.toLongDoc": "longに変換します。", - "monaco.esql.definitions.toLowerDoc": "小文字に変換された入力文字列を表す新しい文字列を返します。", - "monaco.esql.definitions.toRadiansDoc": "ラジアンに変換します", - "monaco.esql.definitions.toStringDoc": "文字列に変換します。", - "monaco.esql.definitions.toUnsignedLongDoc": "符号なしlongに変換します。", - "monaco.esql.definitions.toUpperDoc": "大文字に変換された入力文字列を表す新しい文字列を返します。", - "monaco.esql.definitions.toVersionDoc": "バージョンに変換します。", - "monaco.esql.definitions.trimDoc": "文字列から先頭と末尾の空白を削除します。", - "monaco.esql.definitions.whereDoc": "「predicate-expressions」を使用して、検索結果をフィルターします。予測式は評価時にTRUEまたはFALSEを返します。whereコマンドはTRUEに評価される結果のみを返します。たとえば、特定のフィールド値の結果をフィルターします", - "monaco.esql.definitions.withDoc": "を使用して", + "kbn-esql-validation-autocomplete.esql.autocomplete.matchingFieldDefinition": "ポリシーの{matchingField}で照合するために使用", + "kbn-esql-validation-autocomplete.esql.autocomplete.policyDefinition": "{count, plural, other {インデックス}}で定義されたポリシー:{indices}", + "kbn-esql-validation-autocomplete.esql.divide.warning.divideByZero": "ゼロで除算できません:{left}/{right}", + "kbn-esql-validation-autocomplete.esql.divide.warning.logOfNegativeValue": "負数の対数はNULLになります:{value}", + "kbn-esql-validation-autocomplete.esql.divide.warning.zeroModule": "ゼロによる加群はNULL値を返すことがあります:{left}%{right}", + "kbn-esql-validation-autocomplete.esql.quickfix.replaceWithSolution": "次の結果を表示しています:{solution}", + "kbn-esql-validation-autocomplete.esql.validation.expectedConstantValue": "[{fn}]の引数は定数でなければなりません。[{given}]が渡されました", + "kbn-esql-validation-autocomplete.esql.validation.missingFunction": "不明な関数[{name}]", + "kbn-esql-validation-autocomplete.esql.validation.noCombinationOfAggAndNonAggValues": "[STATS]では集計値と非集計値を結合できません。[{expression}]が見つかりました", + "kbn-esql-validation-autocomplete.esql.validation.noNestedArgumentSupport": "集計関数のパラメーターは属性、リテラル、または非集計関数でなければなりません。タイプ[{argType}]の[{name}]が見つかりました", + "kbn-esql-validation-autocomplete.esql.validation.statsNoAggFunction": "[STATS]では1つ以上の集計関数が必要です。[{expression}]が見つかりました", + "kbn-esql-validation-autocomplete.esql.validation.typeOverwrite": "{fieldType}型の列[{field}]が新しい型の{newType}として上書きされました", + "kbn-esql-validation-autocomplete.esql.validation.unknowAggregateFunction": "集計関数またはグループが想定されていますが、[{type}]型の[{value}]が渡されました", + "kbn-esql-validation-autocomplete.esql.validation.unknownColumn": "不明な列[{name}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownIndex": "不明なインデックス[{name}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownOption": "{command}の無効なオプション:[{option}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownPolicy": "不明なポリシー[{name}]", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedColumnTypeForCommand": "{command}は{type} {typeCount, plural, other {型}}の値のみをサポートしていますが、[{givenType}]型の[{column}]が見つかりました", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedFieldType": "フィールド[{field}]を取得できません。サポートされていないか、インデックス化されていません。NULLが返されます", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedSetting": "サポートされていない設定[{setting}]です。[{expected}]でなければなりません", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedSettingValue": "{command}の認識されていない値[{value}]です。モードは[{expected}]のいずれかでなければなりません", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedTypeForCommand": "{command}は式[{value}]で[{type}]をサポートしていません", + "kbn-esql-validation-autocomplete.esql.validation.wildcardNotSupportedForCommand": "{command}でのワイルドカード(*)の使用は許可されていません[{value}]", + "kbn-esql-validation-autocomplete.esql.validation.wildcardNotSupportedForFunction": "{name}でのワイルドカード(*)の使用は許可されていません", + "kbn-esql-validation-autocomplete.esql.validation.wrongArgumentType": "[{name}]の引数は[{argType}]でなければなりません。値[{value}]型[{givenType}]が見つかりました", + "kbn-esql-validation-autocomplete.esql.validation.wrongDissectOptionArgumentType": "DISSECT append_separatorの無効な値:文字列でなければなりませんが、[{value}]でした", + "kbn-esql-validation-autocomplete.esql.validation.wrongMetadataArgumentType": "メタデータフィールド[{value}]がありません。使用可能なメタデータフィールド:[{availableFields}]", + "kbn-esql-validation-autocomplete.esql.autocomplete.aPatternString": "パターン文字列", + "kbn-esql-validation-autocomplete.esql.autocomplete.colonDoc": "コロン(:)", + "kbn-esql-validation-autocomplete.esql.autocomplete.commaDoc": "カンマ(,)", + "kbn-esql-validation-autocomplete.esql.autocomplete.constantDefinition": "定数", + "kbn-esql-validation-autocomplete.esql.autocomplete.createNewPolicy": "クリックして作成", + "kbn-esql-validation-autocomplete.esql.autocomplete.declarationLabel": "宣言:", + "kbn-esql-validation-autocomplete.esql.autocomplete.examplesLabel": "例:", + "kbn-esql-validation-autocomplete.esql.autocomplete.fieldDefinition": "入力テーブルで指定されたフィールド", + "kbn-esql-validation-autocomplete.esql.autocomplete.listDoc": "項目のリスト(...)", + "kbn-esql-validation-autocomplete.esql.autocomplete.newVarDoc": "新しい変数を定義", + "kbn-esql-validation-autocomplete.esql.autocomplete.noPoliciesLabel": "ポリシーがありません", + "kbn-esql-validation-autocomplete.esql.autocomplete.noPoliciesLabelsFound": "クリックして作成", + "kbn-esql-validation-autocomplete.esql.autocomplete.pipeDoc": "パイプ(|)", + "kbn-esql-validation-autocomplete.esql.autocomplete.semiColonDoc": "セミコロン(;)", + "kbn-esql-validation-autocomplete.esql.autocomplete.sourceDefinition": "インデックス", + "kbn-esql-validation-autocomplete.esql.autocomplete.variableDefinition": "ES|QLクエリでユーザーが指定した変数", + "kbn-esql-validation-autocomplete.esql.definition.addDoc": "加算(+)", + "kbn-esql-validation-autocomplete.esql.definition.andDoc": "AND", + "kbn-esql-validation-autocomplete.esql.definition.assignDoc": "割り当て(=)", + "kbn-esql-validation-autocomplete.esql.definition.divideDoc": "除算(/)", + "kbn-esql-validation-autocomplete.esql.definition.equalToDoc": "等しい", + "kbn-esql-validation-autocomplete.esql.definition.functionsDoc": "ES|QLで使用可能な関数と署名を表示", + "kbn-esql-validation-autocomplete.esql.definition.greaterThanDoc": "より大きい", + "kbn-esql-validation-autocomplete.esql.definition.greaterThanOrEqualToDoc": "よりも大きいまたは等しい", + "kbn-esql-validation-autocomplete.esql.definition.inDoc": "ある式が取る値が、他の式のリストに含まれているかどうかをテストします", + "kbn-esql-validation-autocomplete.esql.definition.infoDoc": "現在のESノードに関する情報を表示", + "kbn-esql-validation-autocomplete.esql.definition.isNotNullDoc": "NULL比較の述部:値がNULLではない場合にTrueを返します", + "kbn-esql-validation-autocomplete.esql.definition.isNullDoc": "NULL比較の述部:値がNULLである場合にTrueを返します", + "kbn-esql-validation-autocomplete.esql.definition.lessThanDoc": "より小さい", + "kbn-esql-validation-autocomplete.esql.definition.lessThanOrEqualToDoc": "以下", + "kbn-esql-validation-autocomplete.esql.definition.likeDoc": "文字列パターンに基づいてデータをフィルター", + "kbn-esql-validation-autocomplete.esql.definition.moduleDoc": "モジュール(%)", + "kbn-esql-validation-autocomplete.esql.definition.multiplyDoc": "乗算(*)", + "kbn-esql-validation-autocomplete.esql.definition.notDoc": "NOT", + "kbn-esql-validation-autocomplete.esql.definition.notEqualToDoc": "Not equal to", + "kbn-esql-validation-autocomplete.esql.definition.orDoc": "または", + "kbn-esql-validation-autocomplete.esql.definition.rlikeDoc": "文字列の正規表現に基づいてデータをフィルター", + "kbn-esql-validation-autocomplete.esql.definition.subtractDoc": "減算(-)", + "kbn-esql-validation-autocomplete.esql.definitions.absDoc": "絶対値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.acosDoc": "逆余弦三角関数", + "kbn-esql-validation-autocomplete.esql.definitions.appendSeparatorDoc": "追加されたフィールドを区切る文字。デフォルトは空の文字列(\"\")です。", + "kbn-esql-validation-autocomplete.esql.definitions.asDoc": "として", + "kbn-esql-validation-autocomplete.esql.definitions.asinDoc": "逆正弦三角関数", + "kbn-esql-validation-autocomplete.esql.definitions.atan2Doc": "直交平面上の原点から点(x , y)に向かう光線と正のx軸のなす角", + "kbn-esql-validation-autocomplete.esql.definitions.atanDoc": "逆正接三角関数", + "kbn-esql-validation-autocomplete.esql.definitions.autoBucketDoc": "指定された範囲とバケット目標に基づいて、日付を自動的にバケット化します。", + "kbn-esql-validation-autocomplete.esql.definitions.avgDoc": "フィールドの値の平均を返します", + "kbn-esql-validation-autocomplete.esql.definitions.byDoc": "グループ基準", + "kbn-esql-validation-autocomplete.esql.definitions.caseDoc": "条件と値のペアを指定できます。この関数は、最初にtrueと評価された条件に属する値を返します。引数の数が奇数の場合、最後の引数は条件に一致しない場合に返されるデフォルト値になります。", + "kbn-esql-validation-autocomplete.esql.definitions.ccqAnyDoc": "エンリッチは任意のクラスターで発生します", + "kbn-esql-validation-autocomplete.esql.definitions.ccqCoordinatorDoc": "エンリッチは、ES|QLを受信する調整クラスターで実行されます", + "kbn-esql-validation-autocomplete.esql.definitions.ccqModeDoc": "クラスター横断クエリモード", + "kbn-esql-validation-autocomplete.esql.definitions.ccqRemoteDoc": "エンリッチはターゲットインデックスをホスティングするクラスターで発生します。", + "kbn-esql-validation-autocomplete.esql.definitions.ceilDoc": "最も近い整数に数値を切り上げます。", + "kbn-esql-validation-autocomplete.esql.definitions.cidrMatchDoc": "この関数は、IP型の最初のパラメーターを取り、その後にCIDR指定に対して評価された1つ以上のパラメーターを取ります。", + "kbn-esql-validation-autocomplete.esql.definitions.coalesceDoc": "最初のNULL以外の値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.concatDoc": "2つ以上の文字列を連結します。", + "kbn-esql-validation-autocomplete.esql.definitions.cosDoc": "余弦三角関数", + "kbn-esql-validation-autocomplete.esql.definitions.coshDoc": "余弦双曲線関数", + "kbn-esql-validation-autocomplete.esql.definitions.countDistinctDoc": "フィールド内の異なる値の数を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.countDoc": "フィールドの値の数を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.day": "日", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.days": "日(複数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.hour": "時間", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.hours": "時間(複数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.millisecond": "ミリ秒", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.milliseconds": "ミリ秒(複数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.minute": "分", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.minutes": "分(複数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.month": "月", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.months": "月(複数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.second": "秒", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.seconds": "秒(複数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.week": "週", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.weeks": "週(複数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.year": "年", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.years": "年(複数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateExtractDoc": "年、月、日、時間など、日付の一部を抽出します。サポートされているフィールド型はjava.time.temporal.ChronoFieldで提供されている型です。", + "kbn-esql-validation-autocomplete.esql.definitions.dateFormatDoc": "指定した書式の日付の文字列表現を返します。書式が指定されていない場合は、yyyy-MM-dd'T'HH:mm:ss.SSSZの書式が使用されます。", + "kbn-esql-validation-autocomplete.esql.definitions.dateParseDoc": "文字列から日付を解析します。", + "kbn-esql-validation-autocomplete.esql.definitions.dateTruncDoc": "最も近い区間まで日付を切り捨てます。区間はtimespanリテラル構文を使って表現できます。", + "kbn-esql-validation-autocomplete.esql.definitions.dissectDoc": "単一の文字列入力から、パターンに基づいて複数の文字列値を抽出", + "kbn-esql-validation-autocomplete.esql.definitions.dropDoc": "列を削除", + "kbn-esql-validation-autocomplete.esql.definitions.eDoc": "Eulerの数値。", + "kbn-esql-validation-autocomplete.esql.definitions.endsWithDoc": "キーワード文字列が他の文字列で終わるかどうかを示すブール値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.enrichDoc": "別のテーブルでテーブルをエンリッチします。エンリッチを使用する前に、エンリッチポリシーを作成して実行する必要があります。", + "kbn-esql-validation-autocomplete.esql.definitions.evalDoc": "式を計算し、結果の値を検索結果フィールドに入力します。", + "kbn-esql-validation-autocomplete.esql.definitions.floorDoc": "最も近い整数に数値を切り捨てます。", + "kbn-esql-validation-autocomplete.esql.definitions.fromDoc": "1つ以上のデータストリーム、インデックス、またはエイリアスからデータを取得します。クエリまたはサブクエリでは、最初にコマンドから使用する必要があります。先頭のパイプは不要です。たとえば、インデックスからデータを取得します。", + "kbn-esql-validation-autocomplete.esql.definitions.greatestDoc": "多数の列から最大値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.grokDoc": "単一の文字列入力から、パターンに基づいて複数の文字列値を抽出", + "kbn-esql-validation-autocomplete.esql.definitions.keepDoc": "フィールドでkeep句を適用して、入力テーブルのフィールドを並べ替えます", + "kbn-esql-validation-autocomplete.esql.definitions.leastDoc": "多数の列から最小値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.leftDoc": "stringから左から順にlength文字を抜き出したサブ文字列を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.lengthDoc": "文字列の文字数を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.limitDoc": "指定された「制限」に基づき、検索順序で、最初の検索結果を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.log10Doc": "底が10の対数を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.logDoc": "スカラー関数対数(底、値)は、引数で指定されている特定の底の値の対数を返します", + "kbn-esql-validation-autocomplete.esql.definitions.ltrimDoc": "文字列から先頭の空白を取り除きます。", + "kbn-esql-validation-autocomplete.esql.definitions.maxDoc": "フィールドの最大値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.medianDeviationDoc": "サンプル全体の中央値からの各データポイントの偏差の中央値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.medianDoc": "50%パーセンタイルを返します。", + "kbn-esql-validation-autocomplete.esql.definitions.metadataDoc": "メタデータ", + "kbn-esql-validation-autocomplete.esql.definitions.minDoc": "フィールドの最小値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvAvgDoc": "複数値フィールドを、すべての値の平均を含む単一値フィールドに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvConcatDoc": "複数値文字列フィールドを、区切り文字で区切られたすべての値を連結した単一値フィールドに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvCountDoc": "複数値フィールドを、値の数をカウントする単一値フィールドに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvDedupeDoc": "複数値フィールドから重複を削除します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvExpandDoc": "複数値フィールドを値ごとに1行に展開し、他のフィールドを複製します", + "kbn-esql-validation-autocomplete.esql.definitions.mvFirstDoc": "複数値フィールドを、最初の値を含む単一値フィールドに縮小します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvLastDoc": "複数値フィールドを、最後の値を含む単一値フィールドに縮小します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvMaxDoc": "複数値フィールドを、最大値を含む単一値フィールドに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvMedianDoc": "複数値フィールドを、中央値を含む単一値フィールドに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvMinDoc": "複数値フィールドを、最小値を含む単一値フィールドに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.mvSumDoc": "複数値フィールドを、すべての値の合計を含む単一値フィールドに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.nowDoc": "現在の日付と時刻を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.onDoc": "オン", + "kbn-esql-validation-autocomplete.esql.definitions.percentiletDoc": "フィールドのnパーセンタイルを返します。", + "kbn-esql-validation-autocomplete.esql.definitions.piDoc": "円の円周と直径の比率。", + "kbn-esql-validation-autocomplete.esql.definitions.powDoc": "底(第1引数)を累乗(第2引数)した値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.renameDoc": "古い列の名前を新しい列に変更", + "kbn-esql-validation-autocomplete.esql.definitions.replaceDoc": "この関数は、文字列(第1引数)で、正規表現(第2引数)の任意の一致に置換文字列(第3引数)を代入します。いずれかの引数がNULLの場合、結果はNULLになります。", + "kbn-esql-validation-autocomplete.esql.definitions.rightDoc": "stringのうち右から数えてlength文字までのサブ文字列を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.roundDoc": "最も近い整数値で指定された数字まで端数処理された数値を返します。デフォルトは整数になるように四捨五入されます。", + "kbn-esql-validation-autocomplete.esql.definitions.rowDoc": "指定した値の列を1つ以上含む行を作成します。これはテストの場合に便利です。", + "kbn-esql-validation-autocomplete.esql.definitions.rtrimDoc": "文字列から末尾の空白を取り除きます。", + "kbn-esql-validation-autocomplete.esql.definitions.showDoc": "デプロイとその能力に関する情報を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.sinDoc": "正弦三角関数。", + "kbn-esql-validation-autocomplete.esql.definitions.sinhDoc": "正弦双曲線関数。", + "kbn-esql-validation-autocomplete.esql.definitions.sortDoc": "すべての結果を指定されたフィールドで並べ替えます。デフォルトでは、null値は他のどの値よりも大きい値として扱われます。昇順のソートではnull値は最後にソートされ、降順のソートではnull値は最初にソートされます。NULLS FIRSTまたはNULLS LASTを指定することで変更できます。", + "kbn-esql-validation-autocomplete.esql.definitions.splitDoc": "単一の値の文字列を複数の文字列に分割します。", + "kbn-esql-validation-autocomplete.esql.definitions.sqrtDoc": "数値の平方根を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.startsWithDoc": "キーワード文字列が他の文字列で始まるかどうかを示すブール値を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.statsDoc": "受信検索結果セットで、平均、カウント、合計などの集約統計情報を計算します。SQL集約と同様に、statsコマンドをBY句なしで使用した場合は、1行のみが返されます。これは、受信検索結果セット全体に対する集約です。BY句を使用すると、BY句で指定したフィールドの1つの値ごとに1行が返されます。statsコマンドは集約のフィールドのみを返します。statsコマンドではさまざまな統計関数を使用できます。複数の集約を実行するときには、各集約をカンマで区切ります。", + "kbn-esql-validation-autocomplete.esql.definitions.stCentroidDoc": "フィールド内の異なる値の数を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.substringDoc": "文字列のサブ文字列を、開始位置とオプションの長さで指定して返します。", + "kbn-esql-validation-autocomplete.esql.definitions.sumDoc": "フィールドの値の合計を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.tanDoc": "正接三角関数。", + "kbn-esql-validation-autocomplete.esql.definitions.tanhDoc": "正接双曲線関数。", + "kbn-esql-validation-autocomplete.esql.definitions.tauDoc": "円の円周と半径の比率。", + "kbn-esql-validation-autocomplete.esql.definitions.toBooleanDoc": "ブール値に変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toCartesianPointDoc": "入力値をpoint値に変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toCartesianshapeDoc": "入力値をcartesian_shape値に変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toDateTimeDoc": "日付に変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toDegreesDoc": "度に変換します", + "kbn-esql-validation-autocomplete.esql.definitions.toDoubleDoc": "doubleに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toGeopointDoc": "geo_pointに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toGeoshapeDoc": "入力値をgeo_shape値に変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toIntegerDoc": "整数に変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toIpDoc": "IPに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toLongDoc": "longに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toLowerDoc": "小文字に変換された入力文字列を表す新しい文字列を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.toRadiansDoc": "ラジアンに変換します", + "kbn-esql-validation-autocomplete.esql.definitions.toStringDoc": "文字列に変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toUnsignedLongDoc": "符号なしlongに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.toUpperDoc": "大文字に変換された入力文字列を表す新しい文字列を返します。", + "kbn-esql-validation-autocomplete.esql.definitions.toVersionDoc": "バージョンに変換します。", + "kbn-esql-validation-autocomplete.esql.definitions.trimDoc": "文字列から先頭と末尾の空白を削除します。", + "kbn-esql-validation-autocomplete.esql.definitions.whereDoc": "「predicate-expressions」を使用して、検索結果をフィルターします。予測式は評価時にTRUEまたはFALSEを返します。whereコマンドはTRUEに評価される結果のみを返します。たとえば、特定のフィールド値の結果をフィルターします", + "kbn-esql-validation-autocomplete.esql.definitions.withDoc": "を使用して", "monaco.esql.hover.policyEnrichedFields": "**フィールド**", "monaco.esql.hover.policyIndexes": "**インデックス**", "monaco.esql.hover.policyMatchingField": "**一致するフィールド**", - "monaco.esql.quickfix.replaceWithQuote": "引用符を\"(二重引用符)に変更", - "monaco.esql.validation.dropAllColumnsError": "すべてのフィールドの削除はできません[*]", - "monaco.esql.validation.dropTimestampWarning": "[@timestamp]を破棄すると、検索結果に対するすべての時間フィルターが削除されます", - "monaco.esql.validation.metadataBracketsDeprecation": "FROM METADATA宣言から角括弧[]を削除する必要があります", - "monaco.esql.validation.statsNoArguments": "[STATS]では1つ以上の集計またはグループ式が必要です", - "monaco.esql.validation.unknownColumnType": "不明なタイプ", - "monaco.esql.validation.unknownInterval": "想定されていない時間間隔修飾子:'{value}'", + "kbn-esql-validation-autocomplete.esql.quickfix.replaceWithQuote": "引用符を\"(二重引用符)に変更", + "kbn-esql-validation-autocomplete.esql.validation.dropAllColumnsError": "すべてのフィールドの削除はできません[*]", + "kbn-esql-validation-autocomplete.esql.validation.dropTimestampWarning": "[@timestamp]を破棄すると、検索結果に対するすべての時間フィルターが削除されます", + "kbn-esql-validation-autocomplete.esql.validation.metadataBracketsDeprecation": "FROM METADATA宣言から角括弧[]を削除する必要があります", + "kbn-esql-validation-autocomplete.esql.validation.statsNoArguments": "[STATS]では1つ以上の集計またはグループ式が必要です", + "kbn-esql-validation-autocomplete.esql.validation.unknownColumnType": "不明なタイプ", + "kbn-esql-validation-autocomplete.esql.validation.unknownInterval": "想定されていない時間間隔修飾子:'{value}'", "monaco.painlessLanguage.autocomplete.docKeywordDescription": "doc['field_name'] 構文を使用して、スクリプトからフィールド値にアクセスします", "monaco.painlessLanguage.autocomplete.emitKeywordDescription": "戻らずに値を発行します。", "monaco.painlessLanguage.autocomplete.fieldValueDescription": "フィールド「{fieldName}」の値を取得します", @@ -13575,7 +13575,6 @@ "xpack.dataVisualizer.removeCombinedFieldsLabel": "結合されたフィールドを削除", "xpack.dataVisualizer.samplingOptionsButton": "抽出オプション", "xpack.dataVisualizer.searchPanel.allFieldsLabel": "すべてのフィールド", - "xpack.dataVisualizer.searchPanel.esql.analyzeAll": "すべて分析", "xpack.dataVisualizer.searchPanel.esql.limitSizeAriaLabel": "サイズを制限", "xpack.dataVisualizer.searchPanel.esql.limitSizeLabel": "分析を制限", "xpack.dataVisualizer.searchPanel.invalidSyntax": "無効な構文", @@ -17540,7 +17539,6 @@ "xpack.fleet.agentEnrollment.loading.instructions": "エージェントが起動した後、Elastic Stackはエージェントを待機し、Fleetでの登録を確認します。接続の問題が発生した場合は、{link}を確認してください。", "xpack.fleet.agentEnrollment.missingFleetHostCalloutText": "Fleetにエージェントを登録するには、FleetサーバーホストのURLが必要です。Fleet設定でこの情報を追加できます。詳細は{link}をご覧ください。", "xpack.fleet.agentEnrollment.stepConfigureAgentDescription": "Elasticエージェントがインストールされているホストで、このポリシーを{fileName}にコピーします。Elasticsearch資格情報を使用するには、{fileName}の{outputSection}セクションで、{ESUsernameVariable}と{ESPasswordVariable}を変更します。", - "xpack.fleet.agentEnrollment.stepConfigureAgentDescriptionk8s": "Kubernetesクラスター内でKubernetesマニフェストをコピーしてダウンロードします。Daemonsetで{ESUsernameVariable}および{ESPasswordVariable}環境変数を更新し、Elasticsearch資格情報と一致するようにします。", "xpack.fleet.agentFlyout.managedRadioOption": "{managed} – ElasticエージェントをFleetに登録して、自動的に更新をデプロイしたり、一元的にエージェントを管理したりします。", "xpack.fleet.agentFlyout.standaloneRadioOption": "{standaloneMessage} – Elasticエージェントをスタンドアロンで実行して、エージェントがインストールされているホストで、手動でエージェントを構成および更新します。", "xpack.fleet.agentHealth.checkinMessageText": "前回のチェックインメッセージ:{lastCheckinMessage}", @@ -17911,7 +17909,6 @@ "xpack.fleet.agentEnrollment.cloudShell.stepEnrollAndRunAgentTitle": "クラウドにElasticエージェントをインストール", "xpack.fleet.agentEnrollment.confirmation.button": "登録されたエージェントを表示", "xpack.fleet.agentEnrollment.copyPolicyButton": "クリップボードにコピー", - "xpack.fleet.agentEnrollment.downloadDescriptionForK8s": "Kubernetesマニフェストをコピーまたはダウンロードします。", "xpack.fleet.agentEnrollment.downloadManifestButtonk8sClicked": "ダウンロード済み", "xpack.fleet.agentEnrollment.downloadPolicyButton": "ポリシーのダウンロード", "xpack.fleet.agentEnrollment.downloadPolicyButtonk8s": "マニフェストのダウンロード", @@ -23180,7 +23177,6 @@ "xpack.lens.chart.labelVisibility.auto": "自動", "xpack.lens.chart.labelVisibility.custom": "カスタム", "xpack.lens.chart.labelVisibility.none": "なし", - "xpack.lens.chartSwitch.dataLossLabel": "警告", "xpack.lens.chartSwitch.experimentalLabel": "テクニカルプレビュー", "xpack.lens.chartTitle.unsaved": "保存されていないビジュアライゼーション", "xpack.lens.cloneLayerAriaLabel": "レイヤーの複製", @@ -23662,7 +23658,6 @@ "xpack.lens.layer.unlinkConfirm": "変更を元に戻す", "xpack.lens.layerActions.layerSettingsAction": "レイヤー設定", "xpack.lens.layerPanel.ignoreGlobalFilters": "グローバルフィルターを無視", - "xpack.lens.layerPanel.layerVisualizationType": "レイヤービジュアライゼーションタイプ", "xpack.lens.layerPanel.missingDataView": "データビューが見つかりません", "xpack.lens.layerSettings.ignoreGlobalFilters": "グローバルフィルターを使用", "xpack.lens.layerTitle.fallbackLabel": "レイヤー", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9f5896e6bfec4..3397e1155d9db 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -5014,205 +5014,205 @@ "management.settings.spaceCalloutSubtitle": "将仅对当前工作区应用更改。这些设置适用于高级用户,因为配置错误可能会对 Kibana 的某些方面造成负面影响。", "management.settings.spaceCalloutTitle": "更改将影响当前工作区。", "management.settings.spaceSettingsTabTitle": "工作区设置", - "monaco.esql.autocomplete.matchingFieldDefinition": "用于匹配策略上的 {matchingField}", - "monaco.esql.autocomplete.policyDefinition": "策略在{count, plural, other {索引}}上定义:{indices}", - "monaco.esql.divide.warning.divideByZero": "不能除以零:{left}/{right}", - "monaco.esql.divide.warning.logOfNegativeValue": "负数的对数将生成 null:{value}", - "monaco.esql.divide.warning.zeroModule": "对零取余数会返回 null 值:{left}%{right}", - "monaco.esql.quickfix.replaceWithSolution": "您是指 {solution} 吗?", - "monaco.esql.validation.expectedConstantValue": "[{fn}] 的参数必须为常数,收到的是 [{given}]", - "monaco.esql.validation.missingFunction": "未知函数 [{name}]", - "monaco.esql.validation.noCombinationOfAggAndNonAggValues": "无法在 [STATS] 中组合聚合与非聚合值,找到了 [{expression}]", - "monaco.esql.validation.noNestedArgumentSupport": "聚合函数的参数必须为属性、文本或非聚合函数;找到了 [{argType}] 类型的 [{name}]", - "monaco.esql.validation.statsNoAggFunction": "[STATS] 中至少需要一个聚合函数,找到了 [{expression}]", - "monaco.esql.validation.typeOverwrite": "类型为 {fieldType} 的列 [{field}] 已重写为新类型:{newType}", - "monaco.esql.validation.unknowAggregateFunction": "应为聚合函数或组,但收到的是 [{type}] 类型的 [{value}]", - "monaco.esql.validation.unknownColumn": "未知列 [{name}]", - "monaco.esql.validation.unknownIndex": "未知索引 [{name}]", - "monaco.esql.validation.unknownOption": "{command} 的选项无效:[{option}]", - "monaco.esql.validation.unknownPolicy": "未知策略 [{name}]", - "monaco.esql.validation.unsupportedColumnTypeForCommand": "{command} 只支持 {type} 种{typeCount, plural, other {类型}}的值,找到了 [{givenType}] 类型的 [{column}]", - "monaco.esql.validation.unsupportedFieldType": "无法检索字段 [{field}],它不受支持或未进行索引;正返回 null", - "monaco.esql.validation.unsupportedFunctionForCommand": "{command} 不支持函数 {name}", - "monaco.esql.validation.unsupportedFunctionforCommandOption": "{command} {option} 不支持函数 {name}", - "monaco.esql.validation.unsupportedSetting": "不支持设置 [{setting}],应为 [{expected}]", - "monaco.esql.validation.unsupportedSettingValue": "无法识别 {command} 的值 [{value}],模式需要为 [{expected}] 之一", - "monaco.esql.validation.unsupportedTypeForCommand": "{command} 不支持表达式 [{value}] 中的 [{type}]", - "monaco.esql.validation.wildcardNotSupportedForCommand": "不允许在 {command} 中使用通配符 (*) [{value}]", - "monaco.esql.validation.wildcardNotSupportedForFunction": "不允许在 {name} 中使用通配符 (*)", - "monaco.esql.validation.wrongArgumentType": "[{name}] 的参数必须为 [{argType}],找到了值 [{value}] 类型 [{givenType}]", - "monaco.esql.validation.wrongDissectOptionArgumentType": "DISSECT append_separator 的值无效:应为字符串,但却为 [{value}]", - "monaco.esql.validation.wrongMetadataArgumentType": "元数据字段 [{value}] 不可用。可用的元数据字段为:[{availableFields}]", - "monaco.esql.autocomplete.aPatternString": "模式字符串", - "monaco.esql.autocomplete.colonDoc": "冒号 (:)", - "monaco.esql.autocomplete.commaDoc": "逗号 (,)", - "monaco.esql.autocomplete.constantDefinition": "常量", - "monaco.esql.autocomplete.createNewPolicy": "单击以创建", - "monaco.esql.autocomplete.declarationLabel": "声明:", - "monaco.esql.autocomplete.examplesLabel": "示例:", - "monaco.esql.autocomplete.fieldDefinition": "由输入表指定的字段", - "monaco.esql.autocomplete.listDoc": "项目列表 ( ...)", - "monaco.esql.autocomplete.newVarDoc": "定义新变量", - "monaco.esql.autocomplete.noPoliciesLabel": "没有可用策略", - "monaco.esql.autocomplete.noPoliciesLabelsFound": "单击以创建", - "monaco.esql.autocomplete.pipeDoc": "管道符 (|)", - "monaco.esql.autocomplete.semiColonDoc": "分号 (;)", - "monaco.esql.autocomplete.sourceDefinition": "索引", - "monaco.esql.autocomplete.variableDefinition": "用户在 ES|QL 查询中指定的变量", - "monaco.esql.definition.addDoc": "添加 (+)", - "monaco.esql.definition.andDoc": "且", - "monaco.esql.definition.assignDoc": "分配 (=)", - "monaco.esql.definition.divideDoc": "除 (/)", - "monaco.esql.definition.equalToDoc": "等于", - "monaco.esql.definition.functionsDoc": "显示带签名的 ES|QL 可用函数", - "monaco.esql.definition.greaterThanDoc": "大于", - "monaco.esql.definition.greaterThanOrEqualToDoc": "大于或等于", - "monaco.esql.definition.inDoc": "测试某表达式接受的值是否包含在其他表达式列表中", - "monaco.esql.definition.infoDoc": "显示有关当前 ES 节点的信息", - "monaco.esql.definition.isNotNullDoc": "用于 NULL 比较的谓词:如果值不为 NULL,则返回 true", - "monaco.esql.definition.isNullDoc": "用于 NULL 比较的谓词:如果值为 NULL,则返回 true", - "monaco.esql.definition.lessThanDoc": "小于", - "monaco.esql.definition.lessThanOrEqualToDoc": "小于或等于", - "monaco.esql.definition.likeDoc": "根据字符串模式筛选数据", - "monaco.esql.definition.moduleDoc": "取余数 (%)", - "monaco.esql.definition.multiplyDoc": "乘 (*)", - "monaco.esql.definition.notDoc": "非", - "monaco.esql.definition.notEqualToDoc": "不等于", - "monaco.esql.definition.orDoc": "或", - "monaco.esql.definition.rlikeDoc": "根据字符串正则表达式筛选数据", - "monaco.esql.definition.subtractDoc": "减 (-)", - "monaco.esql.definitions.absDoc": "返回绝对值。", - "monaco.esql.definitions.acosDoc": "反余弦三角函数", - "monaco.esql.definitions.appendSeparatorDoc": "分隔已追加字段的字符。默认为空字符串 (\"\")。", - "monaco.esql.definitions.asDoc": "作为", - "monaco.esql.definitions.asinDoc": "反正弦三角函数", - "monaco.esql.definitions.atan2Doc": "笛卡儿平面中正 x 轴与从原点到点 (x , y) 构成的射线之间的角度", - "monaco.esql.definitions.atanDoc": "反正切三角函数", - "monaco.esql.definitions.autoBucketDoc": "根据给定范围和存储桶目标自动收集存储桶日期。", - "monaco.esql.definitions.avgDoc": "返回字段中的值的平均值", - "monaco.esql.definitions.byDoc": "依据", - "monaco.esql.definitions.caseDoc": "接受成对的条件和值。此函数返回属于第一个评估为 `true` 的条件的值。如果参数数量为奇数,则最后一个参数为在无条件匹配时返回的默认值。", - "monaco.esql.definitions.ccqAnyDoc": "扩充在任何集群上发生", - "monaco.esql.definitions.ccqCoordinatorDoc": "扩充在接收 ES|QL 的协调集群上发生", - "monaco.esql.definitions.ccqModeDoc": "跨集群查询模式", - "monaco.esql.definitions.ccqRemoteDoc": "扩充在托管目标索引的集群上发生。", - "monaco.esql.definitions.ceilDoc": "将数字四舍五入为最近的整数。", - "monaco.esql.definitions.cidrMatchDoc": "此函数接受的第一个参数应为 IP 类型,后接一个或多个评估为 CIDR 规范的参数。", - "monaco.esql.definitions.coalesceDoc": "返回第一个非 null 值。", - "monaco.esql.definitions.concatDoc": "串联两个或多个字符串。", - "monaco.esql.definitions.cosDoc": "余弦三角函数", - "monaco.esql.definitions.coshDoc": "余弦双曲函数", - "monaco.esql.definitions.countDistinctDoc": "返回字段中不同值的计数。", - "monaco.esql.definitions.countDoc": "返回字段中的值的计数。", - "monaco.esql.definitions.dateDurationDefinition.day": "天", - "monaco.esql.definitions.dateDurationDefinition.days": "天(复数)", - "monaco.esql.definitions.dateDurationDefinition.hour": "小时", - "monaco.esql.definitions.dateDurationDefinition.hours": "小时(复数)", - "monaco.esql.definitions.dateDurationDefinition.millisecond": "毫秒", - "monaco.esql.definitions.dateDurationDefinition.milliseconds": "毫秒(复数)", - "monaco.esql.definitions.dateDurationDefinition.minute": "分钟", - "monaco.esql.definitions.dateDurationDefinition.minutes": "分钟(复数)", - "monaco.esql.definitions.dateDurationDefinition.month": "月", - "monaco.esql.definitions.dateDurationDefinition.months": "月(复数)", - "monaco.esql.definitions.dateDurationDefinition.second": "秒", - "monaco.esql.definitions.dateDurationDefinition.seconds": "秒(复数)", - "monaco.esql.definitions.dateDurationDefinition.week": "周", - "monaco.esql.definitions.dateDurationDefinition.weeks": "周(复数)", - "monaco.esql.definitions.dateDurationDefinition.year": "年", - "monaco.esql.definitions.dateDurationDefinition.years": "年(复数)", - "monaco.esql.definitions.dateExtractDoc": "提取日期的某些部分,如年、月、日、小时。支持的字段类型为 java.time.temporal.ChronoField 提供的那些类型", - "monaco.esql.definitions.dateFormatDoc": "以提供的格式返回日期的字符串表示形式。如果未指定格式,则使用“yyyy-MM-dd'T'HH:mm:ss.SSSZ”格式。", - "monaco.esql.definitions.dateParseDoc": "解析字符串中的日期。", - "monaco.esql.definitions.dateTruncDoc": "将日期向下舍入到最近的时间间隔。时间间隔可以用时间跨度文本语法表示。", - "monaco.esql.definitions.dissectDoc": "根据模式从单个字符串输入中提取多个字符串值", - "monaco.esql.definitions.dropDoc": "丢弃列", - "monaco.esql.definitions.eDoc": "Euler 函数的编号。", - "monaco.esql.definitions.endsWithDoc": "返回布尔值,指示关键字字符串是否以另一个字符串结尾:", - "monaco.esql.definitions.enrichDoc": "用其他表来扩充表。在使用扩充之前,您需要创建并执行扩充策略。", - "monaco.esql.definitions.evalDoc": "计算表达式并将生成的值置入搜索结果字段。", - "monaco.esql.definitions.floorDoc": "将数字向下舍入到最近的整数。", - "monaco.esql.definitions.fromDoc": "从一个或多个数据流、索引或别名中检索数据。在查询或子查询中,必须先使用 from 命令,并且它不需要前导管道符。例如,要从索引中检索数据:", - "monaco.esql.definitions.greatestDoc": "返回许多列中的最大值。", - "monaco.esql.definitions.grokDoc": "根据模式从单个字符串输入中提取多个字符串值", - "monaco.esql.definitions.keepDoc": "通过在字段中应用 keep 子句重新安排输入表中的字段", - "monaco.esql.definitions.leastDoc": "返回许多列中的最小值。", - "monaco.esql.definitions.leftDoc": "返回从字符串中提取长度字符的子字符串,从左侧开始。", - "monaco.esql.definitions.lengthDoc": "返回字符串的字符长度。", - "monaco.esql.definitions.limitDoc": "根据指定的“限制”按搜索顺序返回第一个搜索结果。", - "monaco.esql.definitions.log10Doc": "返回对数底数 10。", - "monaco.esql.definitions.logDoc": "如参数中所指定,标量函数 log(based, value) 返回特定底数的值的对数", - "monaco.esql.definitions.ltrimDoc": "从字符串中移除前导空格。", - "monaco.esql.definitions.maxDoc": "返回字段中的最大值。", - "monaco.esql.definitions.medianDeviationDoc": "返回每个数据点的中位数与整个样例的中位数的偏差。", - "monaco.esql.definitions.medianDoc": "返回 50% 百分位数。", - "monaco.esql.definitions.metadataDoc": "元数据", - "monaco.esql.definitions.minDoc": "返回字段中的最小值。", - "monaco.esql.definitions.mvAvgDoc": "将多值字段转换为包含所有值的平均值的单值字段。", - "monaco.esql.definitions.mvConcatDoc": "将多值字符串字段转换为单值字段,其中包含由分隔符分隔的所有值的串联形式", - "monaco.esql.definitions.mvCountDoc": "将多值字段转换为包含值计数的单值字段", - "monaco.esql.definitions.mvDedupeDoc": "移除多值字段中的重复项", - "monaco.esql.definitions.mvExpandDoc": "将多值字段扩展成每个值一行,从而复制其他字段", - "monaco.esql.definitions.mvFirstDoc": "将多值字段缩减为包含第一个值的单值字段。", - "monaco.esql.definitions.mvLastDoc": "将多值字段缩减为包含最后一个值的单值字段。", - "monaco.esql.definitions.mvMaxDoc": "将多值字段转换为包含最大值的单值字段。", - "monaco.esql.definitions.mvMedianDoc": "将多值字段转换为包含中位数值的单值字段。", - "monaco.esql.definitions.mvMinDoc": "将多值字段转换为包含最小值的单值字段。", - "monaco.esql.definitions.mvSumDoc": "将多值字段转换为包含所有值的总和的单值字段。", - "monaco.esql.definitions.nowDoc": "返回当前日期和时间。", - "monaco.esql.definitions.onDoc": "开启", - "monaco.esql.definitions.percentiletDoc": "返回字段的第 n 个百分位。", - "monaco.esql.definitions.piDoc": "圆的周长与其直径的比率。", - "monaco.esql.definitions.powDoc": "返回提升为幂(第二个参数)的底数(第一个参数)的值。", - "monaco.esql.definitions.renameDoc": "将旧列重命名为新列", - "monaco.esql.definitions.replaceDoc": "此函数将字符串(第 1 个参数)中正则表达式(第 2 个参数)的任何匹配项替换为替代字符串(第 3 个参数)。如果任何参数为 NULL,则结果为 NULL。", - "monaco.esql.definitions.rightDoc": "返回从字符串中提取长度字符的子字符串,从右侧开始。", - "monaco.esql.definitions.roundDoc": "返回四舍五入到小数(由最近的整数值指定)的数字。默认做法是四舍五入到整数。", - "monaco.esql.definitions.rowDoc": "生成一个行,其中包含一个或多个含有您指定的值的列。这可以用于测试。", - "monaco.esql.definitions.rtrimDoc": "从字符串中移除尾随空格。", - "monaco.esql.definitions.showDoc": "返回有关部署及其功能的信息", - "monaco.esql.definitions.sinDoc": "正弦三角函数。", - "monaco.esql.definitions.sinhDoc": "正弦双曲函数。", - "monaco.esql.definitions.sortDoc": "按指定字段对所有结果排序。默认情况下,会将 null 值视为大于任何其他值。使用升序排序顺序时,会最后对 null 值排序,而使用降序排序顺序时,会首先对 null 值排序。您可以通过提供 NULLS FIRST 或 NULLS LAST 来更改该排序", - "monaco.esql.definitions.splitDoc": "将单值字符串拆分成多个字符串。", - "monaco.esql.definitions.sqrtDoc": "返回数字的平方根。", - "monaco.esql.definitions.startsWithDoc": "返回指示关键字字符串是否以另一个字符串开头的布尔值。", - "monaco.esql.definitions.statsDoc": "对传入的搜索结果集计算汇总统计信息,如平均值、计数和总和。与 SQL 聚合类似,如果使用不含 BY 子句的 stats 命令,则只返回一行内容,即聚合传入的整个搜索结果集。使用 BY 子句时,将为在 BY 子句中指定的字段中的每个不同值返回一行内容。stats 命令仅返回聚合中的字段,并且您可以将一系列统计函数与 stats 命令搭配在一起使用。执行多个聚合时,请用逗号分隔每个聚合。", - "monaco.esql.definitions.stCentroidDoc": "返回字段中不同值的计数。", - "monaco.esql.definitions.substringDoc": "返回字符串的子字符串,用起始位置和可选长度指定。", - "monaco.esql.definitions.sumDoc": "返回字段中的值的总和。", - "monaco.esql.definitions.tanDoc": "正切三角函数。", - "monaco.esql.definitions.tanhDoc": "正切双曲函数。", - "monaco.esql.definitions.tauDoc": "圆的圆周长与其半径的比率。", - "monaco.esql.definitions.toBooleanDoc": "转换为布尔值。", - "monaco.esql.definitions.toCartesianPointDoc": "将输入值转换为 `point` 值。", - "monaco.esql.definitions.toCartesianshapeDoc": "将输入值转换为 cartesian_shape 值。", - "monaco.esql.definitions.toDateTimeDoc": "转换为日期。", - "monaco.esql.definitions.toDegreesDoc": "转换为度", - "monaco.esql.definitions.toDoubleDoc": "转换为双精度值。", - "monaco.esql.definitions.toGeopointDoc": "转换为 geo_point。", - "monaco.esql.definitions.toGeoshapeDoc": "将输入值转换为 geo_shape 值。", - "monaco.esql.definitions.toIntegerDoc": "转换为整数。", - "monaco.esql.definitions.toIpDoc": "转换为 IP。", - "monaco.esql.definitions.toLongDoc": "转换为长整型。", - "monaco.esql.definitions.toLowerDoc": "返回一个新字符串,表示已将输入字符串转为小写。", - "monaco.esql.definitions.toRadiansDoc": "转换为弧度", - "monaco.esql.definitions.toStringDoc": "转换为字符串。", - "monaco.esql.definitions.toUnsignedLongDoc": "转换为无符号长整型。", - "monaco.esql.definitions.toUpperDoc": "返回一个新字符串,表示已将输入字符串转为大写。", - "monaco.esql.definitions.toVersionDoc": "转换为版本。", - "monaco.esql.definitions.trimDoc": "从字符串中移除前导和尾随空格。", - "monaco.esql.definitions.whereDoc": "使用“predicate-expressions”可筛选搜索结果。进行计算时,谓词表达式将返回 TRUE 或 FALSE。where 命令仅返回计算结果为 TRUE 的结果。例如,筛选特定字段值的结果", - "monaco.esql.definitions.withDoc": "具有", + "kbn-esql-validation-autocomplete.esql.autocomplete.matchingFieldDefinition": "用于匹配策略上的 {matchingField}", + "kbn-esql-validation-autocomplete.esql.autocomplete.policyDefinition": "策略在{count, plural, other {索引}}上定义:{indices}", + "kbn-esql-validation-autocomplete.esql.divide.warning.divideByZero": "不能除以零:{left}/{right}", + "kbn-esql-validation-autocomplete.esql.divide.warning.logOfNegativeValue": "负数的对数将生成 null:{value}", + "kbn-esql-validation-autocomplete.esql.divide.warning.zeroModule": "对零取余数会返回 null 值:{left}%{right}", + "kbn-esql-validation-autocomplete.esql.quickfix.replaceWithSolution": "您是指 {solution} 吗?", + "kbn-esql-validation-autocomplete.esql.validation.expectedConstantValue": "[{fn}] 的参数必须为常数,收到的是 [{given}]", + "kbn-esql-validation-autocomplete.esql.validation.missingFunction": "未知函数 [{name}]", + "kbn-esql-validation-autocomplete.esql.validation.noCombinationOfAggAndNonAggValues": "无法在 [STATS] 中组合聚合与非聚合值,找到了 [{expression}]", + "kbn-esql-validation-autocomplete.esql.validation.noNestedArgumentSupport": "聚合函数的参数必须为属性、文本或非聚合函数;找到了 [{argType}] 类型的 [{name}]", + "kbn-esql-validation-autocomplete.esql.validation.statsNoAggFunction": "[STATS] 中至少需要一个聚合函数,找到了 [{expression}]", + "kbn-esql-validation-autocomplete.esql.validation.typeOverwrite": "类型为 {fieldType} 的列 [{field}] 已重写为新类型:{newType}", + "kbn-esql-validation-autocomplete.esql.validation.unknowAggregateFunction": "应为聚合函数或组,但收到的是 [{type}] 类型的 [{value}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownColumn": "未知列 [{name}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownIndex": "未知索引 [{name}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownOption": "{command} 的选项无效:[{option}]", + "kbn-esql-validation-autocomplete.esql.validation.unknownPolicy": "未知策略 [{name}]", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedColumnTypeForCommand": "{command} 只支持 {type} 种{typeCount, plural, other {类型}}的值,找到了 [{givenType}] 类型的 [{column}]", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedFieldType": "无法检索字段 [{field}],它不受支持或未进行索引;正返回 null", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedFunctionForCommand": "{command} 不支持函数 {name}", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedFunctionforCommandOption": "{command} {option} 不支持函数 {name}", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedSetting": "不支持设置 [{setting}],应为 [{expected}]", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedSettingValue": "无法识别 {command} 的值 [{value}],模式需要为 [{expected}] 之一", + "kbn-esql-validation-autocomplete.esql.validation.unsupportedTypeForCommand": "{command} 不支持表达式 [{value}] 中的 [{type}]", + "kbn-esql-validation-autocomplete.esql.validation.wildcardNotSupportedForCommand": "不允许在 {command} 中使用通配符 (*) [{value}]", + "kbn-esql-validation-autocomplete.esql.validation.wildcardNotSupportedForFunction": "不允许在 {name} 中使用通配符 (*)", + "kbn-esql-validation-autocomplete.esql.validation.wrongArgumentType": "[{name}] 的参数必须为 [{argType}],找到了值 [{value}] 类型 [{givenType}]", + "kbn-esql-validation-autocomplete.esql.validation.wrongDissectOptionArgumentType": "DISSECT append_separator 的值无效:应为字符串,但却为 [{value}]", + "kbn-esql-validation-autocomplete.esql.validation.wrongMetadataArgumentType": "元数据字段 [{value}] 不可用。可用的元数据字段为:[{availableFields}]", + "kbn-esql-validation-autocomplete.esql.autocomplete.aPatternString": "模式字符串", + "kbn-esql-validation-autocomplete.esql.autocomplete.colonDoc": "冒号 (:)", + "kbn-esql-validation-autocomplete.esql.autocomplete.commaDoc": "逗号 (,)", + "kbn-esql-validation-autocomplete.esql.autocomplete.constantDefinition": "常量", + "kbn-esql-validation-autocomplete.esql.autocomplete.createNewPolicy": "单击以创建", + "kbn-esql-validation-autocomplete.esql.autocomplete.declarationLabel": "声明:", + "kbn-esql-validation-autocomplete.esql.autocomplete.examplesLabel": "示例:", + "kbn-esql-validation-autocomplete.esql.autocomplete.fieldDefinition": "由输入表指定的字段", + "kbn-esql-validation-autocomplete.esql.autocomplete.listDoc": "项目列表 ( ...)", + "kbn-esql-validation-autocomplete.esql.autocomplete.newVarDoc": "定义新变量", + "kbn-esql-validation-autocomplete.esql.autocomplete.noPoliciesLabel": "没有可用策略", + "kbn-esql-validation-autocomplete.esql.autocomplete.noPoliciesLabelsFound": "单击以创建", + "kbn-esql-validation-autocomplete.esql.autocomplete.pipeDoc": "管道符 (|)", + "kbn-esql-validation-autocomplete.esql.autocomplete.semiColonDoc": "分号 (;)", + "kbn-esql-validation-autocomplete.esql.autocomplete.sourceDefinition": "索引", + "kbn-esql-validation-autocomplete.esql.autocomplete.variableDefinition": "用户在 ES|QL 查询中指定的变量", + "kbn-esql-validation-autocomplete.esql.definition.addDoc": "添加 (+)", + "kbn-esql-validation-autocomplete.esql.definition.andDoc": "且", + "kbn-esql-validation-autocomplete.esql.definition.assignDoc": "分配 (=)", + "kbn-esql-validation-autocomplete.esql.definition.divideDoc": "除 (/)", + "kbn-esql-validation-autocomplete.esql.definition.equalToDoc": "等于", + "kbn-esql-validation-autocomplete.esql.definition.functionsDoc": "显示带签名的 ES|QL 可用函数", + "kbn-esql-validation-autocomplete.esql.definition.greaterThanDoc": "大于", + "kbn-esql-validation-autocomplete.esql.definition.greaterThanOrEqualToDoc": "大于或等于", + "kbn-esql-validation-autocomplete.esql.definition.inDoc": "测试某表达式接受的值是否包含在其他表达式列表中", + "kbn-esql-validation-autocomplete.esql.definition.infoDoc": "显示有关当前 ES 节点的信息", + "kbn-esql-validation-autocomplete.esql.definition.isNotNullDoc": "用于 NULL 比较的谓词:如果值不为 NULL,则返回 true", + "kbn-esql-validation-autocomplete.esql.definition.isNullDoc": "用于 NULL 比较的谓词:如果值为 NULL,则返回 true", + "kbn-esql-validation-autocomplete.esql.definition.lessThanDoc": "小于", + "kbn-esql-validation-autocomplete.esql.definition.lessThanOrEqualToDoc": "小于或等于", + "kbn-esql-validation-autocomplete.esql.definition.likeDoc": "根据字符串模式筛选数据", + "kbn-esql-validation-autocomplete.esql.definition.moduleDoc": "取余数 (%)", + "kbn-esql-validation-autocomplete.esql.definition.multiplyDoc": "乘 (*)", + "kbn-esql-validation-autocomplete.esql.definition.notDoc": "非", + "kbn-esql-validation-autocomplete.esql.definition.notEqualToDoc": "不等于", + "kbn-esql-validation-autocomplete.esql.definition.orDoc": "或", + "kbn-esql-validation-autocomplete.esql.definition.rlikeDoc": "根据字符串正则表达式筛选数据", + "kbn-esql-validation-autocomplete.esql.definition.subtractDoc": "减 (-)", + "kbn-esql-validation-autocomplete.esql.definitions.absDoc": "返回绝对值。", + "kbn-esql-validation-autocomplete.esql.definitions.acosDoc": "反余弦三角函数", + "kbn-esql-validation-autocomplete.esql.definitions.appendSeparatorDoc": "分隔已追加字段的字符。默认为空字符串 (\"\")。", + "kbn-esql-validation-autocomplete.esql.definitions.asDoc": "作为", + "kbn-esql-validation-autocomplete.esql.definitions.asinDoc": "反正弦三角函数", + "kbn-esql-validation-autocomplete.esql.definitions.atan2Doc": "笛卡儿平面中正 x 轴与从原点到点 (x , y) 构成的射线之间的角度", + "kbn-esql-validation-autocomplete.esql.definitions.atanDoc": "反正切三角函数", + "kbn-esql-validation-autocomplete.esql.definitions.autoBucketDoc": "根据给定范围和存储桶目标自动收集存储桶日期。", + "kbn-esql-validation-autocomplete.esql.definitions.avgDoc": "返回字段中的值的平均值", + "kbn-esql-validation-autocomplete.esql.definitions.byDoc": "依据", + "kbn-esql-validation-autocomplete.esql.definitions.caseDoc": "接受成对的条件和值。此函数返回属于第一个评估为 `true` 的条件的值。如果参数数量为奇数,则最后一个参数为在无条件匹配时返回的默认值。", + "kbn-esql-validation-autocomplete.esql.definitions.ccqAnyDoc": "扩充在任何集群上发生", + "kbn-esql-validation-autocomplete.esql.definitions.ccqCoordinatorDoc": "扩充在接收 ES|QL 的协调集群上发生", + "kbn-esql-validation-autocomplete.esql.definitions.ccqModeDoc": "跨集群查询模式", + "kbn-esql-validation-autocomplete.esql.definitions.ccqRemoteDoc": "扩充在托管目标索引的集群上发生。", + "kbn-esql-validation-autocomplete.esql.definitions.ceilDoc": "将数字四舍五入为最近的整数。", + "kbn-esql-validation-autocomplete.esql.definitions.cidrMatchDoc": "此函数接受的第一个参数应为 IP 类型,后接一个或多个评估为 CIDR 规范的参数。", + "kbn-esql-validation-autocomplete.esql.definitions.coalesceDoc": "返回第一个非 null 值。", + "kbn-esql-validation-autocomplete.esql.definitions.concatDoc": "串联两个或多个字符串。", + "kbn-esql-validation-autocomplete.esql.definitions.cosDoc": "余弦三角函数", + "kbn-esql-validation-autocomplete.esql.definitions.coshDoc": "余弦双曲函数", + "kbn-esql-validation-autocomplete.esql.definitions.countDistinctDoc": "返回字段中不同值的计数。", + "kbn-esql-validation-autocomplete.esql.definitions.countDoc": "返回字段中的值的计数。", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.day": "天", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.days": "天(复数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.hour": "小时", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.hours": "小时(复数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.millisecond": "毫秒", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.milliseconds": "毫秒(复数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.minute": "分钟", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.minutes": "分钟(复数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.month": "月", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.months": "月(复数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.second": "秒", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.seconds": "秒(复数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.week": "周", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.weeks": "周(复数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.year": "年", + "kbn-esql-validation-autocomplete.esql.definitions.dateDurationDefinition.years": "年(复数)", + "kbn-esql-validation-autocomplete.esql.definitions.dateExtractDoc": "提取日期的某些部分,如年、月、日、小时。支持的字段类型为 java.time.temporal.ChronoField 提供的那些类型", + "kbn-esql-validation-autocomplete.esql.definitions.dateFormatDoc": "以提供的格式返回日期的字符串表示形式。如果未指定格式,则使用“yyyy-MM-dd'T'HH:mm:ss.SSSZ”格式。", + "kbn-esql-validation-autocomplete.esql.definitions.dateParseDoc": "解析字符串中的日期。", + "kbn-esql-validation-autocomplete.esql.definitions.dateTruncDoc": "将日期向下舍入到最近的时间间隔。时间间隔可以用时间跨度文本语法表示。", + "kbn-esql-validation-autocomplete.esql.definitions.dissectDoc": "根据模式从单个字符串输入中提取多个字符串值", + "kbn-esql-validation-autocomplete.esql.definitions.dropDoc": "丢弃列", + "kbn-esql-validation-autocomplete.esql.definitions.eDoc": "Euler 函数的编号。", + "kbn-esql-validation-autocomplete.esql.definitions.endsWithDoc": "返回布尔值,指示关键字字符串是否以另一个字符串结尾:", + "kbn-esql-validation-autocomplete.esql.definitions.enrichDoc": "用其他表来扩充表。在使用扩充之前,您需要创建并执行扩充策略。", + "kbn-esql-validation-autocomplete.esql.definitions.evalDoc": "计算表达式并将生成的值置入搜索结果字段。", + "kbn-esql-validation-autocomplete.esql.definitions.floorDoc": "将数字向下舍入到最近的整数。", + "kbn-esql-validation-autocomplete.esql.definitions.fromDoc": "从一个或多个数据流、索引或别名中检索数据。在查询或子查询中,必须先使用 from 命令,并且它不需要前导管道符。例如,要从索引中检索数据:", + "kbn-esql-validation-autocomplete.esql.definitions.greatestDoc": "返回许多列中的最大值。", + "kbn-esql-validation-autocomplete.esql.definitions.grokDoc": "根据模式从单个字符串输入中提取多个字符串值", + "kbn-esql-validation-autocomplete.esql.definitions.keepDoc": "通过在字段中应用 keep 子句重新安排输入表中的字段", + "kbn-esql-validation-autocomplete.esql.definitions.leastDoc": "返回许多列中的最小值。", + "kbn-esql-validation-autocomplete.esql.definitions.leftDoc": "返回从字符串中提取长度字符的子字符串,从左侧开始。", + "kbn-esql-validation-autocomplete.esql.definitions.lengthDoc": "返回字符串的字符长度。", + "kbn-esql-validation-autocomplete.esql.definitions.limitDoc": "根据指定的“限制”按搜索顺序返回第一个搜索结果。", + "kbn-esql-validation-autocomplete.esql.definitions.log10Doc": "返回对数底数 10。", + "kbn-esql-validation-autocomplete.esql.definitions.logDoc": "如参数中所指定,标量函数 log(based, value) 返回特定底数的值的对数", + "kbn-esql-validation-autocomplete.esql.definitions.ltrimDoc": "从字符串中移除前导空格。", + "kbn-esql-validation-autocomplete.esql.definitions.maxDoc": "返回字段中的最大值。", + "kbn-esql-validation-autocomplete.esql.definitions.medianDeviationDoc": "返回每个数据点的中位数与整个样例的中位数的偏差。", + "kbn-esql-validation-autocomplete.esql.definitions.medianDoc": "返回 50% 百分位数。", + "kbn-esql-validation-autocomplete.esql.definitions.metadataDoc": "元数据", + "kbn-esql-validation-autocomplete.esql.definitions.minDoc": "返回字段中的最小值。", + "kbn-esql-validation-autocomplete.esql.definitions.mvAvgDoc": "将多值字段转换为包含所有值的平均值的单值字段。", + "kbn-esql-validation-autocomplete.esql.definitions.mvConcatDoc": "将多值字符串字段转换为单值字段,其中包含由分隔符分隔的所有值的串联形式", + "kbn-esql-validation-autocomplete.esql.definitions.mvCountDoc": "将多值字段转换为包含值计数的单值字段", + "kbn-esql-validation-autocomplete.esql.definitions.mvDedupeDoc": "移除多值字段中的重复项", + "kbn-esql-validation-autocomplete.esql.definitions.mvExpandDoc": "将多值字段扩展成每个值一行,从而复制其他字段", + "kbn-esql-validation-autocomplete.esql.definitions.mvFirstDoc": "将多值字段缩减为包含第一个值的单值字段。", + "kbn-esql-validation-autocomplete.esql.definitions.mvLastDoc": "将多值字段缩减为包含最后一个值的单值字段。", + "kbn-esql-validation-autocomplete.esql.definitions.mvMaxDoc": "将多值字段转换为包含最大值的单值字段。", + "kbn-esql-validation-autocomplete.esql.definitions.mvMedianDoc": "将多值字段转换为包含中位数值的单值字段。", + "kbn-esql-validation-autocomplete.esql.definitions.mvMinDoc": "将多值字段转换为包含最小值的单值字段。", + "kbn-esql-validation-autocomplete.esql.definitions.mvSumDoc": "将多值字段转换为包含所有值的总和的单值字段。", + "kbn-esql-validation-autocomplete.esql.definitions.nowDoc": "返回当前日期和时间。", + "kbn-esql-validation-autocomplete.esql.definitions.onDoc": "开启", + "kbn-esql-validation-autocomplete.esql.definitions.percentiletDoc": "返回字段的第 n 个百分位。", + "kbn-esql-validation-autocomplete.esql.definitions.piDoc": "圆的周长与其直径的比率。", + "kbn-esql-validation-autocomplete.esql.definitions.powDoc": "返回提升为幂(第二个参数)的底数(第一个参数)的值。", + "kbn-esql-validation-autocomplete.esql.definitions.renameDoc": "将旧列重命名为新列", + "kbn-esql-validation-autocomplete.esql.definitions.replaceDoc": "此函数将字符串(第 1 个参数)中正则表达式(第 2 个参数)的任何匹配项替换为替代字符串(第 3 个参数)。如果任何参数为 NULL,则结果为 NULL。", + "kbn-esql-validation-autocomplete.esql.definitions.rightDoc": "返回从字符串中提取长度字符的子字符串,从右侧开始。", + "kbn-esql-validation-autocomplete.esql.definitions.roundDoc": "返回四舍五入到小数(由最近的整数值指定)的数字。默认做法是四舍五入到整数。", + "kbn-esql-validation-autocomplete.esql.definitions.rowDoc": "生成一个行,其中包含一个或多个含有您指定的值的列。这可以用于测试。", + "kbn-esql-validation-autocomplete.esql.definitions.rtrimDoc": "从字符串中移除尾随空格。", + "kbn-esql-validation-autocomplete.esql.definitions.showDoc": "返回有关部署及其功能的信息", + "kbn-esql-validation-autocomplete.esql.definitions.sinDoc": "正弦三角函数。", + "kbn-esql-validation-autocomplete.esql.definitions.sinhDoc": "正弦双曲函数。", + "kbn-esql-validation-autocomplete.esql.definitions.sortDoc": "按指定字段对所有结果排序。默认情况下,会将 null 值视为大于任何其他值。使用升序排序顺序时,会最后对 null 值排序,而使用降序排序顺序时,会首先对 null 值排序。您可以通过提供 NULLS FIRST 或 NULLS LAST 来更改该排序", + "kbn-esql-validation-autocomplete.esql.definitions.splitDoc": "将单值字符串拆分成多个字符串。", + "kbn-esql-validation-autocomplete.esql.definitions.sqrtDoc": "返回数字的平方根。", + "kbn-esql-validation-autocomplete.esql.definitions.startsWithDoc": "返回指示关键字字符串是否以另一个字符串开头的布尔值。", + "kbn-esql-validation-autocomplete.esql.definitions.statsDoc": "对传入的搜索结果集计算汇总统计信息,如平均值、计数和总和。与 SQL 聚合类似,如果使用不含 BY 子句的 stats 命令,则只返回一行内容,即聚合传入的整个搜索结果集。使用 BY 子句时,将为在 BY 子句中指定的字段中的每个不同值返回一行内容。stats 命令仅返回聚合中的字段,并且您可以将一系列统计函数与 stats 命令搭配在一起使用。执行多个聚合时,请用逗号分隔每个聚合。", + "kbn-esql-validation-autocomplete.esql.definitions.stCentroidDoc": "返回字段中不同值的计数。", + "kbn-esql-validation-autocomplete.esql.definitions.substringDoc": "返回字符串的子字符串,用起始位置和可选长度指定。", + "kbn-esql-validation-autocomplete.esql.definitions.sumDoc": "返回字段中的值的总和。", + "kbn-esql-validation-autocomplete.esql.definitions.tanDoc": "正切三角函数。", + "kbn-esql-validation-autocomplete.esql.definitions.tanhDoc": "正切双曲函数。", + "kbn-esql-validation-autocomplete.esql.definitions.tauDoc": "圆的圆周长与其半径的比率。", + "kbn-esql-validation-autocomplete.esql.definitions.toBooleanDoc": "转换为布尔值。", + "kbn-esql-validation-autocomplete.esql.definitions.toCartesianPointDoc": "将输入值转换为 `point` 值。", + "kbn-esql-validation-autocomplete.esql.definitions.toCartesianshapeDoc": "将输入值转换为 cartesian_shape 值。", + "kbn-esql-validation-autocomplete.esql.definitions.toDateTimeDoc": "转换为日期。", + "kbn-esql-validation-autocomplete.esql.definitions.toDegreesDoc": "转换为度", + "kbn-esql-validation-autocomplete.esql.definitions.toDoubleDoc": "转换为双精度值。", + "kbn-esql-validation-autocomplete.esql.definitions.toGeopointDoc": "转换为 geo_point。", + "kbn-esql-validation-autocomplete.esql.definitions.toGeoshapeDoc": "将输入值转换为 geo_shape 值。", + "kbn-esql-validation-autocomplete.esql.definitions.toIntegerDoc": "转换为整数。", + "kbn-esql-validation-autocomplete.esql.definitions.toIpDoc": "转换为 IP。", + "kbn-esql-validation-autocomplete.esql.definitions.toLongDoc": "转换为长整型。", + "kbn-esql-validation-autocomplete.esql.definitions.toLowerDoc": "返回一个新字符串,表示已将输入字符串转为小写。", + "kbn-esql-validation-autocomplete.esql.definitions.toRadiansDoc": "转换为弧度", + "kbn-esql-validation-autocomplete.esql.definitions.toStringDoc": "转换为字符串。", + "kbn-esql-validation-autocomplete.esql.definitions.toUnsignedLongDoc": "转换为无符号长整型。", + "kbn-esql-validation-autocomplete.esql.definitions.toUpperDoc": "返回一个新字符串,表示已将输入字符串转为大写。", + "kbn-esql-validation-autocomplete.esql.definitions.toVersionDoc": "转换为版本。", + "kbn-esql-validation-autocomplete.esql.definitions.trimDoc": "从字符串中移除前导和尾随空格。", + "kbn-esql-validation-autocomplete.esql.definitions.whereDoc": "使用“predicate-expressions”可筛选搜索结果。进行计算时,谓词表达式将返回 TRUE 或 FALSE。where 命令仅返回计算结果为 TRUE 的结果。例如,筛选特定字段值的结果", + "kbn-esql-validation-autocomplete.esql.definitions.withDoc": "具有", "monaco.esql.hover.policyEnrichedFields": "**字段**", "monaco.esql.hover.policyIndexes": "**索引**", "monaco.esql.hover.policyMatchingField": "**匹配字段**", - "monaco.esql.quickfix.replaceWithQuote": "将引号更改为 \"(双引号)", - "monaco.esql.validation.dropAllColumnsError": "不允许移除所有字段 [*]", - "monaco.esql.validation.dropTimestampWarning": "丢弃 [@timestamp] 会将所有时间筛选移除到搜索结果", - "monaco.esql.validation.metadataBracketsDeprecation": "需要从 FROM METADATA 声明中移除方括号“[]”", - "monaco.esql.validation.statsNoArguments": "[STATS] 中至少需要一个聚合或分组表达式", - "monaco.esql.validation.unknownColumnType": "未知类型", - "monaco.esql.validation.unknownInterval": "意外的时间间隔修饰词:“{value}”", + "kbn-esql-validation-autocomplete.esql.quickfix.replaceWithQuote": "将引号更改为 \"(双引号)", + "kbn-esql-validation-autocomplete.esql.validation.dropAllColumnsError": "不允许移除所有字段 [*]", + "kbn-esql-validation-autocomplete.esql.validation.dropTimestampWarning": "丢弃 [@timestamp] 会将所有时间筛选移除到搜索结果", + "kbn-esql-validation-autocomplete.esql.validation.metadataBracketsDeprecation": "需要从 FROM METADATA 声明中移除方括号“[]”", + "kbn-esql-validation-autocomplete.esql.validation.statsNoArguments": "[STATS] 中至少需要一个聚合或分组表达式", + "kbn-esql-validation-autocomplete.esql.validation.unknownColumnType": "未知类型", + "kbn-esql-validation-autocomplete.esql.validation.unknownInterval": "意外的时间间隔修饰词:“{value}”", "monaco.painlessLanguage.autocomplete.docKeywordDescription": "使用 doc['field_name'] 语法,从脚本中访问字段值", "monaco.painlessLanguage.autocomplete.emitKeywordDescription": "发出值,而不返回值。", "monaco.painlessLanguage.autocomplete.fieldValueDescription": "检索字段“{fieldName}”的值", @@ -13601,7 +13601,6 @@ "xpack.dataVisualizer.removeCombinedFieldsLabel": "移除组合字段", "xpack.dataVisualizer.samplingOptionsButton": "采样选项", "xpack.dataVisualizer.searchPanel.allFieldsLabel": "所有字段", - "xpack.dataVisualizer.searchPanel.esql.analyzeAll": "全部分析", "xpack.dataVisualizer.searchPanel.esql.limitSizeAriaLabel": "限制大小", "xpack.dataVisualizer.searchPanel.esql.limitSizeLabel": "将分析限定为", "xpack.dataVisualizer.searchPanel.invalidSyntax": "语法无效", @@ -17567,7 +17566,6 @@ "xpack.fleet.agentEnrollment.loading.instructions": "代理启动后, Elastic Stack 将侦听代理,并在 Fleet 中确认注册。如果遇到连接问题,请参阅 {link}。", "xpack.fleet.agentEnrollment.missingFleetHostCalloutText": "需要 Fleet 服务器主机的 URL,才能使用 Fleet 注册代理。可以在“Fleet 设置”中添加此信息。有关更多信息,请参阅{link}。", "xpack.fleet.agentEnrollment.stepConfigureAgentDescription": "在安装 Elastic 代理的主机上将此策略复制到 {fileName}。在 {fileName} 的 {outputSection} 部分中修改 {ESUsernameVariable} 和 {ESPasswordVariable},以使用您的 Elasticsearch 凭据。", - "xpack.fleet.agentEnrollment.stepConfigureAgentDescriptionk8s": "复制或下载 Kubernetes 集群内的 Kubernetes 清单。更新 Daemonset 中的 {ESUsernameVariable} 和 {ESPasswordVariable} 环境变量以匹配您的 Elasticsearch 凭据。", "xpack.fleet.agentFlyout.managedRadioOption": "{managed} – 在 Fleet 中注册 Elastic 代理,以便自动部署更新并集中管理该代理。", "xpack.fleet.agentFlyout.standaloneRadioOption": "{standaloneMessage} – 独立运行 Elastic 代理,以在安装代理的主机上手动配置和更新代理。", "xpack.fleet.agentHealth.checkinMessageText": "上次签入消息:{lastCheckinMessage}", @@ -17940,7 +17938,6 @@ "xpack.fleet.agentEnrollment.cloudShell.stepEnrollAndRunAgentTitle": "在云端安装 Elastic 代理", "xpack.fleet.agentEnrollment.confirmation.button": "查看注册的代理", "xpack.fleet.agentEnrollment.copyPolicyButton": "复制到剪贴板", - "xpack.fleet.agentEnrollment.downloadDescriptionForK8s": "复制或下载 Kubernetes 清单。", "xpack.fleet.agentEnrollment.downloadManifestButtonk8sClicked": "已下载", "xpack.fleet.agentEnrollment.downloadPolicyButton": "下载策略", "xpack.fleet.agentEnrollment.downloadPolicyButtonk8s": "下载清单", @@ -23213,7 +23210,6 @@ "xpack.lens.chart.labelVisibility.auto": "自动", "xpack.lens.chart.labelVisibility.custom": "定制", "xpack.lens.chart.labelVisibility.none": "无", - "xpack.lens.chartSwitch.dataLossLabel": "警告", "xpack.lens.chartSwitch.experimentalLabel": "技术预览", "xpack.lens.chartTitle.unsaved": "未保存的可视化", "xpack.lens.cloneLayerAriaLabel": "复制图层", @@ -23695,7 +23691,6 @@ "xpack.lens.layer.unlinkConfirm": "恢复更改", "xpack.lens.layerActions.layerSettingsAction": "图层设置", "xpack.lens.layerPanel.ignoreGlobalFilters": "忽略全局筛选", - "xpack.lens.layerPanel.layerVisualizationType": "图层可视化类型", "xpack.lens.layerPanel.missingDataView": "找不到数据视图", "xpack.lens.layerSettings.ignoreGlobalFilters": "使用全局筛选", "xpack.lens.layerTitle.fallbackLabel": "图层", diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/mappings.api.ts b/x-pack/test/api_integration/apis/management/index_management/lib/mappings.api.ts index f032f2893e318..c63a1ceebcc23 100644 --- a/x-pack/test/api_integration/apis/management/index_management/lib/mappings.api.ts +++ b/x-pack/test/api_integration/apis/management/index_management/lib/mappings.api.ts @@ -17,7 +17,14 @@ export function mappingsApi(getService: FtrProviderContext['getService']) { .set('kbn-xsrf', 'xxx') .set('x-elastic-internal-origin', 'xxx'); + const updateMappings = (index: string) => + supertest + .put(`${API_BASE_PATH}/mapping/${index}`) + .set('kbn-xsrf', 'xxx') + .set('x-elastic-internal-origin', 'xxx') + .send({ name: { type: 'text' } }); return { getMapping, + updateMappings, }; } diff --git a/x-pack/test/api_integration/apis/management/index_management/mapping.ts b/x-pack/test/api_integration/apis/management/index_management/mapping.ts index 5e3ebea13adc6..9fd638329d1f5 100644 --- a/x-pack/test/api_integration/apis/management/index_management/mapping.ts +++ b/x-pack/test/api_integration/apis/management/index_management/mapping.ts @@ -14,7 +14,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const log = getService('log'); - const { getMapping } = mappingsApi(getService); + const { getMapping, updateMappings } = mappingsApi(getService); const { createIndex, deleteAllIndices } = indicesHelpers(getService); describe('mappings', () => { @@ -54,5 +54,13 @@ export default function ({ getService }: FtrProviderContext) { expect(body.mappings).to.eql(mappings); }); + it('show update the index mappings', async () => { + await updateMappings(indexName).expect(200); + const { body } = await getMapping(indexName).expect(200); + expect(body.mappings).to.eql({ + ...mappings, + properties: { ...mappings.properties, name: { type: 'text' } }, + }); + }); }); } diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts b/x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts index b172c84624464..ddd1c080b308d 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts @@ -143,7 +143,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { pageObjects.header.waitUntilLoadingHasFinished(); }); - describe('Create detection rule', () => { + // FLAKY: https://github.com/elastic/kibana/issues/168991 + describe.skip('Create detection rule', () => { it('Creates a detection rule from the Take Action button and navigates to rule page', async () => { await latestFindingsTable.openFlyoutAt(0); await misconfigurationsFlyout.clickTakeActionCreateRuleButton(); diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/package_verification/packages/src/input_only-0.1.0/manifest.yml b/x-pack/test/fleet_api_integration/apis/fixtures/package_verification/packages/src/input_only-0.1.0/manifest.yml index 30533c4911fed..a41ef74bc661a 100644 --- a/x-pack/test/fleet_api_integration/apis/fixtures/package_verification/packages/src/input_only-0.1.0/manifest.yml +++ b/x-pack/test/fleet_api_integration/apis/fixtures/package_verification/packages/src/input_only-0.1.0/manifest.yml @@ -6,6 +6,9 @@ description: >- type: input version: 0.1.0 license: basic +agent: + privileges: + root: true categories: - custom policy_templates: @@ -34,12 +37,12 @@ policy_templates: required: false default: 72h icons: - - src: "/img/sample-logo.svg" - type: "image/svg+xml" + - src: '/img/sample-logo.svg' + type: 'image/svg+xml' screenshots: - - src: "/img/sample-screenshot.png" - title: "Sample screenshot" - size: "600x600" - type: "image/png" + - src: '/img/sample-screenshot.png' + title: 'Sample screenshot' + size: '600x600' + type: 'image/png' owner: - github: elastic/integrations \ No newline at end of file + github: elastic/integrations diff --git a/x-pack/test/functional/apps/dashboard/group3/reporting/reports/baseline/sample_data_ecommerce_76.png b/x-pack/test/functional/apps/dashboard/group3/reporting/reports/baseline/sample_data_ecommerce_76.png index e0729cc12080c..1ce272bd4a86f 100644 Binary files a/x-pack/test/functional/apps/dashboard/group3/reporting/reports/baseline/sample_data_ecommerce_76.png and b/x-pack/test/functional/apps/dashboard/group3/reporting/reports/baseline/sample_data_ecommerce_76.png differ diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table_filters.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table_filters.ts index 0ed1162ccf9ee..eee4cefeb1017 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table_filters.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table_filters.ts @@ -20,8 +20,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const testSubjects = getService('testSubjects'); const to = '2024-01-01T12:00:00.000Z'; - // FLAKY: https://github.com/elastic/kibana/issues/179092 - describe.skip('Dataset quality table filters', () => { + describe('Dataset quality table filters', () => { before(async () => { await synthtrace.index(getInitialTestLogs({ to, count: 4 })); await PageObjects.datasetQuality.navigateTo(); diff --git a/x-pack/test/functional/apps/lens/group1/smokescreen.ts b/x-pack/test/functional/apps/lens/group1/smokescreen.ts index 7a73428fdc6c9..a9b491ebe47fa 100644 --- a/x-pack/test/functional/apps/lens/group1/smokescreen.ts +++ b/x-pack/test/functional/apps/lens/group1/smokescreen.ts @@ -71,47 +71,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await find.allByCssSelector('.echLegendItem')).to.have.length(4); }); - describe('dimension flyout keeping open/closing when palette is open ', () => { - it('should keep the dimension editor open when switching to a chart that moves the column to the new group', async () => { - await PageObjects.visualize.navigateToNewVisualization(); - await PageObjects.visualize.clickVisType('lens'); - await PageObjects.lens.goToTimeRange(); - - await PageObjects.lens.configureDimension({ - dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', - operation: 'average', - field: 'bytes', - }); - - await PageObjects.lens.configureDimension({ - dimension: 'lnsXY_splitDimensionPanel > lns-empty-dimension', - operation: 'terms', - field: '@message.raw', - keepOpen: true, - }); - - await PageObjects.lens.openPalettePanel(); - - await PageObjects.lens.switchToVisualization('bar'); - - expect(await PageObjects.lens.isDimensionEditorOpen()).to.eql(true); - }); - it('should close the dimension editor when switching to a chart that removes the column', async () => { - await PageObjects.lens.closeDimensionEditor(); - await PageObjects.lens.configureDimension({ - dimension: 'lnsXY_splitDimensionPanel > lns-empty-dimension', - operation: 'terms', - field: '@message.raw', - keepOpen: true, - }); - - await PageObjects.lens.openPalettePanel(); - await PageObjects.lens.switchToVisualization('lnsLegacyMetric'); - - expect(await PageObjects.lens.isDimensionEditorOpen()).to.eql(false); - }); - }); - it('should create an xy visualization with filters aggregation', async () => { await PageObjects.visualize.gotoVisualizationLandingPage(); await listingTable.searchForItemWithName('lnsXYvis'); @@ -166,6 +125,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await PageObjects.lens.hasChartSwitchWarning('line')).to.eql(false); await PageObjects.lens.switchToVisualization('line'); + + expect(await PageObjects.lens.getLayerType(0)).to.eql('Line'); + // expect first layer to be line, second layer to be bar chart + expect(await PageObjects.lens.getLayerType(1)).to.eql('Bar vertical stacked'); await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', operation: 'terms', @@ -174,8 +137,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_yDimensionPanel > lns-empty-dimension', - operation: 'median', - field: 'bytes', + operation: 'average', + field: 'machine.ram', }); expect(await PageObjects.lens.getLayerCount()).to.eql(2); @@ -184,6 +147,59 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.existOrFail('workspace-drag-drop-prompt'); }); + it('should transition selected layer in a multi layer bar using layer chart switch', async () => { + await PageObjects.visualize.navigateToNewVisualization(); + await PageObjects.visualize.clickVisType('lens'); + await PageObjects.lens.goToTimeRange(); + + await PageObjects.lens.configureDimension({ + dimension: 'lnsXY_xDimensionPanel > lns-empty-dimension', + operation: 'date_histogram', + field: '@timestamp', + }); + + await PageObjects.lens.configureDimension({ + dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', + operation: 'average', + field: 'bytes', + }); + + await PageObjects.lens.createLayer(); + await PageObjects.lens.configureDimension({ + dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', + operation: 'terms', + field: 'geo.src', + }); + + await PageObjects.lens.configureDimension({ + dimension: 'lns-layerPanel-1 > lnsXY_yDimensionPanel > lns-empty-dimension', + operation: 'average', + field: 'machine.ram', + }); + + // only changes one layer for compatible chart + await PageObjects.lens.switchToVisualization('line', undefined, 1); + expect(await PageObjects.lens.getLayerType(0)).to.eql('Bar vertical stacked'); + expect(await PageObjects.lens.getLayerType(1)).to.eql('Line'); + + // changes all layers for multilayer chart + await PageObjects.lens.switchToVisualization('bar_horizontal_stacked', undefined, 0); + expect(await PageObjects.lens.getLayerType(0)).to.eql('Bar horizontal stacked'); + expect(await PageObjects.lens.getLayerType(1)).to.eql('Bar horizontal stacked'); + + // generates new one layer chart based on selected layer + await PageObjects.lens.switchToVisualization('pie', undefined, 1); + expect(await PageObjects.lens.getLayerType(0)).to.eql('Pie'); + const sliceByText = await PageObjects.lens.getDimensionTriggerText( + 'lnsPie_sliceByDimensionPanel' + ); + const sizeByText = await PageObjects.lens.getDimensionTriggerText( + 'lnsPie_sizeByDimensionPanel' + ); + expect(sliceByText).to.be('Top 5 values of geo.src'); + expect(sizeByText).to.be('Average of machine.ram'); + }); + it('should edit settings of xy line chart', async () => { await PageObjects.visualize.gotoVisualizationLandingPage(); await listingTable.searchForItemWithName('lnsXYvis'); @@ -392,12 +408,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); }); - it('should transition from bar chart to line chart using layer chart switch', async () => { + it('should transition from bar chart to line chart', async () => { await PageObjects.visualize.gotoVisualizationLandingPage(); await listingTable.searchForItemWithName('lnsXYvis'); await PageObjects.lens.clickVisualizeListItemTitle('lnsXYvis'); await PageObjects.lens.goToTimeRange(); - await PageObjects.lens.switchLayerSeriesType('line'); + await PageObjects.lens.switchToVisualization('line'); expect(await PageObjects.lens.getTitle()).to.eql('lnsXYvis'); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_xDimensionPanel')).to.eql( '@timestamp' diff --git a/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts b/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts index 0dd8ebe13e805..c6a34fe81183f 100644 --- a/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts +++ b/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts @@ -60,9 +60,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { dimension: 'lnsMetric_secondaryMetricDimensionPanel > lns-empty-dimension', operation: 'max', field: 'bytes', - keepOpen: true, }); - await PageObjects.lens.closeDimensionEditor(); await testSubjects.click('applyFlyoutButton'); await PageObjects.dashboard.waitForRenderComplete(); const data = await PageObjects.lens.getMetricVisualizationData(); @@ -123,11 +121,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { dimension: 'lnsMetric_secondaryMetricDimensionPanel > lns-empty-dimension', operation: 'max', field: 'bytes', - keepOpen: true, }); log.debug('Cancels the changes'); - await PageObjects.lens.closeDimensionEditor(); await testSubjects.click('cancelFlyoutButton'); await PageObjects.dashboard.waitForRenderComplete(); diff --git a/x-pack/test/functional/apps/lens/group4/colors.ts b/x-pack/test/functional/apps/lens/group4/colors.ts index 20265d247cf83..2670cc19653db 100644 --- a/x-pack/test/functional/apps/lens/group4/colors.ts +++ b/x-pack/test/functional/apps/lens/group4/colors.ts @@ -64,6 +64,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await PageObjects.lens.assertPalette(ElasticBrandPalette.id, false); + await PageObjects.lens.closeDimensionEditor(); }); it('should carry over palette to the pie chart', async () => { @@ -72,6 +73,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'lnsPie_sliceByDimensionPanel > lns-dimensionTrigger' ); await PageObjects.lens.assertPalette(ElasticBrandPalette.id, false); + await PageObjects.lens.closeDimensionEditor(); }); it('should carry palette back to the bar chart', async () => { diff --git a/x-pack/test/functional/apps/lens/open_in_lens/agg_based/xy.ts b/x-pack/test/functional/apps/lens/open_in_lens/agg_based/xy.ts index 37e2580b776ff..b54ea10d2217a 100644 --- a/x-pack/test/functional/apps/lens/open_in_lens/agg_based/xy.ts +++ b/x-pack/test/functional/apps/lens/open_in_lens/agg_based/xy.ts @@ -123,10 +123,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await retry.try(async () => { expect(await lens.getLayerCount()).to.be(2); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(2); - expect(await layersSettings[0].getVisibleText()).to.be('Area'); - expect(await layersSettings[1].getVisibleText()).to.be('Bar vertical'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(2); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Area'); + expect(await layerChartSwitches[1].getVisibleText()).to.be('Bar vertical'); const yDimensionText1 = await lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 0); const yDimensionText2 = await lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 1); expect(yDimensionText1).to.be('Count'); @@ -150,9 +150,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await retry.try(async () => { expect(await lens.getLayerCount()).to.be(1); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(1); - expect(await layersSettings[0].getVisibleText()).to.be('Bar vertical'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(1); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Bar vertical'); const yDimensionText1 = await lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 0); const yDimensionText2 = await lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 1); expect(yDimensionText1).to.be('Count'); @@ -236,9 +236,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await lens.waitForVisualization('xyVisChart'); await retry.try(async () => { expect(await lens.getLayerCount()).to.be(1); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(1); - expect(await layersSettings[0].getVisibleText()).to.be('Area stacked'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(1); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Area stacked'); }); }); @@ -256,9 +256,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await lens.waitForVisualization('xyVisChart'); await retry.try(async () => { expect(await lens.getLayerCount()).to.be(1); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(1); - expect(await layersSettings[0].getVisibleText()).to.be('Area percentage'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(1); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Area percentage'); }); }); @@ -275,9 +275,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await lens.waitForVisualization('xyVisChart'); await retry.try(async () => { expect(await lens.getLayerCount()).to.be(1); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(1); - expect(await layersSettings[0].getVisibleText()).to.be('Bar horizontal'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(1); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Bar horizontal'); }); }); diff --git a/x-pack/test/functional/apps/maps/group3/reports/baseline/example_map_report.png b/x-pack/test/functional/apps/maps/group3/reports/baseline/example_map_report.png index d89f23ec77ca4..d160e61ee2f82 100644 Binary files a/x-pack/test/functional/apps/maps/group3/reports/baseline/example_map_report.png and b/x-pack/test/functional/apps/maps/group3/reports/baseline/example_map_report.png differ diff --git a/x-pack/test/functional/apps/maps/group3/reports/baseline/geo_map_report.png b/x-pack/test/functional/apps/maps/group3/reports/baseline/geo_map_report.png index 1607769771a93..83e11d9ddf70a 100644 Binary files a/x-pack/test/functional/apps/maps/group3/reports/baseline/geo_map_report.png and b/x-pack/test/functional/apps/maps/group3/reports/baseline/geo_map_report.png differ diff --git a/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts b/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts index 167dc03510797..61320617c07f7 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts @@ -269,7 +269,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { } await ml.testExecution.logTestStep('sets limit size to Analyze all'); - await ml.dataVisualizer.setLimitSize('none'); + await ml.dataVisualizer.setLimitSize(100000); await ml.testExecution.logTestStep('updates table with newly set limit size'); for (const fieldRow of testData.expected.metricFields as Array< @@ -299,7 +299,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { }); } - describe('esql', function () { + describe('esql data visualizer', function () { this.tags(['ml']); before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index 2c917ba03ac12..ba1f2dbe296fc 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -104,6 +104,10 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv ); }, + async waitUntilTableLoaded() { + await find.waitForDeletedByCssSelector('.euiBasicTable-loading'); + }, + async waitUntilSummaryPanelLoaded() { await testSubjects.missingOrFail(`datasetQuality-${texts.activeDatasets}-loading`); await testSubjects.missingOrFail(`datasetQuality-${texts.estimatedData}-loading`); @@ -151,6 +155,7 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv }, async getDatasetTableRows(): Promise { + await this.waitUntilTableLoaded(); const table = await testSubjects.find(testSubjectSelectors.datasetQualityTable); const tBody = await table.findByTagName('tbody'); return tBody.findAllByTagName('tr'); diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index ccc7a7da38c57..8fd1b6e604548 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -875,8 +875,8 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont * @param subVisualizationId - the ID of the sub-visualization to switch to, such as * lnsDatatable or bar_stacked */ - async switchToVisualization(subVisualizationId: string, searchTerm?: string) { - await this.openChartSwitchPopover(); + async switchToVisualization(subVisualizationId: string, searchTerm?: string, layerIndex = 0) { + await this.openChartSwitchPopover(layerIndex); await this.waitForSearchInputValue(subVisualizationId, searchTerm); await testSubjects.click(`lnsChartSwitchPopover_${subVisualizationId}`); await PageObjects.header.waitUntilLoadingHasFinished(); @@ -893,12 +893,13 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont }); }, - async openChartSwitchPopover() { + async openChartSwitchPopover(layerIndex = 0) { if (await testSubjects.exists('lnsChartSwitchList', { timeout: 50 })) { return; } await retry.try(async () => { - await testSubjects.click('lnsChartSwitchPopover'); + const allChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + await allChartSwitches[layerIndex].click(); await testSubjects.existOrFail('lnsChartSwitchList'); }); }, @@ -967,25 +968,19 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont }, /** - * Uses the Lens layer switcher to switch seriesType for xy charts. - * - * @param subVisualizationId - the ID of the sub-visualization to switch to, such as - * line, + * Returns the number of layers visible in the chart configuration */ - async switchLayerSeriesType(seriesType: string) { - await retry.try(async () => { - await testSubjects.click('lns_layer_settings'); - await testSubjects.exists(`lnsXY_seriesType-${seriesType}`); - }); - - return await testSubjects.click(`lnsXY_seriesType-${seriesType}`); + async getLayerCount() { + return (await find.allByCssSelector(`[data-test-subj^="lns-layerPanel-"]`)).length; }, /** - * Returns the number of layers visible in the chart configuration + * Returns the layer vis type from chart switch label */ - async getLayerCount() { - return (await find.allByCssSelector(`[data-test-subj^="lns-layerPanel-"]`)).length; + async getLayerType(index = 0) { + return (await find.allByCssSelector(`[data-test-subj^="lnsChartSwitchPopover"]`))[ + index + ].getVisibleText(); }, /** diff --git a/x-pack/test/functional/services/ml/data_visualizer.ts b/x-pack/test/functional/services/ml/data_visualizer.ts index 560e189aaf576..39a1450aea320 100644 --- a/x-pack/test/functional/services/ml/data_visualizer.ts +++ b/x-pack/test/functional/services/ml/data_visualizer.ts @@ -95,18 +95,18 @@ export function MachineLearningDataVisualizerProvider({ getService }: FtrProvide }); }, - async assertLimitSize(size: 5000 | 10000 | 100000 | 1000000 | 'none') { + async assertLimitSize(size: 5000 | 10000 | 100000) { await testSubjects.existOrFail(`dvESQLLimitSize-${size}`, { timeout: 1000 }); }, - async setLimitSize(size: 5000 | 10000 | 100000 | 1000000 | 'none') { + async setLimitSize(size: 5000 | 10000 | 100000) { await retry.tryForTime(5000, async () => { // escape popover await browser.pressKeys(browser.keys.ESCAPE); // Once clicked, show list of options await testSubjects.clickWhenNotDisabled('dvESQLLimitSizeSelect'); - for (const option of [5000, 10000, 100000, 1000000, 'none']) { + for (const option of [5000, 10000, 100000]) { await testSubjects.existOrFail(`dvESQLLimitSize-${option}`, { timeout: 1000 }); } diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/global_alerts_page.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/global_alerts_page.ts index ca3b40be16344..6faa8894d6a01 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/global_alerts_page.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/global_alerts_page.ts @@ -8,7 +8,6 @@ import expect from '@kbn/expect'; import { CustomCheerio } from '@kbn/ftr-common-functional-ui-services'; import { FtrProviderContext } from '../../ftr_provider_context'; -import { ObjectRemover } from '../../lib/object_remover'; const FILTERABLE_SOLUTIONS = ['Stack management', 'Machine Learning', 'Observability', 'Security']; @@ -26,18 +25,12 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const security = getService('security'); const pageObjects = getPageObjects(['common', 'triggersActionsUI', 'header']); const log = getService('log'); - const supertest = getService('supertest'); - const objectRemover = new ObjectRemover(supertest); - - // Failing: See https://github.com/elastic/kibana/issues/178887 - describe.skip('Global alerts page', function () { - // FLAKY: https://github.com/elastic/kibana/issues/178322 - describe.skip('Loads the page with limited privileges', () => { - before(async () => { - await security.testUser.setRoles(['alerts_and_actions_role']); - }); - after(async () => { + + describe('Global alerts page', function () { + describe('Loads the page with limited privileges', () => { + beforeEach(async () => { await security.testUser.restoreDefaults(); + await security.testUser.setRoles(['alerts_and_actions_role']); }); it('Loads the page', async () => { @@ -71,11 +64,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); describe('Loads the page with actions but not alerting privilege', () => { - before(async () => { - await security.testUser.setRoles(['only_actions_role']); - }); - after(async () => { + beforeEach(async () => { await security.testUser.restoreDefaults(); + await security.testUser.setRoles(['only_actions_role']); }); it('Loads the page but shows missing permission prompt', async () => { @@ -93,6 +84,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('Loads the page', () => { beforeEach(async () => { + await security.testUser.restoreDefaults(); await pageObjects.common.navigateToUrl( 'management', 'insightsAndAlerting/triggersActionsAlerts', @@ -102,10 +94,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { ); }); - afterEach(async () => { - await objectRemover.removeAll(); - }); - it('Loads the page', async () => { log.debug('Checking for section heading to say Alerts.'); diff --git a/x-pack/test/localization/tests/lens/smokescreen.ts b/x-pack/test/localization/tests/lens/smokescreen.ts index da8d17f65c68f..85dd1e18d83ea 100644 --- a/x-pack/test/localization/tests/lens/smokescreen.ts +++ b/x-pack/test/localization/tests/lens/smokescreen.ts @@ -31,6 +31,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return 'Vertical à barres'; case 'bar_stacked': return 'Vertical à barres empilées'; + case 'bar_horizontal': + return 'Horizontal à barres'; case 'line': return 'Ligne'; case 'donut': @@ -78,6 +80,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return '縦棒'; case 'bar_stacked': return '積み上げ縦棒'; + case 'bar_horizontal': + return '横棒'; case 'line': return '折れ線'; case 'donut': @@ -122,6 +126,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return '垂直条形图'; case 'bar_stacked': return '垂直堆积条形图'; + case 'bar_horizontal': + return '水平条形图'; case 'line': return '折线图'; case 'donut': @@ -291,6 +297,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); await PageObjects.lens.switchToVisualization('line', termTranslator('line')); + + expect(await PageObjects.lens.getLayerType(0)).to.eql(termTranslator('line')); + expect(await PageObjects.lens.getLayerType(1)).to.eql(termTranslator('bar_stacked')); + await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', operation: 'terms', @@ -299,8 +309,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_yDimensionPanel > lns-empty-dimension', - operation: 'median', - field: 'bytes', + operation: 'average', + field: 'machine.ram', }); expect(await PageObjects.lens.getLayerCount()).to.eql(2); @@ -309,6 +319,65 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.existOrFail('workspace-drag-drop-prompt'); }); + it('should transition selected layer in a multi layer bar using layer chart switch', async () => { + await PageObjects.visualize.navigateToNewVisualization(); + await PageObjects.visualize.clickVisType('lens'); + await PageObjects.lens.goToTimeRange(); + + await PageObjects.lens.configureDimension({ + dimension: 'lnsXY_xDimensionPanel > lns-empty-dimension', + operation: 'date_histogram', + field: '@timestamp', + }); + + await PageObjects.lens.configureDimension({ + dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', + operation: 'average', + field: 'bytes', + }); + + await PageObjects.lens.createLayer(); + await PageObjects.lens.configureDimension({ + dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', + operation: 'terms', + field: 'geo.src', + }); + + await PageObjects.lens.configureDimension({ + dimension: 'lns-layerPanel-1 > lnsXY_yDimensionPanel > lns-empty-dimension', + operation: 'average', + field: 'machine.ram', + }); + + // only changes one layer for compatible chart + await PageObjects.lens.switchToVisualization('line', termTranslator('line'), 1); + + expect(await PageObjects.lens.getLayerType(0)).to.eql(termTranslator('bar_stacked')); + expect(await PageObjects.lens.getLayerType(1)).to.eql(termTranslator('line')); + + // changes all layers for multilayer chart + await PageObjects.lens.switchToVisualization( + 'bar_horizontal', + termTranslator('bar_horizontal'), + 1 + ); + expect(await PageObjects.lens.getLayerType(0)).to.eql(termTranslator('bar_horizontal')); + expect(await PageObjects.lens.getLayerType(1)).to.eql(termTranslator('bar_horizontal')); + + // generates new one layer chart based on selected layer + await PageObjects.lens.switchToVisualization('pie', termTranslator('pie'), 1); + expect(await PageObjects.lens.getLayerType(0)).to.eql(termTranslator('pie')); + const sliceByText = await PageObjects.lens.getDimensionTriggerText( + 'lnsPie_sliceByDimensionPanel' + ); + const sizeByText = await PageObjects.lens.getDimensionTriggerText( + 'lnsPie_sizeByDimensionPanel' + ); + + expect(sliceByText).to.be(termTranslator('terms', 'geo.src', 5)); + expect(sizeByText).to.be(termTranslator('average', 'machine.ram')); + }); + it('should edit settings of xy line chart', async () => { await PageObjects.visualize.gotoVisualizationLandingPage(); await listingTable.searchForItemWithName('lnsXYvis'); @@ -478,12 +547,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); }); - it('should transition from bar chart to line chart using layer chart switch', async () => { + it('should transition from bar chart to line chart', async () => { await PageObjects.visualize.gotoVisualizationLandingPage(); await listingTable.searchForItemWithName('lnsXYvis'); await PageObjects.lens.clickVisualizeListItemTitle('lnsXYvis'); await PageObjects.lens.goToTimeRange(); - await PageObjects.lens.switchLayerSeriesType('line'); + await PageObjects.lens.switchToVisualization('line', termTranslator('line')); expect(await PageObjects.lens.getTitle()).to.eql('lnsXYvis'); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_xDimensionPanel')).to.eql( '@timestamp' diff --git a/x-pack/test/osquery_cypress/utils.ts b/x-pack/test/osquery_cypress/utils.ts index 810f432d14dd9..b196f14af956d 100644 --- a/x-pack/test/osquery_cypress/utils.ts +++ b/x-pack/test/osquery_cypress/utils.ts @@ -110,6 +110,12 @@ export const addIntegrationToAgentPolicy = async ( }); }; +/** + * Check if the given version string is a valid artifact version + * @param version Version string + */ +const isValidArtifactVersion = (version: string) => !!version.match(/^\d+\.\d+\.\d+(-SNAPSHOT)?$/); + /** * Returns the Agent version that is available for install (will check `artifacts-api.elastic.co/v1/versions`) * that is equal to or less than `maxVersion`. @@ -120,7 +126,12 @@ export const getLatestAvailableAgentVersion = async (kbnClient: KbnClient): Prom const kbnStatus = await kbnClient.status.get(); const agentVersions = await axios .get('https://artifacts-api.elastic.co/v1/versions') - .then((response) => map(response.data.versions, (version) => version.split('-SNAPSHOT')[0])); + .then((response) => + map( + response.data.versions.filter(isValidArtifactVersion), + (version) => version.split('-SNAPSHOT')[0] + ) + ); let version = semver.maxSatisfying(agentVersions, `<=${kbnStatus.version.number}`) ?? diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel.ts index 7edd12dcf1eda..b5a3f780dbf66 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel.ts @@ -5,19 +5,17 @@ * 2.0. */ -import { - INSIGHTS_TAB_TEST_ID, - INVESTIGATION_TAB_TEST_ID, - RESPONSE_TAB_TEST_ID, - VISUALIZE_TAB_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/left/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; -export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB = - getDataTestSubjectSelector(INSIGHTS_TAB_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB = - getDataTestSubjectSelector(VISUALIZE_TAB_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_INVESTIGATION_TAB = - getDataTestSubjectSelector(INVESTIGATION_TAB_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_RESPONSE_TAB = - getDataTestSubjectSelector(RESPONSE_TAB_TEST_ID); +export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB = getDataTestSubjectSelector( + 'securitySolutionFlyoutInsightsTab' +); +export const DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB = getDataTestSubjectSelector( + 'securitySolutionFlyoutVisualizeTab' +); +export const DOCUMENT_DETAILS_FLYOUT_INVESTIGATION_TAB = getDataTestSubjectSelector( + 'securitySolutionFlyoutInvestigationTab' +); +export const DOCUMENT_DETAILS_FLYOUT_RESPONSE_TAB = getDataTestSubjectSelector( + 'securitySolutionFlyoutResponseTab' +); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_analyzer_graph_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_analyzer_graph_tab.ts index dc0b384aed40f..e0a923ecc8624 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_analyzer_graph_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_analyzer_graph_tab.ts @@ -5,11 +5,9 @@ * 2.0. */ -import { VISUALIZE_TAB_GRAPH_ANALYZER_BUTTON_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/tabs/test_ids'; -import { ANALYZER_GRAPH_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_GRAPH_ANALYZER_BUTTON = - getDataTestSubjectSelector(VISUALIZE_TAB_GRAPH_ANALYZER_BUTTON_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutVisualizeTabGraphAnalyzerButton'); export const DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_GRAPH_ANALYZER_CONTENT = - getDataTestSubjectSelector(ANALYZER_GRAPH_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutAnalyzerGraph'); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_correlations_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_correlations_tab.ts index c2a76ed9fe37c..21f20f8679cdc 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_correlations_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_correlations_tab.ts @@ -5,73 +5,64 @@ * 2.0. */ -import { INSIGHTS_TAB_CORRELATIONS_BUTTON_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/tabs/test_ids'; -import { - CORRELATIONS_DETAILS_BY_ANCESTRY_SECTION_TEST_ID, - CORRELATIONS_DETAILS_BY_SESSION_SECTION_TEST_ID, - CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TEST_ID, - CORRELATIONS_DETAILS_CASES_SECTION_TEST_ID, - CORRELATIONS_DETAILS_SUPPRESSED_ALERTS_SECTION_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/left/components/test_ids'; -import { EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/shared/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_CORRELATIONS_BUTTON = getDataTestSubjectSelector( - INSIGHTS_TAB_CORRELATIONS_BUTTON_TEST_ID + 'securitySolutionFlyoutInsightsTabCorrelationsButton' ); export const CORRELATIONS_ANCESTRY_SECTION_TITLE = getDataTestSubjectSelector( - EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(CORRELATIONS_DETAILS_BY_ANCESTRY_SECTION_TEST_ID) + 'securitySolutionFlyoutCorrelationsDetailsAlertsByAncestrySectionTitleText' ); export const CORRELATIONS_ANCESTRY_SECTION_TABLE = getDataTestSubjectSelector( - `${CORRELATIONS_DETAILS_BY_ANCESTRY_SECTION_TEST_ID}Table` + 'securitySolutionFlyoutCorrelationsDetailsAlertsByAncestrySectionTable' ); export const CORRELATIONS_ANCESTRY_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON = getDataTestSubjectSelector( - `${CORRELATIONS_DETAILS_BY_ANCESTRY_SECTION_TEST_ID}InvestigateInTimeline` + 'securitySolutionFlyoutCorrelationsDetailsAlertsByAncestrySectionInvestigateInTimeline' ); export const CORRELATIONS_SOURCE_SECTION_TITLE = getDataTestSubjectSelector( - EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TEST_ID) + 'securitySolutionFlyoutCorrelationsDetailsAlertsBySourceSectionTitleText' ); export const CORRELATIONS_SOURCE_SECTION_TABLE = getDataTestSubjectSelector( - `${CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TEST_ID}Table` + 'securitySolutionFlyoutCorrelationsDetailsAlertsBySourceSectionTable' ); export const CORRELATIONS_SOURCE_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON = getDataTestSubjectSelector( - `${CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TEST_ID}InvestigateInTimeline` + 'securitySolutionFlyoutCorrelationsDetailsAlertsBySourceSectionInvestigateInTimeline' ); export const CORRELATIONS_SESSION_SECTION_TITLE = getDataTestSubjectSelector( - EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(CORRELATIONS_DETAILS_BY_SESSION_SECTION_TEST_ID) + 'securitySolutionFlyoutCorrelationsDetailsAlertsBySessionSectionTitleText' ); export const CORRELATIONS_SESSION_SECTION_TABLE = getDataTestSubjectSelector( - `${CORRELATIONS_DETAILS_BY_SESSION_SECTION_TEST_ID}Table` + 'securitySolutionFlyoutCorrelationsDetailsAlertsBySessionSectionTable' ); export const CORRELATIONS_SESSION_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON = getDataTestSubjectSelector( - `${CORRELATIONS_DETAILS_BY_SESSION_SECTION_TEST_ID}InvestigateInTimeline` + 'securitySolutionFlyoutCorrelationsDetailsAlertsBySessionSectionInvestigateInTimeline' ); export const CORRELATIONS_CASES_SECTION_TITLE = getDataTestSubjectSelector( - EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(CORRELATIONS_DETAILS_CASES_SECTION_TEST_ID) + 'securitySolutionFlyoutCorrelationsDetailsCasesSectionTitleText' ); export const CORRELATIONS_CASES_SECTION_TABLE = getDataTestSubjectSelector( - `${CORRELATIONS_DETAILS_CASES_SECTION_TEST_ID}Table` + 'securitySolutionFlyoutCorrelationsDetailsCasesSectionTable' ); export const CORRELATIONS_SUPPRESSED_ALERTS_TITLE = getDataTestSubjectSelector( - EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(CORRELATIONS_DETAILS_SUPPRESSED_ALERTS_SECTION_TEST_ID) + 'securitySolutionFlyoutCorrelationsDetailsSuppressedAlertsSectionTitleText' ); export const CORRELATIONS_SUPPRESSED_ALERTS_INVESTIGATE_IN_TIMELINE_BUTTON = getDataTestSubjectSelector( - `${CORRELATIONS_DETAILS_SUPPRESSED_ALERTS_SECTION_TEST_ID}InvestigateInTimeline` + 'securitySolutionFlyoutCorrelationsDetailsSuppressedAlertsSectionInvestigateInTimeline' ); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_entities_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_entities_tab.ts index 8d4bb411c9e3e..37424eeb935fa 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_entities_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_entities_tab.ts @@ -5,34 +5,24 @@ * 2.0. */ -import { - HOST_DETAILS_TEST_ID, - USER_DETAILS_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/left/components/test_ids'; -import { INSIGHTS_TAB_ENTITIES_BUTTON_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/tabs/test_ids'; -import { - EXPANDABLE_PANEL_CONTENT_TEST_ID, - EXPANDABLE_PANEL_HEADER_RIGHT_SECTION_TEST_ID, - EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/shared/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_ENTITIES_BUTTON = getDataTestSubjectSelector( - INSIGHTS_TAB_ENTITIES_BUTTON_TEST_ID + 'securitySolutionFlyoutInsightsTabEntitiesButton' ); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS_TITLE = getDataTestSubjectSelector( - EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(USER_DETAILS_TEST_ID) + 'securitySolutionFlyoutUsersDetailsTitleText' ); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS_RIGHT_SECTION = - getDataTestSubjectSelector(EXPANDABLE_PANEL_HEADER_RIGHT_SECTION_TEST_ID(USER_DETAILS_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutUsersDetailsRightSection'); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS = getDataTestSubjectSelector( - EXPANDABLE_PANEL_CONTENT_TEST_ID(USER_DETAILS_TEST_ID) + 'securitySolutionFlyoutUsersDetailsContent' ); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS_TITLE = getDataTestSubjectSelector( - EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(HOST_DETAILS_TEST_ID) + 'securitySolutionFlyoutHostsDetailsTitleText' ); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS_RIGHT_SECTION = - getDataTestSubjectSelector(EXPANDABLE_PANEL_HEADER_RIGHT_SECTION_TEST_ID(HOST_DETAILS_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutHostsDetailsRightSection'); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS = getDataTestSubjectSelector( - EXPANDABLE_PANEL_CONTENT_TEST_ID(HOST_DETAILS_TEST_ID) + 'securitySolutionFlyoutHostsDetailsContent' ); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_investigation_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_investigation_tab.ts index e644c29bccea9..467616aa7417a 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_investigation_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_investigation_tab.ts @@ -5,12 +5,11 @@ * 2.0. */ -import { INVESTIGATION_TAB_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/test_ids'; -import { INVESTIGATION_TAB_CONTENT_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/tabs/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; -export const DOCUMENT_DETAILS_FLYOUT_INVESTIGATION_TAB = - getDataTestSubjectSelector(INVESTIGATION_TAB_TEST_ID); +export const DOCUMENT_DETAILS_FLYOUT_INVESTIGATION_TAB = getDataTestSubjectSelector( + 'securitySolutionFlyoutInvestigationTab' +); export const DOCUMENT_DETAILS_FLYOUT_INVESTIGATION_TAB_CONTENT = getDataTestSubjectSelector( - INVESTIGATION_TAB_CONTENT_TEST_ID + 'securitySolutionFlyoutInvestigationsTabContent' ); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_prevalence_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_prevalence_tab.ts index fe7f7d2fc9e8e..4830ef2f28500 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_prevalence_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_prevalence_tab.ts @@ -5,32 +5,22 @@ * 2.0. */ -import { - PREVALENCE_DETAILS_TABLE_ALERT_COUNT_CELL_TEST_ID, - PREVALENCE_DETAILS_TABLE_DOC_COUNT_CELL_TEST_ID, - PREVALENCE_DETAILS_TABLE_HOST_PREVALENCE_CELL_TEST_ID, - PREVALENCE_DETAILS_TABLE_VALUE_CELL_TEST_ID, - PREVALENCE_DETAILS_TABLE_FIELD_CELL_TEST_ID, - PREVALENCE_DETAILS_TABLE_USER_PREVALENCE_CELL_TEST_ID, - PREVALENCE_DETAILS_DATE_PICKER_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/left/components/test_ids'; -import { INSIGHTS_TAB_PREVALENCE_BUTTON_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/tabs/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_BUTTON = getDataTestSubjectSelector( - INSIGHTS_TAB_PREVALENCE_BUTTON_TEST_ID + 'securitySolutionFlyoutInsightsTabPrevalenceButton' ); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_DATE_PICKER = - getDataTestSubjectSelector(PREVALENCE_DETAILS_DATE_PICKER_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutPrevalenceDetailsDatePicker'); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_TYPE_CELL = - getDataTestSubjectSelector(PREVALENCE_DETAILS_TABLE_FIELD_CELL_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutPrevalenceDetailsTableFieldCell'); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_NAME_CELL = - getDataTestSubjectSelector(PREVALENCE_DETAILS_TABLE_VALUE_CELL_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutPrevalenceDetailsTableValueCell'); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_ALERT_COUNT_CELL = - getDataTestSubjectSelector(PREVALENCE_DETAILS_TABLE_ALERT_COUNT_CELL_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutPrevalenceDetailsTableAlertCountCell'); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_DOC_COUNT_CELL = - getDataTestSubjectSelector(PREVALENCE_DETAILS_TABLE_DOC_COUNT_CELL_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutPrevalenceDetailsTableDocCountCell'); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_HOST_PREVALENCE_CELL = - getDataTestSubjectSelector(PREVALENCE_DETAILS_TABLE_HOST_PREVALENCE_CELL_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutPrevalenceDetailsTableHostPrevalenceCell'); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_USER_PREVALENCE_CELL = - getDataTestSubjectSelector(PREVALENCE_DETAILS_TABLE_USER_PREVALENCE_CELL_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutPrevalenceDetailsTableUserPrevalenceCell'); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_response_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_response_tab.ts index 74a109266773a..b1aa49fcf0a4d 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_response_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_response_tab.ts @@ -5,16 +5,14 @@ * 2.0. */ -import { RESPONSE_TAB_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/test_ids'; -import { - RESPONSE_DETAILS_TEST_ID, - RESPONSE_NO_DATA_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/left/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; -export const DOCUMENT_DETAILS_FLYOUT_RESPONSE_TAB = - getDataTestSubjectSelector(RESPONSE_TAB_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_RESPONSE_DETAILS = - getDataTestSubjectSelector(RESPONSE_DETAILS_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_RESPONSE_EMPTY = - getDataTestSubjectSelector(RESPONSE_NO_DATA_TEST_ID); +export const DOCUMENT_DETAILS_FLYOUT_RESPONSE_TAB = getDataTestSubjectSelector( + 'securitySolutionFlyoutResponseTab' +); +export const DOCUMENT_DETAILS_FLYOUT_RESPONSE_DETAILS = getDataTestSubjectSelector( + 'securitySolutionFlyoutResponseDetails' +); +export const DOCUMENT_DETAILS_FLYOUT_RESPONSE_EMPTY = getDataTestSubjectSelector( + 'securitySolutionFlyoutResponseNoData' +); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_session_view_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_session_view_tab.ts index e05b79f83ddc1..323d9da64c1c2 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_session_view_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_session_view_tab.ts @@ -5,9 +5,8 @@ * 2.0. */ -import { VISUALIZE_TAB_SESSION_VIEW_BUTTON_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/tabs/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_SESSION_VIEW_BUTTON = getDataTestSubjectSelector( - VISUALIZE_TAB_SESSION_VIEW_BUTTON_TEST_ID + 'securitySolutionFlyoutVisualizeTabSessionViewButton' ); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_threat_intelligence_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_threat_intelligence_tab.ts index 83716fb9bc450..3523061acd62a 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_threat_intelligence_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_threat_intelligence_tab.ts @@ -5,8 +5,7 @@ * 2.0. */ -import { INSIGHTS_TAB_THREAT_INTELLIGENCE_BUTTON_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/tabs/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_THREAT_INTELLIGENCE_BUTTON = - getDataTestSubjectSelector(INSIGHTS_TAB_THREAT_INTELLIGENCE_BUTTON_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutInsightsTabThreatIntelligenceButton'); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_alert_reason_preview.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_alert_reason_preview.ts index 868083d5c25ba..24bb9fc086443 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_alert_reason_preview.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_alert_reason_preview.ts @@ -5,9 +5,8 @@ * 2.0. */ -import { ALERT_REASON_PREVIEW_BODY_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/preview/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_ALERT_REASON_PREVIEW_CONTAINER = getDataTestSubjectSelector( - ALERT_REASON_PREVIEW_BODY_TEST_ID + 'securitySolutionFlyoutAlertReasonPreviewBody' ); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_rule_preview.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_rule_preview.ts index e808a3c07a7db..ff0107a3f97cc 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_rule_preview.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_rule_preview.ts @@ -5,46 +5,32 @@ * 2.0. */ -import { - RULE_PREVIEW_TITLE_TEST_ID, - RULE_PREVIEW_RULE_CREATED_BY_TEST_ID, - RULE_PREVIEW_RULE_UPDATED_BY_TEST_ID, - RULE_PREVIEW_ABOUT_HEADER_TEST_ID, - RULE_PREVIEW_ABOUT_CONTENT_TEST_ID, - RULE_PREVIEW_DEFINITION_HEADER_TEST_ID, - RULE_PREVIEW_DEFINITION_CONTENT_TEST_ID, - RULE_PREVIEW_SCHEDULE_HEADER_TEST_ID, - RULE_PREVIEW_SCHEDULE_CONTENT_TEST_ID, - RULE_PREVIEW_FOOTER_TEST_ID, - RULE_PREVIEW_NAVIGATE_TO_RULE_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/preview/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_TITLE = getDataTestSubjectSelector( - RULE_PREVIEW_TITLE_TEST_ID + 'securitySolutionFlyoutRulePreviewRulePreviewTitle' ); export const DOCUMENT_DETAILS_FLYOUT_CREATED_BY = getDataTestSubjectSelector( - RULE_PREVIEW_RULE_CREATED_BY_TEST_ID + 'securitySolutionFlyoutRulePreviewCreatedByText' ); export const DOCUMENT_DETAILS_FLYOUT_UPDATED_BY = getDataTestSubjectSelector( - RULE_PREVIEW_RULE_UPDATED_BY_TEST_ID + 'securitySolutionFlyoutRulePreviewUpdatedByText' ); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_HEADER = getDataTestSubjectSelector( - RULE_PREVIEW_ABOUT_HEADER_TEST_ID + 'securitySolutionFlyoutRulePreviewAboutSectionHeader' ); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_CONTENT = - getDataTestSubjectSelector(RULE_PREVIEW_ABOUT_CONTENT_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutRulePreviewAboutSectionContent'); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_HEADER = - getDataTestSubjectSelector(RULE_PREVIEW_DEFINITION_HEADER_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutRulePreviewDefinitionSectionHeader'); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_CONTENT = - getDataTestSubjectSelector(RULE_PREVIEW_DEFINITION_CONTENT_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutRulePreviewDefinitionSectionContent'); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_HEADER = - getDataTestSubjectSelector(RULE_PREVIEW_SCHEDULE_HEADER_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutRulePreviewScheduleSectionHeader'); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_CONTENT = - getDataTestSubjectSelector(RULE_PREVIEW_SCHEDULE_CONTENT_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutRulePreviewScheduleSectionContent'); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER = getDataTestSubjectSelector( - RULE_PREVIEW_FOOTER_TEST_ID -); -export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER_LINK = getDataTestSubjectSelector( - RULE_PREVIEW_NAVIGATE_TO_RULE_TEST_ID + 'securitySolutionFlyoutRulePreviewFooter' ); +export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER_LINK = + getDataTestSubjectSelector('goToRuleDetails'); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel.ts index 77945869ff0a9..4044c284ee054 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel.ts @@ -5,63 +5,52 @@ * 2.0. */ -import { - FLYOUT_BODY_TEST_ID, - JSON_TAB_TEST_ID, - OVERVIEW_TAB_TEST_ID, - TABLE_TAB_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/right/test_ids'; -import { - RISK_SCORE_TITLE_TEST_ID, - RISK_SCORE_VALUE_TEST_ID, - SEVERITY_VALUE_TEST_ID, - STATUS_BUTTON_TEST_ID, - FLYOUT_ALERT_HEADER_TITLE_TEST_ID, - ASSIGNEES_HEADER_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/right/components/test_ids'; -import { - COLLAPSE_DETAILS_BUTTON_TEST_ID, - EXPAND_DETAILS_BUTTON_TEST_ID, - TITLE_HEADER_TEXT_TEST_ID, - TITLE_LINK_ICON_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/shared/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; -export const DOCUMENT_DETAILS_FLYOUT_BODY = getDataTestSubjectSelector(FLYOUT_BODY_TEST_ID); +export const DOCUMENT_DETAILS_FLYOUT_BODY = getDataTestSubjectSelector( + 'securitySolutionFlyoutBody' +); /* Header */ export const DOCUMENT_DETAILS_FLYOUT_HEADER_ICON = getDataTestSubjectSelector( - TITLE_LINK_ICON_TEST_ID(FLYOUT_ALERT_HEADER_TITLE_TEST_ID) + 'securitySolutionFlyoutAlertTitleIcon' ); export const DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE = getDataTestSubjectSelector( - TITLE_HEADER_TEXT_TEST_ID(FLYOUT_ALERT_HEADER_TITLE_TEST_ID) + 'securitySolutionFlyoutAlertTitleText' ); export const DOCUMENT_DETAILS_FLYOUT_HEADER_LINK_ICON = getDataTestSubjectSelector( - TITLE_LINK_ICON_TEST_ID(FLYOUT_ALERT_HEADER_TITLE_TEST_ID) + 'securitySolutionFlyoutAlertTitleLinkIcon' ); export const DOCUMENT_DETAILS_FLYOUT_CLOSE_BUTTON = getDataTestSubjectSelector('euiFlyoutCloseButton'); export const DOCUMENT_DETAILS_FLYOUT_EXPAND_DETAILS_BUTTON = getDataTestSubjectSelector( - EXPAND_DETAILS_BUTTON_TEST_ID + 'securitySolutionFlyoutNavigationExpandDetailButton' ); export const DOCUMENT_DETAILS_FLYOUT_COLLAPSE_DETAILS_BUTTON = getDataTestSubjectSelector( - COLLAPSE_DETAILS_BUTTON_TEST_ID + 'securitySolutionFlyoutNavigationCollapseDetailButton' +); +export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB = getDataTestSubjectSelector( + 'securitySolutionFlyoutOverviewTab' +); +export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB = getDataTestSubjectSelector( + 'securitySolutionFlyoutTableTab' +); +export const DOCUMENT_DETAILS_FLYOUT_JSON_TAB = getDataTestSubjectSelector( + 'securitySolutionFlyoutJsonTab' ); -export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB = - getDataTestSubjectSelector(OVERVIEW_TAB_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB = getDataTestSubjectSelector(TABLE_TAB_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_JSON_TAB = getDataTestSubjectSelector(JSON_TAB_TEST_ID); export const DOCUMENT_DETAILS_FLYOUT_HEADER_STATUS = - getDataTestSubjectSelector(STATUS_BUTTON_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE = - getDataTestSubjectSelector(RISK_SCORE_TITLE_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE_VALUE = - getDataTestSubjectSelector(RISK_SCORE_VALUE_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_HEADER_SEVERITY_VALUE = - getDataTestSubjectSelector(SEVERITY_VALUE_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_HEADER_ASSIGNEES = - getDataTestSubjectSelector(ASSIGNEES_HEADER_TEST_ID); + getDataTestSubjectSelector('rule-status-badge'); +export const DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE = getDataTestSubjectSelector( + 'securitySolutionFlyoutHeaderRiskScoreTitle' +); +export const DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE_VALUE = getDataTestSubjectSelector( + 'securitySolutionFlyoutHeaderRiskScoreValue' +); +export const DOCUMENT_DETAILS_FLYOUT_HEADER_SEVERITY_VALUE = getDataTestSubjectSelector('severity'); +export const DOCUMENT_DETAILS_FLYOUT_HEADER_ASSIGNEES = getDataTestSubjectSelector( + 'securitySolutionFlyoutHeaderAssigneesHeader' +); /* Footer */ diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_json_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_json_tab.ts index 66549fea944c6..6380b69eaa184 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_json_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_json_tab.ts @@ -5,14 +5,9 @@ * 2.0. */ -import { - JSON_TAB_CONTENT_TEST_ID, - JSON_TAB_COPY_TO_CLIPBOARD_BUTTON_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/right/tabs/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_JSON_TAB_COPY_TO_CLIPBOARD_BUTTON = getDataTestSubjectSelector( - JSON_TAB_COPY_TO_CLIPBOARD_BUTTON_TEST_ID + 'securitySolutionFlyoutJsonTabCopyToClipboard' ); -export const DOCUMENT_DETAILS_FLYOUT_JSON_TAB_CONTENT = - getDataTestSubjectSelector(JSON_TAB_CONTENT_TEST_ID); +export const DOCUMENT_DETAILS_FLYOUT_JSON_TAB_CONTENT = getDataTestSubjectSelector('jsonView'); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts index 698066fd06056..c96919398a3be 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts @@ -5,145 +5,106 @@ * 2.0. */ -import { - EXPANDABLE_PANEL_CONTENT_TEST_ID, - EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/shared/components/test_ids'; -import { - ABOUT_SECTION_HEADER_TEST_ID, - ALERT_DESCRIPTION_DETAILS_TEST_ID, - ALERT_DESCRIPTION_TITLE_TEST_ID, - RULE_SUMMARY_BUTTON_TEST_ID, - HIGHLIGHTED_FIELDS_DETAILS_TEST_ID, - HIGHLIGHTED_FIELDS_TITLE_TEST_ID, - INSIGHTS_HEADER_TEST_ID, - INVESTIGATION_GUIDE_BUTTON_TEST_ID, - INVESTIGATION_SECTION_HEADER_TEST_ID, - MITRE_ATTACK_DETAILS_TEST_ID, - MITRE_ATTACK_TITLE_TEST_ID, - REASON_DETAILS_TEST_ID, - REASON_TITLE_TEST_ID, - VISUALIZATIONS_SECTION_HEADER_TEST_ID, - HIGHLIGHTED_FIELDS_CELL_TEST_ID, - RESPONSE_SECTION_HEADER_TEST_ID, - INSIGHTS_THREAT_INTELLIGENCE_TEST_ID, - CORRELATIONS_TEST_ID, - PREVALENCE_TEST_ID, - SUMMARY_ROW_VALUE_TEST_ID, - CORRELATIONS_RELATED_ALERTS_BY_ANCESTRY_TEST_ID, - CORRELATIONS_RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID, - CORRELATIONS_RELATED_ALERTS_BY_SESSION_TEST_ID, - CORRELATIONS_RELATED_CASES_TEST_ID, - CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID, - INSIGHTS_ENTITIES_TEST_ID, - REASON_DETAILS_PREVIEW_BUTTON_TEST_ID, - ANALYZER_PREVIEW_TEST_ID, - SESSION_PREVIEW_TEST_ID, - RESPONSE_BUTTON_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/right/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; /* About section */ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_ABOUT_SECTION_HEADER = getDataTestSubjectSelector( - ABOUT_SECTION_HEADER_TEST_ID + 'securitySolutionFlyoutAboutSectionHeader' ); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_DESCRIPTION_TITLE = getDataTestSubjectSelector( - ALERT_DESCRIPTION_TITLE_TEST_ID + 'securitySolutionFlyoutAlertDescriptionTitle' ); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_DESCRIPTION_DETAILS = getDataTestSubjectSelector( - ALERT_DESCRIPTION_DETAILS_TEST_ID + 'securitySolutionFlyoutAlertDescriptionDetails' ); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_OPEN_RULE_PREVIEW_BUTTON = - getDataTestSubjectSelector(RULE_SUMMARY_BUTTON_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_REASON_TITLE = - getDataTestSubjectSelector(REASON_TITLE_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_REASON_DETAILS = - getDataTestSubjectSelector(REASON_DETAILS_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutRuleSummaryButton'); +export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_REASON_TITLE = getDataTestSubjectSelector( + 'securitySolutionFlyoutReasonTitle' +); +export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_REASON_DETAILS = getDataTestSubjectSelector( + 'securitySolutionFlyoutReasonDetails' +); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_OPEN_ALERT_REASON_PREVIEW_BUTTON = - getDataTestSubjectSelector(REASON_DETAILS_PREVIEW_BUTTON_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutReasonPreviewButton'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_TITLE = getDataTestSubjectSelector( - MITRE_ATTACK_TITLE_TEST_ID + 'securitySolutionFlyoutMitreAttackTitle' ); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_MITRE_ATTACK_DETAILS = getDataTestSubjectSelector( - MITRE_ATTACK_DETAILS_TEST_ID + 'securitySolutionFlyoutMitreAttackDetails' ); /* Investigation section */ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INVESTIGATION_SECTION_HEADER = - getDataTestSubjectSelector(INVESTIGATION_SECTION_HEADER_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutInvestigationSectionHeader'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_HIGHLIGHTED_FIELDS_HEADER_TITLE = - getDataTestSubjectSelector(HIGHLIGHTED_FIELDS_TITLE_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutHighlightedFieldsTitle'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_HIGHLIGHTED_FIELDS_DETAILS = - getDataTestSubjectSelector(HIGHLIGHTED_FIELDS_DETAILS_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutHighlightedFieldsDetails'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_HIGHLIGHTED_FIELDS_TABLE_FIELD_CELL = getDataTestSubjectSelector('fieldCell'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_HIGHLIGHTED_FIELDS_TABLE_VALUE_CELL = ( value: string -) => getDataTestSubjectSelector(`${value}-${HIGHLIGHTED_FIELDS_CELL_TEST_ID}`); +) => getDataTestSubjectSelector(`${value}-securitySolutionFlyoutHighlightedFieldsCell`); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INVESTIGATION_GUIDE_BUTTON = - getDataTestSubjectSelector(INVESTIGATION_GUIDE_BUTTON_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutInvestigationGuideButton'); /* Insights section */ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_SECTION_HEADER = - getDataTestSubjectSelector(INSIGHTS_HEADER_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutInsightsHeader'); /* Insights Entities */ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_ENTITIES_HEADER = - getDataTestSubjectSelector(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(INSIGHTS_ENTITIES_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutInsightsEntitiesTitleLink'); /* Insights Threat Intelligence */ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_THREAT_INTELLIGENCE_HEADER = - getDataTestSubjectSelector( - EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(INSIGHTS_THREAT_INTELLIGENCE_TEST_ID) - ); + getDataTestSubjectSelector('securitySolutionFlyoutInsightsThreatIntelligenceTitleLink'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_THREAT_INTELLIGENCE_VALUES = - getDataTestSubjectSelector(SUMMARY_ROW_VALUE_TEST_ID(INSIGHTS_THREAT_INTELLIGENCE_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutInsightsThreatIntelligenceValue'); /* Insights Correlations */ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_CORRELATIONS_HEADER = - getDataTestSubjectSelector(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(CORRELATIONS_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutCorrelationsTitleLink'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_CORRELATIONS_VALUES_SUPPRESSED_ALERTS = - getDataTestSubjectSelector(SUMMARY_ROW_VALUE_TEST_ID(CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutCorrelationsSuppressedAlertsValue'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_CORRELATIONS_VALUES_RELATED_ALERTS_BY_ANCESTRY = - getDataTestSubjectSelector( - SUMMARY_ROW_VALUE_TEST_ID(CORRELATIONS_RELATED_ALERTS_BY_ANCESTRY_TEST_ID) - ); + getDataTestSubjectSelector('securitySolutionFlyoutCorrelationsRelatedAlertsByAncestryValue'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_CORRELATIONS_VALUES_RELATED_ALERTS_BY_SAME_SOURCE_EVENT = getDataTestSubjectSelector( - SUMMARY_ROW_VALUE_TEST_ID(CORRELATIONS_RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID) + 'securitySolutionFlyoutCorrelationsRelatedAlertsBySameSourceEventValue' ); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_CORRELATIONS_VALUES_RELATED_ALERTS_BY_SESSION = - getDataTestSubjectSelector( - SUMMARY_ROW_VALUE_TEST_ID(CORRELATIONS_RELATED_ALERTS_BY_SESSION_TEST_ID) - ); + getDataTestSubjectSelector('securitySolutionFlyoutCorrelationsRelatedAlertsBySessionValue'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_CORRELATIONS_VALUES_RELATED_CASES = - getDataTestSubjectSelector(SUMMARY_ROW_VALUE_TEST_ID(CORRELATIONS_RELATED_CASES_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutCorrelationsRelatedCasesValue'); /* Insights Prevalence */ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_PREVALENCE_HEADER = - getDataTestSubjectSelector(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(PREVALENCE_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutInsightsPrevalenceTitleLink'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_PREVALENCE_CONTENT = - getDataTestSubjectSelector(EXPANDABLE_PANEL_CONTENT_TEST_ID(PREVALENCE_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutInsightsPrevalenceContent'); /* Visualization section */ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_VISUALIZATIONS_SECTION_HEADER = - getDataTestSubjectSelector(VISUALIZATIONS_SECTION_HEADER_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutVisualizationsHeader'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_ANALYZER_PREVIEW_CONTAINER = - getDataTestSubjectSelector(EXPANDABLE_PANEL_CONTENT_TEST_ID(ANALYZER_PREVIEW_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutAnalyzerPreviewContent'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_SESSION_PREVIEW_CONTAINER = - getDataTestSubjectSelector(EXPANDABLE_PANEL_CONTENT_TEST_ID(SESSION_PREVIEW_TEST_ID)); + getDataTestSubjectSelector('securitySolutionFlyoutSessionPreviewContent'); /* Response section */ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_RESPONSE_SECTION_HEADER = - getDataTestSubjectSelector(RESPONSE_SECTION_HEADER_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_RESPONSE_BUTTON = - getDataTestSubjectSelector(RESPONSE_BUTTON_TEST_ID); + getDataTestSubjectSelector('securitySolutionFlyoutResponseSectionHeader'); +export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_RESPONSE_BUTTON = getDataTestSubjectSelector( + 'securitySolutionFlyoutResponseButton' +); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts index 71b7bacd2e8a3..2be0752f62475 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts @@ -6,7 +6,7 @@ */ import { ISOLATE_HOST_ROUTE_V2 } from '@kbn/security-solution-plugin/common/endpoint/constants'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import type { FtrProviderContext } from '../../ftr_provider_context'; import { targetTags } from '../../../security_solution_endpoint/target_tags'; export default function ({ getService }: FtrProviderContext) { @@ -15,9 +15,8 @@ export default function ({ getService }: FtrProviderContext) { describe('Response Actions support for sentinelOne agentType', function () { targetTags(this, ['@ess', '@serverless']); - describe('and the "responseActionsSentinelOneV1Enabled" feature flag is disabled', () => { - // When feature flag is enabled, this entire `describe()` block should be removed - it('should return an error', async () => { + describe('and the "responseActionsSentinelOneV1Enabled" feature flag is enabled', () => { + it('should not return feature disabled error, but a connector not found error', async () => { await supertest .post(ISOLATE_HOST_ROUTE_V2) .set('kbn-xsrf', 'true') @@ -26,7 +25,7 @@ export default function ({ getService }: FtrProviderContext) { .expect(400, { statusCode: 400, error: 'Bad Request', - message: '[request body.agent_type]: feature is disabled', + message: 'No SentinelOne stack connector found', }); }); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts b/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts index f2fa7b7d89403..db022dd4e8158 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts @@ -67,7 +67,9 @@ export default ({ getService }: FtrProviderContext) => { /* * Tests */ - describe('Generate CSV from SearchSource', () => { + describe('Generate CSV from SearchSource', function () { + // failsOnMKI, see https://github.com/elastic/kibana/issues/179456 + this.tags(['failsOnMKI']); beforeEach(async () => { await kibanaServer.uiSettings.update({ 'csv:quoteValues': true, diff --git a/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts b/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts index 027afe3c2ebe5..571a57e25f450 100644 --- a/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts +++ b/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts @@ -355,12 +355,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); }); - it('should transition from bar chart to line chart using layer chart switch', async () => { + it('should transition from bar chart to line chart', async () => { await PageObjects.visualize.gotoVisualizationLandingPage(); await listingTable.searchForItemWithName('lnsXYvis'); await PageObjects.lens.clickVisualizeListItemTitle('lnsXYvis'); await PageObjects.lens.goToTimeRange(); - await PageObjects.lens.switchLayerSeriesType('line'); + await PageObjects.lens.switchToVisualization('line'); expect(await PageObjects.lens.getTitle()).to.eql('lnsXYvis'); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_xDimensionPanel')).to.eql( '@timestamp' diff --git a/x-pack/test_serverless/functional/test_suites/common/visualizations/group2/open_in_lens/agg_based/xy.ts b/x-pack/test_serverless/functional/test_suites/common/visualizations/group2/open_in_lens/agg_based/xy.ts index 299142e7cf9b5..4f2d9ff033da8 100644 --- a/x-pack/test_serverless/functional/test_suites/common/visualizations/group2/open_in_lens/agg_based/xy.ts +++ b/x-pack/test_serverless/functional/test_suites/common/visualizations/group2/open_in_lens/agg_based/xy.ts @@ -77,10 +77,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await retry.try(async () => { expect(await lens.getLayerCount()).to.be(2); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(2); - expect(await layersSettings[0].getVisibleText()).to.be('Area'); - expect(await layersSettings[1].getVisibleText()).to.be('Bar vertical'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(2); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Area'); + expect(await layerChartSwitches[1].getVisibleText()).to.be('Bar vertical'); const yDimensionText1 = await lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 0); const yDimensionText2 = await lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 1); expect(yDimensionText1).to.be('Count'); @@ -95,9 +95,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await retry.try(async () => { expect(await lens.getLayerCount()).to.be(1); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(1); - expect(await layersSettings[0].getVisibleText()).to.be('Bar vertical'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(1); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Bar vertical'); const yDimensionText1 = await lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 0); const yDimensionText2 = await lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 1); expect(yDimensionText1).to.be('Count'); @@ -162,9 +162,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await retry.try(async () => { expect(await lens.getLayerCount()).to.be(1); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(1); - expect(await layersSettings[0].getVisibleText()).to.be('Area stacked'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(1); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Area stacked'); }); }); @@ -175,9 +175,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await retry.try(async () => { expect(await lens.getLayerCount()).to.be(1); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(1); - expect(await layersSettings[0].getVisibleText()).to.be('Area percentage'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(1); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Area percentage'); }); }); @@ -188,9 +188,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await retry.try(async () => { expect(await lens.getLayerCount()).to.be(1); - const layersSettings = await testSubjects.findAll('lns_layer_settings'); - expect(layersSettings.length).to.be(1); - expect(await layersSettings[0].getVisibleText()).to.be('Bar horizontal'); + const layerChartSwitches = await testSubjects.findAll('lnsChartSwitchPopover'); + expect(layerChartSwitches.length).to.be(1); + expect(await layerChartSwitches[0].getVisibleText()).to.be('Bar horizontal'); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_table_filters.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_table_filters.ts index 5ed86ab3c711a..220be569349b2 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_table_filters.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_table_filters.ts @@ -21,8 +21,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const to = '2024-01-01T12:00:00.000Z'; - // FLAKY: https://github.com/elastic/kibana/issues/178652 - describe.skip('Dataset quality table filters', () => { + describe('Dataset quality table filters', () => { before(async () => { await synthtrace.index(getInitialTestLogs({ to, count: 4 })); await PageObjects.svlCommonPage.loginWithRole('admin'); diff --git a/yarn.lock b/yarn.lock index cda4d0d15ffe9..6e16a26e7c321 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1746,23 +1746,22 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@93.4.0": - version "93.4.0" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-93.4.0.tgz#14a7302125e13c1c324c5169fb320451f6b79e7a" - integrity sha512-fDUNvsPninaDdXWAQRFfoEzk4EgZL+OUoDbzDVH9PTcxkA/dr54sMoTV8KrvvXBVQ+X+VXndcXzmluQeWKj+5g== +"@elastic/eui@93.5.1": + version "93.5.1" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-93.5.1.tgz#e663017052a1461ec0c67e825f1d7c1346f3c3ee" + integrity sha512-40zFwuYakCDxzEDnh2ePgUh4KVfmy8p6sXc8FFES07zoboRt82YxQxwmgouqu02TZHaXir1bXSpmEyXe4T7CMg== dependencies: "@hello-pangea/dnd" "^16.3.0" - "@types/lodash" "^4.14.198" - "@types/numeral" "^2.0.2" - "@types/react-window" "^1.8.5" - "@types/refractor" "^3.0.2" - "@types/resize-observer-browser" "^0.1.7" + "@types/lodash" "^4.14.202" + "@types/numeral" "^2.0.5" + "@types/react-window" "^1.8.8" + "@types/refractor" "^3.4.0" chroma-js "^2.4.2" - classnames "^2.3.2" + classnames "^2.5.1" lodash "^4.17.21" mdast-util-to-hast "^10.2.0" numeral "^2.0.6" - prop-types "^15.6.0" + prop-types "^15.8.1" react-dropzone "^11.7.1" react-element-to-jsx-string "^15.0.0" react-focus-on "^3.9.1" @@ -4607,10 +4606,22 @@ version "0.0.0" uid "" +"@kbn/esql-ast@link:packages/kbn-esql-ast": + version "0.0.0" + uid "" + "@kbn/esql-utils@link:packages/kbn-esql-utils": version "0.0.0" uid "" +"@kbn/esql-validation-autocomplete@link:packages/kbn-esql-validation-autocomplete": + version "0.0.0" + uid "" + +"@kbn/esql-validation-example-plugin@link:examples/esql_validation_example": + version "0.0.0" + uid "" + "@kbn/event-annotation-common@link:packages/kbn-event-annotation-common": version "0.0.0" uid "" @@ -9883,10 +9894,10 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.184.tgz#23f96cd2a21a28e106dc24d825d4aa966de7a9fe" integrity sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q== -"@types/lodash@^4.14.198": - version "4.14.198" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.198.tgz#4d27465257011aedc741a809f1269941fa2c5d4c" - integrity sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg== +"@types/lodash@^4.14.202": + version "4.17.0" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.0.tgz#d774355e41f372d5350a4d0714abb48194a489c3" + integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== "@types/long@^4.0.0", "@types/long@^4.0.1": version "4.0.2" @@ -10078,10 +10089,10 @@ resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.2.tgz#d070fe6a6b78755d1092a3dc492d34c3d8f871c4" integrity sha512-4QQmOF5KlwfxJ5IGXFIudkeLCdMABz03RcUXu+LCb24zmln8QW6aDjuGl4d4XPVLf2j+FnjelHTP7dvceAFbhA== -"@types/numeral@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-2.0.2.tgz#8ea2c4f4e64c0cc948ad7da375f6f827778a7912" - integrity sha512-A8F30k2gYJ/6e07spSCPpkuZu79LCnkPTvqmIWQzNGcrzwFKpVOydG41lNt5wZXjSI149qjyzC2L1+F2PD/NUA== +"@types/numeral@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-2.0.5.tgz#388e5c4ff4b0e1787f130753cbbe83d3ba770858" + integrity sha512-kH8I7OSSwQu9DS9JYdFWbuvhVzvFRoCPCkGxNwoGgaPeDfEPJlcxNvEOypZhQ3XXHsGbfIuYcxcJxKUfJHnRfw== "@types/object-hash@^1.3.0": version "1.3.0" @@ -10333,6 +10344,13 @@ dependencies: "@types/react" "*" +"@types/react-window@^1.8.8": + version "1.8.8" + resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.8.tgz#c20645414d142364fbe735818e1c1e0a145696e3" + integrity sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^17", "@types/react@^17.0.45": version "17.0.45" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.45.tgz#9b3d5b661fd26365fefef0e766a1c6c30ccf7b3f" @@ -10347,18 +10365,13 @@ resolved "https://registry.yarnpkg.com/@types/redux-actions/-/redux-actions-2.6.1.tgz#0940e97fa35ad3004316bddb391d8e01d2efa605" integrity sha512-zKgK+ATp3sswXs6sOYo1tk8xdXTy4CTaeeYrVQlClCjeOpag5vzPo0ASWiiBJ7vsiQRAdb3VkuFLnDoBimF67g== -"@types/refractor@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.0.2.tgz#2d42128d59f78f84d2c799ffc5ab5cadbcba2d82" - integrity sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg== +"@types/refractor@^3.4.0": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.4.1.tgz#8b109804f77b3da8fad543d3f575fef1ece8835a" + integrity sha512-wYuorIiCTSuvRT9srwt+taF6mH/ww+SyN2psM0sjef2qW+sS8GmshgDGTEDgWB1sTVGgYVE6EK7dBA2MxQxibg== dependencies: "@types/prismjs" "*" -"@types/resize-observer-browser@^0.1.7": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz#294aaadf24ac6580b8fbd1fe3ab7b59fe85f9ef3" - integrity sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg== - "@types/resolve@^1.20.1": version "1.20.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.1.tgz#3727e48042fda81e374f5d5cf2fa92288bf698f8" @@ -10497,10 +10510,10 @@ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== -"@types/tar@^6.1.5": - version "6.1.5" - resolved "https://registry.yarnpkg.com/@types/tar/-/tar-6.1.5.tgz#90ccb3b6a35430e7427410d50eed564e85feaaff" - integrity sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q== +"@types/tar@^6.1.11": + version "6.1.11" + resolved "https://registry.yarnpkg.com/@types/tar/-/tar-6.1.11.tgz#48de9ccee8db37efb0d5a9f288567fc0378cb734" + integrity sha512-ThA1WD8aDdVU4VLuyq5NEqriwXErF5gEIJeyT6gHBWU7JtSmW2a5qjNv3/vR82O20mW+1vhmeZJfBQPT3HCugg== dependencies: "@types/node" "*" minipass "^4.0.0" @@ -13398,7 +13411,7 @@ classnames@2.2.6: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== -classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2: +classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== @@ -15693,10 +15706,10 @@ elastic-apm-node@3.46.0: traverse "^0.6.6" unicode-byte-truncate "^1.0.0" -elastic-apm-node@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-4.4.1.tgz#2d0c5476b910ee5923c67ac521007571ce7405d6" - integrity sha512-frkyRK+vyzpOe4njT6j70+nVYwDbzLmQ5xasHzxLHQ29GalhPFLIBaX0aohrY9MTdpLPKFfTHl87eqFtEizJYg== +elastic-apm-node@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-4.5.0.tgz#9ee75189ac4bd919d432c6c1457c8cb2ef0b3903" + integrity sha512-doIe7VPdCRgbFjEdswQvHj1Puem8L2pDFEdeUuT7CX3Xr3+gbOvgQGV7s742dJWgO2l0nSekvdgc7UBaPvOb6A== dependencies: "@elastic/ecs-pino-format" "^1.5.0" "@opentelemetry/api" "^1.4.1" @@ -29165,10 +29178,10 @@ tar-stream@^3.1.5: fast-fifo "^1.2.0" streamx "^2.15.0" -tar@^6.0.2, tar@^6.1.11, tar@^6.1.15, tar@^6.1.2: - version "6.1.15" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" - integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2, tar@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0"