diff --git a/.buildkite/pipeline-resource-definitions/kibana-serverless-release.yml b/.buildkite/pipeline-resource-definitions/kibana-serverless-release.yml index 5bcc818f1d801..057a31c47190a 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-serverless-release.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-serverless-release.yml @@ -19,8 +19,8 @@ spec: description: Initiate kibana serverless releases spec: env: - SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' - ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'false' + SLACK_NOTIFICATIONS_CHANNEL: '#kibana-mission-control' + ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' default_branch: main allow_rebuilds: false skip_intermediate_builds: false 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/common/env.sh b/.buildkite/scripts/common/env.sh index 6243641507a1e..be1101f4c2d96 100755 --- a/.buildkite/scripts/common/env.sh +++ b/.buildkite/scripts/common/env.sh @@ -72,9 +72,7 @@ export TEST_BROWSER_HEADLESS=1 export ELASTIC_APM_ENVIRONMENT=ci export ELASTIC_APM_TRANSACTION_SAMPLE_RATE=0.1 -export ELASTIC_APM_SERVER_URL=https://kibana-ci-apm.apm.us-central1.gcp.cloud.es.io -# Not really a secret, if APM supported public auth we would use it and APM requires that we use this name -export ELASTIC_APM_SECRET_TOKEN=7YKhoXsO4MzjhXjx2c +export ELASTIC_APM_KIBANA_FRONTEND_ACTIVE=false if is_pr; then if is_pr_with_label "ci:collect-apm"; then diff --git a/.buildkite/scripts/common/setup_job_env.sh b/.buildkite/scripts/common/setup_job_env.sh index 64666d022c976..6b07beebcfa9c 100644 --- a/.buildkite/scripts/common/setup_job_env.sh +++ b/.buildkite/scripts/common/setup_job_env.sh @@ -122,6 +122,12 @@ EOF SONAR_LOGIN=$(vault_get sonarqube token) export SONAR_LOGIN + + ELASTIC_APM_SERVER_URL=$(vault_get project-kibana-ci-apm apm_server_url) + export ELASTIC_APM_SERVER_URL + + ELASTIC_APM_API_KEY=$(vault_get project-kibana-ci-apm apm_server_api_key) + export ELASTIC_APM_API_KEY } # Set up GCS Service Account for CDN 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 old mode 100644 new mode 100755 index f0f3ad80e05e3..33091b7524387 --- 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 @@ -113,7 +113,7 @@ main () { git checkout -b "$BRANCH_NAME" - git add -A + git add esql/antlr/* git commit -m "Update ES|QL grammars" report_main_step "Changes committed. Creating pull request." diff --git a/.buildkite/scripts/steps/lint_with_types.sh b/.buildkite/scripts/steps/lint_with_types.sh index d54b5e2169074..d2df07d3e9349 100755 --- a/.buildkite/scripts/steps/lint_with_types.sh +++ b/.buildkite/scripts/steps/lint_with_types.sh @@ -7,4 +7,5 @@ source .buildkite/scripts/common/util.sh .buildkite/scripts/bootstrap.sh echo '--- Lint: eslint (with types)' +export NODE_OPTIONS='--max-old-space-size=8192' node scripts/eslint_with_types 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 d0bc6e27d8970..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 @@ -682,6 +685,7 @@ x-pack/examples/screenshotting_example @elastic/appex-sharedux x-pack/plugins/screenshotting @elastic/kibana-reporting-services packages/kbn-search-api-panels @elastic/enterprise-search-frontend packages/kbn-search-connectors @elastic/enterprise-search-frontend +x-pack/plugins/search_connectors @elastic/enterprise-search-frontend packages/kbn-search-errors @elastic/kibana-data-discovery examples/search_examples @elastic/kibana-data-discovery packages/kbn-search-index-documents @elastic/enterprise-search-frontend @@ -824,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 @@ -965,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 @@ -1175,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 7cf16cb57bd97..0c71b510223ad 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -9,12 +9,17 @@ "autocomplete": "packages/kbn-securitysolution-autocomplete/src", "bfetch": "src/plugins/bfetch", "bfetchError": "packages/kbn-bfetch-error", - "cases": ["packages/kbn-cases-components"], + "cases": [ + "packages/kbn-cases-components" + ], "cellActions": "packages/kbn-cell-actions", "charts": "src/plugins/charts", "console": "src/plugins/console", "contentManagement": "packages/content-management", - "core": ["src/core", "packages/core"], + "core": [ + "src/core", + "packages/core" + ], "customIntegrations": "src/plugins/custom_integrations", "customIntegrationsPackage": "packages/kbn-custom-integrations", "dashboard": "src/plugins/dashboard", @@ -26,7 +31,10 @@ "dataViews": "src/plugins/data_views", "defaultNavigation": "packages/default-nav", "devTools": "src/plugins/dev_tools", - "discover": ["src/plugins/discover", "packages/kbn-discover-utils"], + "discover": [ + "src/plugins/discover", + "packages/kbn-discover-utils" + ], "savedSearch": "src/plugins/saved_search", "embeddableApi": "src/plugins/embeddable", "presentationPanel": "src/plugins/presentation_panel", @@ -73,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", @@ -100,8 +109,12 @@ "savedObjectsFinder": "src/plugins/saved_objects_finder", "savedObjectsManagement": "src/plugins/saved_objects_management", "searchConnectors": "packages/kbn-search-connectors", + "searchConnectorsPlugin": "x-pack/plugins/search_connectors", "server": "src/legacy/server", - "share": ["src/plugins/share", "packages/kbn-reporting-share"], + "share": [ + "src/plugins/share", + "packages/kbn-reporting-share" + ], "sharedUXPackages": "packages/shared-ux", "searchApiPanels": "packages/kbn-search-api-panels/", "searchErrors": "packages/kbn-search-errors", @@ -113,9 +126,17 @@ "languageDocumentationPopover": "packages/kbn-language-documentation-popover/src", "textBasedLanguages": "src/plugins/text_based_languages", "statusPage": "src/legacy/core_plugins/status_page", - "telemetry": ["src/plugins/telemetry", "src/plugins/telemetry_management_section"], - "timelion": ["src/plugins/vis_types/timelion"], - "uiActions": ["src/plugins/ui_actions", "packages/kbn-ui-actions-browser"], + "telemetry": [ + "src/plugins/telemetry", + "src/plugins/telemetry_management_section" + ], + "timelion": [ + "src/plugins/vis_types/timelion" + ], + "uiActions": [ + "src/plugins/ui_actions", + "packages/kbn-ui-actions-browser" + ], "uiActionsEnhanced": "src/plugins/ui_actions_enhanced", "uiActionsExamples": "examples/ui_action_examples", "usageCollection": "src/plugins/usage_collection", @@ -136,7 +157,10 @@ "visualizations": "src/plugins/visualizations", "visualizationUiComponents": "packages/kbn-visualization-ui-components", "visualizationUtils": "packages/kbn-visualization-utils", - "unifiedDocViewer": ["src/plugins/unified_doc_viewer", "packages/kbn-unified-doc-viewer"], + "unifiedDocViewer": [ + "src/plugins/unified_doc_viewer", + "packages/kbn-unified-doc-viewer" + ], "unifiedSearch": "src/plugins/unified_search", "unifiedFieldList": "packages/kbn-unified-field-list", "unifiedHistogram": "src/plugins/unified_histogram", diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 9d5dcfbe41365..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-25 +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 18fd27d837f29..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-25 +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 3c07f88e30932..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-25 +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 3033ddf650b82..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-25 +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 a3bd6176a5750..2d07cb3143930 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -3539,34 +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": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_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 e250b248d9c3c..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-25 +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 ab454108bd6b5..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-25 +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 4c7941dbd2993..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-25 +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 1c5b053951fd5..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-25 +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 edd609ead2157..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-25 +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 9f2024bee64f3..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-25 +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 a53974ed19544..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-25 +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 f4c8f1ce20b26..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-25 +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 1c9e156d3d889..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-25 +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 8a780ef79afa5..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-25 +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 65fa009555db3..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-25 +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 752a937c04d5d..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-25 +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 22cb4b6bd1668..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-25 +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 c78ed738ebe6b..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-25 +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 50af3e68a8d30..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-25 +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 bae25a1e027ad..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-25 +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 f1073ace8b3a7..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-25 +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 6674bb2382a93..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-25 +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 2b54cf17e68e9..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-25 +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 ce614b418e108..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-25 +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 1e75dc4d36802..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-25 +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 f1fb087d99d15..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-25 +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 f9f70768b62c5..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-25 +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 195048862c71c..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-25 +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 374bdfcb216ec..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-25 +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 dd2872e101ea5..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-25 +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 8dbaf2e55f0b6..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-25 +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 3aa3da6be2fbb..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-25 +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 bf78605333dbc..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-25 +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 eb8d02b4a32c1..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-25 +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, infra, 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 e3a894f7045b8..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-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -157,7 +157,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [version_map.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.ts#:~:text=migrations), [version_map.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.ts#:~:text=migrations), [version_map.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.ts#:~:text=migrations), [saved_objects_type_registry.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_type_registry.test.ts#:~:text=migrations), [saved_objects_type_registry.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_type_registry.test.ts#:~:text=migrations), [saved_objects_type_registry.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_type_registry.test.ts#:~:text=migrations), [saved_objects_type_registry.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_type_registry.test.ts#:~:text=migrations), [version_map.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts#:~:text=migrations), [version_map.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts#:~:text=migrations), [version_map.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts#:~:text=migrations)+ 8 more | - | +| | [version_map.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.ts#:~:text=migrations), [version_map.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.ts#:~:text=migrations), [version_map.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.ts#:~:text=migrations), [saved_objects_type_registry.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_type_registry.test.ts#:~:text=migrations), [saved_objects_type_registry.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_type_registry.test.ts#:~:text=migrations), [saved_objects_type_registry.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_type_registry.test.ts#:~:text=migrations), [saved_objects_type_registry.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_type_registry.test.ts#:~:text=migrations), [version_map.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts#:~:text=migrations), [version_map.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts#:~:text=migrations), [version_map.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts#:~:text=migrations)+ 13 more | - | @@ -995,7 +995,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [log_threshold_executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts#:~:text=alertFactory), [log_threshold_executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts#:~:text=alertFactory), [log_threshold_executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts#:~:text=alertFactory) | - | | | [common_providers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/apps/common_providers.tsx#:~:text=KibanaThemeProvider), [common_providers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/apps/common_providers.tsx#:~:text=KibanaThemeProvider), [common_providers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/apps/common_providers.tsx#:~:text=KibanaThemeProvider) | - | | | [saved_object_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/server/lib/sources/saved_object_type.ts#:~:text=migrations) | - | @@ -1205,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 | @@ -1497,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) | - | @@ -1666,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 ef1e5cd670e24..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-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 65a637136d144..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-25 +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 aefa9104eb769..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-25 +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 66464cdc9af30..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-25 +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 204b28137e381..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-25 +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 23eee26b6ec1c..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-25 +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 78d3cdb0400e2..0e1bf12d94027 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -5806,7 +5806,7 @@ }, " | undefined" ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false } @@ -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 } ] } @@ -9081,7 +9111,9 @@ "type": "Function", "tags": [], "label": "registerReactEmbeddableFactory", - "description": [], + "description": [ + "\nRegisters a new React embeddable factory. This should be called at plugin start time.\n" + ], "signature": [ ">(factory: ", + ">(type: string, getFactory: () => Promise<", { "pluginId": "embeddable", "scope": "public", @@ -9107,7 +9139,7 @@ "section": "def-public.ReactEmbeddableFactory", "text": "ReactEmbeddableFactory" }, - ") => void" + ">) => void" ], "path": "src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts", "deprecated": false, @@ -9116,11 +9148,31 @@ { "parentPluginId": "embeddable", "id": "def-public.registerReactEmbeddableFactory.$1", - "type": "Object", + "type": "string", "tags": [], - "label": "factory", - "description": [], + "label": "type", + "description": [ + "The key to register the factory under. This should be the same as the `type` key in the factory definition." + ], + "signature": [ + "string" + ], + "path": "src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "embeddable", + "id": "def-public.registerReactEmbeddableFactory.$2", + "type": "Function", + "tags": [], + "label": "getFactory", + "description": [ + "an async function that gets the factory definition for this key. This should always async import the\nactual factory definition file to avoid polluting page load." + ], "signature": [ + "() => Promise<", { "pluginId": "embeddable", "scope": "public", @@ -9128,7 +9180,7 @@ "section": "def-public.ReactEmbeddableFactory", "text": "ReactEmbeddableFactory" }, - "" + ">" ], "path": "src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts", "deprecated": false, diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 717eda5c54e00..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-25 +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 | |-------------------|-----------|------------------------|-----------------| -| 555 | 1 | 453 | 10 | +| 557 | 1 | 452 | 10 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index d685a3350f9e6..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-25 +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 64ef863939eb6..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-25 +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 5a8577a2ff7c9..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-25 +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 4e82dfe5e345c..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-25 +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 4a24b0ff73e9d..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-25 +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 aea5c38815881..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-25 +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 51e6cba0908d6..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-25 +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 2c99390dc1870..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-25 +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 3d951051e8e4d..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-25 +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 154aac3084f1a..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-25 +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 4a47e730922f4..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-25 +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 95a01dd3b061d..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-25 +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 bac522654c9a5..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-25 +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 5d46e48c5e18f..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-25 +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 d467a5b61e6dd..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-25 +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 50dcd46111cd5..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-25 +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 955dcddd8e69b..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-25 +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 7e61973e6b115..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-25 +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 24f1ea2981ea4..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-25 +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 a28282433c6f1..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-25 +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 a517871dc8384..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-25 +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 1ee0227b3d464..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-25 +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 a81cf86fe9c3f..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-25 +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 25818fef82cfe..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-25 +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 695599f405faa..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-25 +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 8c9fef631e543..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-25 +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 eccb2a8c4ae74..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-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index d8691a1f2d603..dc9f2eae19d35 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -19152,7 +19152,7 @@ "label": "fleet", "description": [], "signature": [ - "{ all: boolean; setup: boolean; readEnrollmentTokens: boolean; readAgentPolicies: boolean; allAgentPolicies: boolean; readAgents: boolean; allAgents: boolean; readSettings: boolean; allSettings: boolean; }" + "{ all: boolean; setup: boolean; readEnrollmentTokens: boolean; readAgentPolicies: boolean; allAgentPolicies: boolean; readAgents: boolean; allAgents: boolean; readSettings: boolean; allSettings: boolean; addAgents: boolean; addFleetServers: boolean; }" ], "path": "x-pack/plugins/fleet/common/authz.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 679fa260ec86c..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-25 +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 88c98adc40847..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-25 +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 5759502d80349..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-25 +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 b512d5df3fb0f..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-25 +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 34800faec78b8..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-25 +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 cca782888e886..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-25 +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 8b934a43520e8..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-25 +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 ae10696463e30..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-25 +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 3142b453a8b58..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-25 +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 f8c6910556978..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-25 +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 e0d7b98f85196..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-25 +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 e1db577e2ad00..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-25 +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 e530dc96b7e47..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-25 +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 97d1096005f5c..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-25 +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 a44e59c265b3a..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-25 +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 95cdb689a47ab..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-25 +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 5549f2b8e5750..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-25 +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 75e9fb3d73ad1..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-25 +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 643d693b26b7b..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-25 +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 ff4efa4cf9924..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-25 +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 a2101e8c1ff95..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-25 +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 f6997e2e46298..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-25 +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 499d836bb9d40..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-25 +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 25e3ba95014d0..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-25 +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 b3743f981e94d..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-25 +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 4d114cca341cd..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-25 +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 35b09172ad803..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-25 +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 e93fbd3b0303d..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-25 +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 1439cb08c9a92..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-25 +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 7b354fa7bdf14..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-25 +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 5f337f14dcfc5..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-25 +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 b16db5dc816ee..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-25 +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 4debcff433ed6..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-25 +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 a3446fb67d48f..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-25 +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 005685aaf6d61..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-25 +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 c8e85d87eac27..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-25 +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 2716728cc73b7..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-25 +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 a147b7be743a3..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-25 +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 91bd143e51856..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-25 +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 5031064159767..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-25 +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 38e41a0567701..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-25 +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 ed49ec09ed85e..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-25 +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 6cd930e32e981..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-25 +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 dc62a87be438f..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-25 +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 24de93b38c709..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-25 +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 5e3b78f5c2c5c..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-25 +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 068e5d6484b17..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-25 +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 f811f5f02321b..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-25 +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 9f1eaa93ea242..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-25 +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 02f93c3bba82f..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-25 +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 02ef512d17f1d..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-25 +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 75136136208c9..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-25 +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 3c722ff313ee3..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-25 +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 4b3803b6f5373..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-25 +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 881da861b2e7b..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-25 +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 67473abd39de5..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-25 +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 f7ba7e2721cab..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-25 +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 d870c9bc95deb..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-25 +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 724d63bcd3ae2..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-25 +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 8a61b1a4492bd..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-25 +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 684dda54388b2..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-25 +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 c93e27cdd5ce4..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-25 +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 01a25e5d8f14d..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-25 +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 415b680294f3e..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-25 +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 6578ff2dc37ba..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-25 +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 2da7c71c023bc..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-25 +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 3321a25cd3aa0..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-25 +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 7c2a0e0fcb69b..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-25 +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 d04c29629b793..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-25 +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 56944c9d0abab..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-25 +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 cb529117fccae..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-25 +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 1fa2e35577eb3..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-25 +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 f90c61e83c3d6..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-25 +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 21c30f29da6f0..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-25 +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 9c8f65958fbba..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-25 +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 f4cae47f4e070..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-25 +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 5e1736fae6481..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-25 +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.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index 8bbcd01c1ea9f..3991e31dcfa08 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -3696,7 +3696,7 @@ "label": "AppDeepLinkId", "description": [], "signature": [ - "\"fleet\" | \"ml\" | \"monitoring\" | \"metrics\" | \"management\" | \"synthetics\" | \"apm\" | \"logs\" | \"dashboards\" | \"home\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"dev_tools\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:aiAssistantManagementObservability\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"slo\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:rules\" | \"observability-overview:alerts\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:services\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:sessions\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:uncommon_processes\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\" | \"fleet:agents\"" + "\"fleet\" | \"ml\" | \"monitoring\" | \"metrics\" | \"management\" | \"synthetics\" | \"apm\" | \"logs\" | \"dashboards\" | \"home\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"dev_tools\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"slo\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:rules\" | \"observability-overview:alerts\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:services\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:sessions\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:uncommon_processes\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\" | \"fleet:agents\"" ], "path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts", "deprecated": false, diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 4bd0a141e7649..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-25 +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 8434a3c1ce5f6..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-25 +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 818d126d0bbf6..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-25 +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 011e4f91c8c96..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-25 +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 3fa54be1e7189..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-25 +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 dbcb157a91006..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-25 +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 0851789021347..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-25 +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 b7942570b312b..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-25 +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 df15192d02e77..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-25 +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 03746daa2fd6c..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-25 +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 04ec34f5596d2..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-25 +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 9e941a44a24c5..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-25 +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 0231a99b553b2..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-25 +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 e4924d224d47c..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-25 +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 6d6655b667bf3..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-25 +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 d2df287f9d402..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-25 +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 162c9aa7471c1..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-25 +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 71a4543443ad2..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-25 +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 5ddbdc97c26d9..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-25 +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 73f603c0e94d3..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-25 +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 4dcb0a7979634..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-25 +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 e4b03275e7519..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-25 +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 fd08cf7c4459e..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-25 +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 070d55ed534c7..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-25 +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 310d289e9187c..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-25 +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 f3e387e6fce36..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-25 +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 be2bb5d7059d6..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-25 +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 d6814e95461c4..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-25 +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 e92b8d2249b0c..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-25 +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 a0da4c9505ad6..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-25 +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 9ed79ecc6f27f..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-25 +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 242969fc14591..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-25 +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 bb66141fdac73..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-25 +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 3ad14ba59768a..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-25 +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 588f29a45292f..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-25 +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 b5f272c03ba24..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-25 +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 dc82d74dfb5e6..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-25 +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 58dc9edc76423..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-25 +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 105a880f23fc1..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-25 +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 77286f79fabec..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-25 +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 933ab7c50e496..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-25 +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 4227d2e867378..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-25 +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 8e9fadde713b1..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-25 +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 56714067fea94..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-25 +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 d437947ebea20..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-25 +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 07175144e4a99..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-25 +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 7f942ad299d42..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-25 +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 dae4c42ce3e0f..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-25 +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 cf20a5290d15c..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-25 +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 7771b8591686e..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-25 +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 54b10489efc40..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-25 +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 b90162fe79929..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-25 +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 4ca1604a45bf6..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-25 +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 e2f8e68a0267e..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-25 +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 a63ab319f42fc..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-25 +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 e412fd0126725..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-25 +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 d94fda28bdd95..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-25 +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 a10c5a576a822..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-25 +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 4d7b95a0e38b0..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-25 +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 867677a071acb..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-25 +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 feb5a7781f8a7..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-25 +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 aebc155848904..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-25 +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 1ea2fe63fb02e..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-25 +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 ef62526bb8afa..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-25 +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 9a7a2c2da6ab9..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-25 +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 c05a58a83e904..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-25 +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 003292be5967d..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-25 +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 cca8c1f8891c9..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-25 +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 6bf06ea54ca6d..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-25 +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 b37bfc92f14a4..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-25 +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 e911a4cd05635..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-25 +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 f94ad18b01575..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-25 +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 7679f3b4e6f18..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-25 +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 15f377a744ddc..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-25 +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 d380a027592c9..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-25 +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 2d9d9c01ddcc3..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-25 +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 c3c0633513f8e..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-25 +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 a30ae302b1bfc..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-25 +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 5628e2280c9fe..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-25 +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 38b7166253617..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-25 +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 69100a4d0e5b3..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-25 +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 a966cd655e0dd..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-25 +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 5e2c6240742fe..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-25 +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 d7d13c696d7a9..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-25 +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 c87671079f648..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-25 +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 1df4f562c06e1..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-25 +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 04897c91207ff..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-25 +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 ad119fc4c3719..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-25 +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 09032e14786f9..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-25 +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 6afb7ef4cc1f2..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-25 +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 6023d27d2b9bb..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-25 +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 63d89135d4051..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-25 +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 e6ca382897510..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-25 +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 1a7e2af58b5dc..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-25 +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 cbfe887985b55..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-25 +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.devdocs.json b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json index f80fc9e96295f..1b5ec3ef53fcc 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json @@ -2313,7 +2313,7 @@ } ], "returnComment": [ - "the udpated simple saved object" + "the updated simple saved object" ] }, { diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 586ee50a0d396..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-25 +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 1207c3e8f5645..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-25 +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 567f71ec87326..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-25 +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.devdocs.json b/api_docs/kbn_core_saved_objects_base_server_internal.devdocs.json index bcd13697e1ae8..33bc322e68a69 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.devdocs.json +++ b/api_docs/kbn_core_saved_objects_base_server_internal.devdocs.json @@ -778,6 +778,63 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.getLatestMappingsVirtualVersionMap", + "type": "Function", + "tags": [], + "label": "getLatestMappingsVirtualVersionMap", + "description": [ + "\nReturns a map of virtual model version for the given types.\nSee {@link getLatestMappingsModelVersion}" + ], + "signature": [ + "(types: ", + { + "pluginId": "@kbn/core-saved-objects-server", + "scope": "common", + "docId": "kibKbnCoreSavedObjectsServerPluginApi", + "section": "def-common.SavedObjectsType", + "text": "SavedObjectsType" + }, + "[]) => ", + { + "pluginId": "@kbn/core-saved-objects-base-server-internal", + "scope": "common", + "docId": "kibKbnCoreSavedObjectsBaseServerInternalPluginApi", + "section": "def-common.VirtualVersionMap", + "text": "VirtualVersionMap" + } + ], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.getLatestMappingsVirtualVersionMap.$1", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-saved-objects-server", + "scope": "common", + "docId": "kibKbnCoreSavedObjectsServerPluginApi", + "section": "def-common.SavedObjectsType", + "text": "SavedObjectsType" + }, + "[]" + ], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-saved-objects-base-server-internal", "id": "def-common.getLatestMigrationVersion", @@ -2212,6 +2269,1210 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP", + "type": "Object", + "tags": [], + "label": "HASH_TO_VERSION_MAP", + "description": [ + "\nIn order to be FIPS compliant, the migration logic has switched\nfrom using hashes (stored in _meta.migrationMappingPropertyHashes)\nto using model versions (stored in _meta.mappingVersions).\n\nThis map holds a breakdown of md5 hashes to model versions.\nThis allows keeping track of changes in mappings for the different SO types:\nWhen upgrading from a Kibana version prior to the introduction of model versions for V2,\nthe V2 logic will map stored hashes to their corresponding model versions.\nThese model versions will then be compared against the ones defined in the typeRegistry,\nin order to determine which types' mappings have changed." + ], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.action_task_params3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'action_task_params|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.action0be88ebcc8560a075b6898236a202eb1", + "type": "string", + "tags": [], + "label": "'action|0be88ebcc8560a075b6898236a202eb1'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.alert96a5a144778243a9f4fece0e71c2197f", + "type": "string", + "tags": [], + "label": "'alert|96a5a144778243a9f4fece0e71c2197f'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.api_key_pending_invalidation16f515278a295f6245149ad7c5ddedb7", + "type": "string", + "tags": [], + "label": "'api_key_pending_invalidation|16f515278a295f6245149ad7c5ddedb7'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.apmcustomdashboards561810b957ac3c09fcfc08f32f168e97", + "type": "string", + "tags": [], + "label": "'apm-custom-dashboards|561810b957ac3c09fcfc08f32f168e97'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.apmindices3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'apm-indices|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.apmserverschemab1d71908f324c17bf744ac72af5038fb", + "type": "string", + "tags": [], + "label": "'apm-server-schema|b1d71908f324c17bf744ac72af5038fb'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.apmservicegroup2af509c6506f29a858e5a0950577d9fa", + "type": "string", + "tags": [], + "label": "'apm-service-group|2af509c6506f29a858e5a0950577d9fa'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.apmtelemetry3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'apm-telemetry|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.app_search_telemetry3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'app_search_telemetry|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.application_usage_daily43b8830d5d0df85a6823d290885fc9fd", + "type": "string", + "tags": [], + "label": "'application_usage_daily|43b8830d5d0df85a6823d290885fc9fd'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.application_usage_totals3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'application_usage_totals|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.canvaselement7390014e1091044523666d97247392fc", + "type": "string", + "tags": [], + "label": "'canvas-element|7390014e1091044523666d97247392fc'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.canvasworkpadtemplateae2673f678281e2c055d764b153e9715", + "type": "string", + "tags": [], + "label": "'canvas-workpad-template|ae2673f678281e2c055d764b153e9715'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.canvasworkpadb0a1706d356228dbdcb4a17e6b9eb231", + "type": "string", + "tags": [], + "label": "'canvas-workpad|b0a1706d356228dbdcb4a17e6b9eb231'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.casescomments93535d41ca0279a4a2e5d08acd3f28e3", + "type": "string", + "tags": [], + "label": "'cases-comments|93535d41ca0279a4a2e5d08acd3f28e3'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.casesconfigurec124bd0be4c139d0f0f91fb9eeca8e37", + "type": "string", + "tags": [], + "label": "'cases-configure|c124bd0be4c139d0f0f91fb9eeca8e37'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.casesconnectormappingsa98c33813f364f0b068e8c592ac6ef6d", + "type": "string", + "tags": [], + "label": "'cases-connector-mappings|a98c33813f364f0b068e8c592ac6ef6d'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.casestelemetry3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'cases-telemetry|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.casesuseractions07a6651cf37853dd5d64bfb2c796e102", + "type": "string", + "tags": [], + "label": "'cases-user-actions|07a6651cf37853dd5d64bfb2c796e102'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.cases8f7dc53b17c272ea19f831537daa082d", + "type": "string", + "tags": [], + "label": "'cases|8f7dc53b17c272ea19f831537daa082d'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.cloudsecurityposturesettings3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'cloud-security-posture-settings|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.configglobalc63748b75f39d0c54de12d12c1ccbc20", + "type": "string", + "tags": [], + "label": "'config-global|c63748b75f39d0c54de12d12c1ccbc20'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.configc63748b75f39d0c54de12d12c1ccbc20", + "type": "string", + "tags": [], + "label": "'config|c63748b75f39d0c54de12d12c1ccbc20'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.connector_token740b3fd18387d4097dca8d177e6a35c6", + "type": "string", + "tags": [], + "label": "'connector_token|740b3fd18387d4097dca8d177e6a35c6'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.coreusagestats3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'core-usage-stats|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.cspruletemplate6ee70dc06c0ca3ddffc18222f202ab25", + "type": "string", + "tags": [], + "label": "'csp-rule-template|6ee70dc06c0ca3ddffc18222f202ab25'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.dashboardb8aa800aa5e0d975c5e8dc57f03d41f8", + "type": "string", + "tags": [], + "label": "'dashboard|b8aa800aa5e0d975c5e8dc57f03d41f8'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.endpointuserartifactmanifest7502b5c5bc923abe8aa5ccfd636e8c3d", + "type": "string", + "tags": [], + "label": "'endpoint:user-artifact-manifest|7502b5c5bc923abe8aa5ccfd636e8c3d'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.enterprise_search_telemetry3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'enterprise_search_telemetry|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.epmpackagesassets44621b2f6052ef966da47b7c3a00f33b", + "type": "string", + "tags": [], + "label": "'epm-packages-assets|44621b2f6052ef966da47b7c3a00f33b'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.epmpackagesc1e2020399dbebba2448096ca007c668", + "type": "string", + "tags": [], + "label": "'epm-packages|c1e2020399dbebba2448096ca007c668'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.event_loop_delays_daily5df7e292ddd5028e07c1482e130e6654", + "type": "string", + "tags": [], + "label": "'event_loop_delays_daily|5df7e292ddd5028e07c1482e130e6654'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.eventannotationgroupdf07b1a361c32daf4e6842c1d5521dbe", + "type": "string", + "tags": [], + "label": "'event-annotation-group|df07b1a361c32daf4e6842c1d5521dbe'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.exceptionlistagnostic8a1defe5981db16792cb9a772e84bb9a", + "type": "string", + "tags": [], + "label": "'exception-list-agnostic|8a1defe5981db16792cb9a772e84bb9a'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.exceptionlist8a1defe5981db16792cb9a772e84bb9a", + "type": "string", + "tags": [], + "label": "'exception-list|8a1defe5981db16792cb9a772e84bb9a'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.fileuploadusagecollectiontelemetrya34fbb8e3263d105044869264860c697", + "type": "string", + "tags": [], + "label": "'file-upload-usage-collection-telemetry|a34fbb8e3263d105044869264860c697'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.file8e9dd7f8a22efdb8fb1c15ed38fde9f6", + "type": "string", + "tags": [], + "label": "'file|8e9dd7f8a22efdb8fb1c15ed38fde9f6'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.fileShareaa8f7ac2ddf8ab1a91bd34e347046caa", + "type": "string", + "tags": [], + "label": "'fileShare|aa8f7ac2ddf8ab1a91bd34e347046caa'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.fleetfleetserverhostc28ce72481d1696a9aac8b2cdebcecfa", + "type": "string", + "tags": [], + "label": "'fleet-fleet-server-host|c28ce72481d1696a9aac8b2cdebcecfa'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.fleetmessagesigningkeys3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'fleet-message-signing-keys|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.fleetpreconfigurationdeletionrecord4c36f199189a367e43541f236141204c", + "type": "string", + "tags": [], + "label": "'fleet-preconfiguration-deletion-record|4c36f199189a367e43541f236141204c'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.fleetproxy05b7a22977de25ce67a77e44dd8e6c33", + "type": "string", + "tags": [], + "label": "'fleet-proxy|05b7a22977de25ce67a77e44dd8e6c33'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.fleetuninstalltokenscdb2b655f6b468ecb57d132972425f2e", + "type": "string", + "tags": [], + "label": "'fleet-uninstall-tokens|cdb2b655f6b468ecb57d132972425f2e'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.graphworkspace27a94b2edcb0610c6aea54a7c56d7752", + "type": "string", + "tags": [], + "label": "'graph-workspace|27a94b2edcb0610c6aea54a7c56d7752'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.guidedonboardingguidestatea3db59c45a3fd2730816d4f53c35c7d9", + "type": "string", + "tags": [], + "label": "'guided-onboarding-guide-state|a3db59c45a3fd2730816d4f53c35c7d9'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.guidedonboardingpluginstate3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'guided-onboarding-plugin-state|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.indexpattern83c02d842fe2a94d14dfa13f7dcd6e87", + "type": "string", + "tags": [], + "label": "'index-pattern|83c02d842fe2a94d14dfa13f7dcd6e87'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.infracustomdashboards6eed22cbe14594bad8c076fa864930de", + "type": "string", + "tags": [], + "label": "'infra-custom-dashboards|6eed22cbe14594bad8c076fa864930de'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.infrastructuremonitoringlogviewc50526fc6040c5355ed027d34d05b35c", + "type": "string", + "tags": [], + "label": "'infrastructure-monitoring-log-view|c50526fc6040c5355ed027d34d05b35c'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.infrastructureuisource3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'infrastructure-ui-source|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.ingest_manager_settingsb91ffb075799c78ffd7dbd51a279c8c9", + "type": "string", + "tags": [], + "label": "'ingest_manager_settings|b91ffb075799c78ffd7dbd51a279c8c9'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.ingestagentpolicies20768dc7ce5eced3eb309e50d8a6cf76", + "type": "string", + "tags": [], + "label": "'ingest-agent-policies|20768dc7ce5eced3eb309e50d8a6cf76'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.ingestdownloadsources0b0f6828e59805bd07a650d80817c342", + "type": "string", + "tags": [], + "label": "'ingest-download-sources|0b0f6828e59805bd07a650d80817c342'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.ingestoutputsb1237f7fdc0967709e75d65d208ace05", + "type": "string", + "tags": [], + "label": "'ingest-outputs|b1237f7fdc0967709e75d65d208ace05'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.ingestpackagepoliciesa1a074bad36e68d54f98d2158d60f879", + "type": "string", + "tags": [], + "label": "'ingest-package-policies|a1a074bad36e68d54f98d2158d60f879'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.inventoryview3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'inventory-view|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.kqltelemetry3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'kql-telemetry|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.legacyurlalias0750774cf16475f88f2361e99cc5c8f0", + "type": "string", + "tags": [], + "label": "'legacy-url-alias|0750774cf16475f88f2361e99cc5c8f0'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.lensuitelemetry509bfa5978586998e05f9e303c07a327", + "type": "string", + "tags": [], + "label": "'lens-ui-telemetry|509bfa5978586998e05f9e303c07a327'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.lensb0da10d5ab9ebd81d61700737ddc76c9", + "type": "string", + "tags": [], + "label": "'lens|b0da10d5ab9ebd81d61700737ddc76c9'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.links3378bb9b651572865d9f61f5b448e415", + "type": "string", + "tags": [], + "label": "'links|3378bb9b651572865d9f61f5b448e415'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.maintenancewindowa58ac2ef53ff5103710093e669dcc1d8", + "type": "string", + "tags": [], + "label": "'maintenance-window|a58ac2ef53ff5103710093e669dcc1d8'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.map9134b47593116d7953f6adba096fc463", + "type": "string", + "tags": [], + "label": "'map|9134b47593116d7953f6adba096fc463'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.metricsdatasource3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'metrics-data-source|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.metricsexplorerview3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'metrics-explorer-view|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.mljob3bb64c31915acf93fc724af137a0891b", + "type": "string", + "tags": [], + "label": "'ml-job|3bb64c31915acf93fc724af137a0891b'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.mlmodulef6c6b7b7ebdca4154246923f24d6340d", + "type": "string", + "tags": [], + "label": "'ml-module|f6c6b7b7ebdca4154246923f24d6340d'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.mltrainedmodeld2f03c1a5dd038fa58af14a56944312b", + "type": "string", + "tags": [], + "label": "'ml-trained-model|d2f03c1a5dd038fa58af14a56944312b'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.monitoringtelemetry2669d5ec15e82391cf58df4294ee9c68", + "type": "string", + "tags": [], + "label": "'monitoring-telemetry|2669d5ec15e82391cf58df4294ee9c68'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.observabilityonboardingstatea4e5c9d018037114140bdb1647c2d568", + "type": "string", + "tags": [], + "label": "'observability-onboarding-state|a4e5c9d018037114140bdb1647c2d568'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.osquerymanagerusagemetric4dc4f647d27247c002f56f22742175fe", + "type": "string", + "tags": [], + "label": "'osquery-manager-usage-metric|4dc4f647d27247c002f56f22742175fe'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.osquerypackassetfe0dfa13c4c24ac37ce1aec04c560a81", + "type": "string", + "tags": [], + "label": "'osquery-pack-asset|fe0dfa13c4c24ac37ce1aec04c560a81'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.osquerypack6bc20973adab06f00156cbc4578a19ac", + "type": "string", + "tags": [], + "label": "'osquery-pack|6bc20973adab06f00156cbc4578a19ac'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.osquerysavedquerya05ec7031231a4b71bfb4493a07b2dc5", + "type": "string", + "tags": [], + "label": "'osquery-saved-query|a05ec7031231a4b71bfb4493a07b2dc5'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.policysettingsprotectionupdatesnote37d4035a1dc3c5e58f1b519f99093f21", + "type": "string", + "tags": [], + "label": "'policy-settings-protection-updates-note|37d4035a1dc3c5e58f1b519f99093f21'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.queryaa811b49f48906074f59110bfa83984c", + "type": "string", + "tags": [], + "label": "'query|aa811b49f48906074f59110bfa83984c'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.riskengineconfiguration431232781a82926aad5b1fd849715c0f", + "type": "string", + "tags": [], + "label": "'risk-engine-configuration|431232781a82926aad5b1fd849715c0f'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.rulessettings001f60645e96c71520214b57f3ea7590", + "type": "string", + "tags": [], + "label": "'rules-settings|001f60645e96c71520214b57f3ea7590'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.sampledatatelemetry7d3cfeb915303c9641c59681967ffeb4", + "type": "string", + "tags": [], + "label": "'sample-data-telemetry|7d3cfeb915303c9641c59681967ffeb4'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.searchsessionfea3612a90b81672991617646f229a61", + "type": "string", + "tags": [], + "label": "'search-session|fea3612a90b81672991617646f229a61'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.searchtelemetry3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'search-telemetry|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.searchdf07b1a361c32daf4e6842c1d5521dbe", + "type": "string", + "tags": [], + "label": "'search|df07b1a361c32daf4e6842c1d5521dbe'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.securityrule9d9d11b97e3aaa87fbaefbace2b5c25f", + "type": "string", + "tags": [], + "label": "'security-rule|9d9d11b97e3aaa87fbaefbace2b5c25f'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.securitysolutionsignalsmigration4060b5a63dddfd54d2cd56450882cc0e", + "type": "string", + "tags": [], + "label": "'security-solution-signals-migration|4060b5a63dddfd54d2cd56450882cc0e'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.siemdetectionengineruleactionsf5c218f837bac10ab2c3980555176cf9", + "type": "string", + "tags": [], + "label": "'siem-detection-engine-rule-actions|f5c218f837bac10ab2c3980555176cf9'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.siemuitimelinenote28393dfdeb4e4413393eb5f7ec8c5436", + "type": "string", + "tags": [], + "label": "'siem-ui-timeline-note|28393dfdeb4e4413393eb5f7ec8c5436'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.siemuitimelinepinnedevent293fce142548281599060e07ad2c9ddb", + "type": "string", + "tags": [], + "label": "'siem-ui-timeline-pinned-event|293fce142548281599060e07ad2c9ddb'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.siemuitimelinef6739fd4b17646a6c86321a746c247ef", + "type": "string", + "tags": [], + "label": "'siem-ui-timeline|f6739fd4b17646a6c86321a746c247ef'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.slodc7f35c0cf07d71bb36f154996fe10c6", + "type": "string", + "tags": [], + "label": "'slo|dc7f35c0cf07d71bb36f154996fe10c6'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.spacec3aec2a5d4afcb75554fed96411170e1", + "type": "string", + "tags": [], + "label": "'space|c3aec2a5d4afcb75554fed96411170e1'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.spacesusagestats3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'spaces-usage-stats|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.syntheticsmonitor50b48ccda9f2f7d73d31fd50c41bf305", + "type": "string", + "tags": [], + "label": "'synthetics-monitor|50b48ccda9f2f7d73d31fd50c41bf305'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.syntheticsparam3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'synthetics-param|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.syntheticsprivateslocations3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'synthetics-privates-locations|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.tag83d55da58f6530f7055415717ec06474", + "type": "string", + "tags": [], + "label": "'tag|83d55da58f6530f7055415717ec06474'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.taskb4a368fd68cd32ef6990877634639db6", + "type": "string", + "tags": [], + "label": "'task|b4a368fd68cd32ef6990877634639db6'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.telemetry3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'telemetry|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.thresholdexplorerview3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'threshold-explorer-view|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.uimetric0d409297dc5ebe1e3a1da691c6ee32e3", + "type": "string", + "tags": [], + "label": "'ui-metric|0d409297dc5ebe1e3a1da691c6ee32e3'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.upgradeassistantmlupgradeoperation3caf305ad2da94d80d49453b0970156d", + "type": "string", + "tags": [], + "label": "'upgrade-assistant-ml-upgrade-operation|3caf305ad2da94d80d49453b0970156d'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.upgradeassistantreindexoperation6d1e2aca91767634e1829c30f20f6b16", + "type": "string", + "tags": [], + "label": "'upgrade-assistant-reindex-operation|6d1e2aca91767634e1829c30f20f6b16'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.uptimedynamicsettings3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'uptime-dynamic-settings|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.uptimesyntheticsapikeyc3178f0fde61e18d3530ba9a70bc278a", + "type": "string", + "tags": [], + "label": "'uptime-synthetics-api-key|c3178f0fde61e18d3530ba9a70bc278a'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.urla37dbae7645ad5811045f4dd3dc1c0a8", + "type": "string", + "tags": [], + "label": "'url|a37dbae7645ad5811045f4dd3dc1c0a8'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.usagecounters8cc260bdceffec4ffc3ad165c97dc1b4", + "type": "string", + "tags": [], + "label": "'usage-counters|8cc260bdceffec4ffc3ad165c97dc1b4'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.visualization4891c012863513388881fc109fec4809", + "type": "string", + "tags": [], + "label": "'visualization|4891c012863513388881fc109fec4809'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-base-server-internal", + "id": "def-common.HASH_TO_VERSION_MAP.workplace_search_telemetry3d1b76c39bfb2cc8296b024d73854724", + "type": "string", + "tags": [], + "label": "'workplace_search_telemetry|3d1b76c39bfb2cc8296b024d73854724'", + "description": [], + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-saved-objects-base-server-internal", "id": "def-common.savedObjectsConfig", 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 8aefed99587c2..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-25 +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'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 112 | 0 | 71 | 10 | +| 223 | 0 | 180 | 11 | ## Common 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 30923673bdca5..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-25 +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 8d4efee9a284b..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-25 +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 f291976560112..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-25 +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 9289546b9a83d..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-25 +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 37ceb1fb4e583..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-25 +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 b40f81af5c941..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-25 +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 b975b02f883e2..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-25 +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.devdocs.json b/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json index a1a5638f699bc..1b4478ccf6163 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json @@ -426,7 +426,7 @@ "id": "def-common.KibanaMigrator.Unnamed.$1", "type": "Object", "tags": [], - "label": "{\n client,\n typeRegistry,\n kibanaIndex,\n defaultIndexTypesMap,\n soMigrationsConfig,\n kibanaVersion,\n logger,\n docLinks,\n waitForMigrationCompletion,\n nodeRoles,\n esCapabilities,\n }", + "label": "{\n client,\n typeRegistry,\n kibanaIndex,\n defaultIndexTypesMap,\n hashToVersionMap,\n soMigrationsConfig,\n kibanaVersion,\n logger,\n docLinks,\n waitForMigrationCompletion,\n nodeRoles,\n esCapabilities,\n }", "description": [], "signature": [ { @@ -724,7 +724,9 @@ }, " | ", "SavedObjectsTypeMappingDefinitions", - ") => ", + ", _meta: ", + "IndexMappingMeta", + " | undefined) => ", "IndexMapping" ], "path": "packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts", @@ -755,6 +757,22 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "@kbn/core-saved-objects-migration-server-internal", + "id": "def-common.buildActiveMappings.$2", + "type": "CompoundType", + "tags": [], + "label": "_meta", + "description": [], + "signature": [ + "IndexMappingMeta", + " | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [], @@ -1925,7 +1943,7 @@ "tags": [], "label": "updateMappings", "description": [ - "\nUpdates an index's mappings and runs an pickupUpdatedMappings task so that the mapping\nchanges are \"picked up\". Returns a taskId to track progress." + "\nAttempts to update the SO index mappings.\nIncludes an automatic retry mechanism for retriable errors.\nReturns an 'update_mappings_succeeded' upon success.\nIf changes in the mappings are NOT compatible and the update fails on ES side,\nthis method will return an 'incompatible_mapping_exception'." ], "signature": [ "({ client, index, mappings, }: ", @@ -3653,6 +3671,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-migration-server-internal", + "id": "def-common.KibanaMigratorOptions.hashToVersionMap", + "type": "Object", + "tags": [], + "label": "hashToVersionMap", + "description": [], + "signature": [ + "{ [x: string]: string; }" + ], + "path": "packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-migration-server-internal", "id": "def-common.KibanaMigratorOptions.soMigrationsConfig", 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 d69217b5ea93c..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-25 +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'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 129 | 0 | 94 | 45 | +| 131 | 0 | 96 | 45 | ## Common 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 805ff905c1b35..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-25 +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.devdocs.json b/api_docs/kbn_core_saved_objects_server.devdocs.json index 4c07a90947594..dcef12108ba2e 100644 --- a/api_docs/kbn_core_saved_objects_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_server.devdocs.json @@ -10877,6 +10877,26 @@ "plugin": "@kbn/core-saved-objects-base-server-internal", "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts" }, + { + "plugin": "@kbn/core-saved-objects-base-server-internal", + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts" + }, + { + "plugin": "@kbn/core-saved-objects-base-server-internal", + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts" + }, + { + "plugin": "@kbn/core-saved-objects-base-server-internal", + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts" + }, + { + "plugin": "@kbn/core-saved-objects-base-server-internal", + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts" + }, + { + "plugin": "@kbn/core-saved-objects-base-server-internal", + "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/model_version/version_map.test.ts" + }, { "plugin": "@kbn/core-saved-objects-migration-server-internal", "path": "packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_index_map.test.ts" diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index c8d11ae995309..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-25 +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 c124a53a479e0..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-25 +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 2b649abbc0fee..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-25 +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 efd7574507424..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-25 +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 349f1dc86ee2f..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-25 +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 2deade2130ec9..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-25 +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 5ea904f08562f..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-25 +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 fa528398fc8f4..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-25 +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 a07f37088667a..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-25 +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 77dfba4fa219d..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-25 +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 bb07555050bbc..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-25 +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 a0f99cf794265..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-25 +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 6ad42b8d42f44..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-25 +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 a82c8b4420b84..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-25 +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 6e4d2836a6455..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-25 +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 710b0e0223449..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-25 +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 6e854a4666d8e..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-25 +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 3d4d4bff4db1c..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-25 +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 8210e49857e1d..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-25 +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 5619d86690a06..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-25 +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 9dd993cfb1d05..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-25 +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 18120c8ca5b9a..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-25 +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 b23668696e60f..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-25 +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 52c917623937d..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-25 +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 252bffee7d24c..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-25 +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 0fbd695414548..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-25 +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 0492af0c6017e..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-25 +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.devdocs.json b/api_docs/kbn_core_ui_settings_common.devdocs.json index 55ace6dd5b9ff..6a5399fdfce37 100644 --- a/api_docs/kbn_core_ui_settings_common.devdocs.json +++ b/api_docs/kbn_core_ui_settings_common.devdocs.json @@ -361,7 +361,9 @@ "type": "Object", "tags": [], "label": "schema", - "description": [], + "description": [ + "\nValue validation schema.\nUsed to validate value on write and read.\n\nThis schema is also used for validating the user input in all settings fields {@link FieldRow} across Kibana UI.\nUse schema options to specify limits on the value. For example:\n`schema.number({ min: 0, max: 100 })`\n\nMore information about schema in https://github.com/elastic/kibana/blob/main/packages/kbn-config-schema/README.md" + ], "signature": [ { "pluginId": "@kbn/config-schema", diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 953357af496e5..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-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 30 | 0 | 6 | 0 | +| 30 | 0 | 5 | 0 | ## Common diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 4ff71fbef5c2d..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-25 +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 882f5e32c0281..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-25 +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 83d81a12af3d3..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-25 +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 ae6575f6957b5..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-25 +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 5d32e59d8fb25..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-25 +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 4f65895bf8b07..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-25 +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 bba6ea461b54d..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-25 +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 d595fca44947c..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-25 +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 65ac6af67b441..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-25 +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 d4128b87bdfa1..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-25 +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 a3c643fd2ff3a..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-25 +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 ea9cf2488f444..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-25 +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 88edd778b985b..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-25 +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 4f536ab5d98a9..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-25 +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 881c9c519c81b..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-25 +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 94501144c7cdf..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-25 +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 4bac50f6c185b..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-25 +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 7ef95e9ce6075..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-25 +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 2a4723736684a..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-25 +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 f458316649d60..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-25 +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 60e0ca24f5882..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-25 +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 216df355e772b..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-25 +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.devdocs.json b/api_docs/kbn_deeplinks_management.devdocs.json index 454be76704be6..95c470c287ed1 100644 --- a/api_docs/kbn_deeplinks_management.devdocs.json +++ b/api_docs/kbn_deeplinks_management.devdocs.json @@ -45,7 +45,7 @@ "label": "DeepLinkId", "description": [], "signature": [ - "\"fleet\" | \"monitoring\" | \"management\" | \"integrations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:aiAssistantManagementObservability\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\"" + "\"fleet\" | \"monitoring\" | \"management\" | \"integrations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\"" ], "path": "packages/deeplinks/management/deep_links.ts", "deprecated": false, @@ -60,7 +60,7 @@ "label": "LinkId", "description": [], "signature": [ - "\"transform\" | \"watcher\" | \"cases\" | \"tags\" | \"maintenanceWindows\" | \"settings\" | \"dataViews\" | \"spaces\" | \"users\" | \"migrate_data\" | \"search_sessions\" | \"filesManagement\" | \"roles\" | \"reporting\" | \"aiAssistantManagementSelection\" | \"aiAssistantManagementObservability\" | \"api_keys\" | \"cross_cluster_replication\" | \"license_management\" | \"index_lifecycle_management\" | \"index_management\" | \"ingest_pipelines\" | \"jobsListLink\" | \"objects\" | \"pipelines\" | \"remote_clusters\" | \"role_mappings\" | \"rollup_jobs\" | \"snapshot_restore\" | \"triggersActions\" | \"triggersActionsConnectors\" | \"upgrade_assistant\"" + "\"transform\" | \"watcher\" | \"cases\" | \"tags\" | \"maintenanceWindows\" | \"settings\" | \"dataViews\" | \"spaces\" | \"users\" | \"migrate_data\" | \"search_sessions\" | \"filesManagement\" | \"roles\" | \"reporting\" | \"aiAssistantManagementSelection\" | \"observabilityAiAssistantManagement\" | \"api_keys\" | \"cross_cluster_replication\" | \"license_management\" | \"index_lifecycle_management\" | \"index_management\" | \"ingest_pipelines\" | \"jobsListLink\" | \"objects\" | \"pipelines\" | \"remote_clusters\" | \"role_mappings\" | \"rollup_jobs\" | \"snapshot_restore\" | \"triggersActions\" | \"triggersActionsConnectors\" | \"upgrade_assistant\"" ], "path": "packages/deeplinks/management/deep_links.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index e0e35ef5cc17e..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-25 +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 19fdfb6418a01..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-25 +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 67e6927a77a26..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-25 +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 646164c22b5ff..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-25 +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 fcad11e847071..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-25 +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 77a88ea1d3057..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-25 +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 65512482ddde6..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-25 +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 3577900295e3a..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-25 +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 48f0dbfbd18d2..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-25 +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 647725e452eea..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-25 +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 685a9e1bb7ef8..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-25 +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 7f51d3a8cf9a7..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-25 +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 3598ca4c090f3..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-25 +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 b5ec18b143bf1..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-25 +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 3d7ed291b0d6e..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-25 +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 7a45da369d502..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-25 +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 2df4768561d68..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-25 +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 7ddbd9b57ffa3..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-25 +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 244eaaa8b79c4..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-25 +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 5e2396d33fcd8..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-25 +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 5d78eb149cbdd..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-25 +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 f08335aae2cec..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-25 +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 e3ac5247143cd..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-25 +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 5b1b571aa48e5..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-25 +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 1b10c8da8f905..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-25 +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 3e4ef0c13e3b3..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-25 +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 ed09c9970256a..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-25 +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 bb697bcdfc282..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-25 +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 143c5e83337fd..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-25 +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 d351956ab5a45..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-25 +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 59d655d0a32f8..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-25 +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 4a74b7722ada3..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-25 +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.devdocs.json b/api_docs/kbn_expandable_flyout.devdocs.json index f3f7f1d35646b..8fbc1787e2d68 100644 --- a/api_docs/kbn_expandable_flyout.devdocs.json +++ b/api_docs/kbn_expandable_flyout.devdocs.json @@ -13,7 +13,7 @@ "\nExpandable flyout UI React component.\nDisplays 3 sections (right, left, preview) depending on the panels in the context.\n\nThe behavior expects that the left and preview sections should only be displayed is a right section\nis already rendered." ], "signature": [ - "{ ({ registeredPanels, ...flyoutProps }: React.PropsWithChildren<", + "{ ({ customStyles, registeredPanels, ...flyoutProps }: React.PropsWithChildren<", { "pluginId": "@kbn/expandable-flyout", "scope": "public", @@ -32,7 +32,7 @@ "id": "def-public.ExpandableFlyout.$1", "type": "CompoundType", "tags": [], - "label": "{\n registeredPanels,\n ...flyoutProps\n}", + "label": "{\n customStyles,\n registeredPanels,\n ...flyoutProps\n}", "description": [], "signature": [ "React.PropsWithChildren<", @@ -549,6 +549,31 @@ "path": "packages/kbn-expandable-flyout/src/index.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/expandable-flyout", + "id": "def-public.ExpandableFlyoutProps.customStyles", + "type": "CompoundType", + "tags": [], + "label": "customStyles", + "description": [ + "\nAllows for custom styles to be passed to the EuiFlyout component" + ], + "signature": [ + "InterpolationPrimitive", + " | ", + "ArrayInterpolation", + "<", + "Theme", + "> | ", + "FunctionInterpolation", + "<", + "Theme", + ">" + ], + "path": "packages/kbn-expandable-flyout/src/index.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index ff9105f5abb2f..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-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-threat-hunting-investigations](https://github.com/org | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 37 | 0 | 14 | 1 | +| 38 | 0 | 14 | 1 | ## Client diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index c8a109435f888..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-25 +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 828cca0307b5b..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-25 +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 8c40402312e1b..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-25 +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 35facf813781d..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-25 +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 53f7dca88cc44..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-25 +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 3ed30caebafe8..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-25 +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 4cb492af7ecdd..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-25 +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 c1597fec67b0a..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-25 +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 10f859455cadc..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-25 +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 d754102c981a6..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-25 +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 c2a8449b7c48e..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-25 +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 cdcd7346f9e6f..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-25 +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 4054c8c67f720..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-25 +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 d8004ade14288..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-25 +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 9164acb186a50..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-25 +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 9897f15515be9..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-25 +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 c4c0374f02eba..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-25 +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 3763aa6fc87e8..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-25 +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 7b8f4615d6cb9..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-25 +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 eda00f6099a2b..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-25 +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 fe30a724dca80..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-25 +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 87950b8c77e8b..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-25 +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 36f69689f01b2..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-25 +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 07fe3cedc6154..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-25 +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 b88677b62e72c..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-25 +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 c376c743e113d..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-25 +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 58c260e39f17b..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-25 +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 e439dfb5c1f16..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-25 +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 bd76cdfb0a0c8..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-25 +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 80ae0740d72e0..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-25 +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 42eab5dd0e7ab..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-25 +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 861f7f85f0209..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-25 +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 2d3afd75f833b..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-25 +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 3e0a952e76a4c..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-25 +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 96302a897c6f4..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-25 +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 bf6fd3c337de1..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-25 +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 e8f0dd2e2d05e..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-25 +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 efb212c2bd49a..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-25 +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 9aabc085130b1..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-25 +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 f385b71f631a3..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-25 +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 1ce83b080179f..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-25 +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 41ec0f97fd1b2..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-25 +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 d9582d79446c8..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-25 +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 3a5b0a9d45a59..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-25 +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 7f75c4aca7789..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-25 +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 01cce860ed2f2..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-25 +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 b12a0357da9db..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-25 +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 62113d32ea45a..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-25 +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 5db3cb6aca2d6..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-25 +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 a2177bbc32d76..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-25 +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 24177bc90a6e8..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-25 +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 b1ee22508e675..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-25 +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 46ef1ee5c1b65..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-25 +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 0d930bff87069..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-25 +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 38e9fee10183a..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-25 +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 f6ede83d03f61..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-25 +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 03aef1d1374ee..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-25 +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 8120941b94ada..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-25 +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 1a634a5286f70..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-25 +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 7837096257507..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-25 +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 35eaed4d176d6..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-25 +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 f8cac5b6220be..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-25 +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 94239629903ff..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-25 +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 022749e4f6ae7..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-25 +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 16792d3140d41..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-25 +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 55b3775c4bee8..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-25 +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 edaa4ac80fb42..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-25 +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 1dd679cdcf359..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-25 +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 9cb5bdbd37c43..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-25 +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 ba3bb53411364..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-25 +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 9352646d69057..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-25 +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 28932e551bc9f..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-25 +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 16da3dd4ff3e6..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-25 +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 f812969ff4bbb..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-25 +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 82a509109853c..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-25 +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 79f96177454f0..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-25 +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 9fc28c58a36e0..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-25 +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 aa7cafb3d9a8d..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-25 +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 bcf4f266dbf39..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-25 +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 99bf00a555153..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-25 +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 132fdec68eb4c..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-25 +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 71a63bd357173..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-25 +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 f9dca032281e4..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-25 +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 12cc875f5cf23..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-25 +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 e7b36b2194324..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-25 +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 401f33462bac9..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-25 +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 bb3fc61075f36..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-25 +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 1257229469157..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-25 +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 a6f7064f54a78..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-25 +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 34bbad977f867..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-25 +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.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json index f77b5176d1532..b54a48603b9c1 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -581,7 +581,7 @@ }, ">" ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -595,7 +595,7 @@ "signature": [ "unknown" ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -703,7 +703,7 @@ "text": "PublishesTimeRange" } ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -717,7 +717,7 @@ "signature": [ "unknown" ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -743,7 +743,7 @@ "text": "PublishesUnifiedSearch" } ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -757,7 +757,7 @@ "signature": [ "unknown" ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -945,7 +945,7 @@ "text": "PublishesWritableUnifiedSearch" } ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -959,7 +959,7 @@ "signature": [ "unknown" ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1284,6 +1284,86 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.initializeTimeRange", + "type": "Function", + "tags": [], + "label": "initializeTimeRange", + "description": [], + "signature": [ + "(rawState: ", + "SerializedTimeRange", + ", parentApi?: unknown) => { appliedTimeRange$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.PublishingSubject", + "text": "PublishingSubject" + }, + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined>; cleanupTimeRange: () => void; serializeTimeRange: () => ", + "SerializedTimeRange", + "; timeRangeApi: ", + "PublishesWritableTimeRange", + "; timeRangeComparators: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.StateComparators", + "text": "StateComparators" + }, + "<", + "SerializedTimeRange", + ">; }" + ], + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.initializeTimeRange.$1", + "type": "Object", + "tags": [], + "label": "rawState", + "description": [], + "signature": [ + "SerializedTimeRange" + ], + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.initializeTimeRange.$2", + "type": "Unknown", + "tags": [], + "label": "parentApi", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.initializeTitles", @@ -4562,7 +4642,7 @@ "tags": [], "label": "PublishesTimeRange", "description": [], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -4926,7 +5006,7 @@ }, " | undefined>; }; }" ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false } @@ -5786,7 +5866,7 @@ }, " | undefined>; }" ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -5898,7 +5978,7 @@ "section": "def-common.TimeRange", "text": "TimeRange" }, - " | undefined) => void; setFilters: (filters: ", + " | undefined) => void; } & { setFilters: (filters: ", { "pluginId": "@kbn/es-query", "scope": "common", @@ -5916,7 +5996,7 @@ }, " | undefined) => void; }" ], - "path": "packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index a5e8dfcfb5808..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-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.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 | |-------------------|-----------|------------------------|-----------------| -| 164 | 0 | 134 | 4 | +| 167 | 0 | 137 | 6 | ## Common diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index f461de190686e..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-25 +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 af603c48a5fb1..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-25 +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 f4325334ecbd8..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-25 +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 060f7eb50788f..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-25 +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 6f3529bcb32bd..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-25 +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 5bf12d250c3b2..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-25 +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 7e9252d3f6409..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-25 +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 c2010fb8e3bf6..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-25 +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 7ceaa899b7740..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-25 +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 43d9a4885707c..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-25 +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 b9c0da3a5c275..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-25 +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 14d55c646e389..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-25 +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 42fddd150384f..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-25 +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 bce0b13b5e30d..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-25 +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 fb1aa9f8416c2..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-25 +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 edde1cc568205..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-25 +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 eea8d4509648f..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-25 +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 e9c2fa18ea6a1..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-25 +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 e5aa5559df1a5..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-25 +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 d78d90dbe750f..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-25 +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 08c1af9c1647b..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-25 +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 2ccdd9fe88902..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-25 +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 3a7d4fb47f8a4..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-25 +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 bf6aabb234000..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-25 +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 8c2fc5a09cda2..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-25 +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 7830cf1dabddb..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-25 +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 c1881cfe651e2..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-25 +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 4384c44a0890f..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-25 +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 8c5d3a0b3a207..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-25 +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 a1ef80276674d..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-25 +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 188d0c612318f..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", @@ -13705,10 +13558,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method", "type": "Object", "tags": [], - "label": "token", + "label": "auth_method", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13716,7 +13569,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -13730,7 +13583,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.depends_on", "type": "Array", "tags": [], "label": "depends_on", @@ -13744,7 +13597,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.display", "type": "string", "tags": [], "label": "display", @@ -13757,7 +13610,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".DROPDOWN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13765,7 +13618,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.label", "type": "string", "tags": [], "label": "label", @@ -13776,13 +13629,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.options", "type": "Array", "tags": [], "label": "options", "description": [], "signature": [ - "never[]" + "{ label: string; value: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13790,7 +13643,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.order", "type": "number", "tags": [], "label": "order", @@ -13801,7 +13654,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.required", "type": "boolean", "tags": [], "label": "required", @@ -13815,13 +13668,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "true" + "false" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13829,7 +13682,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.tooltip", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.tooltip", "type": "Uncategorized", "tags": [], "label": "tooltip", @@ -13843,7 +13696,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.type", "type": "string", "tags": [], "label": "type", @@ -13864,7 +13717,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -13878,7 +13731,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.validations", "type": "Array", "tags": [], "label": "validations", @@ -13892,7 +13745,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.auth_method.value", "type": "string", "tags": [], "label": "value", @@ -13905,10 +13758,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token", "type": "Object", "tags": [], - "label": "repo_type", + "label": "token", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13916,7 +13769,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -13930,13 +13783,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "never[]" + "{ field: string; value: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13944,7 +13797,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.display", "type": "string", "tags": [], "label": "display", @@ -13957,7 +13810,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".DROPDOWN" + ".TEXTBOX" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13965,7 +13818,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.label", "type": "string", "tags": [], "label": "label", @@ -13976,13 +13829,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.options", "type": "Array", "tags": [], "label": "options", "description": [], "signature": [ - "{ label: string; value: string; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -13990,7 +13843,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.order", "type": "number", "tags": [], "label": "order", @@ -14001,7 +13854,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.required", "type": "boolean", "tags": [], "label": "required", @@ -14015,13 +13868,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.sensitive", "type": "boolean", "tags": [], "label": "sensitive", "description": [], "signature": [ - "false" + "true" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14029,18 +13882,21 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.tooltip", - "type": "string", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.tooltip", + "type": "Uncategorized", "tags": [], "label": "tooltip", "description": [], + "signature": [ + "null" + ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.type", "type": "string", "tags": [], "label": "type", @@ -14061,7 +13917,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -14075,7 +13931,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.validations", "type": "Array", "tags": [], "label": "validations", @@ -14089,7 +13945,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.token.value", "type": "string", "tags": [], "label": "value", @@ -14102,10 +13958,10 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type", "type": "Object", "tags": [], - "label": "org_name", + "label": "repo_type", "description": [], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14113,7 +13969,7 @@ "children": [ { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.default_value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.default_value", "type": "Uncategorized", "tags": [], "label": "default_value", @@ -14127,13 +13983,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.depends_on", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.depends_on", "type": "Array", "tags": [], "label": "depends_on", "description": [], "signature": [ - "{ field: string; value: string; }[]" + "never[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14141,7 +13997,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.display", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.display", "type": "string", "tags": [], "label": "display", @@ -14154,7 +14010,7 @@ "section": "def-common.DisplayType", "text": "DisplayType" }, - ".TEXTBOX" + ".DROPDOWN" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14162,7 +14018,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.label", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.label", "type": "string", "tags": [], "label": "label", @@ -14173,13 +14029,13 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.options", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.options", "type": "Array", "tags": [], "label": "options", "description": [], "signature": [ - "never[]" + "{ label: string; value: string; }[]" ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, @@ -14187,7 +14043,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.order", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.order", "type": "number", "tags": [], "label": "order", @@ -14198,7 +14054,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.required", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.required", "type": "boolean", "tags": [], "label": "required", @@ -14212,7 +14068,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.sensitive", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.sensitive", "type": "boolean", "tags": [], "label": "sensitive", @@ -14226,21 +14082,18 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.tooltip", - "type": "Uncategorized", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.tooltip", + "type": "string", "tags": [], "label": "tooltip", "description": [], - "signature": [ - "null" - ], "path": "packages/kbn-search-connectors/types/native_connectors.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.type", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.type", "type": "string", "tags": [], "label": "type", @@ -14261,7 +14114,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.ui_restrictions", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.ui_restrictions", "type": "Array", "tags": [], "label": "ui_restrictions", @@ -14275,7 +14128,7 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.validations", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.validations", "type": "Array", "tags": [], "label": "validations", @@ -14289,7 +14142,607 @@ }, { "parentPluginId": "@kbn/search-connectors", - "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.value", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.repo_type.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name", + "type": "Object", + "tags": [], + "label": "org_name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.org_name.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id", + "type": "Object", + "tags": [], + "label": "app_id", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.app_id.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key", + "type": "Object", + "tags": [], + "label": "private_key", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.github.configuration.private_key.value", "type": "string", "tags": [], "label": "value", diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 1c605877a9f4a..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-25 +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 | |-------------------|-----------|------------------------|-----------------| -| 3177 | 0 | 3177 | 0 | +| 3208 | 0 | 3208 | 0 | ## Common diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 91558e1a40a79..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-25 +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 28fcfc2efb2b5..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-25 +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 7f627940782e7..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-25 +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 f6af127b61da3..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-25 +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 a4592a246bc62..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-25 +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 96252b32cb67e..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-25 +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 6c28e698c2f8d..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-25 +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 46a50629c675c..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-25 +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 34a113460d239..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-25 +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 e7750974c88fb..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-25 +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 118c69f684889..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-25 +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 f408e9264e75c..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-25 +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 151d1fccef3f4..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-25 +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 14f50416b2ed1..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-25 +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 636075f70aeac..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-25 +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 1c1f0cfa560ed..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-25 +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 699ac7bb9467f..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-25 +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 b804de31c71e2..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-25 +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 c65edc753604f..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-25 +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 db3035735c4f2..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-25 +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 6c64964bc10c2..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-25 +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 aff041a184ba5..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-25 +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 2d575e3738b67..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-25 +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 f546a6c02291e..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-25 +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 6ce5e1db2043b..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-25 +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 7f7b6a596e772..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-25 +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 db9551298ef9a..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-25 +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 1b5217131de32..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-25 +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 5353dd88ae201..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-25 +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 8545c172a482e..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-25 +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 1a6a670f63084..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-25 +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 0410ae31fb177..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-25 +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 f042fa12b15d1..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-25 +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 0d0cfd5716bcb..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-25 +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 74ece090f1bf9..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-25 +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 3cc65bd475fa1..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-25 +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 818c7a4115ccc..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-25 +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 ee7fc088864cf..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-25 +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 9f289612b68b8..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-25 +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 30fc248b0811a..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-25 +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 da5863527ec18..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-25 +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 5daddc201f8ce..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-25 +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 9199bd62299a4..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-25 +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 6f32cd7ece966..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-25 +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 4ca99d955b41c..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-25 +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 9294cfc944de2..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-25 +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 467de7ff1856c..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-25 +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 ad394264f337d..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-25 +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 7f0780667d91e..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-25 +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 c019851fcaf3a..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-25 +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 78223048b2618..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-25 +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 2c1550965a089..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-25 +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 5d487f2b288f2..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-25 +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 bd93a885295cc..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-25 +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 9dada134268fd..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-25 +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 9da51bd01bb95..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-25 +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 d8cf427f39ae1..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-25 +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 0696a057f655a..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-25 +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 e896124f47a52..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-25 +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 e8aadaa66617c..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-25 +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 c1e7780f0fe91..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-25 +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 a0e752c9a1f7d..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-25 +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 e562a737a6d27..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-25 +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 09043066f022b..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-25 +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 56ee3ea19134f..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-25 +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 5aea99c235073..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-25 +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 59781452619a2..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-25 +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 c19ea00e17a23..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-25 +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 c9216b11e2dc2..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-25 +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 f6388c42db23d..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-25 +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 fbd05454d6b34..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-25 +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 a6bfa614dadaa..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-25 +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 9a7a9c1b23345..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-25 +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 6411eae8c82c6..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-25 +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 c42c9e5ea04ab..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-25 +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 97caeb564c28f..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-25 +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 f2d59b6303100..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-25 +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 d55519546c311..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-25 +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 1852bc89e40c9..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-25 +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 07e4f2aed4fd8..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-25 +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 97ae8d720742a..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-25 +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 7ccaeb419918f..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-25 +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 2fae7380a09f9..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-25 +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 5c8ad725089f2..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-25 +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 b22ed4b9118de..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-25 +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 259942119a736..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-25 +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 b4028062bf84c..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-25 +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 d8c56abacebf8..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-25 +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 65b3a591346e7..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-25 +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 79cf1e0124c2b..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-25 +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 880d1769fb4c8..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-25 +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 f4723c7d1d8d7..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-25 +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 1756f70d51554..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-25 +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 25d7b9ffc2be6..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-25 +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 46acb8d2f24ba..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-25 +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 23bdc63f8251a..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-25 +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 839408decfa73..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-25 +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 d4ad72b87f419..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-25 +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 bf58bb06eb45d..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-25 +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 27f30bcdb5346..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-25 +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 883b1c5a2baff..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-25 +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 1eace0d652759..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-25 +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 3f4903b7c056f..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-25 +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 1467e33a83789..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-25 +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 197da269e2ee1..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-25 +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 1f8134ef0db3f..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-25 +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 3b314fdcd95df..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-25 +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 1060fbf4ed598..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-25 +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 b7e545117c3d3..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-25 +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 f98d4c4816bf1..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-25 +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 e6257220fcb2a..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-25 +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 337f26a04a2a1..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-25 +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 8ae485db7e038..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-25 +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 3fd8dc086ec96..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-25 +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 1f9c0b25d03bc..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-25 +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 592185c376369..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-25 +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 + ### Start - + diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 6ca7b1e42d8e5..1554cdf00a8ed 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-03-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 7199e79c209f3..428fac85c576e 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-03-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 47a1e9927b6c1..825ff0792e707 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-03-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 7509ed31eee30..73c4209d12391 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-03-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index e5159b3ab0f40..eda546cd99c17 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-03-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 220d7b83dbcd2..329c9a476d30b 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-03-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 770 | 661 | 40 | +| 771 | 662 | 40 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 46129 | 233 | 34918 | 1785 | +| 46323 | 233 | 35104 | 1791 | ## Plugin Directory @@ -29,7 +29,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] |--------------|----------------|-----------|--------------|----------|---------------|--------| | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 289 | 0 | 283 | 32 | | | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 2 | 0 | 2 | 0 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 70 | 0 | 4 | 1 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 838 | 1 | 807 | 53 | @@ -69,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 | 555 | 1 | 453 | 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 | @@ -79,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 | @@ -119,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 | @@ -143,13 +142,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 661 | 2 | 652 | 14 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 227 | 1 | 225 | 25 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 21 | 0 | 21 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 14 | 0 | 14 | 0 | | | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 333 | 1 | 328 | 20 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 23 | 0 | 23 | 7 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds a standardized Presentation panel which allows any forward ref component to interface with various Kibana systems. | 11 | 0 | 11 | 4 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 220 | 2 | 165 | 11 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 212 | 2 | 157 | 11 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 16 | 1 | 16 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 22 | 0 | 22 | 7 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 23 | 0 | 23 | 0 | @@ -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 | @@ -388,7 +389,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 111 | 1 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 353 | 1 | 5 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 11 | 0 | 11 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 112 | 0 | 71 | 10 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 223 | 0 | 180 | 11 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 5 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | @@ -396,7 +397,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 73 | 0 | 40 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 0 | 23 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 129 | 0 | 94 | 45 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 131 | 0 | 96 | 45 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 12 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 555 | 1 | 130 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 69 | 0 | 69 | 4 | @@ -425,7 +426,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 33 | 2 | 20 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 1 | 11 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 30 | 0 | 6 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 30 | 0 | 5 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 40 | 1 | 22 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 20 | 1 | 19 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | @@ -480,7 +481,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 20 | 0 | 18 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 39 | 0 | 39 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 0 | 52 | 1 | -| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 37 | 0 | 14 | 1 | +| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 38 | 0 | 14 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 18 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 50 | 0 | 42 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 0 | 0 | @@ -564,14 +565,14 @@ 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 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 46 | 0 | 44 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 10 | 0 | 10 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 164 | 0 | 134 | 4 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 167 | 0 | 137 | 6 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 161 | 0 | 48 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 13 | 0 | 7 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 9 | 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) | - | 3177 | 0 | 3177 | 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 bea2ea1159767..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-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.devdocs.json b/api_docs/presentation_util.devdocs.json index 66cfbad90ca3b..c7740f463de7b 100644 --- a/api_docs/presentation_util.devdocs.json +++ b/api_docs/presentation_util.devdocs.json @@ -1543,7 +1543,7 @@ "label": "isProjectEnabled", "description": [], "signature": [ - "(id: \"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\" | \"labs:dashboard:linksPanel\") => boolean" + "(id: \"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\") => boolean" ], "path": "src/plugins/presentation_util/public/services/labs/types.ts", "deprecated": false, @@ -1557,7 +1557,7 @@ "label": "id", "description": [], "signature": [ - "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\" | \"labs:dashboard:linksPanel\"" + "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\"" ], "path": "src/plugins/presentation_util/public/services/labs/types.ts", "deprecated": false, @@ -1575,7 +1575,7 @@ "label": "getProjectIDs", "description": [], "signature": [ - "() => readonly [\"labs:dashboard:deferBelowFold\", \"labs:canvas:byValueEmbeddable\", \"labs:dashboard:linksPanel\"]" + "() => readonly [\"labs:dashboard:deferBelowFold\", \"labs:canvas:byValueEmbeddable\"]" ], "path": "src/plugins/presentation_util/public/services/labs/types.ts", "deprecated": false, @@ -1591,7 +1591,7 @@ "label": "getProject", "description": [], "signature": [ - "(id: \"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\" | \"labs:dashboard:linksPanel\") => ", + "(id: \"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\") => ", { "pluginId": "presentationUtil", "scope": "common", @@ -1612,7 +1612,7 @@ "label": "id", "description": [], "signature": [ - "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\" | \"labs:dashboard:linksPanel\"" + "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\"" ], "path": "src/plugins/presentation_util/public/services/labs/types.ts", "deprecated": false, @@ -1630,7 +1630,7 @@ "label": "getProjects", "description": [], "signature": [ - "(solutions?: (\"canvas\" | \"dashboard\" | \"presentation\")[] | undefined) => Record<\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\" | \"labs:dashboard:linksPanel\", ", + "(solutions?: (\"canvas\" | \"dashboard\" | \"presentation\")[] | undefined) => Record<\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\", ", { "pluginId": "presentationUtil", "scope": "common", @@ -1670,7 +1670,7 @@ "label": "setProjectStatus", "description": [], "signature": [ - "(id: \"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\" | \"labs:dashboard:linksPanel\", env: \"kibana\" | \"browser\" | \"session\", status: boolean) => void" + "(id: \"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\", env: \"kibana\" | \"browser\" | \"session\", status: boolean) => void" ], "path": "src/plugins/presentation_util/public/services/labs/types.ts", "deprecated": false, @@ -1684,7 +1684,7 @@ "label": "id", "description": [], "signature": [ - "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\" | \"labs:dashboard:linksPanel\"" + "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\"" ], "path": "src/plugins/presentation_util/public/services/labs/types.ts", "deprecated": false, @@ -3093,7 +3093,7 @@ "label": "getProjectIDs", "description": [], "signature": [ - "() => readonly [\"labs:dashboard:deferBelowFold\", \"labs:canvas:byValueEmbeddable\", \"labs:dashboard:linksPanel\"]" + "() => readonly [\"labs:dashboard:deferBelowFold\", \"labs:canvas:byValueEmbeddable\"]" ], "path": "src/plugins/presentation_util/common/labs.ts", "deprecated": false, @@ -3395,7 +3395,7 @@ "label": "id", "description": [], "signature": [ - "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\" | \"labs:dashboard:linksPanel\"" + "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\"" ], "path": "src/plugins/presentation_util/common/labs.ts", "deprecated": false, @@ -3609,7 +3609,7 @@ "label": "ProjectID", "description": [], "signature": [ - "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\" | \"labs:dashboard:linksPanel\"" + "\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\"" ], "path": "src/plugins/presentation_util/common/labs.ts", "deprecated": false, @@ -3702,7 +3702,7 @@ "label": "projectIDs", "description": [], "signature": [ - "readonly [\"labs:dashboard:deferBelowFold\", \"labs:canvas:byValueEmbeddable\", \"labs:dashboard:linksPanel\"]" + "readonly [\"labs:dashboard:deferBelowFold\", \"labs:canvas:byValueEmbeddable\"]" ], "path": "src/plugins/presentation_util/common/labs.ts", "deprecated": false, @@ -3827,111 +3827,6 @@ } ] }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.DASHBOARD_LINKS_PANEL", - "type": "Object", - "tags": [], - "label": "[DASHBOARD_LINKS_PANEL]", - "description": [], - "path": "src/plugins/presentation_util/common/labs.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.DASHBOARD_LINKS_PANEL.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "\"labs:dashboard:linksPanel\"" - ], - "path": "src/plugins/presentation_util/common/labs.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.DASHBOARD_LINKS_PANEL.isActive", - "type": "boolean", - "tags": [], - "label": "isActive", - "description": [], - "signature": [ - "true" - ], - "path": "src/plugins/presentation_util/common/labs.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.DASHBOARD_LINKS_PANEL.isDisplayed", - "type": "boolean", - "tags": [], - "label": "isDisplayed", - "description": [], - "signature": [ - "true" - ], - "path": "src/plugins/presentation_util/common/labs.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.DASHBOARD_LINKS_PANEL.environments", - "type": "Array", - "tags": [], - "label": "environments", - "description": [], - "signature": [ - "(\"kibana\" | \"browser\" | \"session\")[]" - ], - "path": "src/plugins/presentation_util/common/labs.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.DASHBOARD_LINKS_PANEL.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "src/plugins/presentation_util/common/labs.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.DASHBOARD_LINKS_PANEL.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "path": "src/plugins/presentation_util/common/labs.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.DASHBOARD_LINKS_PANEL.solutions", - "type": "Array", - "tags": [], - "label": "solutions", - "description": [], - "signature": [ - "\"dashboard\"[]" - ], - "path": "src/plugins/presentation_util/common/labs.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, { "parentPluginId": "presentationUtil", "id": "def-common.projects.BY_VALUE_EMBEDDABLE", diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 59044c427b483..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-25 +date: 2024-03-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.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 | |-------------------|-----------|------------------------|-----------------| -| 220 | 2 | 165 | 11 | +| 212 | 2 | 157 | 11 | ## Client diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index effb23bae13e5..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-25 +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 cca1278fdc5e6..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-25 +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 a504753be1aec..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-25 +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 9084b2d906233..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-25 +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 6aad388442b3e..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-25 +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 11fd304c5add4..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-25 +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 53d3b6f826d5e..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-25 +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 44b2bf262255e..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-25 +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 897bb09972ba4..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-25 +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 548af35695e72..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-25 +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 6279a4fd9d063..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-25 +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 5150c019709e0..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-25 +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 ddad3e784d2b6..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-25 +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 4bca6257ed2aa..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-25 +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 a18b89e5e76e3..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-25 +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 23be952d2a03e..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-25 +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 58909c87cf943..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-25 +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 ae23e6568aaab..c9983973a0249 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -114,7 +114,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/plugin.tsx", "deprecated": false, @@ -568,7 +568,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantModelEvaluation\" | \"assistantStreamingEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | undefined" + "\"assistantModelEvaluation\" | \"assistantStreamingEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -648,7 +648,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantModelEvaluation\" | \"assistantStreamingEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | undefined" + "\"assistantModelEvaluation\" | \"assistantStreamingEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -2004,7 +2004,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3123,7 +3123,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3299,7 +3299,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -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 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 12683bd7b245a..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-25 +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 75d3bc269cf25..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-25 +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 954c5d41443d0..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-25 +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 9336033eeb071..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-25 +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 5f00b91f3578f..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-25 +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 1f2498db55b3c..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-25 +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 0f9cd586809bb..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-25 +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 4a711f03e88ec..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-25 +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 0e8710290ad5e..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-25 +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 569e36fb0a8be..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-25 +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 10f9630ee21d8..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-25 +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 7ae3497c5bfaf..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-25 +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 b5d48aece2c72..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-25 +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 8a0c13a04a2fb..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-25 +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 1a3930a573f6b..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-25 +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 85735b6f76910..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-25 +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 5845671f08a5f..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-25 +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 8e1565c74e481..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-25 +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 e5f8ed85fe2d1..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-25 +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 6272d088f21dd..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-25 +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 784e4760b4b74..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-25 +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 fd5e09b8b939b..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-25 +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 3a19d67e12571..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-25 +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 a82297a56a1d6..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-25 +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 901e0f5f633ca..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-25 +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 11a3cf8f27408..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-25 +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 023e12565f401..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-25 +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 93405877f1062..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-25 +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 beef0fbb33ca9..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-25 +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 ca94d87571321..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-25 +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 964fda24ad6bd..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-25 +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 32d77e05cec93..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-25 +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 d47a0fc54fa0e..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-25 +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 ddb8f326fc0c3..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-25 +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 d8d55f43ca750..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-25 +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 305239b5b6a05..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-25 +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 82944b3973164..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-25 +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 15e4ae2a83001..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-25 +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 16b23c3b66f64..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-25 +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 679c3cf1e71ed..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-25 +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 36539451ae292..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-25 +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 a14d94f4c65f9..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-25 +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 7d4d0ddb60d32..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-25 +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 473aff51b6b1f..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-25 +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/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 0b241f0e79282..472ad01dc9ce1 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -753,6 +753,10 @@ Elastic. It uses Chromium and Puppeteer underneath to run the browser in headless mode. +|{kib-repo}blob/{branch}/x-pack/plugins/search_connectors/README.mdx[searchConnectors] +|This plugin contains common assets and endpoints for the use of connectors in Kibana. Primarily used by the enterprise_search and serverless_search plugins. + + |{kib-repo}blob/{branch}/x-pack/plugins/search_playground/README.md[searchPlayground] |The Search Playground is a tool for developers to experiment with their own data using LLMs. diff --git a/docs/fleet/fleet.asciidoc b/docs/fleet/fleet.asciidoc index b0b4f5ea9cf91..dfee4c36171dc 100644 --- a/docs/fleet/fleet.asciidoc +++ b/docs/fleet/fleet.asciidoc @@ -18,6 +18,27 @@ It is recommended for advanced users only. [role="screenshot"] image::fleet/images/fleet-start.png[{fleet} app in {kib}] +Most integration content installed by {fleet} isn’t editable. This content is tagged with a **Managed** badge in the {kib} UI. Managed content itself cannot be edited or deleted, however managed visualizations, dashboards, and saved searches can be cloned. + +[role="screenshot"] +image::fleet/images/system-managed.png[An image of the new managed badge.] + +When a managed dashboard is cloned, any linked or referenced panels become part of the clone without relying on external sources. The panels are integrated into the cloned dashboard as stand alone components. For example, with a cloned dashboard, the cloned panels become entirely self-contained copy without any dependencies on the original configuration. Clones can be customized and modified without accidentally affecting the original. + +NOTE: The cloned managed content retains the managed badge, but is independent from the original. + +You can make a complete clone of a whole managed dashboard. If you clone a panel within a managed dashboard, you're prompted to save the changes as a new dashboard, which is unlinked from the original managed content. + +To clone a dashboard: + +. Open the main menu (≡) and click *Dashboards*. +. Click on the name of the managed dashboard to view the dashboard. +. Click *Clone* in the toolbar. +. Click *Save and return* after editing the dashboard. +. Click *Save*. + +To clone managed content relating to specific visualization editors, such as Lens, TSVB, and Maps, view the visualization in the editor then begin to make edits. Unlike cloning dashboards, and dashboard panels, the cloned content retains the original configurations. Once finished you are prompted to save the edits as a new visualization. The same applies for altering any saved searches in a managed visualization. + [float] == Get started diff --git a/docs/fleet/images/system-managed.png b/docs/fleet/images/system-managed.png new file mode 100644 index 0000000000000..7786d958e9eaf Binary files /dev/null and b/docs/fleet/images/system-managed.png differ diff --git a/docs/user/images/alert-delay.png b/docs/user/images/alert-delay.png new file mode 100644 index 0000000000000..6a752f279fd8a Binary files /dev/null and b/docs/user/images/alert-delay.png differ diff --git a/docs/user/images/auto-interval-1.png b/docs/user/images/auto-interval-1.png new file mode 100644 index 0000000000000..22727ace8df8c Binary files /dev/null and b/docs/user/images/auto-interval-1.png differ diff --git a/docs/user/images/auto-interval.png b/docs/user/images/auto-interval.png new file mode 100644 index 0000000000000..c9ec3056b77ce Binary files /dev/null and b/docs/user/images/auto-interval.png differ diff --git a/docs/user/images/cancel-button.png b/docs/user/images/cancel-button.png new file mode 100644 index 0000000000000..484a5c751f597 Binary files /dev/null and b/docs/user/images/cancel-button.png differ diff --git a/docs/user/images/color-mapping-1.png b/docs/user/images/color-mapping-1.png new file mode 100644 index 0000000000000..9eacda753b016 Binary files /dev/null and b/docs/user/images/color-mapping-1.png differ diff --git a/docs/user/images/color-mapping-enhanced.png b/docs/user/images/color-mapping-enhanced.png new file mode 100644 index 0000000000000..a95671432185e Binary files /dev/null and b/docs/user/images/color-mapping-enhanced.png differ diff --git a/docs/user/images/controls-config.png b/docs/user/images/controls-config.png new file mode 100644 index 0000000000000..a0f50c6275b98 Binary files /dev/null and b/docs/user/images/controls-config.png differ diff --git a/docs/user/images/controls-edit.png b/docs/user/images/controls-edit.png new file mode 100644 index 0000000000000..eceb750ec98b9 Binary files /dev/null and b/docs/user/images/controls-edit.png differ diff --git a/docs/user/images/data-visualizer.png b/docs/user/images/data-visualizer.png new file mode 100644 index 0000000000000..a7c5a8388403a Binary files /dev/null and b/docs/user/images/data-visualizer.png differ diff --git a/docs/user/images/embed-detection.png b/docs/user/images/embed-detection.png new file mode 100644 index 0000000000000..82a8949908d8a Binary files /dev/null and b/docs/user/images/embed-detection.png differ diff --git a/docs/user/images/empty-fields-results.png b/docs/user/images/empty-fields-results.png new file mode 100644 index 0000000000000..134aa16fb6d7d Binary files /dev/null and b/docs/user/images/empty-fields-results.png differ diff --git a/docs/user/images/empty-fields.png b/docs/user/images/empty-fields.png new file mode 100644 index 0000000000000..aa85384777e2e Binary files /dev/null and b/docs/user/images/empty-fields.png differ diff --git a/docs/user/images/esql-charts-1.png b/docs/user/images/esql-charts-1.png new file mode 100644 index 0000000000000..ef8d36162d773 Binary files /dev/null and b/docs/user/images/esql-charts-1.png differ diff --git a/docs/user/images/esql-maps-example.png b/docs/user/images/esql-maps-example.png new file mode 100644 index 0000000000000..9bad2c2c33e09 Binary files /dev/null and b/docs/user/images/esql-maps-example.png differ diff --git a/docs/user/images/esql-maps.png b/docs/user/images/esql-maps.png new file mode 100644 index 0000000000000..55ca8f57e0e1a Binary files /dev/null and b/docs/user/images/esql-maps.png differ diff --git a/docs/user/images/esql-validation.png b/docs/user/images/esql-validation.png new file mode 100644 index 0000000000000..2e9581c12ca0f Binary files /dev/null and b/docs/user/images/esql-validation.png differ diff --git a/docs/user/images/grok-highlighting.png b/docs/user/images/grok-highlighting.png new file mode 100644 index 0000000000000..5663359f38aa8 Binary files /dev/null and b/docs/user/images/grok-highlighting.png differ diff --git a/docs/user/images/set-up-improvements.png b/docs/user/images/set-up-improvements.png new file mode 100644 index 0000000000000..d9617474a407b Binary files /dev/null and b/docs/user/images/set-up-improvements.png differ diff --git a/docs/user/images/single-metric-viewer.png b/docs/user/images/single-metric-viewer.png new file mode 100644 index 0000000000000..26adf8b3ec508 Binary files /dev/null and b/docs/user/images/single-metric-viewer.png differ diff --git a/docs/user/images/slack-api.png b/docs/user/images/slack-api.png new file mode 100644 index 0000000000000..1cc9f84cb80d6 Binary files /dev/null and b/docs/user/images/slack-api.png differ diff --git a/docs/user/images/slack-block.png b/docs/user/images/slack-block.png new file mode 100644 index 0000000000000..1ed77cd6d1aee Binary files /dev/null and b/docs/user/images/slack-block.png differ diff --git a/docs/user/images/usability-1.png b/docs/user/images/usability-1.png new file mode 100644 index 0000000000000..a9f0b7a79f52b Binary files /dev/null and b/docs/user/images/usability-1.png differ diff --git a/docs/user/images/usability.png b/docs/user/images/usability.png new file mode 100644 index 0000000000000..c23b301ca7779 Binary files /dev/null and b/docs/user/images/usability.png differ diff --git a/docs/user/whats-new.asciidoc b/docs/user/whats-new.asciidoc index 96fd0cb22662a..4fd8c24d9982a 100644 --- a/docs/user/whats-new.asciidoc +++ b/docs/user/whats-new.asciidoc @@ -1,157 +1,253 @@ [[whats-new]] -== What's new in {minor-version} +== What's new in 8.13 -Here are the highlights of what's new and improved in {minor-version}. +Here are the highlights of what's new and improved in 8.13. For detailed information about this release, check the <>. -Previous versions: {kibana-ref-all}/8.11/whats-new.html[8.11] | {kibana-ref-all}/8.10/whats-new.html[8.10] | {kibana-ref-all}/8.9/whats-new.html[8.9] | {kibana-ref-all}/8.8/whats-new.html[8.8] | {kibana-ref-all}/8.7/whats-new.html[8.7] | {kibana-ref-all}/8.6/whats-new.html[8.6] | {kibana-ref-all}/8.5/whats-new.html[8.5] | {kibana-ref-all}/8.4/whats-new.html[8.4] | {kibana-ref-all}/8.3/whats-new.html[8.3] | {kibana-ref-all}/8.2/whats-new.html[8.2] +Previous versions: {kibana-ref-all}/8.12/whats-new.html[8.12] | {kibana-ref-all}/8.11/whats-new.html[8.11] | {kibana-ref-all}/8.10/whats-new.html[8.10] | {kibana-ref-all}/8.9/whats-new.html[8.9] | {kibana-ref-all}/8.8/whats-new.html[8.8] | {kibana-ref-all}/8.7/whats-new.html[8.7] | {kibana-ref-all}/8.6/whats-new.html[8.6] | {kibana-ref-all}/8.5/whats-new.html[8.5] | {kibana-ref-all}/8.4/whats-new.html[8.4] | {kibana-ref-all}/8.3/whats-new.html[8.3] | {kibana-ref-all}/8.2/whats-new.html[8.2] | {kibana-ref-all}/8.1/whats-new.html[8.1] | {kibana-ref-all}/8.0/whats-new.html[8.0] +[discrete] +=== Discover [discrete] -=== Dashboard +==== Empty fields improvements in Discover, Lens & ES|QL + +Navigating through extensive data can often lead users to encounter numerous *Empty fields* within their field lists, making it challenging to identify and access valuable data efficiently. To address this issue, we’ve focused our efforts on enhancing the *Empty fields* category. Our solution simplifies the process of finding and accessing fields that contain meaningful data, ensuring a more streamlined and productive data exploration experience for our users. + +In some cases this can have a huge impact on field lists that target indices with many fields, such as in the below example where the field list was reduced from 5,492 fields down to only 238. + +[role="screenshot"] +image::images/empty-fields.png[An image of the available fields before the improvements.] + +[role="screenshot"] +image::images/empty-fields-results.png[An image of the improvements to the available fields.] [discrete] -==== Edit {esql} in a dashboard +==== Discover enhancements -We are introducing editing of an {esql} query on a dashboard and allows the users to select among different chart suggestions. This is quite powerful since users don't need to go back to Discover to edit the query and recreate the chart, they can simply adjust the query right there on a dashboard. +Improving the experience in Discover when users are exploring their data helps them find insights quickly. In 8.13 we added the *Auto Interval* to the Histogram, which allows users to quickly select a *Time Interval*. We also enhanced the UI by moving the count of documents to the table and new panel toggle buttons for toggling fields sidebar and histogram. [role="screenshot"] -image::images/edit-esql-dashboard.gif[A short video demo of how to edit {esql} in a dashboard] +image::images/auto-interval.png[An image of the new auto interval option, width=60%] + +[role="screenshot"] +image::images/auto-interval-1.png[An image of the auto option.] [discrete] -==== Improved ES|QL in-app documentation search -Many users open the {esql} editor’s documentation popover to familiarize themselves with the commands and find examples. Our search input was searching only on the titles of the commands/functions and not the description of each. As a result users were failing to find what they wanted. For example, if they searched for IP then CIDR_MATCH would not appear, but only TO_IP. This change helps users learn {esql} faster by improving the search. +==== Cancellation of the {esql} long-running query + +You can now cancel a long-running {esql} query from the UI. [role="screenshot"] -image::images/esql-in-app.png[A screenshot of the {esql} in app documentation] +image::images/cancel-button.png[] + [discrete] -==== Improved error messages for {ccs} -Customers querying data from multiple clusters link:{ref}/modules-cross-cluster-search.html[({ccs-init} queries)] will get more information on why their search failed for each of the visualizations in a dashboard as well as in the Discover application. +==== Better validation and autocomplete when writing ES|QL queries + +Autocomplete and validation are important tools to ensure the user’s ES|QL is correct and can be executed without errors. With these improvements, we are speeding up their workflow and increasing the quality of the improvements. [role="screenshot"] -image::images/improved-errors.png[A screenshot of an improved error message, width=50%] +image::images/esql-validation.png[An image of {esql} validation in action.] [discrete] -=== Discover +==== Color all terms in new color mapping + +In our latest update, based on early feedback, we've enhanced the user experience with our new color mapping feature introducing a more intuitive default option. Now users can either assign a single color or enable color looping for unassigned terms, providing greater flexibility and a cleaner interface for term assignments. Additionally we've eliminated the maximum limit on assignments, allowing for more comprehensive customization. It's important to note that looping colors or using more than 10 colors can be effective in certain scenarios. However, we recommend limiting the number of colors used to prevent potential misinterpretation of your charts. This update aims to make color mapping more user-friendly and adaptable to your needs. + +[role="screenshot"] +image::images/color-mapping-enhanced.png[An image of the color mapping feature applied to a vertical bar chart.] + +[role="screenshot"] +image::images/color-mapping-1.png[An image of the color palette options, width=60%] [discrete] -==== Improved long field names handling in {kib} -Long field names are very normal in Observability and Security datasets. That’s why we adapted multiple elements in Discover, Dashboards, Maps, and Lens such as field selectors, table headers, filter pills, and chart tooltips amongst others to handle long field names. For example, you will notice it when you select a field to set some filters or when you mouse over a chart. +==== Visualizing an {esql} query in Observability AI assistant + +The {observability} AI assistant in 8.13 comes with great improvements in query generation and performance. Users can now visualize the generated {esql} queries, edit them using the inline editing flyout, and embed them in a dashboard. [role="screenshot"] -image::images/long-field-names.png[A screenshot of the improved long field name handling in {kib}] +image::https://images.contentstack.io/v3/assets/bltefdd0b53724fa2ce/bltd6737b8e5633e948/viz-esql.gif[A gif of an {esql} query in the AI assistant.] [discrete] -==== Improved search for field names by handling spaces like wildcards -To improve data exploration, we improved the search within the field list by allowing users to do a more flexible search in the fields sidebar with terms containing spaces. +==== Cross-cluster search support in {esql} and in {kib} + +Cross-cluster searches are now supported in {esql} and in {kib} the feature has been introduced for both validation and autocomplete. The autocomplete feature will show some documentation about the specific settings when navigating the suggestions. [role="screenshot"] -image::images/allow-spaces.png[A screenshot of the search within the field list allowing spaces, width=70%] +image::https://images.contentstack.io/v3/assets/bltefdd0b53724fa2ce/blt4b3db027b6c7951a/ccs-esql-queries.gif[A gif of an {esql} cross cluster query.] [discrete] -=== Machine Learning +==== Quick fix to help users write {esql} + +Quick fix helps users when they have misspelled a field, index, or policy name (maybe pasting a query from somewhere else) in {esql} mode. + +[role="screenshot"] +image::https://images.contentstack.io/v3/assets/bltefdd0b53724fa2ce/blt463edc257418dd71/esql-quickfix[A gif showing the quick fix feature in action.] [discrete] -==== Unified inference API now integrates OpenAI and HuggingFace -In 8.11 we introduced a unified inference API that abstracts away the complexity of performing inference on different models for different tasks. +==== Create {esql} charts directly from a dashboard -We released an MVP iteration of this framework in technical preview which initially supported ELSER in an Elastic deployment and we hinted that in future releases, the inference API will support both internal and external models and will integrate with the LLM ecosystem. +Now you can create {esql} charts directly from a dashboard, without the need to go through Discover. Previously, to add a chart to your dashboard, you had to first create it in Discover using {esql} and then save it to the dashboard. This update streamlines the process, allowing you to instantly add {esql} charts right from your dashboard! -And so in 8.12 Elastic’s Inference API is extended to integrate with external models to perform AI search inference using: +[role="screenshot"] +image::images/esql-charts-1.png[] -* OpenAI embeddings -* HuggingFace embeddings and -* ELSER on HuggingFace +[role="screenshot"] +image::https://images.contentstack.io/v3/assets/bltefdd0b53724fa2ce/blt517f402fdeddd49f/ESQLcharts.gif[A gif of editing an {esql} query in the dashboard.] -AI search with embeddings achieves superior contextual relevance and captures user intent. Inference using these new capabilities involves external calls to the corresponding endpoints on OpenAI and HuggingFace. The power of the inference API lies in its simple, unified syntax that abstracts away the underlying complexity of using different internal and external models for different tasks. +[discrete] +==== {esql} in Maps -Performing inference on the newly supported models and services is as simple as a call with the simple syntax introduced in 8.11: +You can now create a new documents layer in map using our recently launched https://www.elastic.co/blog/esql-elasticsearch-piped-query-language[ElasticSearch Query Language (ES|QL)]. You can query your data directly from Elasticsearch and leverage the benefits that {esql} brings such as speed and flexible data transformations to your maps. -[source, bash] ----- -PUT /_inference// ----- +[role="screenshot"] +image::images/esql-maps.png[An image of the {esql} option for maps.] -Concretely, this is how this syntax shapes up for inference with OpenAI embeddings, showcasing the power of Elastic’s unified inference API: +[role="screenshot"] +image::images/esql-maps-example.png[An image of {esql} applied to a map.] -[source, bash] ----- -PUT _inference/text_embedding/openai_embeddings ----- -For a detailed example, see link:{ref}/semantic-search-inference.html[this tutorial]. Bear in mind that you will need an OpenAI account and the corresponding API key, as well as to choose the specific OpenAI embeddings that you want to use. +[discrete] +==== Controls configuration + +We added some improvements to controls for you to easily filter and interact with your dashboards. + +* You will be able to decide whether you want the global filters and time range to be applied to your controls narrowing down the available options or whether you prefer to display all possible values without considering them. You will find these options in the Controls settings. + +[role="screenshot"] +image::images/controls-config.png[An image of the filtering control settings.] + +* If you have numeric fields displayed as range slider controls in your dashboard, you will now be able to decide what is the step that you want to be displayed between your values. -HuggingFace enables access to many open source models while also providing granular control over how the models are deployed. Tailor the deployment environment to your needs by configuring the number of replicas and whether to run the model on a CPU or GPU. +[role="screenshot"] +image::images/controls-edit.png[An image of the range slider settings.] -We will continue enhancing Elastic’s inference API with more capabilities and support for more models and tasks for our users to have the most powerful AI effortlessly and seamlessly. +[discrete] +=== ResponseOps [discrete] -==== First-class support for E5 multilingual embeddings -ELSER is Elastic’s text expansion language model for AI search in English. It offers superior relevance out of the box, without the need for retraining on in-domain data. ELSER is the AI search model of choice for the English language. ELSER v2 is Generally Available as of 8.11. +==== Alert delay -For AI search in languages other than English, you can now use E5 multilingual embeddings straight from the Trained Models UI. Like ELSER, E5 has two versions: an Intel-optimized one and a cross-platform one (which runs on any hardware). The Model Management > Trained Models UI shows you which version of E5 is recommended to deploy based on your cluster’s hardware (also see the next section for the redesigned Trained Models UI). The supported model version of E5 is `multilingual-e5-small`. For more details, see our link:{ml-docs}/ml-nlp-e5.html[documentation]. Note that E5 is used under the MIT license. +In order to reduce noise for alerting rules with low sensitivity and ensure created alerts will be actionable and reasonable, we want to allow users to define how many rule runs should match before creating the alert. For example, "Generate the alert after 3 threshold matches in a row". + +[role="screenshot"] +image::images/alert-delay.png[] [discrete] -==== A redesigned trained models UI that brings together our AI search capabilities -In 8.12, we have redesigned the way you can add trained models to your deployment through the Trained Models UI for better guidance and usability. +==== Slack action message templating using Slack Block Kit + +By supporting the link:https://api.slack.com/reference/surfaces/formatting#rich-layouts[Slack Block Kit] with our {kibana-ref}/slack-action-type.html[Slack connector (Web API)], we unlock new message templates to allow users to enrich and format the messages that are sent to Slack channels. Read more about link:https://app.slack.com/block-kit-builder/T0CUZ52US#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22You%20have%20a%20new%20request:%5Cn*%3Cgoogle.com%7CFred%20Enriquez%20-%20Time%20Off%20request%3E*%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Type:*%5CnPaid%20time%20off%5Cn*When:*%5CnAug%2010-Aug%2013%5Cn*Hours:*%2016.0%20(2%20days)%5Cn*Remaining%20balance:*%2032.0%20hours%20(4%20days)%5Cn*Comments:*%20%5C%22Family%20in%20town,%20going%20camping!%5C%22%22%7D,%22accessory%22:%7B%22type%22:%22image%22,%22image_url%22:%22https://api.slack.com/img/blocks/bkb_template_images/approvalsNewDevice.png%22,%22alt_text%22:%22computer%20thumbnail%22%7D%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22emoji%22:true,%22text%22:%22Approve%22%7D,%22style%22:%22primary%22,%22value%22:%22click_me_123%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22emoji%22:true,%22text%22:%22Deny%22%7D,%22style%22:%22danger%22,%22value%22:%22click_me_123%22%7D%5D%7D%5D%7D[templates options with Slack Block Kit]. -The flyout to add a trained model includes a tab for ELSER and E5 which can be deployed with one click. The UI also guides you as to the recommended version of each model (Intel-optimized or cross-platform), depending on your underlying hardware. A second tab guides you through deploying any other model on Elastic using the Eland Python client. +[role="screenshot"] +image::images/slack-api.png[An image of the Slack web api connector, width =60%] [role="screenshot"] -image::images/trained-models-ui.png[A screenshot of the redesigned trained models UI] +image::images/slack-block.png[An image of the block kit builder.] + +[discrete] +=== Machine Learning [discrete] -==== AIOps: Log Rate Analysis is GA -Log Rate Analysis helps you investigate significant increases or decreases of your log rates fast and easy. It helps you identify the reasons behind these changes. Just click on a spike or dip and it will show you the fields (or combinations of fields) that contribute to these changes and, if it helps, continue your investigation by inspecting your selected field in Discover. We consistently enhanced Log Rate Analysis during the past few releases to support both spikes and dips analysis, support for text fields by leveraging Log Pattern Analysis, integration with Discover and more. In 8.12 we added the ability to easily create a categorization anomaly detection job from the pattern analysis flyout in Discover and importantly Log Rate Analysis becomes GA. +==== Unified inference API now integrates Cohere embeddings + +We continue enhancing Elastic's unified inference API which supports both internal and external models for seamless easy integration with the LLM ecosystem. + +In 8.13 we add support for Cohere embeddings. This enhances our offering which supports OpenAI and HuggingFace embeddings since 8.12. + +The power of the inference API lies in its simple, unified syntax that abstracts away the underlying complexity of using different internal and external models. + +So, in 8.13 we also added support for inference against the E5 multilingual embeddings that were offered through the Trained Models UI since 8.12. + +As a reminder, performing inference on the newly supported models and services is as simple as a call with the simple syntax introduced in 8.11: + +[source,bash] +---- +PUT /_inference// +---- + +To start using Cohere embeddings with your Elastic deployment using the new inference API, https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search-inference.html[please see this tutorial]. This functionality is in Technical Preview in 8.13. [discrete] -==== Alerts in Anomaly Explorer -In 8.12 we have enhanced the Anomaly Explorer UI to include insights about alerts generated by rules that use your anomaly detection jobs. +==== {esql} support in the Data Visualizer + +preview:[] The Data Visualizer now supports {esql}, Elastic’s new piped query language that simplifies data investigation. Run your {esql} queries in the Data Visualizer to easily explore your datasets. Choose to explore and apply your query to the entire dataset or a subset of it for speed. In 8.13 this functionality is in Technical Preview and supports keyword, text, numeric, boolean, date, and ip fields. [role="screenshot"] -image::images/alerts-anomaly.png[A screenshot of the anomaly explorer UI] +image::images/data-visualizer.png[An image of the new Data Visualizer for {esql}.] -These insights include: +[discrete] +==== Embed Anomaly Detection Single Metric Viewer in Dashboards -* a line chart of the alerts count and their correlation with the anomalies detected, -* an alert context menu when an anomaly swimlane cell is selected, -* a summary section including the alert duration, start and recovery time and more information and a -* Details tab from which the user can select to open an alert’s detail page and attach an alert to a new or existing case. +You can now easily add single metric anomaly detection charts to dashboards. Under the *Add panel* option in Dashboard’s edit mode, select Machine Learning and then the *Single metric viewer* option from the menu. [role="screenshot"] -image::images/alerts.png[A screenshot of details of the alerts] +image::images/embed-detection.png[An image of the single metric viewer.] [discrete] -=== ResponseOps +==== AIOps: Usability enhancements + +We have enhanced Pattern Analysis in AIOps so that you can expand a row and see the tokens, the regex and a few examples that give you a better sense of the pattern. In addition the syntax highlighting (font color) reflects the detected pattern. When you choose to filter a pattern in Discover’s main view, the highlighting is now consistent between the Pattern Analysis feature and Discover. + +[role="screenshot"] +image::images/usability.png[An image of expanded rows.] + +You can now run Log Rate Analysis from the Anomaly Explorer and the Single Metric Viewer. Click on the *Actions* cog and select *Run log rate analysis* from the menu. You will be directed to the Log Rate analysis UI in Machine Learning. + +[role="screenshot"] +image::images/usability-1.png[An image of the actions menu with an arrow to run log rate analysis.] + +From 8.13, you can achieve the same from the anomaly markers in the Single Metric Viewer. Click on them and the actions menu will appear. + +[role="screenshot"] +image::images/single-metric-viewer.png[An image of the single metric viewer.] [discrete] -==== Maintenance window filters +==== Grok highlighting in the File Data Visualizer -In 8.12 you can add KQL filters to your <> to further refine their scope: +Uploading a file through the File Data Visualizer will display the first 5 lines with inline highlighting. Hovering the mouse over displays a tooltip with the field name and type. [role="screenshot"] -image::images/maintenance-window-filter.png[A screenshot of the create maintenance window UI] +image::images/grok-highlighting.png[An image of grok highlighting.] [discrete] -==== Case improvements -The enhanced case view is now supported by any field filter and any change to the view is saved to local cache to ensure your data won't be lost. +=== Security + +[discrete] +==== UI improvements for managing API keys + +We’ve made some improvements to the API keys management page. Going forward, you can now easily sort columns in the API keys table, making it easier for you to navigate through API keys, especially when volume is high. + +We’ve also made the API key name a required field. This reduces previous bugs on this page that resulted in errors or inconsistent API key names being displayed. + +[discrete] +=== Global Experience + +[discrete] +==== Discover using {esql} without data views + +You can now utilize {esql} without creating a data view. To expand, if you have ingested data but have not created a data view, when you navigate to *Discover* you will see a screen prompting you to create a data view, as before. Now an option is available on that screen to *Try ES|QL*. + +[discrete] +==== Improved UX for Setup Guides + +The setup guides you see in Kibana are now organized by solution, making it much easier to find the guide you’re looking for. Additionally, a new card was added to *Connect to the Elasticsearch API* so users with API use cases don’t have to dig through the navigation and documentation to find the connection info. [role="screenshot"] -image::images/cases.png[A screenshot of the enhanced case view] +image::images/set-up-improvements.png[A screenshot of the home page cards.] -There is also a new {kib} <> that enables you to customize access to case settings. +[discrete] +==== Live chat available from the Elastic Cloud console -If you <> to cases, there is a new option to copy the file hash to your clipboard. -File hashes are crucial for incident investigation and for verification of file integrity. -The supported hash functions for case files are MD5, SHA-1, and SHA-256. +You will now find live chat functionality available in the top right corner in the Elastic Cloud console, completing seamlessly availability from all locations within both Elastic Cloud and Kibana experiences. [discrete] -==== Connector improvements +==== Faster deployment creation times + +In particular regions, deployment of a new cluster is nearly instantaneous, saving you about 3-5 minutes of waiting time to get started. The number of regions that provide this performance boost has increased by 5x as we strive to make this the standard experience. + -PagerDuty alert action is now supported by 2 new fields `links` and `custom_details`. -ServiceNow ITSM alert action allows users to define incident resolution when alert is recovered to ensure bi-directional sync between the Elastic Alerts and ServiceNow Incidents. diff --git a/examples/embeddable_examples/public/plugin.ts b/examples/embeddable_examples/public/plugin.ts index 7f2a5b6a26152..e3916b8b409cb 100644 --- a/examples/embeddable_examples/public/plugin.ts +++ b/examples/embeddable_examples/public/plugin.ts @@ -7,7 +7,11 @@ */ import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; -import { EmbeddableSetup, EmbeddableStart } from '@kbn/embeddable-plugin/public'; +import { + EmbeddableSetup, + EmbeddableStart, + registerReactEmbeddableFactory, +} from '@kbn/embeddable-plugin/public'; import { Plugin, CoreSetup, CoreStart } from '@kbn/core/public'; import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; @@ -35,12 +39,12 @@ import { FilterDebuggerEmbeddableFactory, FilterDebuggerEmbeddableFactoryDefinition, } from './filter_debugger'; -import { registerMarkdownEditorEmbeddable } from './react_embeddables/eui_markdown/eui_markdown_react_embeddable'; import { registerCreateEuiMarkdownAction } from './react_embeddables/eui_markdown/create_eui_markdown_action'; -import { registerFieldListFactory } from './react_embeddables/field_list/field_list_react_embeddable'; import { registerCreateFieldListAction } from './react_embeddables/field_list/create_field_list_action'; -import { registerSearchEmbeddableFactory } from './react_embeddables/search/register_search_embeddable_factory'; import { registerAddSearchPanelAction } from './react_embeddables/search/register_add_search_panel_action'; +import { EUI_MARKDOWN_ID } from './react_embeddables/eui_markdown/constants'; +import { FIELD_LIST_ID } from './react_embeddables/field_list/constants'; +import { SEARCH_EMBEDDABLE_ID } from './react_embeddables/search/constants'; export interface EmbeddableExamplesSetupDependencies { embeddable: EmbeddableSetup; @@ -114,17 +118,29 @@ export class EmbeddableExamplesPlugin core: CoreStart, deps: EmbeddableExamplesStartDependencies ): EmbeddableExamplesStart { - registerFieldListFactory(core, deps); registerCreateFieldListAction(deps.uiActions); + registerReactEmbeddableFactory(FIELD_LIST_ID, async () => { + const { getFieldListFactory } = await import( + './react_embeddables/field_list/field_list_react_embeddable' + ); + return getFieldListFactory(core, deps); + }); - registerMarkdownEditorEmbeddable(); registerCreateEuiMarkdownAction(deps.uiActions); - - registerSearchEmbeddableFactory({ - data: deps.data, - dataViews: deps.dataViews, + registerReactEmbeddableFactory(EUI_MARKDOWN_ID, async () => { + const { markdownEmbeddableFactory } = await import( + './react_embeddables/eui_markdown/eui_markdown_react_embeddable' + ); + return markdownEmbeddableFactory; }); + registerAddSearchPanelAction(deps.uiActions); + registerReactEmbeddableFactory(SEARCH_EMBEDDABLE_ID, async () => { + const { getSearchEmbeddableFactory } = await import( + './react_embeddables/search/search_react_embeddable' + ); + return getSearchEmbeddableFactory(deps); + }); return { createSampleData: async () => {}, diff --git a/examples/embeddable_examples/public/react_embeddables/eui_markdown/eui_markdown_react_embeddable.tsx b/examples/embeddable_examples/public/react_embeddables/eui_markdown/eui_markdown_react_embeddable.tsx index e7f4cc5daedfd..3a79952e16223 100644 --- a/examples/embeddable_examples/public/react_embeddables/eui_markdown/eui_markdown_react_embeddable.tsx +++ b/examples/embeddable_examples/public/react_embeddables/eui_markdown/eui_markdown_react_embeddable.tsx @@ -8,10 +8,7 @@ import { EuiMarkdownEditor, EuiMarkdownFormat } from '@elastic/eui'; import { css } from '@emotion/react'; -import { - ReactEmbeddableFactory, - registerReactEmbeddableFactory, -} from '@kbn/embeddable-plugin/public'; +import { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; import { i18n } from '@kbn/i18n'; import { initializeTitles, @@ -24,7 +21,7 @@ import { BehaviorSubject } from 'rxjs'; import { EUI_MARKDOWN_ID } from './constants'; import { MarkdownEditorSerializedState, MarkdownEditorApi } from './types'; -const markdownEmbeddableFactory: ReactEmbeddableFactory< +export const markdownEmbeddableFactory: ReactEmbeddableFactory< MarkdownEditorSerializedState, MarkdownEditorApi > = { @@ -108,11 +105,3 @@ const markdownEmbeddableFactory: ReactEmbeddableFactory< }; }, }; - -/** - * Register the defined Embeddable Factory - notice that this isn't defined - * on the plugin. Instead, it's a simple imported function. I.E to register an - * embeddable, you only need the embeddable plugin in your requiredBundles - */ -export const registerMarkdownEditorEmbeddable = () => - registerReactEmbeddableFactory(markdownEmbeddableFactory); diff --git a/examples/embeddable_examples/public/react_embeddables/field_list/field_list_react_embeddable.tsx b/examples/embeddable_examples/public/react_embeddables/field_list/field_list_react_embeddable.tsx index 8f7a4955e301b..f17cabf8c6440 100644 --- a/examples/embeddable_examples/public/react_embeddables/field_list/field_list_react_embeddable.tsx +++ b/examples/embeddable_examples/public/react_embeddables/field_list/field_list_react_embeddable.tsx @@ -17,10 +17,7 @@ import { DataViewsPublicPluginStart, DATA_VIEW_SAVED_OBJECT_TYPE, } from '@kbn/data-views-plugin/public'; -import { - ReactEmbeddableFactory, - registerReactEmbeddableFactory, -} from '@kbn/embeddable-plugin/public'; +import { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import { i18n } from '@kbn/i18n'; import { initializeTitles, useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; @@ -49,7 +46,7 @@ const getCreationOptions: UnifiedFieldListSidebarContainerProps['getCreationOpti }; }; -export const registerFieldListFactory = ( +export const getFieldListFactory = ( core: CoreStart, { dataViews, @@ -224,6 +221,5 @@ export const registerFieldListFactory = ( }; }, }; - - registerReactEmbeddableFactory(fieldListEmbeddableFactory); + return fieldListEmbeddableFactory; }; diff --git a/examples/embeddable_examples/public/react_embeddables/search/build_search_embeddable.tsx b/examples/embeddable_examples/public/react_embeddables/search/build_search_embeddable.tsx deleted file mode 100644 index 2fe28c6e878fb..0000000000000 --- a/examples/embeddable_examples/public/react_embeddables/search/build_search_embeddable.tsx +++ /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 React, { useEffect, useState } from 'react'; -import fastIsEqual from 'fast-deep-equal'; -import { EuiCallOut } from '@elastic/eui'; -import { BehaviorSubject } from 'rxjs'; -import { TimeRange } from '@kbn/es-query'; -import type { DataView } from '@kbn/data-plugin/common'; -import { StateComparators, useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; -import { ReactEmbeddableApiRegistration } from '@kbn/embeddable-plugin/public/react_embeddable_system/types'; -import { Api, State, Services } from './types'; -import { getCount } from './get_count'; - -export const buildSearchEmbeddable = async ( - state: State, - buildApi: ( - apiRegistration: ReactEmbeddableApiRegistration, - comparators: StateComparators - ) => Api, - services: Services -) => { - const defaultDataView = await services.dataViews.getDefaultDataView(); - const timeRange$ = new BehaviorSubject(state.timeRange); - const dataViews$ = new BehaviorSubject( - defaultDataView ? [defaultDataView] : undefined - ); - const dataLoading$ = new BehaviorSubject(false); - function setTimeRange(nextTimeRange: TimeRange | undefined) { - timeRange$.next(nextTimeRange); - } - - const api = buildApi( - { - dataViews: dataViews$, - timeRange$, - setTimeRange, - dataLoading: dataLoading$, - serializeState: () => { - return { - rawState: { - timeRange: timeRange$.value, - }, - references: [], - }; - }, - }, - { - timeRange: [timeRange$, setTimeRange, fastIsEqual], - } - ); - - const appliedTimeRange$ = new BehaviorSubject( - timeRange$.value ?? api.parentApi?.timeRange$?.value - ); - const subscriptions = api.timeRange$.subscribe((timeRange) => { - appliedTimeRange$.next(timeRange ?? api.parentApi?.timeRange$?.value); - }); - if (api.parentApi?.timeRange$) { - subscriptions.add( - api.parentApi?.timeRange$.subscribe((parentTimeRange) => { - if (timeRange$?.value) { - return; - } - appliedTimeRange$.next(parentTimeRange); - }) - ); - } - - return { - api, - Component: () => { - const [count, setCount] = useState(0); - const [error, setError] = useState(); - const [filters, query, appliedTimeRange] = useBatchedPublishingSubjects( - api.parentApi?.filters$, - api.parentApi?.query$, - appliedTimeRange$ - ); - - useEffect(() => { - return () => { - subscriptions.unsubscribe(); - }; - }, []); - - useEffect(() => { - let ignore = false; - setError(undefined); - if (!defaultDataView) { - return; - } - dataLoading$.next(true); - getCount(defaultDataView, services.data, filters ?? [], query, appliedTimeRange) - .then((nextCount: number) => { - if (ignore) { - return; - } - dataLoading$.next(false); - setCount(nextCount); - }) - .catch((err) => { - if (ignore) { - return; - } - dataLoading$.next(false); - setError(err); - }); - return () => { - ignore = true; - }; - }, [filters, query, appliedTimeRange]); - - if (!defaultDataView) { - return ( - -

Please install a sample data set to run example.

-
- ); - } - - if (error) { - return ( - -

{error.message}

-
- ); - } - - return ( -

- Found {count} from {defaultDataView.name} -

- ); - }, - }; -}; diff --git a/examples/embeddable_examples/public/react_embeddables/search/constants.ts b/examples/embeddable_examples/public/react_embeddables/search/constants.ts new file mode 100644 index 0000000000000..3ca6c976ef3c0 --- /dev/null +++ b/examples/embeddable_examples/public/react_embeddables/search/constants.ts @@ -0,0 +1,10 @@ +/* + * 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 SEARCH_EMBEDDABLE_ID = 'searchEmbeddableDemo'; +export const ADD_SEARCH_ACTION_ID = 'create_search_demo'; diff --git a/examples/embeddable_examples/public/react_embeddables/search/register_add_search_panel_action.tsx b/examples/embeddable_examples/public/react_embeddables/search/register_add_search_panel_action.tsx index d136a57fd7590..151fa07d77322 100644 --- a/examples/embeddable_examples/public/react_embeddables/search/register_add_search_panel_action.tsx +++ b/examples/embeddable_examples/public/react_embeddables/search/register_add_search_panel_action.tsx @@ -9,10 +9,11 @@ import { apiIsPresentationContainer } from '@kbn/presentation-containers'; import { EmbeddableApiContext } from '@kbn/presentation-publishing'; import { IncompatibleActionError, UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import { ADD_SEARCH_ACTION_ID, SEARCH_EMBEDDABLE_ID } from './constants'; export const registerAddSearchPanelAction = (uiActions: UiActionsStart) => { uiActions.registerAction({ - id: 'CREATE_SEARCH_REACT_EMBEDDABLE', + id: ADD_SEARCH_ACTION_ID, getDisplayName: () => 'Unified search example', getDisplayNameTooltip: () => 'Demonstrates how to use global filters, global time range, panel time range, and global query state in an embeddable', @@ -24,12 +25,12 @@ export const registerAddSearchPanelAction = (uiActions: UiActionsStart) => { if (!apiIsPresentationContainer(embeddable)) throw new IncompatibleActionError(); embeddable.addNewPanel( { - panelType: 'SEARCH_REACT_EMBEDDABLE', + panelType: SEARCH_EMBEDDABLE_ID, initialState: {}, }, true ); }, }); - uiActions.attachAction('ADD_PANEL_TRIGGER', 'CREATE_SEARCH_REACT_EMBEDDABLE'); + uiActions.attachAction('ADD_PANEL_TRIGGER', ADD_SEARCH_ACTION_ID); }; diff --git a/examples/embeddable_examples/public/react_embeddables/search/register_search_embeddable_factory.ts b/examples/embeddable_examples/public/react_embeddables/search/register_search_embeddable_factory.ts deleted file mode 100644 index a2b4bf7ac6282..0000000000000 --- a/examples/embeddable_examples/public/react_embeddables/search/register_search_embeddable_factory.ts +++ /dev/null @@ -1,28 +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 { - ReactEmbeddableFactory, - registerReactEmbeddableFactory, -} from '@kbn/embeddable-plugin/public'; -import { Api, Services, State } from './types'; - -export const registerSearchEmbeddableFactory = (services: Services) => { - const factory: ReactEmbeddableFactory = { - type: 'SEARCH_REACT_EMBEDDABLE', - deserializeState: (state) => { - return state.rawState as State; - }, - buildEmbeddable: async (state, buildApi) => { - const { buildSearchEmbeddable } = await import('./build_search_embeddable'); - return buildSearchEmbeddable(state, buildApi, services); - }, - }; - - registerReactEmbeddableFactory(factory); -}; diff --git a/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx b/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx new file mode 100644 index 0000000000000..e2b9fdea7bbf3 --- /dev/null +++ b/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx @@ -0,0 +1,128 @@ +/* + * 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 { EuiCallOut } from '@elastic/eui'; +import { DataView } from '@kbn/data-views-plugin/common'; +import { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; +import { initializeTimeRange, useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; +import React, { useEffect, useState } from 'react'; +import { BehaviorSubject } from 'rxjs'; +import { SEARCH_EMBEDDABLE_ID } from './constants'; +import { getCount } from './get_count'; +import { Api, Services, State } from './types'; + +export const getSearchEmbeddableFactory = (services: Services) => { + const factory: ReactEmbeddableFactory = { + type: SEARCH_EMBEDDABLE_ID, + deserializeState: (state) => { + return state.rawState as State; + }, + buildEmbeddable: async (state, buildApi, uuid, parentApi) => { + const { + appliedTimeRange$, + cleanupTimeRange, + serializeTimeRange, + timeRangeApi, + timeRangeComparators, + } = initializeTimeRange(state, parentApi); + const defaultDataView = await services.dataViews.getDefaultDataView(); + const dataViews$ = new BehaviorSubject( + defaultDataView ? [defaultDataView] : undefined + ); + const dataLoading$ = new BehaviorSubject(false); + + const api = buildApi( + { + ...timeRangeApi, + dataViews: dataViews$, + dataLoading: dataLoading$, + serializeState: () => { + return { + rawState: { + ...serializeTimeRange(), + }, + references: [], + }; + }, + }, + { + ...timeRangeComparators, + } + ); + + return { + api, + Component: () => { + const [count, setCount] = useState(0); + const [error, setError] = useState(); + const [filters, query, appliedTimeRange] = useBatchedPublishingSubjects( + api.parentApi?.filters$, + api.parentApi?.query$, + appliedTimeRange$ + ); + + useEffect(() => { + return () => { + cleanupTimeRange(); + }; + }, []); + + useEffect(() => { + let ignore = false; + setError(undefined); + if (!defaultDataView) { + return; + } + dataLoading$.next(true); + getCount(defaultDataView, services.data, filters ?? [], query, appliedTimeRange) + .then((nextCount: number) => { + if (ignore) { + return; + } + dataLoading$.next(false); + setCount(nextCount); + }) + .catch((err) => { + if (ignore) { + return; + } + dataLoading$.next(false); + setError(err); + }); + return () => { + ignore = true; + }; + }, [filters, query, appliedTimeRange]); + + if (!defaultDataView) { + return ( + +

Please install a sample data set to run example.

+
+ ); + } + + if (error) { + return ( + +

{error.message}

+
+ ); + } + + return ( +

+ Found {count} from {defaultDataView.name} +

+ ); + }, + }; + }, + }; + return factory; +}; 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 3db9941e2c39c..3bfdb8efd067a 100644 --- a/package.json +++ b/package.json @@ -101,12 +101,12 @@ "@dnd-kit/utilities": "^2.0.0", "@elastic/apm-rum": "^5.16.0", "@elastic/apm-rum-react": "^2.0.2", - "@elastic/charts": "64.0.0", + "@elastic/charts": "64.0.2", "@elastic/datemath": "5.0.3", "@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", @@ -686,6 +689,7 @@ "@kbn/screenshotting-plugin": "link:x-pack/plugins/screenshotting", "@kbn/search-api-panels": "link:packages/kbn-search-api-panels", "@kbn/search-connectors": "link:packages/kbn-search-connectors", + "@kbn/search-connectors-plugin": "link:x-pack/plugins/search_connectors", "@kbn/search-errors": "link:packages/kbn-search-errors", "@kbn/search-examples-plugin": "link:examples/search_examples", "@kbn/search-index-documents": "link:packages/kbn-search-index-documents", @@ -936,7 +940,6 @@ "blurhash": "^2.0.1", "brace": "0.11.1", "brok": "^5.0.2", - "buildkite-test-collector": "^1.6.5", "byte-size": "^8.1.0", "canvg": "^3.0.9", "cbor-x": "^1.3.3", @@ -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", @@ -1537,6 +1540,7 @@ "babel-plugin-transform-typescript-metadata": "^0.3.2", "backport": "^8.9.8", "blob-polyfill": "^7.0.20220408", + "buildkite-test-collector": "^1.7.0", "callsites": "^3.1.0", "chance": "1.0.18", "chromedriver": "^122.0.5", @@ -1621,6 +1625,7 @@ "minimist": "^1.2.6", "mocha": "^10.1.0", "mocha-junit-reporter": "^2.0.2", + "mocha-multi-reporters": "^1.5.1", "mochawesome": "^7.1.3", "mochawesome-merge": "^4.3.0", "mock-fs": "^5.1.2", diff --git a/packages/content-management/table_list_view_table/src/table_list_view_table.tsx b/packages/content-management/table_list_view_table/src/table_list_view_table.tsx index 762c6eaf68b21..00f28114f3da0 100644 --- a/packages/content-management/table_list_view_table/src/table_list_view_table.tsx +++ b/packages/content-management/table_list_view_table/src/table_list_view_table.tsx @@ -450,12 +450,6 @@ function TableListViewTableComp({ }), }, ...ret[item.id], - delete: { - enabled: false, - reason: i18n.translate('contentManagement.tableList.managedItemNoDelete', { - defaultMessage: 'Elastic manages this item. Deleting it is not possible.', - }), - }, }; } 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-apm-config-loader/src/config.test.ts b/packages/kbn-apm-config-loader/src/config.test.ts index caf3b800b444b..3d0bd98bec467 100644 --- a/packages/kbn-apm-config-loader/src/config.test.ts +++ b/packages/kbn-apm-config-loader/src/config.test.ts @@ -151,6 +151,7 @@ describe('ApmConfiguration', () => { delete process.env.ELASTIC_APM_ENVIRONMENT; delete process.env.ELASTIC_APM_SECRET_TOKEN; delete process.env.ELASTIC_APM_API_KEY; + delete process.env.ELASTIC_APM_KIBANA_FRONTEND_ACTIVE; delete process.env.ELASTIC_APM_SERVER_URL; delete process.env.ELASTIC_APM_GLOBAL_LABELS; delete process.env.NODE_ENV; @@ -202,6 +203,18 @@ describe('ApmConfiguration', () => { }); }); + it('ELASTIC_APM_KIBANA_FRONTEND_ACTIVE', () => { + process.env.ELASTIC_APM_KIBANA_FRONTEND_ACTIVE = 'false'; + const config = new ApmConfiguration(mockedRootDir, {}, false); + const serverConfig = config.getConfig('servicesOverrides'); + // @ts-ignore + expect(serverConfig.servicesOverrides).toEqual({ + 'kibana-frontend': { + active: false, + }, + }); + }); + it('does not override the environment from NODE_ENV if already set in the config file', () => { const kibanaConfig = { elastic: { diff --git a/packages/kbn-apm-config-loader/src/config.ts b/packages/kbn-apm-config-loader/src/config.ts index efe228be8157e..583dd8fc58b56 100644 --- a/packages/kbn-apm-config-loader/src/config.ts +++ b/packages/kbn-apm-config-loader/src/config.ts @@ -8,7 +8,7 @@ import { join } from 'path'; import deepmerge from 'deepmerge'; -import { merge } from 'lodash'; +import { merge, isEmpty } from 'lodash'; import { execSync } from 'child_process'; import { getDataPath } from '@kbn/utils'; import { readFileSync } from 'fs'; @@ -79,7 +79,8 @@ export class ApmConfiguration { } public getConfig(serviceName: string): AgentConfigOptions { - const { servicesOverrides = {} } = this.getConfigFromKibanaConfig(); + const kibanaConfig = this.getConfigFromKibanaConfig(); + const { servicesOverrides = {} } = merge(kibanaConfig, this.getConfigFromEnv(kibanaConfig)); let baseConfig = { ...this.getBaseConfig(), @@ -139,11 +140,20 @@ export class ApmConfiguration { */ private getConfigFromEnv(configFromKibanaConfig: AgentConfigOptions): AgentConfigOptions { const config: AgentConfigOptions = {}; + const servicesOverrides: Record = {}; if (process.env.ELASTIC_APM_ACTIVE === 'true') { config.active = true; } + if (process.env.ELASTIC_APM_KIBANA_FRONTEND_ACTIVE === 'false') { + merge(servicesOverrides, { + 'kibana-frontend': { + active: false, + }, + }); + } + if (process.env.ELASTIC_APM_CONTEXT_PROPAGATION_ONLY === 'true') { config.contextPropagationOnly = true; } else if (process.env.ELASTIC_APM_CONTEXT_PROPAGATION_ONLY === 'false') { @@ -186,6 +196,10 @@ export class ApmConfiguration { ); } + if (!isEmpty(servicesOverrides)) { + merge(config, { servicesOverrides }); + } + return config; } diff --git a/packages/kbn-chart-icons/index.ts b/packages/kbn-chart-icons/index.ts index f9f0a5ad8962d..b962185d70589 100644 --- a/packages/kbn-chart-icons/index.ts +++ b/packages/kbn-chart-icons/index.ts @@ -40,5 +40,8 @@ export { IconChartHeatmap, IconChartHorizontalBullet, IconChartVerticalBullet, + IconChartGaugeSemiCircle, + IconChartGaugeArc, + IconChartGaugeCircle, IconChartTagcloud, } from './src/assets'; diff --git a/packages/kbn-chart-icons/src/assets/chart_gauge_arc.tsx b/packages/kbn-chart-icons/src/assets/chart_gauge_arc.tsx new file mode 100644 index 0000000000000..a206e5c629407 --- /dev/null +++ b/packages/kbn-chart-icons/src/assets/chart_gauge_arc.tsx @@ -0,0 +1,36 @@ +/* + * 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 from 'react'; +import type { EuiIconProps } from '@elastic/eui'; +import { colors } from './common_styles'; + +export const IconChartGaugeArc = ({ title, titleId, ...props }: Omit) => { + return ( + + {title ? {title} : null} + + + + + + + + ); +}; diff --git a/packages/kbn-chart-icons/src/assets/chart_gauge_circle.tsx b/packages/kbn-chart-icons/src/assets/chart_gauge_circle.tsx new file mode 100644 index 0000000000000..e89dba7297465 --- /dev/null +++ b/packages/kbn-chart-icons/src/assets/chart_gauge_circle.tsx @@ -0,0 +1,35 @@ +/* + * 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 from 'react'; +import type { EuiIconProps } from '@elastic/eui'; +import { colors } from './common_styles'; + +export const IconChartGaugeCircle = ({ title, titleId, ...props }: Omit) => { + return ( + + {title ? {title} : null} + + + + + + + ); +}; diff --git a/packages/kbn-chart-icons/src/assets/chart_gauge_semi_circle.tsx b/packages/kbn-chart-icons/src/assets/chart_gauge_semi_circle.tsx new file mode 100644 index 0000000000000..912516b3d7118 --- /dev/null +++ b/packages/kbn-chart-icons/src/assets/chart_gauge_semi_circle.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 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 from 'react'; +import type { EuiIconProps } from '@elastic/eui'; +import { colors } from './common_styles'; + +export const IconChartGaugeSemiCircle = ({ + title, + titleId, + ...props +}: Omit) => { + return ( + + {title ? {title} : null} + + + + + + + + ); +}; diff --git a/packages/kbn-chart-icons/src/assets/chart_vertical_bullet.tsx b/packages/kbn-chart-icons/src/assets/chart_vertical_bullet.tsx index 5cf427af7d238..db24e31bf25e8 100644 --- a/packages/kbn-chart-icons/src/assets/chart_vertical_bullet.tsx +++ b/packages/kbn-chart-icons/src/assets/chart_vertical_bullet.tsx @@ -27,11 +27,11 @@ export const IconChartVerticalBullet = ({ > {title ? {title} : null} diff --git a/packages/kbn-chart-icons/src/assets/index.ts b/packages/kbn-chart-icons/src/assets/index.ts index 85cc291936b18..0165b2bf0381a 100644 --- a/packages/kbn-chart-icons/src/assets/index.ts +++ b/packages/kbn-chart-icons/src/assets/index.ts @@ -40,4 +40,7 @@ export { IconRegionMap } from './region_map'; export { IconChartHeatmap } from './chart_heatmap'; export { IconChartHorizontalBullet } from './chart_horizontal_bullet'; export { IconChartVerticalBullet } from './chart_vertical_bullet'; +export { IconChartGaugeSemiCircle } from './chart_gauge_semi_circle'; +export { IconChartGaugeArc } from './chart_gauge_arc'; +export { IconChartGaugeCircle } from './chart_gauge_circle'; export { IconChartTagcloud } from './chart_tagcloud'; 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-esql-ast/src/antlr/esql_lexer.g4 b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 new file mode 100644 index 0000000000000..c116f045a19a8 --- /dev/null +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 @@ -0,0 +1,436 @@ +/* + * 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. + */ + +// DO NOT MODIFY THIS FILE BY HAND. IT IS MANAGED BY A CI JOB. + +lexer grammar esql_lexer; + options { caseInsensitive = true; } + +DISSECT : 'dissect' -> pushMode(EXPRESSION_MODE); +DROP : 'drop' -> pushMode(PROJECT_MODE); +ENRICH : 'enrich' -> pushMode(ENRICH_MODE); +EVAL : 'eval' -> pushMode(EXPRESSION_MODE); +EXPLAIN : 'explain' -> pushMode(EXPLAIN_MODE); +FROM : 'from' -> pushMode(FROM_MODE); +GROK : 'grok' -> pushMode(EXPRESSION_MODE); +INLINESTATS : 'inlinestats' -> pushMode(EXPRESSION_MODE); +KEEP : 'keep' -> pushMode(PROJECT_MODE); +LIMIT : 'limit' -> pushMode(EXPRESSION_MODE); +META : 'meta' -> pushMode(META_MODE); +MV_EXPAND : 'mv_expand' -> pushMode(MVEXPAND_MODE); +RENAME : 'rename' -> pushMode(RENAME_MODE); +ROW : 'row' -> pushMode(EXPRESSION_MODE); +SHOW : 'show' -> pushMode(SHOW_MODE); +SORT : 'sort' -> pushMode(EXPRESSION_MODE); +STATS : 'stats' -> pushMode(EXPRESSION_MODE); +WHERE : 'where' -> pushMode(EXPRESSION_MODE); +UNKNOWN_CMD : ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION_MODE); + +LINE_COMMENT + : '//' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN) + ; + +MULTILINE_COMMENT + : '/*' (MULTILINE_COMMENT|.)*? '*/' -> channel(HIDDEN) + ; + +WS + : [ \r\n\t]+ -> channel(HIDDEN) + ; +// +// Explain +// +mode EXPLAIN_MODE; +EXPLAIN_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(DEFAULT_MODE); +EXPLAIN_PIPE : PIPE -> type(PIPE), popMode; +EXPLAIN_WS : WS -> channel(HIDDEN); +EXPLAIN_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN); +EXPLAIN_MULTILINE_COMMENT : MULTILINE_COMMENT -> channel(HIDDEN); + +// +// Expression - used by most command +// +mode EXPRESSION_MODE; + +PIPE : '|' -> popMode; + +fragment DIGIT + : [0-9] + ; + +fragment LETTER + : [A-Za-z] + ; + +fragment ESCAPE_SEQUENCE + : '\\' [tnr"\\] + ; + +fragment UNESCAPED_CHARS + : ~[\r\n"\\] + ; + +fragment EXPONENT + : [Ee] [+-]? DIGIT+ + ; + +fragment ASPERAND + : '@' + ; + +fragment BACKQUOTE + : '`' + ; + +fragment BACKQUOTE_BLOCK + : ~'`' + | '``' + ; + +fragment UNDERSCORE + : '_' + ; + +fragment UNQUOTED_ID_BODY + : (LETTER | DIGIT | UNDERSCORE) + ; + +STRING + : '"' (ESCAPE_SEQUENCE | UNESCAPED_CHARS)* '"' + | '"""' (~[\r\n])*? '"""' '"'? '"'? + ; + +INTEGER_LITERAL + : DIGIT+ + ; + +DECIMAL_LITERAL + : DIGIT+ DOT DIGIT* + | DOT DIGIT+ + | DIGIT+ (DOT DIGIT*)? EXPONENT + | DOT DIGIT+ EXPONENT + ; + +BY : 'by'; + +AND : 'and'; +ASC : 'asc'; +ASSIGN : '='; +COMMA : ','; +DESC : 'desc'; +DOT : '.'; +FALSE : 'false'; +FIRST : 'first'; +LAST : 'last'; +LP : '('; +IN: 'in'; +IS: 'is'; +LIKE: 'like'; +NOT : 'not'; +NULL : 'null'; +NULLS : 'nulls'; +OR : 'or'; +PARAM: '?'; +RLIKE: 'rlike'; +RP : ')'; +TRUE : 'true'; + +EQ : '=='; +CIEQ : '=~'; +NEQ : '!='; +LT : '<'; +LTE : '<='; +GT : '>'; +GTE : '>='; + +PLUS : '+'; +MINUS : '-'; +ASTERISK : '*'; +SLASH : '/'; +PERCENT : '%'; + +// Brackets are funny. We can happen upon a CLOSING_BRACKET in two ways - one +// way is to start in an explain command which then shifts us to expression +// mode. Thus, the two popModes on CLOSING_BRACKET. The other way could as +// the start of a multivalued field constant. To line up with the double pop +// the explain mode needs, we double push when we see that. +OPENING_BRACKET : '[' -> pushMode(EXPRESSION_MODE), pushMode(EXPRESSION_MODE); +CLOSING_BRACKET : ']' -> popMode, popMode; + +UNQUOTED_IDENTIFIER + : LETTER UNQUOTED_ID_BODY* + // only allow @ at beginning of identifier to keep the option to allow @ as infix operator in the future + // also, single `_` and `@` characters are not valid identifiers + | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY+ + ; + +fragment QUOTED_ID + : BACKQUOTE BACKQUOTE_BLOCK+ BACKQUOTE + ; + +QUOTED_IDENTIFIER + : QUOTED_ID + ; + +EXPR_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +EXPR_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +EXPR_WS + : WS -> channel(HIDDEN) + ; +// +// FROM command +// +mode FROM_MODE; +FROM_PIPE : PIPE -> type(PIPE), popMode; +FROM_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET); +FROM_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET); +FROM_COMMA : COMMA -> type(COMMA); +FROM_ASSIGN : ASSIGN -> type(ASSIGN); + +METADATA: 'metadata'; + +fragment FROM_UNQUOTED_IDENTIFIER_PART + : ~[=`|,[\]/ \t\r\n] + | '/' ~[*/] // allow single / but not followed by another / or * which would start a comment + ; + +FROM_UNQUOTED_IDENTIFIER + : FROM_UNQUOTED_IDENTIFIER_PART+ + ; + +FROM_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) + ; + +FROM_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +FROM_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +FROM_WS + : WS -> channel(HIDDEN) + ; +// +// DROP, KEEP +// +mode PROJECT_MODE; +PROJECT_PIPE : PIPE -> type(PIPE), popMode; +PROJECT_DOT: DOT -> type(DOT); +PROJECT_COMMA : COMMA -> type(COMMA); + +fragment UNQUOTED_ID_BODY_WITH_PATTERN + : (LETTER | DIGIT | UNDERSCORE | ASTERISK) + ; + +fragment UNQUOTED_ID_PATTERN + : (LETTER | ASTERISK) UNQUOTED_ID_BODY_WITH_PATTERN* + | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY_WITH_PATTERN+ + ; + +ID_PATTERN + : (UNQUOTED_ID_PATTERN | QUOTED_ID)+ + ; + +PROJECT_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +PROJECT_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +PROJECT_WS + : WS -> channel(HIDDEN) + ; +// +// | RENAME a.b AS x, c AS y +// +mode RENAME_MODE; +RENAME_PIPE : PIPE -> type(PIPE), popMode; +RENAME_ASSIGN : ASSIGN -> type(ASSIGN); +RENAME_COMMA : COMMA -> type(COMMA); +RENAME_DOT: DOT -> type(DOT); + +AS : 'as'; + +RENAME_ID_PATTERN + : ID_PATTERN -> type(ID_PATTERN) + ; + +RENAME_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +RENAME_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +RENAME_WS + : WS -> channel(HIDDEN) + ; + +// | ENRICH ON key WITH fields +mode ENRICH_MODE; +ENRICH_PIPE : PIPE -> type(PIPE), popMode; +ENRICH_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(SETTING_MODE); + +ON : 'on' -> pushMode(ENRICH_FIELD_MODE); +WITH : 'with' -> pushMode(ENRICH_FIELD_MODE); + +// similar to that of an index +// see https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html#indices-create-api-path-params +fragment ENRICH_POLICY_NAME_BODY + : ~[\\/?"<>| ,#\t\r\n:] + ; + +ENRICH_POLICY_NAME + // allow prefix for the policy to specify its resolution + : (ENRICH_POLICY_NAME_BODY+ COLON)? ENRICH_POLICY_NAME_BODY+ + ; + +ENRICH_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) + ; + +ENRICH_MODE_UNQUOTED_VALUE + : ENRICH_POLICY_NAME -> type(ENRICH_POLICY_NAME) + ; + +ENRICH_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +ENRICH_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +ENRICH_WS + : WS -> channel(HIDDEN) + ; + +// submode for Enrich to allow different lexing between policy identifier (loose) and field identifiers +mode ENRICH_FIELD_MODE; +ENRICH_FIELD_PIPE : PIPE -> type(PIPE), popMode, popMode; +ENRICH_FIELD_ASSIGN : ASSIGN -> type(ASSIGN); +ENRICH_FIELD_COMMA : COMMA -> type(COMMA); +ENRICH_FIELD_DOT: DOT -> type(DOT); + +ENRICH_FIELD_WITH : WITH -> type(WITH) ; + +ENRICH_FIELD_ID_PATTERN + : ID_PATTERN -> type(ID_PATTERN) + ; + +ENRICH_FIELD_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) + ; + +ENRICH_FIELD_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +ENRICH_FIELD_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +ENRICH_FIELD_WS + : WS -> channel(HIDDEN) + ; + +mode MVEXPAND_MODE; +MVEXPAND_PIPE : PIPE -> type(PIPE), popMode; +MVEXPAND_DOT: DOT -> type(DOT); + +MVEXPAND_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) + ; + +MVEXPAND_UNQUOTED_IDENTIFIER + : UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER) + ; + +MVEXPAND_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +MVEXPAND_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +MVEXPAND_WS + : WS -> channel(HIDDEN) + ; + +// +// SHOW commands +// +mode SHOW_MODE; +SHOW_PIPE : PIPE -> type(PIPE), popMode; + +INFO : 'info'; + +SHOW_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +SHOW_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +SHOW_WS + : WS -> channel(HIDDEN) + ; + +// +// META commands +// +mode META_MODE; +META_PIPE : PIPE -> type(PIPE), popMode; + +FUNCTIONS : 'functions'; + +META_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +META_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +META_WS + : WS -> channel(HIDDEN) + ; + +mode SETTING_MODE; +SETTING_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET), popMode; + +COLON : ':'; + +SETTING + : (ASPERAND | DIGIT| DOT | LETTER | UNDERSCORE)+ + ; + +SETTING_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +SETTTING_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +SETTING_WS + : WS -> channel(HIDDEN) + ; \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp new file mode 100644 index 0000000000000..ecf5ef0f4ffd5 --- /dev/null +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp @@ -0,0 +1,401 @@ +token literal names: +null +'dissect' +'drop' +'enrich' +'eval' +'explain' +'from' +'grok' +'inlinestats' +'keep' +'limit' +'meta' +'mv_expand' +'rename' +'row' +'show' +'sort' +'stats' +'where' +null +null +null +null +null +null +null +'|' +null +null +null +'by' +'and' +'asc' +'=' +',' +'desc' +'.' +'false' +'first' +'last' +'(' +'in' +'is' +'like' +'not' +'null' +'nulls' +'or' +'?' +'rlike' +')' +'true' +'==' +'=~' +'!=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'/' +'%' +null +']' +null +null +null +null +null +'metadata' +null +null +null +null +null +null +null +null +'as' +null +null +null +'on' +'with' +null +null +null +null +null +null +null +null +null +null +'info' +null +null +null +'functions' +null +null +null +':' +null +null +null +null + +token symbolic names: +null +DISSECT +DROP +ENRICH +EVAL +EXPLAIN +FROM +GROK +INLINESTATS +KEEP +LIMIT +META +MV_EXPAND +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 +CIEQ +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 +ID_PATTERN +PROJECT_LINE_COMMENT +PROJECT_MULTILINE_COMMENT +PROJECT_WS +AS +RENAME_LINE_COMMENT +RENAME_MULTILINE_COMMENT +RENAME_WS +ON +WITH +ENRICH_POLICY_NAME +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 +SHOW_LINE_COMMENT +SHOW_MULTILINE_COMMENT +SHOW_WS +FUNCTIONS +META_LINE_COMMENT +META_MULTILINE_COMMENT +META_WS +COLON +SETTING +SETTING_LINE_COMMENT +SETTTING_MULTILINE_COMMENT +SETTING_WS + +rule names: +DISSECT +DROP +ENRICH +EVAL +EXPLAIN +FROM +GROK +INLINESTATS +KEEP +LIMIT +META +MV_EXPAND +RENAME +ROW +SHOW +SORT +STATS +WHERE +UNKNOWN_CMD +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 +ASPERAND +BACKQUOTE +BACKQUOTE_BLOCK +UNDERSCORE +UNQUOTED_ID_BODY +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 +CIEQ +NEQ +LT +LTE +GT +GTE +PLUS +MINUS +ASTERISK +SLASH +PERCENT +OPENING_BRACKET +CLOSING_BRACKET +UNQUOTED_IDENTIFIER +QUOTED_ID +QUOTED_IDENTIFIER +EXPR_LINE_COMMENT +EXPR_MULTILINE_COMMENT +EXPR_WS +FROM_PIPE +FROM_OPENING_BRACKET +FROM_CLOSING_BRACKET +FROM_COMMA +FROM_ASSIGN +METADATA +FROM_UNQUOTED_IDENTIFIER_PART +FROM_UNQUOTED_IDENTIFIER +FROM_QUOTED_IDENTIFIER +FROM_LINE_COMMENT +FROM_MULTILINE_COMMENT +FROM_WS +PROJECT_PIPE +PROJECT_DOT +PROJECT_COMMA +UNQUOTED_ID_BODY_WITH_PATTERN +UNQUOTED_ID_PATTERN +ID_PATTERN +PROJECT_LINE_COMMENT +PROJECT_MULTILINE_COMMENT +PROJECT_WS +RENAME_PIPE +RENAME_ASSIGN +RENAME_COMMA +RENAME_DOT +AS +RENAME_ID_PATTERN +RENAME_LINE_COMMENT +RENAME_MULTILINE_COMMENT +RENAME_WS +ENRICH_PIPE +ENRICH_OPENING_BRACKET +ON +WITH +ENRICH_POLICY_NAME_BODY +ENRICH_POLICY_NAME +ENRICH_QUOTED_IDENTIFIER +ENRICH_MODE_UNQUOTED_VALUE +ENRICH_LINE_COMMENT +ENRICH_MULTILINE_COMMENT +ENRICH_WS +ENRICH_FIELD_PIPE +ENRICH_FIELD_ASSIGN +ENRICH_FIELD_COMMA +ENRICH_FIELD_DOT +ENRICH_FIELD_WITH +ENRICH_FIELD_ID_PATTERN +ENRICH_FIELD_QUOTED_IDENTIFIER +ENRICH_FIELD_LINE_COMMENT +ENRICH_FIELD_MULTILINE_COMMENT +ENRICH_FIELD_WS +MVEXPAND_PIPE +MVEXPAND_DOT +MVEXPAND_QUOTED_IDENTIFIER +MVEXPAND_UNQUOTED_IDENTIFIER +MVEXPAND_LINE_COMMENT +MVEXPAND_MULTILINE_COMMENT +MVEXPAND_WS +SHOW_PIPE +INFO +SHOW_LINE_COMMENT +SHOW_MULTILINE_COMMENT +SHOW_WS +META_PIPE +FUNCTIONS +META_LINE_COMMENT +META_MULTILINE_COMMENT +META_WS +SETTING_CLOSING_BRACKET +COLON +SETTING +SETTING_LINE_COMMENT +SETTTING_MULTILINE_COMMENT +SETTING_WS + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE +EXPLAIN_MODE +EXPRESSION_MODE +FROM_MODE +PROJECT_MODE +RENAME_MODE +ENRICH_MODE +ENRICH_FIELD_MODE +MVEXPAND_MODE +SHOW_MODE +META_MODE +SETTING_MODE + +atn: +[4, 0, 108, 1182, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 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, 2, 1, 2, 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, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 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, 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, 11, 1, 11, 1, 12, 1, 12, 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, 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, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 4, 18, 478, 8, 18, 11, 18, 12, 18, 479, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 488, 8, 19, 10, 19, 12, 19, 491, 9, 19, 1, 19, 3, 19, 494, 8, 19, 1, 19, 3, 19, 497, 8, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 506, 8, 20, 10, 20, 12, 20, 509, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 4, 21, 517, 8, 21, 11, 21, 12, 21, 518, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 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, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 560, 8, 32, 1, 32, 4, 32, 563, 8, 32, 11, 32, 12, 32, 564, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 574, 8, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 3, 37, 581, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 586, 8, 38, 10, 38, 12, 38, 589, 9, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 597, 8, 38, 10, 38, 12, 38, 600, 9, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 607, 8, 38, 1, 38, 3, 38, 610, 8, 38, 3, 38, 612, 8, 38, 1, 39, 4, 39, 615, 8, 39, 11, 39, 12, 39, 616, 1, 40, 4, 40, 620, 8, 40, 11, 40, 12, 40, 621, 1, 40, 1, 40, 5, 40, 626, 8, 40, 10, 40, 12, 40, 629, 9, 40, 1, 40, 1, 40, 4, 40, 633, 8, 40, 11, 40, 12, 40, 634, 1, 40, 4, 40, 638, 8, 40, 11, 40, 12, 40, 639, 1, 40, 1, 40, 5, 40, 644, 8, 40, 10, 40, 12, 40, 647, 9, 40, 3, 40, 649, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 4, 40, 655, 8, 40, 11, 40, 12, 40, 656, 1, 40, 1, 40, 3, 40, 661, 8, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 5, 77, 789, 8, 77, 10, 77, 12, 77, 792, 9, 77, 1, 77, 1, 77, 3, 77, 796, 8, 77, 1, 77, 4, 77, 799, 8, 77, 11, 77, 12, 77, 800, 3, 77, 803, 8, 77, 1, 78, 1, 78, 4, 78, 807, 8, 78, 11, 78, 12, 78, 808, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 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, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 3, 89, 860, 8, 89, 1, 90, 4, 90, 863, 8, 90, 11, 90, 12, 90, 864, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 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, 98, 1, 98, 3, 98, 900, 8, 98, 1, 99, 1, 99, 3, 99, 904, 8, 99, 1, 99, 5, 99, 907, 8, 99, 10, 99, 12, 99, 910, 9, 99, 1, 99, 1, 99, 3, 99, 914, 8, 99, 1, 99, 4, 99, 917, 8, 99, 11, 99, 12, 99, 918, 3, 99, 921, 8, 99, 1, 100, 1, 100, 4, 100, 925, 8, 100, 11, 100, 12, 100, 926, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 4, 118, 1002, 8, 118, 11, 118, 12, 118, 1003, 1, 118, 1, 118, 3, 118, 1008, 8, 118, 1, 118, 4, 118, 1011, 8, 118, 11, 118, 12, 118, 1012, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 4, 153, 1167, 8, 153, 11, 153, 12, 153, 1168, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 2, 507, 598, 0, 157, 12, 1, 14, 2, 16, 3, 18, 4, 20, 5, 22, 6, 24, 7, 26, 8, 28, 9, 30, 10, 32, 11, 34, 12, 36, 13, 38, 14, 40, 15, 42, 16, 44, 17, 46, 18, 48, 19, 50, 20, 52, 21, 54, 22, 56, 0, 58, 0, 60, 23, 62, 24, 64, 25, 66, 26, 68, 0, 70, 0, 72, 0, 74, 0, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 0, 88, 27, 90, 28, 92, 29, 94, 30, 96, 31, 98, 32, 100, 33, 102, 34, 104, 35, 106, 36, 108, 37, 110, 38, 112, 39, 114, 40, 116, 41, 118, 42, 120, 43, 122, 44, 124, 45, 126, 46, 128, 47, 130, 48, 132, 49, 134, 50, 136, 51, 138, 52, 140, 53, 142, 54, 144, 55, 146, 56, 148, 57, 150, 58, 152, 59, 154, 60, 156, 61, 158, 62, 160, 63, 162, 64, 164, 65, 166, 66, 168, 0, 170, 67, 172, 68, 174, 69, 176, 70, 178, 0, 180, 0, 182, 0, 184, 0, 186, 0, 188, 71, 190, 0, 192, 72, 194, 0, 196, 73, 198, 74, 200, 75, 202, 0, 204, 0, 206, 0, 208, 0, 210, 0, 212, 76, 214, 77, 216, 78, 218, 79, 220, 0, 222, 0, 224, 0, 226, 0, 228, 80, 230, 0, 232, 81, 234, 82, 236, 83, 238, 0, 240, 0, 242, 84, 244, 85, 246, 0, 248, 86, 250, 0, 252, 0, 254, 87, 256, 88, 258, 89, 260, 0, 262, 0, 264, 0, 266, 0, 268, 0, 270, 0, 272, 0, 274, 90, 276, 91, 278, 92, 280, 0, 282, 0, 284, 0, 286, 0, 288, 93, 290, 94, 292, 95, 294, 0, 296, 96, 298, 97, 300, 98, 302, 99, 304, 0, 306, 100, 308, 101, 310, 102, 312, 103, 314, 0, 316, 104, 318, 105, 320, 106, 322, 107, 324, 108, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 2, 0, 85, 85, 117, 117, 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, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1209, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 1, 56, 1, 0, 0, 0, 1, 58, 1, 0, 0, 0, 1, 60, 1, 0, 0, 0, 1, 62, 1, 0, 0, 0, 1, 64, 1, 0, 0, 0, 2, 66, 1, 0, 0, 0, 2, 88, 1, 0, 0, 0, 2, 90, 1, 0, 0, 0, 2, 92, 1, 0, 0, 0, 2, 94, 1, 0, 0, 0, 2, 96, 1, 0, 0, 0, 2, 98, 1, 0, 0, 0, 2, 100, 1, 0, 0, 0, 2, 102, 1, 0, 0, 0, 2, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 2, 108, 1, 0, 0, 0, 2, 110, 1, 0, 0, 0, 2, 112, 1, 0, 0, 0, 2, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 2, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 3, 178, 1, 0, 0, 0, 3, 180, 1, 0, 0, 0, 3, 182, 1, 0, 0, 0, 3, 184, 1, 0, 0, 0, 3, 186, 1, 0, 0, 0, 3, 188, 1, 0, 0, 0, 3, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 4, 202, 1, 0, 0, 0, 4, 204, 1, 0, 0, 0, 4, 206, 1, 0, 0, 0, 4, 212, 1, 0, 0, 0, 4, 214, 1, 0, 0, 0, 4, 216, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 5, 220, 1, 0, 0, 0, 5, 222, 1, 0, 0, 0, 5, 224, 1, 0, 0, 0, 5, 226, 1, 0, 0, 0, 5, 228, 1, 0, 0, 0, 5, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 6, 238, 1, 0, 0, 0, 6, 240, 1, 0, 0, 0, 6, 242, 1, 0, 0, 0, 6, 244, 1, 0, 0, 0, 6, 248, 1, 0, 0, 0, 6, 250, 1, 0, 0, 0, 6, 252, 1, 0, 0, 0, 6, 254, 1, 0, 0, 0, 6, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 7, 260, 1, 0, 0, 0, 7, 262, 1, 0, 0, 0, 7, 264, 1, 0, 0, 0, 7, 266, 1, 0, 0, 0, 7, 268, 1, 0, 0, 0, 7, 270, 1, 0, 0, 0, 7, 272, 1, 0, 0, 0, 7, 274, 1, 0, 0, 0, 7, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 8, 280, 1, 0, 0, 0, 8, 282, 1, 0, 0, 0, 8, 284, 1, 0, 0, 0, 8, 286, 1, 0, 0, 0, 8, 288, 1, 0, 0, 0, 8, 290, 1, 0, 0, 0, 8, 292, 1, 0, 0, 0, 9, 294, 1, 0, 0, 0, 9, 296, 1, 0, 0, 0, 9, 298, 1, 0, 0, 0, 9, 300, 1, 0, 0, 0, 9, 302, 1, 0, 0, 0, 10, 304, 1, 0, 0, 0, 10, 306, 1, 0, 0, 0, 10, 308, 1, 0, 0, 0, 10, 310, 1, 0, 0, 0, 10, 312, 1, 0, 0, 0, 11, 314, 1, 0, 0, 0, 11, 316, 1, 0, 0, 0, 11, 318, 1, 0, 0, 0, 11, 320, 1, 0, 0, 0, 11, 322, 1, 0, 0, 0, 11, 324, 1, 0, 0, 0, 12, 326, 1, 0, 0, 0, 14, 336, 1, 0, 0, 0, 16, 343, 1, 0, 0, 0, 18, 352, 1, 0, 0, 0, 20, 359, 1, 0, 0, 0, 22, 369, 1, 0, 0, 0, 24, 376, 1, 0, 0, 0, 26, 383, 1, 0, 0, 0, 28, 397, 1, 0, 0, 0, 30, 404, 1, 0, 0, 0, 32, 412, 1, 0, 0, 0, 34, 419, 1, 0, 0, 0, 36, 431, 1, 0, 0, 0, 38, 440, 1, 0, 0, 0, 40, 446, 1, 0, 0, 0, 42, 453, 1, 0, 0, 0, 44, 460, 1, 0, 0, 0, 46, 468, 1, 0, 0, 0, 48, 477, 1, 0, 0, 0, 50, 483, 1, 0, 0, 0, 52, 500, 1, 0, 0, 0, 54, 516, 1, 0, 0, 0, 56, 522, 1, 0, 0, 0, 58, 527, 1, 0, 0, 0, 60, 532, 1, 0, 0, 0, 62, 536, 1, 0, 0, 0, 64, 540, 1, 0, 0, 0, 66, 544, 1, 0, 0, 0, 68, 548, 1, 0, 0, 0, 70, 550, 1, 0, 0, 0, 72, 552, 1, 0, 0, 0, 74, 555, 1, 0, 0, 0, 76, 557, 1, 0, 0, 0, 78, 566, 1, 0, 0, 0, 80, 568, 1, 0, 0, 0, 82, 573, 1, 0, 0, 0, 84, 575, 1, 0, 0, 0, 86, 580, 1, 0, 0, 0, 88, 611, 1, 0, 0, 0, 90, 614, 1, 0, 0, 0, 92, 660, 1, 0, 0, 0, 94, 662, 1, 0, 0, 0, 96, 665, 1, 0, 0, 0, 98, 669, 1, 0, 0, 0, 100, 673, 1, 0, 0, 0, 102, 675, 1, 0, 0, 0, 104, 677, 1, 0, 0, 0, 106, 682, 1, 0, 0, 0, 108, 684, 1, 0, 0, 0, 110, 690, 1, 0, 0, 0, 112, 696, 1, 0, 0, 0, 114, 701, 1, 0, 0, 0, 116, 703, 1, 0, 0, 0, 118, 706, 1, 0, 0, 0, 120, 709, 1, 0, 0, 0, 122, 714, 1, 0, 0, 0, 124, 718, 1, 0, 0, 0, 126, 723, 1, 0, 0, 0, 128, 729, 1, 0, 0, 0, 130, 732, 1, 0, 0, 0, 132, 734, 1, 0, 0, 0, 134, 740, 1, 0, 0, 0, 136, 742, 1, 0, 0, 0, 138, 747, 1, 0, 0, 0, 140, 750, 1, 0, 0, 0, 142, 753, 1, 0, 0, 0, 144, 756, 1, 0, 0, 0, 146, 758, 1, 0, 0, 0, 148, 761, 1, 0, 0, 0, 150, 763, 1, 0, 0, 0, 152, 766, 1, 0, 0, 0, 154, 768, 1, 0, 0, 0, 156, 770, 1, 0, 0, 0, 158, 772, 1, 0, 0, 0, 160, 774, 1, 0, 0, 0, 162, 776, 1, 0, 0, 0, 164, 781, 1, 0, 0, 0, 166, 802, 1, 0, 0, 0, 168, 804, 1, 0, 0, 0, 170, 812, 1, 0, 0, 0, 172, 814, 1, 0, 0, 0, 174, 818, 1, 0, 0, 0, 176, 822, 1, 0, 0, 0, 178, 826, 1, 0, 0, 0, 180, 831, 1, 0, 0, 0, 182, 835, 1, 0, 0, 0, 184, 839, 1, 0, 0, 0, 186, 843, 1, 0, 0, 0, 188, 847, 1, 0, 0, 0, 190, 859, 1, 0, 0, 0, 192, 862, 1, 0, 0, 0, 194, 866, 1, 0, 0, 0, 196, 870, 1, 0, 0, 0, 198, 874, 1, 0, 0, 0, 200, 878, 1, 0, 0, 0, 202, 882, 1, 0, 0, 0, 204, 887, 1, 0, 0, 0, 206, 891, 1, 0, 0, 0, 208, 899, 1, 0, 0, 0, 210, 920, 1, 0, 0, 0, 212, 924, 1, 0, 0, 0, 214, 928, 1, 0, 0, 0, 216, 932, 1, 0, 0, 0, 218, 936, 1, 0, 0, 0, 220, 940, 1, 0, 0, 0, 222, 945, 1, 0, 0, 0, 224, 949, 1, 0, 0, 0, 226, 953, 1, 0, 0, 0, 228, 957, 1, 0, 0, 0, 230, 960, 1, 0, 0, 0, 232, 964, 1, 0, 0, 0, 234, 968, 1, 0, 0, 0, 236, 972, 1, 0, 0, 0, 238, 976, 1, 0, 0, 0, 240, 981, 1, 0, 0, 0, 242, 986, 1, 0, 0, 0, 244, 991, 1, 0, 0, 0, 246, 998, 1, 0, 0, 0, 248, 1007, 1, 0, 0, 0, 250, 1014, 1, 0, 0, 0, 252, 1018, 1, 0, 0, 0, 254, 1022, 1, 0, 0, 0, 256, 1026, 1, 0, 0, 0, 258, 1030, 1, 0, 0, 0, 260, 1034, 1, 0, 0, 0, 262, 1040, 1, 0, 0, 0, 264, 1044, 1, 0, 0, 0, 266, 1048, 1, 0, 0, 0, 268, 1052, 1, 0, 0, 0, 270, 1056, 1, 0, 0, 0, 272, 1060, 1, 0, 0, 0, 274, 1064, 1, 0, 0, 0, 276, 1068, 1, 0, 0, 0, 278, 1072, 1, 0, 0, 0, 280, 1076, 1, 0, 0, 0, 282, 1081, 1, 0, 0, 0, 284, 1085, 1, 0, 0, 0, 286, 1089, 1, 0, 0, 0, 288, 1093, 1, 0, 0, 0, 290, 1097, 1, 0, 0, 0, 292, 1101, 1, 0, 0, 0, 294, 1105, 1, 0, 0, 0, 296, 1110, 1, 0, 0, 0, 298, 1115, 1, 0, 0, 0, 300, 1119, 1, 0, 0, 0, 302, 1123, 1, 0, 0, 0, 304, 1127, 1, 0, 0, 0, 306, 1132, 1, 0, 0, 0, 308, 1142, 1, 0, 0, 0, 310, 1146, 1, 0, 0, 0, 312, 1150, 1, 0, 0, 0, 314, 1154, 1, 0, 0, 0, 316, 1159, 1, 0, 0, 0, 318, 1166, 1, 0, 0, 0, 320, 1170, 1, 0, 0, 0, 322, 1174, 1, 0, 0, 0, 324, 1178, 1, 0, 0, 0, 326, 327, 7, 0, 0, 0, 327, 328, 7, 1, 0, 0, 328, 329, 7, 2, 0, 0, 329, 330, 7, 2, 0, 0, 330, 331, 7, 3, 0, 0, 331, 332, 7, 4, 0, 0, 332, 333, 7, 5, 0, 0, 333, 334, 1, 0, 0, 0, 334, 335, 6, 0, 0, 0, 335, 13, 1, 0, 0, 0, 336, 337, 7, 0, 0, 0, 337, 338, 7, 6, 0, 0, 338, 339, 7, 7, 0, 0, 339, 340, 7, 8, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 6, 1, 1, 0, 342, 15, 1, 0, 0, 0, 343, 344, 7, 3, 0, 0, 344, 345, 7, 9, 0, 0, 345, 346, 7, 6, 0, 0, 346, 347, 7, 1, 0, 0, 347, 348, 7, 4, 0, 0, 348, 349, 7, 10, 0, 0, 349, 350, 1, 0, 0, 0, 350, 351, 6, 2, 2, 0, 351, 17, 1, 0, 0, 0, 352, 353, 7, 3, 0, 0, 353, 354, 7, 11, 0, 0, 354, 355, 7, 12, 0, 0, 355, 356, 7, 13, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 6, 3, 0, 0, 358, 19, 1, 0, 0, 0, 359, 360, 7, 3, 0, 0, 360, 361, 7, 14, 0, 0, 361, 362, 7, 8, 0, 0, 362, 363, 7, 13, 0, 0, 363, 364, 7, 12, 0, 0, 364, 365, 7, 1, 0, 0, 365, 366, 7, 9, 0, 0, 366, 367, 1, 0, 0, 0, 367, 368, 6, 4, 3, 0, 368, 21, 1, 0, 0, 0, 369, 370, 7, 15, 0, 0, 370, 371, 7, 6, 0, 0, 371, 372, 7, 7, 0, 0, 372, 373, 7, 16, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 6, 5, 4, 0, 375, 23, 1, 0, 0, 0, 376, 377, 7, 17, 0, 0, 377, 378, 7, 6, 0, 0, 378, 379, 7, 7, 0, 0, 379, 380, 7, 18, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 6, 6, 0, 0, 382, 25, 1, 0, 0, 0, 383, 384, 7, 1, 0, 0, 384, 385, 7, 9, 0, 0, 385, 386, 7, 13, 0, 0, 386, 387, 7, 1, 0, 0, 387, 388, 7, 9, 0, 0, 388, 389, 7, 3, 0, 0, 389, 390, 7, 2, 0, 0, 390, 391, 7, 5, 0, 0, 391, 392, 7, 12, 0, 0, 392, 393, 7, 5, 0, 0, 393, 394, 7, 2, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 6, 7, 0, 0, 396, 27, 1, 0, 0, 0, 397, 398, 7, 18, 0, 0, 398, 399, 7, 3, 0, 0, 399, 400, 7, 3, 0, 0, 400, 401, 7, 8, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 6, 8, 1, 0, 403, 29, 1, 0, 0, 0, 404, 405, 7, 13, 0, 0, 405, 406, 7, 1, 0, 0, 406, 407, 7, 16, 0, 0, 407, 408, 7, 1, 0, 0, 408, 409, 7, 5, 0, 0, 409, 410, 1, 0, 0, 0, 410, 411, 6, 9, 0, 0, 411, 31, 1, 0, 0, 0, 412, 413, 7, 16, 0, 0, 413, 414, 7, 3, 0, 0, 414, 415, 7, 5, 0, 0, 415, 416, 7, 12, 0, 0, 416, 417, 1, 0, 0, 0, 417, 418, 6, 10, 5, 0, 418, 33, 1, 0, 0, 0, 419, 420, 7, 16, 0, 0, 420, 421, 7, 11, 0, 0, 421, 422, 5, 95, 0, 0, 422, 423, 7, 3, 0, 0, 423, 424, 7, 14, 0, 0, 424, 425, 7, 8, 0, 0, 425, 426, 7, 12, 0, 0, 426, 427, 7, 9, 0, 0, 427, 428, 7, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 6, 11, 6, 0, 430, 35, 1, 0, 0, 0, 431, 432, 7, 6, 0, 0, 432, 433, 7, 3, 0, 0, 433, 434, 7, 9, 0, 0, 434, 435, 7, 12, 0, 0, 435, 436, 7, 16, 0, 0, 436, 437, 7, 3, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 6, 12, 7, 0, 439, 37, 1, 0, 0, 0, 440, 441, 7, 6, 0, 0, 441, 442, 7, 7, 0, 0, 442, 443, 7, 19, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 6, 13, 0, 0, 445, 39, 1, 0, 0, 0, 446, 447, 7, 2, 0, 0, 447, 448, 7, 10, 0, 0, 448, 449, 7, 7, 0, 0, 449, 450, 7, 19, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 6, 14, 8, 0, 452, 41, 1, 0, 0, 0, 453, 454, 7, 2, 0, 0, 454, 455, 7, 7, 0, 0, 455, 456, 7, 6, 0, 0, 456, 457, 7, 5, 0, 0, 457, 458, 1, 0, 0, 0, 458, 459, 6, 15, 0, 0, 459, 43, 1, 0, 0, 0, 460, 461, 7, 2, 0, 0, 461, 462, 7, 5, 0, 0, 462, 463, 7, 12, 0, 0, 463, 464, 7, 5, 0, 0, 464, 465, 7, 2, 0, 0, 465, 466, 1, 0, 0, 0, 466, 467, 6, 16, 0, 0, 467, 45, 1, 0, 0, 0, 468, 469, 7, 19, 0, 0, 469, 470, 7, 10, 0, 0, 470, 471, 7, 3, 0, 0, 471, 472, 7, 6, 0, 0, 472, 473, 7, 3, 0, 0, 473, 474, 1, 0, 0, 0, 474, 475, 6, 17, 0, 0, 475, 47, 1, 0, 0, 0, 476, 478, 8, 20, 0, 0, 477, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 6, 18, 0, 0, 482, 49, 1, 0, 0, 0, 483, 484, 5, 47, 0, 0, 484, 485, 5, 47, 0, 0, 485, 489, 1, 0, 0, 0, 486, 488, 8, 21, 0, 0, 487, 486, 1, 0, 0, 0, 488, 491, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 494, 5, 13, 0, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 496, 1, 0, 0, 0, 495, 497, 5, 10, 0, 0, 496, 495, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 499, 6, 19, 9, 0, 499, 51, 1, 0, 0, 0, 500, 501, 5, 47, 0, 0, 501, 502, 5, 42, 0, 0, 502, 507, 1, 0, 0, 0, 503, 506, 3, 52, 20, 0, 504, 506, 9, 0, 0, 0, 505, 503, 1, 0, 0, 0, 505, 504, 1, 0, 0, 0, 506, 509, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 508, 510, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 510, 511, 5, 42, 0, 0, 511, 512, 5, 47, 0, 0, 512, 513, 1, 0, 0, 0, 513, 514, 6, 20, 9, 0, 514, 53, 1, 0, 0, 0, 515, 517, 7, 22, 0, 0, 516, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 516, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 6, 21, 9, 0, 521, 55, 1, 0, 0, 0, 522, 523, 3, 162, 75, 0, 523, 524, 1, 0, 0, 0, 524, 525, 6, 22, 10, 0, 525, 526, 6, 22, 11, 0, 526, 57, 1, 0, 0, 0, 527, 528, 3, 66, 27, 0, 528, 529, 1, 0, 0, 0, 529, 530, 6, 23, 12, 0, 530, 531, 6, 23, 13, 0, 531, 59, 1, 0, 0, 0, 532, 533, 3, 54, 21, 0, 533, 534, 1, 0, 0, 0, 534, 535, 6, 24, 9, 0, 535, 61, 1, 0, 0, 0, 536, 537, 3, 50, 19, 0, 537, 538, 1, 0, 0, 0, 538, 539, 6, 25, 9, 0, 539, 63, 1, 0, 0, 0, 540, 541, 3, 52, 20, 0, 541, 542, 1, 0, 0, 0, 542, 543, 6, 26, 9, 0, 543, 65, 1, 0, 0, 0, 544, 545, 5, 124, 0, 0, 545, 546, 1, 0, 0, 0, 546, 547, 6, 27, 13, 0, 547, 67, 1, 0, 0, 0, 548, 549, 7, 23, 0, 0, 549, 69, 1, 0, 0, 0, 550, 551, 7, 24, 0, 0, 551, 71, 1, 0, 0, 0, 552, 553, 5, 92, 0, 0, 553, 554, 7, 25, 0, 0, 554, 73, 1, 0, 0, 0, 555, 556, 8, 26, 0, 0, 556, 75, 1, 0, 0, 0, 557, 559, 7, 3, 0, 0, 558, 560, 7, 27, 0, 0, 559, 558, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 562, 1, 0, 0, 0, 561, 563, 3, 68, 28, 0, 562, 561, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 562, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 77, 1, 0, 0, 0, 566, 567, 5, 64, 0, 0, 567, 79, 1, 0, 0, 0, 568, 569, 5, 96, 0, 0, 569, 81, 1, 0, 0, 0, 570, 574, 8, 28, 0, 0, 571, 572, 5, 96, 0, 0, 572, 574, 5, 96, 0, 0, 573, 570, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 574, 83, 1, 0, 0, 0, 575, 576, 5, 95, 0, 0, 576, 85, 1, 0, 0, 0, 577, 581, 3, 70, 29, 0, 578, 581, 3, 68, 28, 0, 579, 581, 3, 84, 36, 0, 580, 577, 1, 0, 0, 0, 580, 578, 1, 0, 0, 0, 580, 579, 1, 0, 0, 0, 581, 87, 1, 0, 0, 0, 582, 587, 5, 34, 0, 0, 583, 586, 3, 72, 30, 0, 584, 586, 3, 74, 31, 0, 585, 583, 1, 0, 0, 0, 585, 584, 1, 0, 0, 0, 586, 589, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 590, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 590, 612, 5, 34, 0, 0, 591, 592, 5, 34, 0, 0, 592, 593, 5, 34, 0, 0, 593, 594, 5, 34, 0, 0, 594, 598, 1, 0, 0, 0, 595, 597, 8, 21, 0, 0, 596, 595, 1, 0, 0, 0, 597, 600, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 599, 601, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 601, 602, 5, 34, 0, 0, 602, 603, 5, 34, 0, 0, 603, 604, 5, 34, 0, 0, 604, 606, 1, 0, 0, 0, 605, 607, 5, 34, 0, 0, 606, 605, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 609, 1, 0, 0, 0, 608, 610, 5, 34, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 582, 1, 0, 0, 0, 611, 591, 1, 0, 0, 0, 612, 89, 1, 0, 0, 0, 613, 615, 3, 68, 28, 0, 614, 613, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 614, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 91, 1, 0, 0, 0, 618, 620, 3, 68, 28, 0, 619, 618, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 627, 3, 106, 47, 0, 624, 626, 3, 68, 28, 0, 625, 624, 1, 0, 0, 0, 626, 629, 1, 0, 0, 0, 627, 625, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 661, 1, 0, 0, 0, 629, 627, 1, 0, 0, 0, 630, 632, 3, 106, 47, 0, 631, 633, 3, 68, 28, 0, 632, 631, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 661, 1, 0, 0, 0, 636, 638, 3, 68, 28, 0, 637, 636, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 637, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 648, 1, 0, 0, 0, 641, 645, 3, 106, 47, 0, 642, 644, 3, 68, 28, 0, 643, 642, 1, 0, 0, 0, 644, 647, 1, 0, 0, 0, 645, 643, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 649, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 648, 641, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 650, 1, 0, 0, 0, 650, 651, 3, 76, 32, 0, 651, 661, 1, 0, 0, 0, 652, 654, 3, 106, 47, 0, 653, 655, 3, 68, 28, 0, 654, 653, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 659, 3, 76, 32, 0, 659, 661, 1, 0, 0, 0, 660, 619, 1, 0, 0, 0, 660, 630, 1, 0, 0, 0, 660, 637, 1, 0, 0, 0, 660, 652, 1, 0, 0, 0, 661, 93, 1, 0, 0, 0, 662, 663, 7, 29, 0, 0, 663, 664, 7, 30, 0, 0, 664, 95, 1, 0, 0, 0, 665, 666, 7, 12, 0, 0, 666, 667, 7, 9, 0, 0, 667, 668, 7, 0, 0, 0, 668, 97, 1, 0, 0, 0, 669, 670, 7, 12, 0, 0, 670, 671, 7, 2, 0, 0, 671, 672, 7, 4, 0, 0, 672, 99, 1, 0, 0, 0, 673, 674, 5, 61, 0, 0, 674, 101, 1, 0, 0, 0, 675, 676, 5, 44, 0, 0, 676, 103, 1, 0, 0, 0, 677, 678, 7, 0, 0, 0, 678, 679, 7, 3, 0, 0, 679, 680, 7, 2, 0, 0, 680, 681, 7, 4, 0, 0, 681, 105, 1, 0, 0, 0, 682, 683, 5, 46, 0, 0, 683, 107, 1, 0, 0, 0, 684, 685, 7, 15, 0, 0, 685, 686, 7, 12, 0, 0, 686, 687, 7, 13, 0, 0, 687, 688, 7, 2, 0, 0, 688, 689, 7, 3, 0, 0, 689, 109, 1, 0, 0, 0, 690, 691, 7, 15, 0, 0, 691, 692, 7, 1, 0, 0, 692, 693, 7, 6, 0, 0, 693, 694, 7, 2, 0, 0, 694, 695, 7, 5, 0, 0, 695, 111, 1, 0, 0, 0, 696, 697, 7, 13, 0, 0, 697, 698, 7, 12, 0, 0, 698, 699, 7, 2, 0, 0, 699, 700, 7, 5, 0, 0, 700, 113, 1, 0, 0, 0, 701, 702, 5, 40, 0, 0, 702, 115, 1, 0, 0, 0, 703, 704, 7, 1, 0, 0, 704, 705, 7, 9, 0, 0, 705, 117, 1, 0, 0, 0, 706, 707, 7, 1, 0, 0, 707, 708, 7, 2, 0, 0, 708, 119, 1, 0, 0, 0, 709, 710, 7, 13, 0, 0, 710, 711, 7, 1, 0, 0, 711, 712, 7, 18, 0, 0, 712, 713, 7, 3, 0, 0, 713, 121, 1, 0, 0, 0, 714, 715, 7, 9, 0, 0, 715, 716, 7, 7, 0, 0, 716, 717, 7, 5, 0, 0, 717, 123, 1, 0, 0, 0, 718, 719, 7, 9, 0, 0, 719, 720, 7, 31, 0, 0, 720, 721, 7, 13, 0, 0, 721, 722, 7, 13, 0, 0, 722, 125, 1, 0, 0, 0, 723, 724, 7, 9, 0, 0, 724, 725, 7, 31, 0, 0, 725, 726, 7, 13, 0, 0, 726, 727, 7, 13, 0, 0, 727, 728, 7, 2, 0, 0, 728, 127, 1, 0, 0, 0, 729, 730, 7, 7, 0, 0, 730, 731, 7, 6, 0, 0, 731, 129, 1, 0, 0, 0, 732, 733, 5, 63, 0, 0, 733, 131, 1, 0, 0, 0, 734, 735, 7, 6, 0, 0, 735, 736, 7, 13, 0, 0, 736, 737, 7, 1, 0, 0, 737, 738, 7, 18, 0, 0, 738, 739, 7, 3, 0, 0, 739, 133, 1, 0, 0, 0, 740, 741, 5, 41, 0, 0, 741, 135, 1, 0, 0, 0, 742, 743, 7, 5, 0, 0, 743, 744, 7, 6, 0, 0, 744, 745, 7, 31, 0, 0, 745, 746, 7, 3, 0, 0, 746, 137, 1, 0, 0, 0, 747, 748, 5, 61, 0, 0, 748, 749, 5, 61, 0, 0, 749, 139, 1, 0, 0, 0, 750, 751, 5, 61, 0, 0, 751, 752, 5, 126, 0, 0, 752, 141, 1, 0, 0, 0, 753, 754, 5, 33, 0, 0, 754, 755, 5, 61, 0, 0, 755, 143, 1, 0, 0, 0, 756, 757, 5, 60, 0, 0, 757, 145, 1, 0, 0, 0, 758, 759, 5, 60, 0, 0, 759, 760, 5, 61, 0, 0, 760, 147, 1, 0, 0, 0, 761, 762, 5, 62, 0, 0, 762, 149, 1, 0, 0, 0, 763, 764, 5, 62, 0, 0, 764, 765, 5, 61, 0, 0, 765, 151, 1, 0, 0, 0, 766, 767, 5, 43, 0, 0, 767, 153, 1, 0, 0, 0, 768, 769, 5, 45, 0, 0, 769, 155, 1, 0, 0, 0, 770, 771, 5, 42, 0, 0, 771, 157, 1, 0, 0, 0, 772, 773, 5, 47, 0, 0, 773, 159, 1, 0, 0, 0, 774, 775, 5, 37, 0, 0, 775, 161, 1, 0, 0, 0, 776, 777, 5, 91, 0, 0, 777, 778, 1, 0, 0, 0, 778, 779, 6, 75, 0, 0, 779, 780, 6, 75, 0, 0, 780, 163, 1, 0, 0, 0, 781, 782, 5, 93, 0, 0, 782, 783, 1, 0, 0, 0, 783, 784, 6, 76, 13, 0, 784, 785, 6, 76, 13, 0, 785, 165, 1, 0, 0, 0, 786, 790, 3, 70, 29, 0, 787, 789, 3, 86, 37, 0, 788, 787, 1, 0, 0, 0, 789, 792, 1, 0, 0, 0, 790, 788, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 803, 1, 0, 0, 0, 792, 790, 1, 0, 0, 0, 793, 796, 3, 84, 36, 0, 794, 796, 3, 78, 33, 0, 795, 793, 1, 0, 0, 0, 795, 794, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 799, 3, 86, 37, 0, 798, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 798, 1, 0, 0, 0, 800, 801, 1, 0, 0, 0, 801, 803, 1, 0, 0, 0, 802, 786, 1, 0, 0, 0, 802, 795, 1, 0, 0, 0, 803, 167, 1, 0, 0, 0, 804, 806, 3, 80, 34, 0, 805, 807, 3, 82, 35, 0, 806, 805, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 806, 1, 0, 0, 0, 808, 809, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 811, 3, 80, 34, 0, 811, 169, 1, 0, 0, 0, 812, 813, 3, 168, 78, 0, 813, 171, 1, 0, 0, 0, 814, 815, 3, 50, 19, 0, 815, 816, 1, 0, 0, 0, 816, 817, 6, 80, 9, 0, 817, 173, 1, 0, 0, 0, 818, 819, 3, 52, 20, 0, 819, 820, 1, 0, 0, 0, 820, 821, 6, 81, 9, 0, 821, 175, 1, 0, 0, 0, 822, 823, 3, 54, 21, 0, 823, 824, 1, 0, 0, 0, 824, 825, 6, 82, 9, 0, 825, 177, 1, 0, 0, 0, 826, 827, 3, 66, 27, 0, 827, 828, 1, 0, 0, 0, 828, 829, 6, 83, 12, 0, 829, 830, 6, 83, 13, 0, 830, 179, 1, 0, 0, 0, 831, 832, 3, 162, 75, 0, 832, 833, 1, 0, 0, 0, 833, 834, 6, 84, 10, 0, 834, 181, 1, 0, 0, 0, 835, 836, 3, 164, 76, 0, 836, 837, 1, 0, 0, 0, 837, 838, 6, 85, 14, 0, 838, 183, 1, 0, 0, 0, 839, 840, 3, 102, 45, 0, 840, 841, 1, 0, 0, 0, 841, 842, 6, 86, 15, 0, 842, 185, 1, 0, 0, 0, 843, 844, 3, 100, 44, 0, 844, 845, 1, 0, 0, 0, 845, 846, 6, 87, 16, 0, 846, 187, 1, 0, 0, 0, 847, 848, 7, 16, 0, 0, 848, 849, 7, 3, 0, 0, 849, 850, 7, 5, 0, 0, 850, 851, 7, 12, 0, 0, 851, 852, 7, 0, 0, 0, 852, 853, 7, 12, 0, 0, 853, 854, 7, 5, 0, 0, 854, 855, 7, 12, 0, 0, 855, 189, 1, 0, 0, 0, 856, 860, 8, 32, 0, 0, 857, 858, 5, 47, 0, 0, 858, 860, 8, 33, 0, 0, 859, 856, 1, 0, 0, 0, 859, 857, 1, 0, 0, 0, 860, 191, 1, 0, 0, 0, 861, 863, 3, 190, 89, 0, 862, 861, 1, 0, 0, 0, 863, 864, 1, 0, 0, 0, 864, 862, 1, 0, 0, 0, 864, 865, 1, 0, 0, 0, 865, 193, 1, 0, 0, 0, 866, 867, 3, 170, 79, 0, 867, 868, 1, 0, 0, 0, 868, 869, 6, 91, 17, 0, 869, 195, 1, 0, 0, 0, 870, 871, 3, 50, 19, 0, 871, 872, 1, 0, 0, 0, 872, 873, 6, 92, 9, 0, 873, 197, 1, 0, 0, 0, 874, 875, 3, 52, 20, 0, 875, 876, 1, 0, 0, 0, 876, 877, 6, 93, 9, 0, 877, 199, 1, 0, 0, 0, 878, 879, 3, 54, 21, 0, 879, 880, 1, 0, 0, 0, 880, 881, 6, 94, 9, 0, 881, 201, 1, 0, 0, 0, 882, 883, 3, 66, 27, 0, 883, 884, 1, 0, 0, 0, 884, 885, 6, 95, 12, 0, 885, 886, 6, 95, 13, 0, 886, 203, 1, 0, 0, 0, 887, 888, 3, 106, 47, 0, 888, 889, 1, 0, 0, 0, 889, 890, 6, 96, 18, 0, 890, 205, 1, 0, 0, 0, 891, 892, 3, 102, 45, 0, 892, 893, 1, 0, 0, 0, 893, 894, 6, 97, 15, 0, 894, 207, 1, 0, 0, 0, 895, 900, 3, 70, 29, 0, 896, 900, 3, 68, 28, 0, 897, 900, 3, 84, 36, 0, 898, 900, 3, 156, 72, 0, 899, 895, 1, 0, 0, 0, 899, 896, 1, 0, 0, 0, 899, 897, 1, 0, 0, 0, 899, 898, 1, 0, 0, 0, 900, 209, 1, 0, 0, 0, 901, 904, 3, 70, 29, 0, 902, 904, 3, 156, 72, 0, 903, 901, 1, 0, 0, 0, 903, 902, 1, 0, 0, 0, 904, 908, 1, 0, 0, 0, 905, 907, 3, 208, 98, 0, 906, 905, 1, 0, 0, 0, 907, 910, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 921, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 911, 914, 3, 84, 36, 0, 912, 914, 3, 78, 33, 0, 913, 911, 1, 0, 0, 0, 913, 912, 1, 0, 0, 0, 914, 916, 1, 0, 0, 0, 915, 917, 3, 208, 98, 0, 916, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 921, 1, 0, 0, 0, 920, 903, 1, 0, 0, 0, 920, 913, 1, 0, 0, 0, 921, 211, 1, 0, 0, 0, 922, 925, 3, 210, 99, 0, 923, 925, 3, 168, 78, 0, 924, 922, 1, 0, 0, 0, 924, 923, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 213, 1, 0, 0, 0, 928, 929, 3, 50, 19, 0, 929, 930, 1, 0, 0, 0, 930, 931, 6, 101, 9, 0, 931, 215, 1, 0, 0, 0, 932, 933, 3, 52, 20, 0, 933, 934, 1, 0, 0, 0, 934, 935, 6, 102, 9, 0, 935, 217, 1, 0, 0, 0, 936, 937, 3, 54, 21, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 103, 9, 0, 939, 219, 1, 0, 0, 0, 940, 941, 3, 66, 27, 0, 941, 942, 1, 0, 0, 0, 942, 943, 6, 104, 12, 0, 943, 944, 6, 104, 13, 0, 944, 221, 1, 0, 0, 0, 945, 946, 3, 100, 44, 0, 946, 947, 1, 0, 0, 0, 947, 948, 6, 105, 16, 0, 948, 223, 1, 0, 0, 0, 949, 950, 3, 102, 45, 0, 950, 951, 1, 0, 0, 0, 951, 952, 6, 106, 15, 0, 952, 225, 1, 0, 0, 0, 953, 954, 3, 106, 47, 0, 954, 955, 1, 0, 0, 0, 955, 956, 6, 107, 18, 0, 956, 227, 1, 0, 0, 0, 957, 958, 7, 12, 0, 0, 958, 959, 7, 2, 0, 0, 959, 229, 1, 0, 0, 0, 960, 961, 3, 212, 100, 0, 961, 962, 1, 0, 0, 0, 962, 963, 6, 109, 19, 0, 963, 231, 1, 0, 0, 0, 964, 965, 3, 50, 19, 0, 965, 966, 1, 0, 0, 0, 966, 967, 6, 110, 9, 0, 967, 233, 1, 0, 0, 0, 968, 969, 3, 52, 20, 0, 969, 970, 1, 0, 0, 0, 970, 971, 6, 111, 9, 0, 971, 235, 1, 0, 0, 0, 972, 973, 3, 54, 21, 0, 973, 974, 1, 0, 0, 0, 974, 975, 6, 112, 9, 0, 975, 237, 1, 0, 0, 0, 976, 977, 3, 66, 27, 0, 977, 978, 1, 0, 0, 0, 978, 979, 6, 113, 12, 0, 979, 980, 6, 113, 13, 0, 980, 239, 1, 0, 0, 0, 981, 982, 3, 162, 75, 0, 982, 983, 1, 0, 0, 0, 983, 984, 6, 114, 10, 0, 984, 985, 6, 114, 20, 0, 985, 241, 1, 0, 0, 0, 986, 987, 7, 7, 0, 0, 987, 988, 7, 9, 0, 0, 988, 989, 1, 0, 0, 0, 989, 990, 6, 115, 21, 0, 990, 243, 1, 0, 0, 0, 991, 992, 7, 19, 0, 0, 992, 993, 7, 1, 0, 0, 993, 994, 7, 5, 0, 0, 994, 995, 7, 10, 0, 0, 995, 996, 1, 0, 0, 0, 996, 997, 6, 116, 21, 0, 997, 245, 1, 0, 0, 0, 998, 999, 8, 34, 0, 0, 999, 247, 1, 0, 0, 0, 1000, 1002, 3, 246, 117, 0, 1001, 1000, 1, 0, 0, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1001, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 3, 316, 152, 0, 1006, 1008, 1, 0, 0, 0, 1007, 1001, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1010, 1, 0, 0, 0, 1009, 1011, 3, 246, 117, 0, 1010, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1010, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 249, 1, 0, 0, 0, 1014, 1015, 3, 170, 79, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 6, 119, 17, 0, 1017, 251, 1, 0, 0, 0, 1018, 1019, 3, 248, 118, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1021, 6, 120, 22, 0, 1021, 253, 1, 0, 0, 0, 1022, 1023, 3, 50, 19, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 121, 9, 0, 1025, 255, 1, 0, 0, 0, 1026, 1027, 3, 52, 20, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 122, 9, 0, 1029, 257, 1, 0, 0, 0, 1030, 1031, 3, 54, 21, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 6, 123, 9, 0, 1033, 259, 1, 0, 0, 0, 1034, 1035, 3, 66, 27, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1037, 6, 124, 12, 0, 1037, 1038, 6, 124, 13, 0, 1038, 1039, 6, 124, 13, 0, 1039, 261, 1, 0, 0, 0, 1040, 1041, 3, 100, 44, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 6, 125, 16, 0, 1043, 263, 1, 0, 0, 0, 1044, 1045, 3, 102, 45, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1047, 6, 126, 15, 0, 1047, 265, 1, 0, 0, 0, 1048, 1049, 3, 106, 47, 0, 1049, 1050, 1, 0, 0, 0, 1050, 1051, 6, 127, 18, 0, 1051, 267, 1, 0, 0, 0, 1052, 1053, 3, 244, 116, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1055, 6, 128, 23, 0, 1055, 269, 1, 0, 0, 0, 1056, 1057, 3, 212, 100, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 6, 129, 19, 0, 1059, 271, 1, 0, 0, 0, 1060, 1061, 3, 170, 79, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1063, 6, 130, 17, 0, 1063, 273, 1, 0, 0, 0, 1064, 1065, 3, 50, 19, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 6, 131, 9, 0, 1067, 275, 1, 0, 0, 0, 1068, 1069, 3, 52, 20, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1071, 6, 132, 9, 0, 1071, 277, 1, 0, 0, 0, 1072, 1073, 3, 54, 21, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1075, 6, 133, 9, 0, 1075, 279, 1, 0, 0, 0, 1076, 1077, 3, 66, 27, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1079, 6, 134, 12, 0, 1079, 1080, 6, 134, 13, 0, 1080, 281, 1, 0, 0, 0, 1081, 1082, 3, 106, 47, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1084, 6, 135, 18, 0, 1084, 283, 1, 0, 0, 0, 1085, 1086, 3, 170, 79, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1088, 6, 136, 17, 0, 1088, 285, 1, 0, 0, 0, 1089, 1090, 3, 166, 77, 0, 1090, 1091, 1, 0, 0, 0, 1091, 1092, 6, 137, 24, 0, 1092, 287, 1, 0, 0, 0, 1093, 1094, 3, 50, 19, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1096, 6, 138, 9, 0, 1096, 289, 1, 0, 0, 0, 1097, 1098, 3, 52, 20, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 6, 139, 9, 0, 1100, 291, 1, 0, 0, 0, 1101, 1102, 3, 54, 21, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1104, 6, 140, 9, 0, 1104, 293, 1, 0, 0, 0, 1105, 1106, 3, 66, 27, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 6, 141, 12, 0, 1108, 1109, 6, 141, 13, 0, 1109, 295, 1, 0, 0, 0, 1110, 1111, 7, 1, 0, 0, 1111, 1112, 7, 9, 0, 0, 1112, 1113, 7, 15, 0, 0, 1113, 1114, 7, 7, 0, 0, 1114, 297, 1, 0, 0, 0, 1115, 1116, 3, 50, 19, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 143, 9, 0, 1118, 299, 1, 0, 0, 0, 1119, 1120, 3, 52, 20, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 144, 9, 0, 1122, 301, 1, 0, 0, 0, 1123, 1124, 3, 54, 21, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 6, 145, 9, 0, 1126, 303, 1, 0, 0, 0, 1127, 1128, 3, 66, 27, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 6, 146, 12, 0, 1130, 1131, 6, 146, 13, 0, 1131, 305, 1, 0, 0, 0, 1132, 1133, 7, 15, 0, 0, 1133, 1134, 7, 31, 0, 0, 1134, 1135, 7, 9, 0, 0, 1135, 1136, 7, 4, 0, 0, 1136, 1137, 7, 5, 0, 0, 1137, 1138, 7, 1, 0, 0, 1138, 1139, 7, 7, 0, 0, 1139, 1140, 7, 9, 0, 0, 1140, 1141, 7, 2, 0, 0, 1141, 307, 1, 0, 0, 0, 1142, 1143, 3, 50, 19, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 6, 148, 9, 0, 1145, 309, 1, 0, 0, 0, 1146, 1147, 3, 52, 20, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1149, 6, 149, 9, 0, 1149, 311, 1, 0, 0, 0, 1150, 1151, 3, 54, 21, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 6, 150, 9, 0, 1153, 313, 1, 0, 0, 0, 1154, 1155, 3, 164, 76, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 151, 14, 0, 1157, 1158, 6, 151, 13, 0, 1158, 315, 1, 0, 0, 0, 1159, 1160, 5, 58, 0, 0, 1160, 317, 1, 0, 0, 0, 1161, 1167, 3, 78, 33, 0, 1162, 1167, 3, 68, 28, 0, 1163, 1167, 3, 106, 47, 0, 1164, 1167, 3, 70, 29, 0, 1165, 1167, 3, 84, 36, 0, 1166, 1161, 1, 0, 0, 0, 1166, 1162, 1, 0, 0, 0, 1166, 1163, 1, 0, 0, 0, 1166, 1164, 1, 0, 0, 0, 1166, 1165, 1, 0, 0, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1166, 1, 0, 0, 0, 1168, 1169, 1, 0, 0, 0, 1169, 319, 1, 0, 0, 0, 1170, 1171, 3, 50, 19, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 6, 154, 9, 0, 1173, 321, 1, 0, 0, 0, 1174, 1175, 3, 52, 20, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 155, 9, 0, 1177, 323, 1, 0, 0, 0, 1178, 1179, 3, 54, 21, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 156, 9, 0, 1181, 325, 1, 0, 0, 0, 58, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 479, 489, 493, 496, 505, 507, 518, 559, 564, 573, 580, 585, 587, 598, 606, 609, 611, 616, 621, 627, 634, 639, 645, 648, 656, 660, 790, 795, 800, 802, 808, 859, 864, 899, 903, 908, 913, 918, 920, 924, 926, 1003, 1007, 1012, 1166, 1168, 25, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 10, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 0, 1, 0, 7, 64, 0, 5, 0, 0, 7, 26, 0, 4, 0, 0, 7, 65, 0, 7, 34, 0, 7, 33, 0, 7, 67, 0, 7, 36, 0, 7, 76, 0, 5, 11, 0, 5, 7, 0, 7, 86, 0, 7, 85, 0, 7, 66, 0] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens new file mode 100644 index 0000000000000..5edc646fad10e --- /dev/null +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens @@ -0,0 +1,169 @@ +DISSECT=1 +DROP=2 +ENRICH=3 +EVAL=4 +EXPLAIN=5 +FROM=6 +GROK=7 +INLINESTATS=8 +KEEP=9 +LIMIT=10 +META=11 +MV_EXPAND=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 +CIEQ=53 +NEQ=54 +LT=55 +LTE=56 +GT=57 +GTE=58 +PLUS=59 +MINUS=60 +ASTERISK=61 +SLASH=62 +PERCENT=63 +OPENING_BRACKET=64 +CLOSING_BRACKET=65 +UNQUOTED_IDENTIFIER=66 +QUOTED_IDENTIFIER=67 +EXPR_LINE_COMMENT=68 +EXPR_MULTILINE_COMMENT=69 +EXPR_WS=70 +METADATA=71 +FROM_UNQUOTED_IDENTIFIER=72 +FROM_LINE_COMMENT=73 +FROM_MULTILINE_COMMENT=74 +FROM_WS=75 +ID_PATTERN=76 +PROJECT_LINE_COMMENT=77 +PROJECT_MULTILINE_COMMENT=78 +PROJECT_WS=79 +AS=80 +RENAME_LINE_COMMENT=81 +RENAME_MULTILINE_COMMENT=82 +RENAME_WS=83 +ON=84 +WITH=85 +ENRICH_POLICY_NAME=86 +ENRICH_LINE_COMMENT=87 +ENRICH_MULTILINE_COMMENT=88 +ENRICH_WS=89 +ENRICH_FIELD_LINE_COMMENT=90 +ENRICH_FIELD_MULTILINE_COMMENT=91 +ENRICH_FIELD_WS=92 +MVEXPAND_LINE_COMMENT=93 +MVEXPAND_MULTILINE_COMMENT=94 +MVEXPAND_WS=95 +INFO=96 +SHOW_LINE_COMMENT=97 +SHOW_MULTILINE_COMMENT=98 +SHOW_WS=99 +FUNCTIONS=100 +META_LINE_COMMENT=101 +META_MULTILINE_COMMENT=102 +META_WS=103 +COLON=104 +SETTING=105 +SETTING_LINE_COMMENT=106 +SETTTING_MULTILINE_COMMENT=107 +SETTING_WS=108 +'dissect'=1 +'drop'=2 +'enrich'=3 +'eval'=4 +'explain'=5 +'from'=6 +'grok'=7 +'inlinestats'=8 +'keep'=9 +'limit'=10 +'meta'=11 +'mv_expand'=12 +'rename'=13 +'row'=14 +'show'=15 +'sort'=16 +'stats'=17 +'where'=18 +'|'=26 +'by'=30 +'and'=31 +'asc'=32 +'='=33 +','=34 +'desc'=35 +'.'=36 +'false'=37 +'first'=38 +'last'=39 +'('=40 +'in'=41 +'is'=42 +'like'=43 +'not'=44 +'null'=45 +'nulls'=46 +'or'=47 +'?'=48 +'rlike'=49 +')'=50 +'true'=51 +'=='=52 +'=~'=53 +'!='=54 +'<'=55 +'<='=56 +'>'=57 +'>='=58 +'+'=59 +'-'=60 +'*'=61 +'/'=62 +'%'=63 +']'=65 +'metadata'=71 +'as'=80 +'on'=84 +'with'=85 +'info'=96 +'functions'=100 +':'=104 diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts new file mode 100644 index 0000000000000..5603ea84b7c00 --- /dev/null +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts @@ -0,0 +1,738 @@ +// @ts-nocheck +// Generated from src/antlr/esql_lexer.g4 by ANTLR 4.13.1 +// noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols +import { + ATN, + ATNDeserializer, + CharStream, + DecisionState, DFA, + Lexer, + LexerATNSimulator, + RuleContext, + PredictionContextCache, + Token +} from "antlr4"; +export default class esql_lexer extends Lexer { + public static readonly DISSECT = 1; + public static readonly DROP = 2; + public static readonly ENRICH = 3; + public static readonly EVAL = 4; + public static readonly EXPLAIN = 5; + public static readonly FROM = 6; + public static readonly GROK = 7; + public static readonly INLINESTATS = 8; + public static readonly KEEP = 9; + public static readonly LIMIT = 10; + public static readonly META = 11; + public static readonly MV_EXPAND = 12; + public static readonly RENAME = 13; + public static readonly ROW = 14; + public static readonly SHOW = 15; + public static readonly SORT = 16; + public static readonly STATS = 17; + public static readonly WHERE = 18; + public static readonly UNKNOWN_CMD = 19; + public static readonly LINE_COMMENT = 20; + public static readonly MULTILINE_COMMENT = 21; + public static readonly WS = 22; + public static readonly EXPLAIN_WS = 23; + public static readonly EXPLAIN_LINE_COMMENT = 24; + public static readonly EXPLAIN_MULTILINE_COMMENT = 25; + public static readonly PIPE = 26; + public static readonly STRING = 27; + public static readonly INTEGER_LITERAL = 28; + public static readonly DECIMAL_LITERAL = 29; + public static readonly BY = 30; + public static readonly AND = 31; + public static readonly ASC = 32; + public static readonly ASSIGN = 33; + public static readonly COMMA = 34; + public static readonly DESC = 35; + public static readonly DOT = 36; + public static readonly FALSE = 37; + public static readonly FIRST = 38; + public static readonly LAST = 39; + public static readonly LP = 40; + public static readonly IN = 41; + public static readonly IS = 42; + public static readonly LIKE = 43; + public static readonly NOT = 44; + public static readonly NULL = 45; + public static readonly NULLS = 46; + public static readonly OR = 47; + public static readonly PARAM = 48; + public static readonly RLIKE = 49; + public static readonly RP = 50; + public static readonly TRUE = 51; + public static readonly EQ = 52; + public static readonly CIEQ = 53; + public static readonly NEQ = 54; + public static readonly LT = 55; + public static readonly LTE = 56; + public static readonly GT = 57; + public static readonly GTE = 58; + public static readonly PLUS = 59; + public static readonly MINUS = 60; + public static readonly ASTERISK = 61; + public static readonly SLASH = 62; + public static readonly PERCENT = 63; + public static readonly OPENING_BRACKET = 64; + public static readonly CLOSING_BRACKET = 65; + public static readonly UNQUOTED_IDENTIFIER = 66; + public static readonly QUOTED_IDENTIFIER = 67; + public static readonly EXPR_LINE_COMMENT = 68; + public static readonly EXPR_MULTILINE_COMMENT = 69; + public static readonly EXPR_WS = 70; + public static readonly METADATA = 71; + public static readonly FROM_UNQUOTED_IDENTIFIER = 72; + public static readonly FROM_LINE_COMMENT = 73; + public static readonly FROM_MULTILINE_COMMENT = 74; + public static readonly FROM_WS = 75; + public static readonly ID_PATTERN = 76; + public static readonly PROJECT_LINE_COMMENT = 77; + public static readonly PROJECT_MULTILINE_COMMENT = 78; + public static readonly PROJECT_WS = 79; + public static readonly AS = 80; + public static readonly RENAME_LINE_COMMENT = 81; + public static readonly RENAME_MULTILINE_COMMENT = 82; + public static readonly RENAME_WS = 83; + public static readonly ON = 84; + public static readonly WITH = 85; + public static readonly ENRICH_POLICY_NAME = 86; + public static readonly ENRICH_LINE_COMMENT = 87; + public static readonly ENRICH_MULTILINE_COMMENT = 88; + public static readonly ENRICH_WS = 89; + public static readonly ENRICH_FIELD_LINE_COMMENT = 90; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 91; + public static readonly ENRICH_FIELD_WS = 92; + public static readonly MVEXPAND_LINE_COMMENT = 93; + public static readonly MVEXPAND_MULTILINE_COMMENT = 94; + public static readonly MVEXPAND_WS = 95; + public static readonly INFO = 96; + public static readonly SHOW_LINE_COMMENT = 97; + public static readonly SHOW_MULTILINE_COMMENT = 98; + public static readonly SHOW_WS = 99; + public static readonly FUNCTIONS = 100; + public static readonly META_LINE_COMMENT = 101; + public static readonly META_MULTILINE_COMMENT = 102; + public static readonly META_WS = 103; + public static readonly COLON = 104; + public static readonly SETTING = 105; + public static readonly SETTING_LINE_COMMENT = 106; + public static readonly SETTTING_MULTILINE_COMMENT = 107; + public static readonly SETTING_WS = 108; + public static readonly EOF = Token.EOF; + public static readonly EXPLAIN_MODE = 1; + public static readonly EXPRESSION_MODE = 2; + public static readonly FROM_MODE = 3; + public static readonly PROJECT_MODE = 4; + public static readonly RENAME_MODE = 5; + public static readonly ENRICH_MODE = 6; + public static readonly ENRICH_FIELD_MODE = 7; + public static readonly MVEXPAND_MODE = 8; + public static readonly SHOW_MODE = 9; + public static readonly META_MODE = 10; + public static readonly SETTING_MODE = 11; + + public static readonly channelNames: string[] = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; + public static readonly literalNames: (string | null)[] = [ null, "'dissect'", + "'drop'", "'enrich'", + "'eval'", "'explain'", + "'from'", "'grok'", + "'inlinestats'", + "'keep'", "'limit'", + "'meta'", "'mv_expand'", + "'rename'", + "'row'", "'show'", + "'sort'", "'stats'", + "'where'", null, + null, null, + null, null, + null, null, + "'|'", null, + null, null, + "'by'", "'and'", + "'asc'", "'='", + "','", "'desc'", + "'.'", "'false'", + "'first'", "'last'", + "'('", "'in'", + "'is'", "'like'", + "'not'", "'null'", + "'nulls'", "'or'", + "'?'", "'rlike'", + "')'", "'true'", + "'=='", "'=~'", + "'!='", "'<'", + "'<='", "'>'", + "'>='", "'+'", + "'-'", "'*'", + "'/'", "'%'", + null, "']'", + null, null, + null, null, + null, "'metadata'", + null, null, + null, null, + null, null, + null, null, + "'as'", null, + null, null, + "'on'", "'with'", + null, null, + null, null, + null, null, + null, null, + null, null, + "'info'", null, + null, null, + "'functions'", + null, null, + null, "':'" ]; + public static readonly symbolicNames: (string | null)[] = [ null, "DISSECT", + "DROP", "ENRICH", + "EVAL", "EXPLAIN", + "FROM", "GROK", + "INLINESTATS", + "KEEP", "LIMIT", + "META", "MV_EXPAND", + "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", "CIEQ", + "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", + "ID_PATTERN", + "PROJECT_LINE_COMMENT", + "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", + "AS", "RENAME_LINE_COMMENT", + "RENAME_MULTILINE_COMMENT", + "RENAME_WS", + "ON", "WITH", + "ENRICH_POLICY_NAME", + "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", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", + "SHOW_WS", + "FUNCTIONS", + "META_LINE_COMMENT", + "META_MULTILINE_COMMENT", + "META_WS", + "COLON", "SETTING", + "SETTING_LINE_COMMENT", + "SETTTING_MULTILINE_COMMENT", + "SETTING_WS" ]; + public static readonly modeNames: string[] = [ "DEFAULT_MODE", "EXPLAIN_MODE", + "EXPRESSION_MODE", "FROM_MODE", + "PROJECT_MODE", "RENAME_MODE", + "ENRICH_MODE", "ENRICH_FIELD_MODE", + "MVEXPAND_MODE", "SHOW_MODE", + "META_MODE", "SETTING_MODE", ]; + + public static readonly ruleNames: string[] = [ + "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "INLINESTATS", + "KEEP", "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", + "STATS", "WHERE", "UNKNOWN_CMD", "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", "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", + "UNDERSCORE", "UNQUOTED_ID_BODY", "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", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", + "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", + "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "FROM_PIPE", "FROM_OPENING_BRACKET", + "FROM_CLOSING_BRACKET", "FROM_COMMA", "FROM_ASSIGN", "METADATA", "FROM_UNQUOTED_IDENTIFIER_PART", + "FROM_UNQUOTED_IDENTIFIER", "FROM_QUOTED_IDENTIFIER", "FROM_LINE_COMMENT", + "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", + "UNQUOTED_ID_BODY_WITH_PATTERN", "UNQUOTED_ID_PATTERN", "ID_PATTERN", + "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "RENAME_PIPE", + "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", "AS", "RENAME_ID_PATTERN", + "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ENRICH_PIPE", + "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", "ENRICH_POLICY_NAME", + "ENRICH_QUOTED_IDENTIFIER", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", + "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", + "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", + "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", + "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", + "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", + "SHOW_WS", "META_PIPE", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", + "META_WS", "SETTING_CLOSING_BRACKET", "COLON", "SETTING", "SETTING_LINE_COMMENT", + "SETTTING_MULTILINE_COMMENT", "SETTING_WS", + ]; + + + constructor(input: CharStream) { + super(input); + this._interp = new LexerATNSimulator(this, esql_lexer._ATN, esql_lexer.DecisionsToDFA, new PredictionContextCache()); + } + + public get grammarFileName(): string { return "esql_lexer.g4"; } + + public get literalNames(): (string | null)[] { return esql_lexer.literalNames; } + public get symbolicNames(): (string | null)[] { return esql_lexer.symbolicNames; } + public get ruleNames(): string[] { return esql_lexer.ruleNames; } + + public get serializedATN(): number[] { return esql_lexer._serializedATN; } + + public get channelNames(): string[] { return esql_lexer.channelNames; } + + public get modeNames(): string[] { return esql_lexer.modeNames; } + + public static readonly _serializedATN: number[] = [4,0,108,1182,6,-1,6, + -1,6,-1,6,-1,6,-1,6,-1,6,-1,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,2,124,7,124,2,125,7,125,2,126,7,126,2,127,7,127,2,128, + 7,128,2,129,7,129,2,130,7,130,2,131,7,131,2,132,7,132,2,133,7,133,2,134, + 7,134,2,135,7,135,2,136,7,136,2,137,7,137,2,138,7,138,2,139,7,139,2,140, + 7,140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,2,146, + 7,146,2,147,7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151,7,151,2,152, + 7,152,2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,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,2,1,2,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, + 4,1,4,1,4,1,5,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,7,1, + 7,1,7,1,7,1,7,1,7,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,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,11,1,11,1,12,1,12,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,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,16,1,16,1, + 16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18, + 4,18,478,8,18,11,18,12,18,479,1,18,1,18,1,19,1,19,1,19,1,19,5,19,488,8, + 19,10,19,12,19,491,9,19,1,19,3,19,494,8,19,1,19,3,19,497,8,19,1,19,1,19, + 1,20,1,20,1,20,1,20,1,20,5,20,506,8,20,10,20,12,20,509,9,20,1,20,1,20,1, + 20,1,20,1,20,1,21,4,21,517,8,21,11,21,12,21,518,1,21,1,21,1,22,1,22,1,22, + 1,22,1,22,1,23,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,26,1,26,1,27,1,27,1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30, + 1,30,1,31,1,31,1,32,1,32,3,32,560,8,32,1,32,4,32,563,8,32,11,32,12,32,564, + 1,33,1,33,1,34,1,34,1,35,1,35,1,35,3,35,574,8,35,1,36,1,36,1,37,1,37,1, + 37,3,37,581,8,37,1,38,1,38,1,38,5,38,586,8,38,10,38,12,38,589,9,38,1,38, + 1,38,1,38,1,38,1,38,1,38,5,38,597,8,38,10,38,12,38,600,9,38,1,38,1,38,1, + 38,1,38,1,38,3,38,607,8,38,1,38,3,38,610,8,38,3,38,612,8,38,1,39,4,39,615, + 8,39,11,39,12,39,616,1,40,4,40,620,8,40,11,40,12,40,621,1,40,1,40,5,40, + 626,8,40,10,40,12,40,629,9,40,1,40,1,40,4,40,633,8,40,11,40,12,40,634,1, + 40,4,40,638,8,40,11,40,12,40,639,1,40,1,40,5,40,644,8,40,10,40,12,40,647, + 9,40,3,40,649,8,40,1,40,1,40,1,40,1,40,4,40,655,8,40,11,40,12,40,656,1, + 40,1,40,3,40,661,8,40,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,43,1,43,1,43, + 1,43,1,44,1,44,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,48,1,48,1, + 48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50, + 1,51,1,51,1,52,1,52,1,52,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55,1, + 55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,58, + 1,58,1,58,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,62,1,62,1, + 62,1,62,1,62,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,65,1,66,1,66,1,67, + 1,67,1,67,1,68,1,68,1,69,1,69,1,69,1,70,1,70,1,71,1,71,1,72,1,72,1,73,1, + 73,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,77,1,77, + 5,77,789,8,77,10,77,12,77,792,9,77,1,77,1,77,3,77,796,8,77,1,77,4,77,799, + 8,77,11,77,12,77,800,3,77,803,8,77,1,78,1,78,4,78,807,8,78,11,78,12,78, + 808,1,78,1,78,1,79,1,79,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,82,1, + 82,1,82,1,82,1,83,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,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1, + 88,1,88,1,88,1,88,1,89,1,89,1,89,3,89,860,8,89,1,90,4,90,863,8,90,11,90, + 12,90,864,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1, + 94,1,94,1,94,1,94,1,95,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,98,1,98,3,98,900,8,98,1,99,1,99,3,99,904,8,99,1,99, + 5,99,907,8,99,10,99,12,99,910,9,99,1,99,1,99,3,99,914,8,99,1,99,4,99,917, + 8,99,11,99,12,99,918,3,99,921,8,99,1,100,1,100,4,100,925,8,100,11,100,12, + 100,926,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,103,1,103,1,103, + 1,103,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,106,1,106, + 1,106,1,106,1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,109,1,109,1,109, + 1,109,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,112,1,112,1,112, + 1,112,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114,1,114,1,115, + 1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,117, + 1,117,1,118,4,118,1002,8,118,11,118,12,118,1003,1,118,1,118,3,118,1008, + 8,118,1,118,4,118,1011,8,118,11,118,12,118,1012,1,119,1,119,1,119,1,119, + 1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122, + 1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,124,1,125,1,125, + 1,125,1,125,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,128,1,128, + 1,128,1,128,1,129,1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,131,1,131, + 1,131,1,131,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,134,1,134, + 1,134,1,134,1,134,1,135,1,135,1,135,1,135,1,136,1,136,1,136,1,136,1,137, + 1,137,1,137,1,137,1,138,1,138,1,138,1,138,1,139,1,139,1,139,1,139,1,140, + 1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142, + 1,142,1,143,1,143,1,143,1,143,1,144,1,144,1,144,1,144,1,145,1,145,1,145, + 1,145,1,146,1,146,1,146,1,146,1,146,1,147,1,147,1,147,1,147,1,147,1,147, + 1,147,1,147,1,147,1,147,1,148,1,148,1,148,1,148,1,149,1,149,1,149,1,149, + 1,150,1,150,1,150,1,150,1,151,1,151,1,151,1,151,1,151,1,152,1,152,1,153, + 1,153,1,153,1,153,1,153,4,153,1167,8,153,11,153,12,153,1168,1,154,1,154, + 1,154,1,154,1,155,1,155,1,155,1,155,1,156,1,156,1,156,1,156,2,507,598,0, + 157,12,1,14,2,16,3,18,4,20,5,22,6,24,7,26,8,28,9,30,10,32,11,34,12,36,13, + 38,14,40,15,42,16,44,17,46,18,48,19,50,20,52,21,54,22,56,0,58,0,60,23,62, + 24,64,25,66,26,68,0,70,0,72,0,74,0,76,0,78,0,80,0,82,0,84,0,86,0,88,27, + 90,28,92,29,94,30,96,31,98,32,100,33,102,34,104,35,106,36,108,37,110,38, + 112,39,114,40,116,41,118,42,120,43,122,44,124,45,126,46,128,47,130,48,132, + 49,134,50,136,51,138,52,140,53,142,54,144,55,146,56,148,57,150,58,152,59, + 154,60,156,61,158,62,160,63,162,64,164,65,166,66,168,0,170,67,172,68,174, + 69,176,70,178,0,180,0,182,0,184,0,186,0,188,71,190,0,192,72,194,0,196,73, + 198,74,200,75,202,0,204,0,206,0,208,0,210,0,212,76,214,77,216,78,218,79, + 220,0,222,0,224,0,226,0,228,80,230,0,232,81,234,82,236,83,238,0,240,0,242, + 84,244,85,246,0,248,86,250,0,252,0,254,87,256,88,258,89,260,0,262,0,264, + 0,266,0,268,0,270,0,272,0,274,90,276,91,278,92,280,0,282,0,284,0,286,0, + 288,93,290,94,292,95,294,0,296,96,298,97,300,98,302,99,304,0,306,100,308, + 101,310,102,312,103,314,0,316,104,318,105,320,106,322,107,324,108,12,0, + 1,2,3,4,5,6,7,8,9,10,11,35,2,0,68,68,100,100,2,0,73,73,105,105,2,0,83,83, + 115,115,2,0,69,69,101,101,2,0,67,67,99,99,2,0,84,84,116,116,2,0,82,82,114, + 114,2,0,79,79,111,111,2,0,80,80,112,112,2,0,78,78,110,110,2,0,72,72,104, + 104,2,0,86,86,118,118,2,0,65,65,97,97,2,0,76,76,108,108,2,0,88,88,120,120, + 2,0,70,70,102,102,2,0,77,77,109,109,2,0,71,71,103,103,2,0,75,75,107,107, + 2,0,87,87,119,119,6,0,9,10,13,13,32,32,47,47,91,91,93,93,2,0,10,10,13,13, + 3,0,9,10,13,13,32,32,1,0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82,84, + 84,92,92,110,110,114,114,116,116,4,0,10,10,13,13,34,34,92,92,2,0,43,43, + 45,45,1,0,96,96,2,0,66,66,98,98,2,0,89,89,121,121,2,0,85,85,117,117,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,11,0,9,10,13,13,32,32,34,35,44,44,47,47,58,58,60,60,62,63,92,92,124, + 124,1209,0,12,1,0,0,0,0,14,1,0,0,0,0,16,1,0,0,0,0,18,1,0,0,0,0,20,1,0,0, + 0,0,22,1,0,0,0,0,24,1,0,0,0,0,26,1,0,0,0,0,28,1,0,0,0,0,30,1,0,0,0,0,32, + 1,0,0,0,0,34,1,0,0,0,0,36,1,0,0,0,0,38,1,0,0,0,0,40,1,0,0,0,0,42,1,0,0, + 0,0,44,1,0,0,0,0,46,1,0,0,0,0,48,1,0,0,0,0,50,1,0,0,0,0,52,1,0,0,0,0,54, + 1,0,0,0,1,56,1,0,0,0,1,58,1,0,0,0,1,60,1,0,0,0,1,62,1,0,0,0,1,64,1,0,0, + 0,2,66,1,0,0,0,2,88,1,0,0,0,2,90,1,0,0,0,2,92,1,0,0,0,2,94,1,0,0,0,2,96, + 1,0,0,0,2,98,1,0,0,0,2,100,1,0,0,0,2,102,1,0,0,0,2,104,1,0,0,0,2,106,1, + 0,0,0,2,108,1,0,0,0,2,110,1,0,0,0,2,112,1,0,0,0,2,114,1,0,0,0,2,116,1,0, + 0,0,2,118,1,0,0,0,2,120,1,0,0,0,2,122,1,0,0,0,2,124,1,0,0,0,2,126,1,0,0, + 0,2,128,1,0,0,0,2,130,1,0,0,0,2,132,1,0,0,0,2,134,1,0,0,0,2,136,1,0,0,0, + 2,138,1,0,0,0,2,140,1,0,0,0,2,142,1,0,0,0,2,144,1,0,0,0,2,146,1,0,0,0,2, + 148,1,0,0,0,2,150,1,0,0,0,2,152,1,0,0,0,2,154,1,0,0,0,2,156,1,0,0,0,2,158, + 1,0,0,0,2,160,1,0,0,0,2,162,1,0,0,0,2,164,1,0,0,0,2,166,1,0,0,0,2,170,1, + 0,0,0,2,172,1,0,0,0,2,174,1,0,0,0,2,176,1,0,0,0,3,178,1,0,0,0,3,180,1,0, + 0,0,3,182,1,0,0,0,3,184,1,0,0,0,3,186,1,0,0,0,3,188,1,0,0,0,3,192,1,0,0, + 0,3,194,1,0,0,0,3,196,1,0,0,0,3,198,1,0,0,0,3,200,1,0,0,0,4,202,1,0,0,0, + 4,204,1,0,0,0,4,206,1,0,0,0,4,212,1,0,0,0,4,214,1,0,0,0,4,216,1,0,0,0,4, + 218,1,0,0,0,5,220,1,0,0,0,5,222,1,0,0,0,5,224,1,0,0,0,5,226,1,0,0,0,5,228, + 1,0,0,0,5,230,1,0,0,0,5,232,1,0,0,0,5,234,1,0,0,0,5,236,1,0,0,0,6,238,1, + 0,0,0,6,240,1,0,0,0,6,242,1,0,0,0,6,244,1,0,0,0,6,248,1,0,0,0,6,250,1,0, + 0,0,6,252,1,0,0,0,6,254,1,0,0,0,6,256,1,0,0,0,6,258,1,0,0,0,7,260,1,0,0, + 0,7,262,1,0,0,0,7,264,1,0,0,0,7,266,1,0,0,0,7,268,1,0,0,0,7,270,1,0,0,0, + 7,272,1,0,0,0,7,274,1,0,0,0,7,276,1,0,0,0,7,278,1,0,0,0,8,280,1,0,0,0,8, + 282,1,0,0,0,8,284,1,0,0,0,8,286,1,0,0,0,8,288,1,0,0,0,8,290,1,0,0,0,8,292, + 1,0,0,0,9,294,1,0,0,0,9,296,1,0,0,0,9,298,1,0,0,0,9,300,1,0,0,0,9,302,1, + 0,0,0,10,304,1,0,0,0,10,306,1,0,0,0,10,308,1,0,0,0,10,310,1,0,0,0,10,312, + 1,0,0,0,11,314,1,0,0,0,11,316,1,0,0,0,11,318,1,0,0,0,11,320,1,0,0,0,11, + 322,1,0,0,0,11,324,1,0,0,0,12,326,1,0,0,0,14,336,1,0,0,0,16,343,1,0,0,0, + 18,352,1,0,0,0,20,359,1,0,0,0,22,369,1,0,0,0,24,376,1,0,0,0,26,383,1,0, + 0,0,28,397,1,0,0,0,30,404,1,0,0,0,32,412,1,0,0,0,34,419,1,0,0,0,36,431, + 1,0,0,0,38,440,1,0,0,0,40,446,1,0,0,0,42,453,1,0,0,0,44,460,1,0,0,0,46, + 468,1,0,0,0,48,477,1,0,0,0,50,483,1,0,0,0,52,500,1,0,0,0,54,516,1,0,0,0, + 56,522,1,0,0,0,58,527,1,0,0,0,60,532,1,0,0,0,62,536,1,0,0,0,64,540,1,0, + 0,0,66,544,1,0,0,0,68,548,1,0,0,0,70,550,1,0,0,0,72,552,1,0,0,0,74,555, + 1,0,0,0,76,557,1,0,0,0,78,566,1,0,0,0,80,568,1,0,0,0,82,573,1,0,0,0,84, + 575,1,0,0,0,86,580,1,0,0,0,88,611,1,0,0,0,90,614,1,0,0,0,92,660,1,0,0,0, + 94,662,1,0,0,0,96,665,1,0,0,0,98,669,1,0,0,0,100,673,1,0,0,0,102,675,1, + 0,0,0,104,677,1,0,0,0,106,682,1,0,0,0,108,684,1,0,0,0,110,690,1,0,0,0,112, + 696,1,0,0,0,114,701,1,0,0,0,116,703,1,0,0,0,118,706,1,0,0,0,120,709,1,0, + 0,0,122,714,1,0,0,0,124,718,1,0,0,0,126,723,1,0,0,0,128,729,1,0,0,0,130, + 732,1,0,0,0,132,734,1,0,0,0,134,740,1,0,0,0,136,742,1,0,0,0,138,747,1,0, + 0,0,140,750,1,0,0,0,142,753,1,0,0,0,144,756,1,0,0,0,146,758,1,0,0,0,148, + 761,1,0,0,0,150,763,1,0,0,0,152,766,1,0,0,0,154,768,1,0,0,0,156,770,1,0, + 0,0,158,772,1,0,0,0,160,774,1,0,0,0,162,776,1,0,0,0,164,781,1,0,0,0,166, + 802,1,0,0,0,168,804,1,0,0,0,170,812,1,0,0,0,172,814,1,0,0,0,174,818,1,0, + 0,0,176,822,1,0,0,0,178,826,1,0,0,0,180,831,1,0,0,0,182,835,1,0,0,0,184, + 839,1,0,0,0,186,843,1,0,0,0,188,847,1,0,0,0,190,859,1,0,0,0,192,862,1,0, + 0,0,194,866,1,0,0,0,196,870,1,0,0,0,198,874,1,0,0,0,200,878,1,0,0,0,202, + 882,1,0,0,0,204,887,1,0,0,0,206,891,1,0,0,0,208,899,1,0,0,0,210,920,1,0, + 0,0,212,924,1,0,0,0,214,928,1,0,0,0,216,932,1,0,0,0,218,936,1,0,0,0,220, + 940,1,0,0,0,222,945,1,0,0,0,224,949,1,0,0,0,226,953,1,0,0,0,228,957,1,0, + 0,0,230,960,1,0,0,0,232,964,1,0,0,0,234,968,1,0,0,0,236,972,1,0,0,0,238, + 976,1,0,0,0,240,981,1,0,0,0,242,986,1,0,0,0,244,991,1,0,0,0,246,998,1,0, + 0,0,248,1007,1,0,0,0,250,1014,1,0,0,0,252,1018,1,0,0,0,254,1022,1,0,0,0, + 256,1026,1,0,0,0,258,1030,1,0,0,0,260,1034,1,0,0,0,262,1040,1,0,0,0,264, + 1044,1,0,0,0,266,1048,1,0,0,0,268,1052,1,0,0,0,270,1056,1,0,0,0,272,1060, + 1,0,0,0,274,1064,1,0,0,0,276,1068,1,0,0,0,278,1072,1,0,0,0,280,1076,1,0, + 0,0,282,1081,1,0,0,0,284,1085,1,0,0,0,286,1089,1,0,0,0,288,1093,1,0,0,0, + 290,1097,1,0,0,0,292,1101,1,0,0,0,294,1105,1,0,0,0,296,1110,1,0,0,0,298, + 1115,1,0,0,0,300,1119,1,0,0,0,302,1123,1,0,0,0,304,1127,1,0,0,0,306,1132, + 1,0,0,0,308,1142,1,0,0,0,310,1146,1,0,0,0,312,1150,1,0,0,0,314,1154,1,0, + 0,0,316,1159,1,0,0,0,318,1166,1,0,0,0,320,1170,1,0,0,0,322,1174,1,0,0,0, + 324,1178,1,0,0,0,326,327,7,0,0,0,327,328,7,1,0,0,328,329,7,2,0,0,329,330, + 7,2,0,0,330,331,7,3,0,0,331,332,7,4,0,0,332,333,7,5,0,0,333,334,1,0,0,0, + 334,335,6,0,0,0,335,13,1,0,0,0,336,337,7,0,0,0,337,338,7,6,0,0,338,339, + 7,7,0,0,339,340,7,8,0,0,340,341,1,0,0,0,341,342,6,1,1,0,342,15,1,0,0,0, + 343,344,7,3,0,0,344,345,7,9,0,0,345,346,7,6,0,0,346,347,7,1,0,0,347,348, + 7,4,0,0,348,349,7,10,0,0,349,350,1,0,0,0,350,351,6,2,2,0,351,17,1,0,0,0, + 352,353,7,3,0,0,353,354,7,11,0,0,354,355,7,12,0,0,355,356,7,13,0,0,356, + 357,1,0,0,0,357,358,6,3,0,0,358,19,1,0,0,0,359,360,7,3,0,0,360,361,7,14, + 0,0,361,362,7,8,0,0,362,363,7,13,0,0,363,364,7,12,0,0,364,365,7,1,0,0,365, + 366,7,9,0,0,366,367,1,0,0,0,367,368,6,4,3,0,368,21,1,0,0,0,369,370,7,15, + 0,0,370,371,7,6,0,0,371,372,7,7,0,0,372,373,7,16,0,0,373,374,1,0,0,0,374, + 375,6,5,4,0,375,23,1,0,0,0,376,377,7,17,0,0,377,378,7,6,0,0,378,379,7,7, + 0,0,379,380,7,18,0,0,380,381,1,0,0,0,381,382,6,6,0,0,382,25,1,0,0,0,383, + 384,7,1,0,0,384,385,7,9,0,0,385,386,7,13,0,0,386,387,7,1,0,0,387,388,7, + 9,0,0,388,389,7,3,0,0,389,390,7,2,0,0,390,391,7,5,0,0,391,392,7,12,0,0, + 392,393,7,5,0,0,393,394,7,2,0,0,394,395,1,0,0,0,395,396,6,7,0,0,396,27, + 1,0,0,0,397,398,7,18,0,0,398,399,7,3,0,0,399,400,7,3,0,0,400,401,7,8,0, + 0,401,402,1,0,0,0,402,403,6,8,1,0,403,29,1,0,0,0,404,405,7,13,0,0,405,406, + 7,1,0,0,406,407,7,16,0,0,407,408,7,1,0,0,408,409,7,5,0,0,409,410,1,0,0, + 0,410,411,6,9,0,0,411,31,1,0,0,0,412,413,7,16,0,0,413,414,7,3,0,0,414,415, + 7,5,0,0,415,416,7,12,0,0,416,417,1,0,0,0,417,418,6,10,5,0,418,33,1,0,0, + 0,419,420,7,16,0,0,420,421,7,11,0,0,421,422,5,95,0,0,422,423,7,3,0,0,423, + 424,7,14,0,0,424,425,7,8,0,0,425,426,7,12,0,0,426,427,7,9,0,0,427,428,7, + 0,0,0,428,429,1,0,0,0,429,430,6,11,6,0,430,35,1,0,0,0,431,432,7,6,0,0,432, + 433,7,3,0,0,433,434,7,9,0,0,434,435,7,12,0,0,435,436,7,16,0,0,436,437,7, + 3,0,0,437,438,1,0,0,0,438,439,6,12,7,0,439,37,1,0,0,0,440,441,7,6,0,0,441, + 442,7,7,0,0,442,443,7,19,0,0,443,444,1,0,0,0,444,445,6,13,0,0,445,39,1, + 0,0,0,446,447,7,2,0,0,447,448,7,10,0,0,448,449,7,7,0,0,449,450,7,19,0,0, + 450,451,1,0,0,0,451,452,6,14,8,0,452,41,1,0,0,0,453,454,7,2,0,0,454,455, + 7,7,0,0,455,456,7,6,0,0,456,457,7,5,0,0,457,458,1,0,0,0,458,459,6,15,0, + 0,459,43,1,0,0,0,460,461,7,2,0,0,461,462,7,5,0,0,462,463,7,12,0,0,463,464, + 7,5,0,0,464,465,7,2,0,0,465,466,1,0,0,0,466,467,6,16,0,0,467,45,1,0,0,0, + 468,469,7,19,0,0,469,470,7,10,0,0,470,471,7,3,0,0,471,472,7,6,0,0,472,473, + 7,3,0,0,473,474,1,0,0,0,474,475,6,17,0,0,475,47,1,0,0,0,476,478,8,20,0, + 0,477,476,1,0,0,0,478,479,1,0,0,0,479,477,1,0,0,0,479,480,1,0,0,0,480,481, + 1,0,0,0,481,482,6,18,0,0,482,49,1,0,0,0,483,484,5,47,0,0,484,485,5,47,0, + 0,485,489,1,0,0,0,486,488,8,21,0,0,487,486,1,0,0,0,488,491,1,0,0,0,489, + 487,1,0,0,0,489,490,1,0,0,0,490,493,1,0,0,0,491,489,1,0,0,0,492,494,5,13, + 0,0,493,492,1,0,0,0,493,494,1,0,0,0,494,496,1,0,0,0,495,497,5,10,0,0,496, + 495,1,0,0,0,496,497,1,0,0,0,497,498,1,0,0,0,498,499,6,19,9,0,499,51,1,0, + 0,0,500,501,5,47,0,0,501,502,5,42,0,0,502,507,1,0,0,0,503,506,3,52,20,0, + 504,506,9,0,0,0,505,503,1,0,0,0,505,504,1,0,0,0,506,509,1,0,0,0,507,508, + 1,0,0,0,507,505,1,0,0,0,508,510,1,0,0,0,509,507,1,0,0,0,510,511,5,42,0, + 0,511,512,5,47,0,0,512,513,1,0,0,0,513,514,6,20,9,0,514,53,1,0,0,0,515, + 517,7,22,0,0,516,515,1,0,0,0,517,518,1,0,0,0,518,516,1,0,0,0,518,519,1, + 0,0,0,519,520,1,0,0,0,520,521,6,21,9,0,521,55,1,0,0,0,522,523,3,162,75, + 0,523,524,1,0,0,0,524,525,6,22,10,0,525,526,6,22,11,0,526,57,1,0,0,0,527, + 528,3,66,27,0,528,529,1,0,0,0,529,530,6,23,12,0,530,531,6,23,13,0,531,59, + 1,0,0,0,532,533,3,54,21,0,533,534,1,0,0,0,534,535,6,24,9,0,535,61,1,0,0, + 0,536,537,3,50,19,0,537,538,1,0,0,0,538,539,6,25,9,0,539,63,1,0,0,0,540, + 541,3,52,20,0,541,542,1,0,0,0,542,543,6,26,9,0,543,65,1,0,0,0,544,545,5, + 124,0,0,545,546,1,0,0,0,546,547,6,27,13,0,547,67,1,0,0,0,548,549,7,23,0, + 0,549,69,1,0,0,0,550,551,7,24,0,0,551,71,1,0,0,0,552,553,5,92,0,0,553,554, + 7,25,0,0,554,73,1,0,0,0,555,556,8,26,0,0,556,75,1,0,0,0,557,559,7,3,0,0, + 558,560,7,27,0,0,559,558,1,0,0,0,559,560,1,0,0,0,560,562,1,0,0,0,561,563, + 3,68,28,0,562,561,1,0,0,0,563,564,1,0,0,0,564,562,1,0,0,0,564,565,1,0,0, + 0,565,77,1,0,0,0,566,567,5,64,0,0,567,79,1,0,0,0,568,569,5,96,0,0,569,81, + 1,0,0,0,570,574,8,28,0,0,571,572,5,96,0,0,572,574,5,96,0,0,573,570,1,0, + 0,0,573,571,1,0,0,0,574,83,1,0,0,0,575,576,5,95,0,0,576,85,1,0,0,0,577, + 581,3,70,29,0,578,581,3,68,28,0,579,581,3,84,36,0,580,577,1,0,0,0,580,578, + 1,0,0,0,580,579,1,0,0,0,581,87,1,0,0,0,582,587,5,34,0,0,583,586,3,72,30, + 0,584,586,3,74,31,0,585,583,1,0,0,0,585,584,1,0,0,0,586,589,1,0,0,0,587, + 585,1,0,0,0,587,588,1,0,0,0,588,590,1,0,0,0,589,587,1,0,0,0,590,612,5,34, + 0,0,591,592,5,34,0,0,592,593,5,34,0,0,593,594,5,34,0,0,594,598,1,0,0,0, + 595,597,8,21,0,0,596,595,1,0,0,0,597,600,1,0,0,0,598,599,1,0,0,0,598,596, + 1,0,0,0,599,601,1,0,0,0,600,598,1,0,0,0,601,602,5,34,0,0,602,603,5,34,0, + 0,603,604,5,34,0,0,604,606,1,0,0,0,605,607,5,34,0,0,606,605,1,0,0,0,606, + 607,1,0,0,0,607,609,1,0,0,0,608,610,5,34,0,0,609,608,1,0,0,0,609,610,1, + 0,0,0,610,612,1,0,0,0,611,582,1,0,0,0,611,591,1,0,0,0,612,89,1,0,0,0,613, + 615,3,68,28,0,614,613,1,0,0,0,615,616,1,0,0,0,616,614,1,0,0,0,616,617,1, + 0,0,0,617,91,1,0,0,0,618,620,3,68,28,0,619,618,1,0,0,0,620,621,1,0,0,0, + 621,619,1,0,0,0,621,622,1,0,0,0,622,623,1,0,0,0,623,627,3,106,47,0,624, + 626,3,68,28,0,625,624,1,0,0,0,626,629,1,0,0,0,627,625,1,0,0,0,627,628,1, + 0,0,0,628,661,1,0,0,0,629,627,1,0,0,0,630,632,3,106,47,0,631,633,3,68,28, + 0,632,631,1,0,0,0,633,634,1,0,0,0,634,632,1,0,0,0,634,635,1,0,0,0,635,661, + 1,0,0,0,636,638,3,68,28,0,637,636,1,0,0,0,638,639,1,0,0,0,639,637,1,0,0, + 0,639,640,1,0,0,0,640,648,1,0,0,0,641,645,3,106,47,0,642,644,3,68,28,0, + 643,642,1,0,0,0,644,647,1,0,0,0,645,643,1,0,0,0,645,646,1,0,0,0,646,649, + 1,0,0,0,647,645,1,0,0,0,648,641,1,0,0,0,648,649,1,0,0,0,649,650,1,0,0,0, + 650,651,3,76,32,0,651,661,1,0,0,0,652,654,3,106,47,0,653,655,3,68,28,0, + 654,653,1,0,0,0,655,656,1,0,0,0,656,654,1,0,0,0,656,657,1,0,0,0,657,658, + 1,0,0,0,658,659,3,76,32,0,659,661,1,0,0,0,660,619,1,0,0,0,660,630,1,0,0, + 0,660,637,1,0,0,0,660,652,1,0,0,0,661,93,1,0,0,0,662,663,7,29,0,0,663,664, + 7,30,0,0,664,95,1,0,0,0,665,666,7,12,0,0,666,667,7,9,0,0,667,668,7,0,0, + 0,668,97,1,0,0,0,669,670,7,12,0,0,670,671,7,2,0,0,671,672,7,4,0,0,672,99, + 1,0,0,0,673,674,5,61,0,0,674,101,1,0,0,0,675,676,5,44,0,0,676,103,1,0,0, + 0,677,678,7,0,0,0,678,679,7,3,0,0,679,680,7,2,0,0,680,681,7,4,0,0,681,105, + 1,0,0,0,682,683,5,46,0,0,683,107,1,0,0,0,684,685,7,15,0,0,685,686,7,12, + 0,0,686,687,7,13,0,0,687,688,7,2,0,0,688,689,7,3,0,0,689,109,1,0,0,0,690, + 691,7,15,0,0,691,692,7,1,0,0,692,693,7,6,0,0,693,694,7,2,0,0,694,695,7, + 5,0,0,695,111,1,0,0,0,696,697,7,13,0,0,697,698,7,12,0,0,698,699,7,2,0,0, + 699,700,7,5,0,0,700,113,1,0,0,0,701,702,5,40,0,0,702,115,1,0,0,0,703,704, + 7,1,0,0,704,705,7,9,0,0,705,117,1,0,0,0,706,707,7,1,0,0,707,708,7,2,0,0, + 708,119,1,0,0,0,709,710,7,13,0,0,710,711,7,1,0,0,711,712,7,18,0,0,712,713, + 7,3,0,0,713,121,1,0,0,0,714,715,7,9,0,0,715,716,7,7,0,0,716,717,7,5,0,0, + 717,123,1,0,0,0,718,719,7,9,0,0,719,720,7,31,0,0,720,721,7,13,0,0,721,722, + 7,13,0,0,722,125,1,0,0,0,723,724,7,9,0,0,724,725,7,31,0,0,725,726,7,13, + 0,0,726,727,7,13,0,0,727,728,7,2,0,0,728,127,1,0,0,0,729,730,7,7,0,0,730, + 731,7,6,0,0,731,129,1,0,0,0,732,733,5,63,0,0,733,131,1,0,0,0,734,735,7, + 6,0,0,735,736,7,13,0,0,736,737,7,1,0,0,737,738,7,18,0,0,738,739,7,3,0,0, + 739,133,1,0,0,0,740,741,5,41,0,0,741,135,1,0,0,0,742,743,7,5,0,0,743,744, + 7,6,0,0,744,745,7,31,0,0,745,746,7,3,0,0,746,137,1,0,0,0,747,748,5,61,0, + 0,748,749,5,61,0,0,749,139,1,0,0,0,750,751,5,61,0,0,751,752,5,126,0,0,752, + 141,1,0,0,0,753,754,5,33,0,0,754,755,5,61,0,0,755,143,1,0,0,0,756,757,5, + 60,0,0,757,145,1,0,0,0,758,759,5,60,0,0,759,760,5,61,0,0,760,147,1,0,0, + 0,761,762,5,62,0,0,762,149,1,0,0,0,763,764,5,62,0,0,764,765,5,61,0,0,765, + 151,1,0,0,0,766,767,5,43,0,0,767,153,1,0,0,0,768,769,5,45,0,0,769,155,1, + 0,0,0,770,771,5,42,0,0,771,157,1,0,0,0,772,773,5,47,0,0,773,159,1,0,0,0, + 774,775,5,37,0,0,775,161,1,0,0,0,776,777,5,91,0,0,777,778,1,0,0,0,778,779, + 6,75,0,0,779,780,6,75,0,0,780,163,1,0,0,0,781,782,5,93,0,0,782,783,1,0, + 0,0,783,784,6,76,13,0,784,785,6,76,13,0,785,165,1,0,0,0,786,790,3,70,29, + 0,787,789,3,86,37,0,788,787,1,0,0,0,789,792,1,0,0,0,790,788,1,0,0,0,790, + 791,1,0,0,0,791,803,1,0,0,0,792,790,1,0,0,0,793,796,3,84,36,0,794,796,3, + 78,33,0,795,793,1,0,0,0,795,794,1,0,0,0,796,798,1,0,0,0,797,799,3,86,37, + 0,798,797,1,0,0,0,799,800,1,0,0,0,800,798,1,0,0,0,800,801,1,0,0,0,801,803, + 1,0,0,0,802,786,1,0,0,0,802,795,1,0,0,0,803,167,1,0,0,0,804,806,3,80,34, + 0,805,807,3,82,35,0,806,805,1,0,0,0,807,808,1,0,0,0,808,806,1,0,0,0,808, + 809,1,0,0,0,809,810,1,0,0,0,810,811,3,80,34,0,811,169,1,0,0,0,812,813,3, + 168,78,0,813,171,1,0,0,0,814,815,3,50,19,0,815,816,1,0,0,0,816,817,6,80, + 9,0,817,173,1,0,0,0,818,819,3,52,20,0,819,820,1,0,0,0,820,821,6,81,9,0, + 821,175,1,0,0,0,822,823,3,54,21,0,823,824,1,0,0,0,824,825,6,82,9,0,825, + 177,1,0,0,0,826,827,3,66,27,0,827,828,1,0,0,0,828,829,6,83,12,0,829,830, + 6,83,13,0,830,179,1,0,0,0,831,832,3,162,75,0,832,833,1,0,0,0,833,834,6, + 84,10,0,834,181,1,0,0,0,835,836,3,164,76,0,836,837,1,0,0,0,837,838,6,85, + 14,0,838,183,1,0,0,0,839,840,3,102,45,0,840,841,1,0,0,0,841,842,6,86,15, + 0,842,185,1,0,0,0,843,844,3,100,44,0,844,845,1,0,0,0,845,846,6,87,16,0, + 846,187,1,0,0,0,847,848,7,16,0,0,848,849,7,3,0,0,849,850,7,5,0,0,850,851, + 7,12,0,0,851,852,7,0,0,0,852,853,7,12,0,0,853,854,7,5,0,0,854,855,7,12, + 0,0,855,189,1,0,0,0,856,860,8,32,0,0,857,858,5,47,0,0,858,860,8,33,0,0, + 859,856,1,0,0,0,859,857,1,0,0,0,860,191,1,0,0,0,861,863,3,190,89,0,862, + 861,1,0,0,0,863,864,1,0,0,0,864,862,1,0,0,0,864,865,1,0,0,0,865,193,1,0, + 0,0,866,867,3,170,79,0,867,868,1,0,0,0,868,869,6,91,17,0,869,195,1,0,0, + 0,870,871,3,50,19,0,871,872,1,0,0,0,872,873,6,92,9,0,873,197,1,0,0,0,874, + 875,3,52,20,0,875,876,1,0,0,0,876,877,6,93,9,0,877,199,1,0,0,0,878,879, + 3,54,21,0,879,880,1,0,0,0,880,881,6,94,9,0,881,201,1,0,0,0,882,883,3,66, + 27,0,883,884,1,0,0,0,884,885,6,95,12,0,885,886,6,95,13,0,886,203,1,0,0, + 0,887,888,3,106,47,0,888,889,1,0,0,0,889,890,6,96,18,0,890,205,1,0,0,0, + 891,892,3,102,45,0,892,893,1,0,0,0,893,894,6,97,15,0,894,207,1,0,0,0,895, + 900,3,70,29,0,896,900,3,68,28,0,897,900,3,84,36,0,898,900,3,156,72,0,899, + 895,1,0,0,0,899,896,1,0,0,0,899,897,1,0,0,0,899,898,1,0,0,0,900,209,1,0, + 0,0,901,904,3,70,29,0,902,904,3,156,72,0,903,901,1,0,0,0,903,902,1,0,0, + 0,904,908,1,0,0,0,905,907,3,208,98,0,906,905,1,0,0,0,907,910,1,0,0,0,908, + 906,1,0,0,0,908,909,1,0,0,0,909,921,1,0,0,0,910,908,1,0,0,0,911,914,3,84, + 36,0,912,914,3,78,33,0,913,911,1,0,0,0,913,912,1,0,0,0,914,916,1,0,0,0, + 915,917,3,208,98,0,916,915,1,0,0,0,917,918,1,0,0,0,918,916,1,0,0,0,918, + 919,1,0,0,0,919,921,1,0,0,0,920,903,1,0,0,0,920,913,1,0,0,0,921,211,1,0, + 0,0,922,925,3,210,99,0,923,925,3,168,78,0,924,922,1,0,0,0,924,923,1,0,0, + 0,925,926,1,0,0,0,926,924,1,0,0,0,926,927,1,0,0,0,927,213,1,0,0,0,928,929, + 3,50,19,0,929,930,1,0,0,0,930,931,6,101,9,0,931,215,1,0,0,0,932,933,3,52, + 20,0,933,934,1,0,0,0,934,935,6,102,9,0,935,217,1,0,0,0,936,937,3,54,21, + 0,937,938,1,0,0,0,938,939,6,103,9,0,939,219,1,0,0,0,940,941,3,66,27,0,941, + 942,1,0,0,0,942,943,6,104,12,0,943,944,6,104,13,0,944,221,1,0,0,0,945,946, + 3,100,44,0,946,947,1,0,0,0,947,948,6,105,16,0,948,223,1,0,0,0,949,950,3, + 102,45,0,950,951,1,0,0,0,951,952,6,106,15,0,952,225,1,0,0,0,953,954,3,106, + 47,0,954,955,1,0,0,0,955,956,6,107,18,0,956,227,1,0,0,0,957,958,7,12,0, + 0,958,959,7,2,0,0,959,229,1,0,0,0,960,961,3,212,100,0,961,962,1,0,0,0,962, + 963,6,109,19,0,963,231,1,0,0,0,964,965,3,50,19,0,965,966,1,0,0,0,966,967, + 6,110,9,0,967,233,1,0,0,0,968,969,3,52,20,0,969,970,1,0,0,0,970,971,6,111, + 9,0,971,235,1,0,0,0,972,973,3,54,21,0,973,974,1,0,0,0,974,975,6,112,9,0, + 975,237,1,0,0,0,976,977,3,66,27,0,977,978,1,0,0,0,978,979,6,113,12,0,979, + 980,6,113,13,0,980,239,1,0,0,0,981,982,3,162,75,0,982,983,1,0,0,0,983,984, + 6,114,10,0,984,985,6,114,20,0,985,241,1,0,0,0,986,987,7,7,0,0,987,988,7, + 9,0,0,988,989,1,0,0,0,989,990,6,115,21,0,990,243,1,0,0,0,991,992,7,19,0, + 0,992,993,7,1,0,0,993,994,7,5,0,0,994,995,7,10,0,0,995,996,1,0,0,0,996, + 997,6,116,21,0,997,245,1,0,0,0,998,999,8,34,0,0,999,247,1,0,0,0,1000,1002, + 3,246,117,0,1001,1000,1,0,0,0,1002,1003,1,0,0,0,1003,1001,1,0,0,0,1003, + 1004,1,0,0,0,1004,1005,1,0,0,0,1005,1006,3,316,152,0,1006,1008,1,0,0,0, + 1007,1001,1,0,0,0,1007,1008,1,0,0,0,1008,1010,1,0,0,0,1009,1011,3,246,117, + 0,1010,1009,1,0,0,0,1011,1012,1,0,0,0,1012,1010,1,0,0,0,1012,1013,1,0,0, + 0,1013,249,1,0,0,0,1014,1015,3,170,79,0,1015,1016,1,0,0,0,1016,1017,6,119, + 17,0,1017,251,1,0,0,0,1018,1019,3,248,118,0,1019,1020,1,0,0,0,1020,1021, + 6,120,22,0,1021,253,1,0,0,0,1022,1023,3,50,19,0,1023,1024,1,0,0,0,1024, + 1025,6,121,9,0,1025,255,1,0,0,0,1026,1027,3,52,20,0,1027,1028,1,0,0,0,1028, + 1029,6,122,9,0,1029,257,1,0,0,0,1030,1031,3,54,21,0,1031,1032,1,0,0,0,1032, + 1033,6,123,9,0,1033,259,1,0,0,0,1034,1035,3,66,27,0,1035,1036,1,0,0,0,1036, + 1037,6,124,12,0,1037,1038,6,124,13,0,1038,1039,6,124,13,0,1039,261,1,0, + 0,0,1040,1041,3,100,44,0,1041,1042,1,0,0,0,1042,1043,6,125,16,0,1043,263, + 1,0,0,0,1044,1045,3,102,45,0,1045,1046,1,0,0,0,1046,1047,6,126,15,0,1047, + 265,1,0,0,0,1048,1049,3,106,47,0,1049,1050,1,0,0,0,1050,1051,6,127,18,0, + 1051,267,1,0,0,0,1052,1053,3,244,116,0,1053,1054,1,0,0,0,1054,1055,6,128, + 23,0,1055,269,1,0,0,0,1056,1057,3,212,100,0,1057,1058,1,0,0,0,1058,1059, + 6,129,19,0,1059,271,1,0,0,0,1060,1061,3,170,79,0,1061,1062,1,0,0,0,1062, + 1063,6,130,17,0,1063,273,1,0,0,0,1064,1065,3,50,19,0,1065,1066,1,0,0,0, + 1066,1067,6,131,9,0,1067,275,1,0,0,0,1068,1069,3,52,20,0,1069,1070,1,0, + 0,0,1070,1071,6,132,9,0,1071,277,1,0,0,0,1072,1073,3,54,21,0,1073,1074, + 1,0,0,0,1074,1075,6,133,9,0,1075,279,1,0,0,0,1076,1077,3,66,27,0,1077,1078, + 1,0,0,0,1078,1079,6,134,12,0,1079,1080,6,134,13,0,1080,281,1,0,0,0,1081, + 1082,3,106,47,0,1082,1083,1,0,0,0,1083,1084,6,135,18,0,1084,283,1,0,0,0, + 1085,1086,3,170,79,0,1086,1087,1,0,0,0,1087,1088,6,136,17,0,1088,285,1, + 0,0,0,1089,1090,3,166,77,0,1090,1091,1,0,0,0,1091,1092,6,137,24,0,1092, + 287,1,0,0,0,1093,1094,3,50,19,0,1094,1095,1,0,0,0,1095,1096,6,138,9,0,1096, + 289,1,0,0,0,1097,1098,3,52,20,0,1098,1099,1,0,0,0,1099,1100,6,139,9,0,1100, + 291,1,0,0,0,1101,1102,3,54,21,0,1102,1103,1,0,0,0,1103,1104,6,140,9,0,1104, + 293,1,0,0,0,1105,1106,3,66,27,0,1106,1107,1,0,0,0,1107,1108,6,141,12,0, + 1108,1109,6,141,13,0,1109,295,1,0,0,0,1110,1111,7,1,0,0,1111,1112,7,9,0, + 0,1112,1113,7,15,0,0,1113,1114,7,7,0,0,1114,297,1,0,0,0,1115,1116,3,50, + 19,0,1116,1117,1,0,0,0,1117,1118,6,143,9,0,1118,299,1,0,0,0,1119,1120,3, + 52,20,0,1120,1121,1,0,0,0,1121,1122,6,144,9,0,1122,301,1,0,0,0,1123,1124, + 3,54,21,0,1124,1125,1,0,0,0,1125,1126,6,145,9,0,1126,303,1,0,0,0,1127,1128, + 3,66,27,0,1128,1129,1,0,0,0,1129,1130,6,146,12,0,1130,1131,6,146,13,0,1131, + 305,1,0,0,0,1132,1133,7,15,0,0,1133,1134,7,31,0,0,1134,1135,7,9,0,0,1135, + 1136,7,4,0,0,1136,1137,7,5,0,0,1137,1138,7,1,0,0,1138,1139,7,7,0,0,1139, + 1140,7,9,0,0,1140,1141,7,2,0,0,1141,307,1,0,0,0,1142,1143,3,50,19,0,1143, + 1144,1,0,0,0,1144,1145,6,148,9,0,1145,309,1,0,0,0,1146,1147,3,52,20,0,1147, + 1148,1,0,0,0,1148,1149,6,149,9,0,1149,311,1,0,0,0,1150,1151,3,54,21,0,1151, + 1152,1,0,0,0,1152,1153,6,150,9,0,1153,313,1,0,0,0,1154,1155,3,164,76,0, + 1155,1156,1,0,0,0,1156,1157,6,151,14,0,1157,1158,6,151,13,0,1158,315,1, + 0,0,0,1159,1160,5,58,0,0,1160,317,1,0,0,0,1161,1167,3,78,33,0,1162,1167, + 3,68,28,0,1163,1167,3,106,47,0,1164,1167,3,70,29,0,1165,1167,3,84,36,0, + 1166,1161,1,0,0,0,1166,1162,1,0,0,0,1166,1163,1,0,0,0,1166,1164,1,0,0,0, + 1166,1165,1,0,0,0,1167,1168,1,0,0,0,1168,1166,1,0,0,0,1168,1169,1,0,0,0, + 1169,319,1,0,0,0,1170,1171,3,50,19,0,1171,1172,1,0,0,0,1172,1173,6,154, + 9,0,1173,321,1,0,0,0,1174,1175,3,52,20,0,1175,1176,1,0,0,0,1176,1177,6, + 155,9,0,1177,323,1,0,0,0,1178,1179,3,54,21,0,1179,1180,1,0,0,0,1180,1181, + 6,156,9,0,1181,325,1,0,0,0,58,0,1,2,3,4,5,6,7,8,9,10,11,479,489,493,496, + 505,507,518,559,564,573,580,585,587,598,606,609,611,616,621,627,634,639, + 645,648,656,660,790,795,800,802,808,859,864,899,903,908,913,918,920,924, + 926,1003,1007,1012,1166,1168,25,5,2,0,5,4,0,5,6,0,5,1,0,5,3,0,5,10,0,5, + 8,0,5,5,0,5,9,0,0,1,0,7,64,0,5,0,0,7,26,0,4,0,0,7,65,0,7,34,0,7,33,0,7, + 67,0,7,36,0,7,76,0,5,11,0,5,7,0,7,86,0,7,85,0,7,66,0]; + + private static __ATN: ATN; + public static get _ATN(): ATN { + if (!esql_lexer.__ATN) { + esql_lexer.__ATN = new ATNDeserializer().deserialize(esql_lexer._serializedATN); + } + + return esql_lexer.__ATN; + } + + + static DecisionsToDFA = esql_lexer._ATN.decisionToState.map( (ds: DecisionState, index: number) => new DFA(ds, index) ); +} \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 similarity index 93% rename from packages/kbn-monaco/src/esql/antlr/esql_parser.g4 rename to packages/kbn-esql-ast/src/antlr/esql_parser.g4 index 0c7cf96f5a2e1..b79e6314eedda 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 @@ -1,3 +1,12 @@ +/* + * 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. + */ + +// DO NOT MODIFY THIS FILE BY HAND. IT IS MANAGED BY A CI JOB. + /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one @@ -24,6 +33,7 @@ sourceCommand | fromCommand | rowCommand | showCommand + | metaCommand ; processingCommand @@ -114,7 +124,6 @@ deprecated_metadata : OPENING_BRACKET metadataOption CLOSING_BRACKET ; - evalCommand : EVAL fields ; @@ -149,11 +158,6 @@ identifierPattern : ID_PATTERN ; -idPattern - : UNQUOTED_ID_PATTERN - | QUOTED_IDENTIFIER - ; - constant : NULL #nullLiteral | integerValue UNQUOTED_IDENTIFIER #qualifiedIntegerLiteral @@ -250,7 +254,10 @@ subqueryExpression showCommand : SHOW INFO #showInfo - | SHOW FUNCTIONS #showFunctions + ; + +metaCommand + : META FUNCTIONS #metaFunctions ; enrichCommand diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.interp b/packages/kbn-esql-ast/src/antlr/esql_parser.interp new file mode 100644 index 0000000000000..b8c5f609e75e5 --- /dev/null +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.interp @@ -0,0 +1,278 @@ +token literal names: +null +'dissect' +'drop' +'enrich' +'eval' +'explain' +'from' +'grok' +'inlinestats' +'keep' +'limit' +'meta' +'mv_expand' +'rename' +'row' +'show' +'sort' +'stats' +'where' +null +null +null +null +null +null +null +'|' +null +null +null +'by' +'and' +'asc' +'=' +',' +'desc' +'.' +'false' +'first' +'last' +'(' +'in' +'is' +'like' +'not' +'null' +'nulls' +'or' +'?' +'rlike' +')' +'true' +'==' +'=~' +'!=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'/' +'%' +null +']' +null +null +null +null +null +'metadata' +null +null +null +null +null +null +null +null +'as' +null +null +null +'on' +'with' +null +null +null +null +null +null +null +null +null +null +'info' +null +null +null +'functions' +null +null +null +':' +null +null +null +null + +token symbolic names: +null +DISSECT +DROP +ENRICH +EVAL +EXPLAIN +FROM +GROK +INLINESTATS +KEEP +LIMIT +META +MV_EXPAND +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 +CIEQ +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 +ID_PATTERN +PROJECT_LINE_COMMENT +PROJECT_MULTILINE_COMMENT +PROJECT_WS +AS +RENAME_LINE_COMMENT +RENAME_MULTILINE_COMMENT +RENAME_WS +ON +WITH +ENRICH_POLICY_NAME +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 +SHOW_LINE_COMMENT +SHOW_MULTILINE_COMMENT +SHOW_WS +FUNCTIONS +META_LINE_COMMENT +META_MULTILINE_COMMENT +META_WS +COLON +SETTING +SETTING_LINE_COMMENT +SETTTING_MULTILINE_COMMENT +SETTING_WS + +rule names: +singleStatement +query +sourceCommand +processingCommand +whereCommand +booleanExpression +regexBooleanExpression +valueExpression +operatorExpression +primaryExpression +functionExpression +rowCommand +fields +field +fromCommand +metadata +metadataOption +deprecated_metadata +evalCommand +statsCommand +inlinestatsCommand +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 +metaCommand +enrichCommand +enrichWithClause + + +atn: +[4, 1, 108, 510, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 112, 8, 1, 10, 1, 12, 1, 115, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 122, 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, 137, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 149, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 156, 8, 5, 10, 5, 12, 5, 159, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 166, 8, 5, 1, 5, 1, 5, 3, 5, 170, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 178, 8, 5, 10, 5, 12, 5, 181, 9, 5, 1, 6, 1, 6, 3, 6, 185, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 192, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 197, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 204, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 210, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 218, 8, 8, 10, 8, 12, 8, 221, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 230, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 238, 8, 10, 10, 10, 12, 10, 241, 9, 10, 3, 10, 243, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 5, 12, 253, 8, 12, 10, 12, 12, 12, 256, 9, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 263, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 269, 8, 14, 10, 14, 12, 14, 272, 9, 14, 1, 14, 3, 14, 275, 8, 14, 1, 15, 1, 15, 3, 15, 279, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 285, 8, 16, 10, 16, 12, 16, 288, 9, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 3, 19, 299, 8, 19, 1, 19, 1, 19, 3, 19, 303, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 309, 8, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 5, 22, 316, 8, 22, 10, 22, 12, 22, 319, 9, 22, 1, 23, 1, 23, 1, 23, 5, 23, 324, 8, 23, 10, 23, 12, 23, 327, 9, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 346, 8, 26, 10, 26, 12, 26, 349, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 357, 8, 26, 10, 26, 12, 26, 360, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 368, 8, 26, 10, 26, 12, 26, 371, 9, 26, 1, 26, 1, 26, 3, 26, 375, 8, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 384, 8, 28, 10, 28, 12, 28, 387, 9, 28, 1, 29, 1, 29, 3, 29, 391, 8, 29, 1, 29, 1, 29, 3, 29, 395, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 401, 8, 30, 10, 30, 12, 30, 404, 9, 30, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 410, 8, 31, 10, 31, 12, 31, 413, 9, 31, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 419, 8, 32, 10, 32, 12, 32, 422, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 432, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 5, 37, 444, 8, 37, 10, 37, 12, 37, 447, 9, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 3, 40, 457, 8, 40, 1, 41, 3, 41, 460, 8, 41, 1, 41, 1, 41, 1, 42, 3, 42, 465, 8, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 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, 3, 49, 490, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 496, 8, 49, 10, 49, 12, 49, 499, 9, 49, 3, 49, 501, 8, 49, 1, 50, 1, 50, 1, 50, 3, 50, 506, 8, 50, 1, 50, 1, 50, 1, 50, 0, 3, 2, 10, 16, 51, 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, 98, 100, 0, 8, 1, 0, 59, 60, 1, 0, 61, 63, 2, 0, 67, 67, 72, 72, 1, 0, 66, 67, 2, 0, 32, 32, 35, 35, 1, 0, 38, 39, 2, 0, 37, 37, 51, 51, 2, 0, 52, 52, 54, 58, 535, 0, 102, 1, 0, 0, 0, 2, 105, 1, 0, 0, 0, 4, 121, 1, 0, 0, 0, 6, 136, 1, 0, 0, 0, 8, 138, 1, 0, 0, 0, 10, 169, 1, 0, 0, 0, 12, 196, 1, 0, 0, 0, 14, 203, 1, 0, 0, 0, 16, 209, 1, 0, 0, 0, 18, 229, 1, 0, 0, 0, 20, 231, 1, 0, 0, 0, 22, 246, 1, 0, 0, 0, 24, 249, 1, 0, 0, 0, 26, 262, 1, 0, 0, 0, 28, 264, 1, 0, 0, 0, 30, 278, 1, 0, 0, 0, 32, 280, 1, 0, 0, 0, 34, 289, 1, 0, 0, 0, 36, 293, 1, 0, 0, 0, 38, 296, 1, 0, 0, 0, 40, 304, 1, 0, 0, 0, 42, 310, 1, 0, 0, 0, 44, 312, 1, 0, 0, 0, 46, 320, 1, 0, 0, 0, 48, 328, 1, 0, 0, 0, 50, 330, 1, 0, 0, 0, 52, 374, 1, 0, 0, 0, 54, 376, 1, 0, 0, 0, 56, 379, 1, 0, 0, 0, 58, 388, 1, 0, 0, 0, 60, 396, 1, 0, 0, 0, 62, 405, 1, 0, 0, 0, 64, 414, 1, 0, 0, 0, 66, 423, 1, 0, 0, 0, 68, 427, 1, 0, 0, 0, 70, 433, 1, 0, 0, 0, 72, 437, 1, 0, 0, 0, 74, 440, 1, 0, 0, 0, 76, 448, 1, 0, 0, 0, 78, 452, 1, 0, 0, 0, 80, 456, 1, 0, 0, 0, 82, 459, 1, 0, 0, 0, 84, 464, 1, 0, 0, 0, 86, 468, 1, 0, 0, 0, 88, 470, 1, 0, 0, 0, 90, 472, 1, 0, 0, 0, 92, 475, 1, 0, 0, 0, 94, 479, 1, 0, 0, 0, 96, 482, 1, 0, 0, 0, 98, 485, 1, 0, 0, 0, 100, 505, 1, 0, 0, 0, 102, 103, 3, 2, 1, 0, 103, 104, 5, 0, 0, 1, 104, 1, 1, 0, 0, 0, 105, 106, 6, 1, -1, 0, 106, 107, 3, 4, 2, 0, 107, 113, 1, 0, 0, 0, 108, 109, 10, 1, 0, 0, 109, 110, 5, 26, 0, 0, 110, 112, 3, 6, 3, 0, 111, 108, 1, 0, 0, 0, 112, 115, 1, 0, 0, 0, 113, 111, 1, 0, 0, 0, 113, 114, 1, 0, 0, 0, 114, 3, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 116, 122, 3, 90, 45, 0, 117, 122, 3, 28, 14, 0, 118, 122, 3, 22, 11, 0, 119, 122, 3, 94, 47, 0, 120, 122, 3, 96, 48, 0, 121, 116, 1, 0, 0, 0, 121, 117, 1, 0, 0, 0, 121, 118, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 120, 1, 0, 0, 0, 122, 5, 1, 0, 0, 0, 123, 137, 3, 36, 18, 0, 124, 137, 3, 40, 20, 0, 125, 137, 3, 54, 27, 0, 126, 137, 3, 60, 30, 0, 127, 137, 3, 56, 28, 0, 128, 137, 3, 38, 19, 0, 129, 137, 3, 8, 4, 0, 130, 137, 3, 62, 31, 0, 131, 137, 3, 64, 32, 0, 132, 137, 3, 68, 34, 0, 133, 137, 3, 70, 35, 0, 134, 137, 3, 98, 49, 0, 135, 137, 3, 72, 36, 0, 136, 123, 1, 0, 0, 0, 136, 124, 1, 0, 0, 0, 136, 125, 1, 0, 0, 0, 136, 126, 1, 0, 0, 0, 136, 127, 1, 0, 0, 0, 136, 128, 1, 0, 0, 0, 136, 129, 1, 0, 0, 0, 136, 130, 1, 0, 0, 0, 136, 131, 1, 0, 0, 0, 136, 132, 1, 0, 0, 0, 136, 133, 1, 0, 0, 0, 136, 134, 1, 0, 0, 0, 136, 135, 1, 0, 0, 0, 137, 7, 1, 0, 0, 0, 138, 139, 5, 18, 0, 0, 139, 140, 3, 10, 5, 0, 140, 9, 1, 0, 0, 0, 141, 142, 6, 5, -1, 0, 142, 143, 5, 44, 0, 0, 143, 170, 3, 10, 5, 7, 144, 170, 3, 14, 7, 0, 145, 170, 3, 12, 6, 0, 146, 148, 3, 14, 7, 0, 147, 149, 5, 44, 0, 0, 148, 147, 1, 0, 0, 0, 148, 149, 1, 0, 0, 0, 149, 150, 1, 0, 0, 0, 150, 151, 5, 41, 0, 0, 151, 152, 5, 40, 0, 0, 152, 157, 3, 14, 7, 0, 153, 154, 5, 34, 0, 0, 154, 156, 3, 14, 7, 0, 155, 153, 1, 0, 0, 0, 156, 159, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 160, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 161, 5, 50, 0, 0, 161, 170, 1, 0, 0, 0, 162, 163, 3, 14, 7, 0, 163, 165, 5, 42, 0, 0, 164, 166, 5, 44, 0, 0, 165, 164, 1, 0, 0, 0, 165, 166, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 168, 5, 45, 0, 0, 168, 170, 1, 0, 0, 0, 169, 141, 1, 0, 0, 0, 169, 144, 1, 0, 0, 0, 169, 145, 1, 0, 0, 0, 169, 146, 1, 0, 0, 0, 169, 162, 1, 0, 0, 0, 170, 179, 1, 0, 0, 0, 171, 172, 10, 4, 0, 0, 172, 173, 5, 31, 0, 0, 173, 178, 3, 10, 5, 5, 174, 175, 10, 3, 0, 0, 175, 176, 5, 47, 0, 0, 176, 178, 3, 10, 5, 4, 177, 171, 1, 0, 0, 0, 177, 174, 1, 0, 0, 0, 178, 181, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 11, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 184, 3, 14, 7, 0, 183, 185, 5, 44, 0, 0, 184, 183, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 5, 43, 0, 0, 187, 188, 3, 86, 43, 0, 188, 197, 1, 0, 0, 0, 189, 191, 3, 14, 7, 0, 190, 192, 5, 44, 0, 0, 191, 190, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 194, 5, 49, 0, 0, 194, 195, 3, 86, 43, 0, 195, 197, 1, 0, 0, 0, 196, 182, 1, 0, 0, 0, 196, 189, 1, 0, 0, 0, 197, 13, 1, 0, 0, 0, 198, 204, 3, 16, 8, 0, 199, 200, 3, 16, 8, 0, 200, 201, 3, 88, 44, 0, 201, 202, 3, 16, 8, 0, 202, 204, 1, 0, 0, 0, 203, 198, 1, 0, 0, 0, 203, 199, 1, 0, 0, 0, 204, 15, 1, 0, 0, 0, 205, 206, 6, 8, -1, 0, 206, 210, 3, 18, 9, 0, 207, 208, 7, 0, 0, 0, 208, 210, 3, 16, 8, 3, 209, 205, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 210, 219, 1, 0, 0, 0, 211, 212, 10, 2, 0, 0, 212, 213, 7, 1, 0, 0, 213, 218, 3, 16, 8, 3, 214, 215, 10, 1, 0, 0, 215, 216, 7, 0, 0, 0, 216, 218, 3, 16, 8, 2, 217, 211, 1, 0, 0, 0, 217, 214, 1, 0, 0, 0, 218, 221, 1, 0, 0, 0, 219, 217, 1, 0, 0, 0, 219, 220, 1, 0, 0, 0, 220, 17, 1, 0, 0, 0, 221, 219, 1, 0, 0, 0, 222, 230, 3, 52, 26, 0, 223, 230, 3, 44, 22, 0, 224, 230, 3, 20, 10, 0, 225, 226, 5, 40, 0, 0, 226, 227, 3, 10, 5, 0, 227, 228, 5, 50, 0, 0, 228, 230, 1, 0, 0, 0, 229, 222, 1, 0, 0, 0, 229, 223, 1, 0, 0, 0, 229, 224, 1, 0, 0, 0, 229, 225, 1, 0, 0, 0, 230, 19, 1, 0, 0, 0, 231, 232, 3, 48, 24, 0, 232, 242, 5, 40, 0, 0, 233, 243, 5, 61, 0, 0, 234, 239, 3, 10, 5, 0, 235, 236, 5, 34, 0, 0, 236, 238, 3, 10, 5, 0, 237, 235, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 243, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 233, 1, 0, 0, 0, 242, 234, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 5, 50, 0, 0, 245, 21, 1, 0, 0, 0, 246, 247, 5, 14, 0, 0, 247, 248, 3, 24, 12, 0, 248, 23, 1, 0, 0, 0, 249, 254, 3, 26, 13, 0, 250, 251, 5, 34, 0, 0, 251, 253, 3, 26, 13, 0, 252, 250, 1, 0, 0, 0, 253, 256, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 25, 1, 0, 0, 0, 256, 254, 1, 0, 0, 0, 257, 263, 3, 10, 5, 0, 258, 259, 3, 44, 22, 0, 259, 260, 5, 33, 0, 0, 260, 261, 3, 10, 5, 0, 261, 263, 1, 0, 0, 0, 262, 257, 1, 0, 0, 0, 262, 258, 1, 0, 0, 0, 263, 27, 1, 0, 0, 0, 264, 265, 5, 6, 0, 0, 265, 270, 3, 42, 21, 0, 266, 267, 5, 34, 0, 0, 267, 269, 3, 42, 21, 0, 268, 266, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 274, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 275, 3, 30, 15, 0, 274, 273, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 29, 1, 0, 0, 0, 276, 279, 3, 32, 16, 0, 277, 279, 3, 34, 17, 0, 278, 276, 1, 0, 0, 0, 278, 277, 1, 0, 0, 0, 279, 31, 1, 0, 0, 0, 280, 281, 5, 71, 0, 0, 281, 286, 3, 42, 21, 0, 282, 283, 5, 34, 0, 0, 283, 285, 3, 42, 21, 0, 284, 282, 1, 0, 0, 0, 285, 288, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 33, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 289, 290, 5, 64, 0, 0, 290, 291, 3, 32, 16, 0, 291, 292, 5, 65, 0, 0, 292, 35, 1, 0, 0, 0, 293, 294, 5, 4, 0, 0, 294, 295, 3, 24, 12, 0, 295, 37, 1, 0, 0, 0, 296, 298, 5, 17, 0, 0, 297, 299, 3, 24, 12, 0, 298, 297, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 302, 1, 0, 0, 0, 300, 301, 5, 30, 0, 0, 301, 303, 3, 24, 12, 0, 302, 300, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 39, 1, 0, 0, 0, 304, 305, 5, 8, 0, 0, 305, 308, 3, 24, 12, 0, 306, 307, 5, 30, 0, 0, 307, 309, 3, 24, 12, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 41, 1, 0, 0, 0, 310, 311, 7, 2, 0, 0, 311, 43, 1, 0, 0, 0, 312, 317, 3, 48, 24, 0, 313, 314, 5, 36, 0, 0, 314, 316, 3, 48, 24, 0, 315, 313, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 45, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 320, 325, 3, 50, 25, 0, 321, 322, 5, 36, 0, 0, 322, 324, 3, 50, 25, 0, 323, 321, 1, 0, 0, 0, 324, 327, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 47, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 328, 329, 7, 3, 0, 0, 329, 49, 1, 0, 0, 0, 330, 331, 5, 76, 0, 0, 331, 51, 1, 0, 0, 0, 332, 375, 5, 45, 0, 0, 333, 334, 3, 84, 42, 0, 334, 335, 5, 66, 0, 0, 335, 375, 1, 0, 0, 0, 336, 375, 3, 82, 41, 0, 337, 375, 3, 84, 42, 0, 338, 375, 3, 78, 39, 0, 339, 375, 5, 48, 0, 0, 340, 375, 3, 86, 43, 0, 341, 342, 5, 64, 0, 0, 342, 347, 3, 80, 40, 0, 343, 344, 5, 34, 0, 0, 344, 346, 3, 80, 40, 0, 345, 343, 1, 0, 0, 0, 346, 349, 1, 0, 0, 0, 347, 345, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 350, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 350, 351, 5, 65, 0, 0, 351, 375, 1, 0, 0, 0, 352, 353, 5, 64, 0, 0, 353, 358, 3, 78, 39, 0, 354, 355, 5, 34, 0, 0, 355, 357, 3, 78, 39, 0, 356, 354, 1, 0, 0, 0, 357, 360, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 361, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 361, 362, 5, 65, 0, 0, 362, 375, 1, 0, 0, 0, 363, 364, 5, 64, 0, 0, 364, 369, 3, 86, 43, 0, 365, 366, 5, 34, 0, 0, 366, 368, 3, 86, 43, 0, 367, 365, 1, 0, 0, 0, 368, 371, 1, 0, 0, 0, 369, 367, 1, 0, 0, 0, 369, 370, 1, 0, 0, 0, 370, 372, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 372, 373, 5, 65, 0, 0, 373, 375, 1, 0, 0, 0, 374, 332, 1, 0, 0, 0, 374, 333, 1, 0, 0, 0, 374, 336, 1, 0, 0, 0, 374, 337, 1, 0, 0, 0, 374, 338, 1, 0, 0, 0, 374, 339, 1, 0, 0, 0, 374, 340, 1, 0, 0, 0, 374, 341, 1, 0, 0, 0, 374, 352, 1, 0, 0, 0, 374, 363, 1, 0, 0, 0, 375, 53, 1, 0, 0, 0, 376, 377, 5, 10, 0, 0, 377, 378, 5, 28, 0, 0, 378, 55, 1, 0, 0, 0, 379, 380, 5, 16, 0, 0, 380, 385, 3, 58, 29, 0, 381, 382, 5, 34, 0, 0, 382, 384, 3, 58, 29, 0, 383, 381, 1, 0, 0, 0, 384, 387, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 57, 1, 0, 0, 0, 387, 385, 1, 0, 0, 0, 388, 390, 3, 10, 5, 0, 389, 391, 7, 4, 0, 0, 390, 389, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 394, 1, 0, 0, 0, 392, 393, 5, 46, 0, 0, 393, 395, 7, 5, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 59, 1, 0, 0, 0, 396, 397, 5, 9, 0, 0, 397, 402, 3, 46, 23, 0, 398, 399, 5, 34, 0, 0, 399, 401, 3, 46, 23, 0, 400, 398, 1, 0, 0, 0, 401, 404, 1, 0, 0, 0, 402, 400, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 61, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 405, 406, 5, 2, 0, 0, 406, 411, 3, 46, 23, 0, 407, 408, 5, 34, 0, 0, 408, 410, 3, 46, 23, 0, 409, 407, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 63, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 414, 415, 5, 13, 0, 0, 415, 420, 3, 66, 33, 0, 416, 417, 5, 34, 0, 0, 417, 419, 3, 66, 33, 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, 65, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 423, 424, 3, 46, 23, 0, 424, 425, 5, 80, 0, 0, 425, 426, 3, 46, 23, 0, 426, 67, 1, 0, 0, 0, 427, 428, 5, 1, 0, 0, 428, 429, 3, 18, 9, 0, 429, 431, 3, 86, 43, 0, 430, 432, 3, 74, 37, 0, 431, 430, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 69, 1, 0, 0, 0, 433, 434, 5, 7, 0, 0, 434, 435, 3, 18, 9, 0, 435, 436, 3, 86, 43, 0, 436, 71, 1, 0, 0, 0, 437, 438, 5, 12, 0, 0, 438, 439, 3, 44, 22, 0, 439, 73, 1, 0, 0, 0, 440, 445, 3, 76, 38, 0, 441, 442, 5, 34, 0, 0, 442, 444, 3, 76, 38, 0, 443, 441, 1, 0, 0, 0, 444, 447, 1, 0, 0, 0, 445, 443, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 75, 1, 0, 0, 0, 447, 445, 1, 0, 0, 0, 448, 449, 3, 48, 24, 0, 449, 450, 5, 33, 0, 0, 450, 451, 3, 52, 26, 0, 451, 77, 1, 0, 0, 0, 452, 453, 7, 6, 0, 0, 453, 79, 1, 0, 0, 0, 454, 457, 3, 82, 41, 0, 455, 457, 3, 84, 42, 0, 456, 454, 1, 0, 0, 0, 456, 455, 1, 0, 0, 0, 457, 81, 1, 0, 0, 0, 458, 460, 7, 0, 0, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 5, 29, 0, 0, 462, 83, 1, 0, 0, 0, 463, 465, 7, 0, 0, 0, 464, 463, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 467, 5, 28, 0, 0, 467, 85, 1, 0, 0, 0, 468, 469, 5, 27, 0, 0, 469, 87, 1, 0, 0, 0, 470, 471, 7, 7, 0, 0, 471, 89, 1, 0, 0, 0, 472, 473, 5, 5, 0, 0, 473, 474, 3, 92, 46, 0, 474, 91, 1, 0, 0, 0, 475, 476, 5, 64, 0, 0, 476, 477, 3, 2, 1, 0, 477, 478, 5, 65, 0, 0, 478, 93, 1, 0, 0, 0, 479, 480, 5, 15, 0, 0, 480, 481, 5, 96, 0, 0, 481, 95, 1, 0, 0, 0, 482, 483, 5, 11, 0, 0, 483, 484, 5, 100, 0, 0, 484, 97, 1, 0, 0, 0, 485, 486, 5, 3, 0, 0, 486, 489, 5, 86, 0, 0, 487, 488, 5, 84, 0, 0, 488, 490, 3, 46, 23, 0, 489, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 500, 1, 0, 0, 0, 491, 492, 5, 85, 0, 0, 492, 497, 3, 100, 50, 0, 493, 494, 5, 34, 0, 0, 494, 496, 3, 100, 50, 0, 495, 493, 1, 0, 0, 0, 496, 499, 1, 0, 0, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 501, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 491, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 99, 1, 0, 0, 0, 502, 503, 3, 46, 23, 0, 503, 504, 5, 33, 0, 0, 504, 506, 1, 0, 0, 0, 505, 502, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 3, 46, 23, 0, 508, 101, 1, 0, 0, 0, 49, 113, 121, 136, 148, 157, 165, 169, 177, 179, 184, 191, 196, 203, 209, 217, 219, 229, 239, 242, 254, 262, 270, 274, 278, 286, 298, 302, 308, 317, 325, 347, 358, 369, 374, 385, 390, 394, 402, 411, 420, 431, 445, 456, 459, 464, 489, 497, 500, 505] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens new file mode 100644 index 0000000000000..5edc646fad10e --- /dev/null +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens @@ -0,0 +1,169 @@ +DISSECT=1 +DROP=2 +ENRICH=3 +EVAL=4 +EXPLAIN=5 +FROM=6 +GROK=7 +INLINESTATS=8 +KEEP=9 +LIMIT=10 +META=11 +MV_EXPAND=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 +CIEQ=53 +NEQ=54 +LT=55 +LTE=56 +GT=57 +GTE=58 +PLUS=59 +MINUS=60 +ASTERISK=61 +SLASH=62 +PERCENT=63 +OPENING_BRACKET=64 +CLOSING_BRACKET=65 +UNQUOTED_IDENTIFIER=66 +QUOTED_IDENTIFIER=67 +EXPR_LINE_COMMENT=68 +EXPR_MULTILINE_COMMENT=69 +EXPR_WS=70 +METADATA=71 +FROM_UNQUOTED_IDENTIFIER=72 +FROM_LINE_COMMENT=73 +FROM_MULTILINE_COMMENT=74 +FROM_WS=75 +ID_PATTERN=76 +PROJECT_LINE_COMMENT=77 +PROJECT_MULTILINE_COMMENT=78 +PROJECT_WS=79 +AS=80 +RENAME_LINE_COMMENT=81 +RENAME_MULTILINE_COMMENT=82 +RENAME_WS=83 +ON=84 +WITH=85 +ENRICH_POLICY_NAME=86 +ENRICH_LINE_COMMENT=87 +ENRICH_MULTILINE_COMMENT=88 +ENRICH_WS=89 +ENRICH_FIELD_LINE_COMMENT=90 +ENRICH_FIELD_MULTILINE_COMMENT=91 +ENRICH_FIELD_WS=92 +MVEXPAND_LINE_COMMENT=93 +MVEXPAND_MULTILINE_COMMENT=94 +MVEXPAND_WS=95 +INFO=96 +SHOW_LINE_COMMENT=97 +SHOW_MULTILINE_COMMENT=98 +SHOW_WS=99 +FUNCTIONS=100 +META_LINE_COMMENT=101 +META_MULTILINE_COMMENT=102 +META_WS=103 +COLON=104 +SETTING=105 +SETTING_LINE_COMMENT=106 +SETTTING_MULTILINE_COMMENT=107 +SETTING_WS=108 +'dissect'=1 +'drop'=2 +'enrich'=3 +'eval'=4 +'explain'=5 +'from'=6 +'grok'=7 +'inlinestats'=8 +'keep'=9 +'limit'=10 +'meta'=11 +'mv_expand'=12 +'rename'=13 +'row'=14 +'show'=15 +'sort'=16 +'stats'=17 +'where'=18 +'|'=26 +'by'=30 +'and'=31 +'asc'=32 +'='=33 +','=34 +'desc'=35 +'.'=36 +'false'=37 +'first'=38 +'last'=39 +'('=40 +'in'=41 +'is'=42 +'like'=43 +'not'=44 +'null'=45 +'nulls'=46 +'or'=47 +'?'=48 +'rlike'=49 +')'=50 +'true'=51 +'=='=52 +'=~'=53 +'!='=54 +'<'=55 +'<='=56 +'>'=57 +'>='=58 +'+'=59 +'-'=60 +'*'=61 +'/'=62 +'%'=63 +']'=65 +'metadata'=71 +'as'=80 +'on'=84 +'with'=85 +'info'=96 +'functions'=100 +':'=104 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts b/packages/kbn-esql-ast/src/antlr/esql_parser.ts similarity index 84% rename from packages/kbn-monaco/src/esql/antlr/esql_parser.ts rename to packages/kbn-esql-ast/src/antlr/esql_parser.ts index 954f16ec3d8df..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 { @@ -28,101 +28,104 @@ export default class esql_parser extends Parser { public static readonly INLINESTATS = 8; public static readonly KEEP = 9; public static readonly LIMIT = 10; - public static readonly MV_EXPAND = 11; - public static readonly RENAME = 12; - public static readonly ROW = 13; - public static readonly SHOW = 14; - public static readonly SORT = 15; - public static readonly STATS = 16; - public static readonly WHERE = 17; - public static readonly UNKNOWN_CMD = 18; - public static readonly LINE_COMMENT = 19; - public static readonly MULTILINE_COMMENT = 20; - public static readonly WS = 21; - public static readonly EXPLAIN_WS = 22; - public static readonly EXPLAIN_LINE_COMMENT = 23; - public static readonly EXPLAIN_MULTILINE_COMMENT = 24; - public static readonly PIPE = 25; - public static readonly STRING = 26; - public static readonly INTEGER_LITERAL = 27; - public static readonly DECIMAL_LITERAL = 28; - public static readonly BY = 29; - public static readonly AND = 30; - public static readonly ASC = 31; - public static readonly ASSIGN = 32; - public static readonly COMMA = 33; - public static readonly DESC = 34; - public static readonly DOT = 35; - public static readonly FALSE = 36; - public static readonly FIRST = 37; - public static readonly LAST = 38; - public static readonly LP = 39; - public static readonly IN = 40; - public static readonly IS = 41; - public static readonly LIKE = 42; - public static readonly NOT = 43; - public static readonly NULL = 44; - public static readonly NULLS = 45; - public static readonly OR = 46; - public static readonly PARAM = 47; - public static readonly RLIKE = 48; - public static readonly RP = 49; - public static readonly TRUE = 50; - public static readonly EQ = 51; - public static readonly CIEQ = 52; - public static readonly NEQ = 53; - public static readonly LT = 54; - public static readonly LTE = 55; - public static readonly GT = 56; - public static readonly GTE = 57; - public static readonly PLUS = 58; - public static readonly MINUS = 59; - public static readonly ASTERISK = 60; - public static readonly SLASH = 61; - public static readonly PERCENT = 62; - public static readonly OPENING_BRACKET = 63; - public static readonly CLOSING_BRACKET = 64; - public static readonly UNQUOTED_IDENTIFIER = 65; - public static readonly QUOTED_IDENTIFIER = 66; - public static readonly EXPR_LINE_COMMENT = 67; - public static readonly EXPR_MULTILINE_COMMENT = 68; - public static readonly EXPR_WS = 69; - public static readonly METADATA = 70; - public static readonly FROM_UNQUOTED_IDENTIFIER = 71; - public static readonly FROM_LINE_COMMENT = 72; - public static readonly FROM_MULTILINE_COMMENT = 73; - public static readonly FROM_WS = 74; - public static readonly ID_PATTERN = 75; - public static readonly PROJECT_LINE_COMMENT = 76; - public static readonly PROJECT_MULTILINE_COMMENT = 77; - public static readonly PROJECT_WS = 78; - public static readonly AS = 79; - public static readonly RENAME_LINE_COMMENT = 80; - public static readonly RENAME_MULTILINE_COMMENT = 81; - public static readonly RENAME_WS = 82; - public static readonly ON = 83; - public static readonly WITH = 84; - public static readonly ENRICH_POLICY_NAME = 85; - public static readonly ENRICH_LINE_COMMENT = 86; - public static readonly ENRICH_MULTILINE_COMMENT = 87; - public static readonly ENRICH_WS = 88; - public static readonly ENRICH_FIELD_LINE_COMMENT = 89; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 90; - public static readonly ENRICH_FIELD_WS = 91; - public static readonly MVEXPAND_LINE_COMMENT = 92; - public static readonly MVEXPAND_MULTILINE_COMMENT = 93; - public static readonly MVEXPAND_WS = 94; - public static readonly INFO = 95; - public static readonly FUNCTIONS = 96; + public static readonly META = 11; + public static readonly MV_EXPAND = 12; + public static readonly RENAME = 13; + public static readonly ROW = 14; + public static readonly SHOW = 15; + public static readonly SORT = 16; + public static readonly STATS = 17; + public static readonly WHERE = 18; + public static readonly UNKNOWN_CMD = 19; + public static readonly LINE_COMMENT = 20; + public static readonly MULTILINE_COMMENT = 21; + public static readonly WS = 22; + public static readonly EXPLAIN_WS = 23; + public static readonly EXPLAIN_LINE_COMMENT = 24; + public static readonly EXPLAIN_MULTILINE_COMMENT = 25; + public static readonly PIPE = 26; + public static readonly STRING = 27; + public static readonly INTEGER_LITERAL = 28; + public static readonly DECIMAL_LITERAL = 29; + public static readonly BY = 30; + public static readonly AND = 31; + public static readonly ASC = 32; + public static readonly ASSIGN = 33; + public static readonly COMMA = 34; + public static readonly DESC = 35; + public static readonly DOT = 36; + public static readonly FALSE = 37; + public static readonly FIRST = 38; + public static readonly LAST = 39; + public static readonly LP = 40; + public static readonly IN = 41; + public static readonly IS = 42; + public static readonly LIKE = 43; + public static readonly NOT = 44; + public static readonly NULL = 45; + public static readonly NULLS = 46; + public static readonly OR = 47; + public static readonly PARAM = 48; + public static readonly RLIKE = 49; + public static readonly RP = 50; + public static readonly TRUE = 51; + public static readonly EQ = 52; + public static readonly CIEQ = 53; + public static readonly NEQ = 54; + public static readonly LT = 55; + public static readonly LTE = 56; + public static readonly GT = 57; + public static readonly GTE = 58; + public static readonly PLUS = 59; + public static readonly MINUS = 60; + public static readonly ASTERISK = 61; + public static readonly SLASH = 62; + public static readonly PERCENT = 63; + public static readonly OPENING_BRACKET = 64; + public static readonly CLOSING_BRACKET = 65; + public static readonly UNQUOTED_IDENTIFIER = 66; + public static readonly QUOTED_IDENTIFIER = 67; + public static readonly EXPR_LINE_COMMENT = 68; + public static readonly EXPR_MULTILINE_COMMENT = 69; + public static readonly EXPR_WS = 70; + public static readonly METADATA = 71; + public static readonly FROM_UNQUOTED_IDENTIFIER = 72; + public static readonly FROM_LINE_COMMENT = 73; + public static readonly FROM_MULTILINE_COMMENT = 74; + public static readonly FROM_WS = 75; + public static readonly ID_PATTERN = 76; + public static readonly PROJECT_LINE_COMMENT = 77; + public static readonly PROJECT_MULTILINE_COMMENT = 78; + public static readonly PROJECT_WS = 79; + public static readonly AS = 80; + public static readonly RENAME_LINE_COMMENT = 81; + public static readonly RENAME_MULTILINE_COMMENT = 82; + public static readonly RENAME_WS = 83; + public static readonly ON = 84; + public static readonly WITH = 85; + public static readonly ENRICH_POLICY_NAME = 86; + public static readonly ENRICH_LINE_COMMENT = 87; + public static readonly ENRICH_MULTILINE_COMMENT = 88; + public static readonly ENRICH_WS = 89; + public static readonly ENRICH_FIELD_LINE_COMMENT = 90; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 91; + public static readonly ENRICH_FIELD_WS = 92; + public static readonly MVEXPAND_LINE_COMMENT = 93; + public static readonly MVEXPAND_MULTILINE_COMMENT = 94; + public static readonly MVEXPAND_WS = 95; + public static readonly INFO = 96; public static readonly SHOW_LINE_COMMENT = 97; public static readonly SHOW_MULTILINE_COMMENT = 98; public static readonly SHOW_WS = 99; - public static readonly COLON = 100; - public static readonly SETTING = 101; - public static readonly SETTING_LINE_COMMENT = 102; - public static readonly SETTTING_MULTILINE_COMMENT = 103; - public static readonly SETTING_WS = 104; - public static readonly UNQUOTED_ID_PATTERN = 105; + public static readonly FUNCTIONS = 100; + public static readonly META_LINE_COMMENT = 101; + public static readonly META_MULTILINE_COMMENT = 102; + public static readonly META_WS = 103; + public static readonly COLON = 104; + public static readonly SETTING = 105; + public static readonly SETTING_LINE_COMMENT = 106; + public static readonly SETTTING_MULTILINE_COMMENT = 107; + public static readonly SETTING_WS = 108; public static readonly EOF = Token.EOF; public static readonly RULE_singleStatement = 0; public static readonly RULE_query = 1; @@ -150,29 +153,29 @@ export default class esql_parser extends Parser { public static readonly RULE_qualifiedNamePattern = 23; public static readonly RULE_identifier = 24; public static readonly RULE_identifierPattern = 25; - public static readonly RULE_idPattern = 26; - public static readonly RULE_constant = 27; - public static readonly RULE_limitCommand = 28; - public static readonly RULE_sortCommand = 29; - public static readonly RULE_orderExpression = 30; - public static readonly RULE_keepCommand = 31; - public static readonly RULE_dropCommand = 32; - public static readonly RULE_renameCommand = 33; - public static readonly RULE_renameClause = 34; - public static readonly RULE_dissectCommand = 35; - public static readonly RULE_grokCommand = 36; - public static readonly RULE_mvExpandCommand = 37; - public static readonly RULE_commandOptions = 38; - public static readonly RULE_commandOption = 39; - public static readonly RULE_booleanValue = 40; - public static readonly RULE_numericValue = 41; - public static readonly RULE_decimalValue = 42; - public static readonly RULE_integerValue = 43; - public static readonly RULE_string = 44; - public static readonly RULE_comparisonOperator = 45; - public static readonly RULE_explainCommand = 46; - public static readonly RULE_subqueryExpression = 47; - public static readonly RULE_showCommand = 48; + public static readonly RULE_constant = 26; + public static readonly RULE_limitCommand = 27; + public static readonly RULE_sortCommand = 28; + public static readonly RULE_orderExpression = 29; + public static readonly RULE_keepCommand = 30; + public static readonly RULE_dropCommand = 31; + public static readonly RULE_renameCommand = 32; + public static readonly RULE_renameClause = 33; + public static readonly RULE_dissectCommand = 34; + public static readonly RULE_grokCommand = 35; + public static readonly RULE_mvExpandCommand = 36; + public static readonly RULE_commandOptions = 37; + public static readonly RULE_commandOption = 38; + public static readonly RULE_booleanValue = 39; + public static readonly RULE_numericValue = 40; + public static readonly RULE_decimalValue = 41; + public static readonly RULE_integerValue = 42; + public static readonly RULE_string = 43; + public static readonly RULE_comparisonOperator = 44; + public static readonly RULE_explainCommand = 45; + public static readonly RULE_subqueryExpression = 46; + public static readonly RULE_showCommand = 47; + public static readonly RULE_metaCommand = 48; public static readonly RULE_enrichCommand = 49; public static readonly RULE_enrichWithClause = 50; public static readonly literalNames: (string | null)[] = [ null, "'dissect'", @@ -181,7 +184,7 @@ export default class esql_parser extends Parser { "'from'", "'grok'", "'inlinestats'", "'keep'", "'limit'", - "'mv_expand'", + "'meta'", "'mv_expand'", "'rename'", "'row'", "'show'", "'sort'", "'stats'", @@ -224,7 +227,9 @@ export default class esql_parser extends Parser { null, null, null, null, null, null, - "'info'", "'functions'", + "'info'", null, + null, null, + "'functions'", null, null, null, "':'" ]; public static readonly symbolicNames: (string | null)[] = [ null, "DISSECT", @@ -233,7 +238,7 @@ export default class esql_parser extends Parser { "FROM", "GROK", "INLINESTATS", "KEEP", "LIMIT", - "MV_EXPAND", + "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", @@ -293,15 +298,17 @@ export default class esql_parser extends Parser { "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", - "INFO", "FUNCTIONS", - "SHOW_LINE_COMMENT", + "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS", + "FUNCTIONS", + "META_LINE_COMMENT", + "META_MULTILINE_COMMENT", + "META_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", "SETTTING_MULTILINE_COMMENT", - "SETTING_WS", - "UNQUOTED_ID_PATTERN" ]; + "SETTING_WS" ]; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", @@ -309,13 +316,12 @@ export default class esql_parser extends Parser { "primaryExpression", "functionExpression", "rowCommand", "fields", "field", "fromCommand", "metadata", "metadataOption", "deprecated_metadata", "evalCommand", "statsCommand", "inlinestatsCommand", "fromIdentifier", "qualifiedName", - "qualifiedNamePattern", "identifier", "identifierPattern", "idPattern", - "constant", "limitCommand", "sortCommand", "orderExpression", "keepCommand", - "dropCommand", "renameCommand", "renameClause", "dissectCommand", "grokCommand", - "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", - "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", - "explainCommand", "subqueryExpression", "showCommand", "enrichCommand", - "enrichWithClause", + "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", "metaCommand", "enrichCommand", "enrichWithClause", ]; public get grammarFileName(): string { return "esql_parser.g4"; } public get literalNames(): (string | null)[] { return esql_parser.literalNames; } @@ -435,7 +441,7 @@ export default class esql_parser extends Parser { let localctx: SourceCommandContext = new SourceCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 4, esql_parser.RULE_sourceCommand); try { - this.state = 120; + this.state = 121; this._errHandler.sync(this); switch (this._input.LA(1)) { case 5: @@ -452,20 +458,27 @@ export default class esql_parser extends Parser { this.fromCommand(); } break; - case 13: + case 14: this.enterOuterAlt(localctx, 3); { this.state = 118; this.rowCommand(); } break; - case 14: + case 15: this.enterOuterAlt(localctx, 4); { this.state = 119; this.showCommand(); } break; + case 11: + this.enterOuterAlt(localctx, 5); + { + this.state = 120; + this.metaCommand(); + } + break; default: throw new NoViableAltException(this); } @@ -489,97 +502,97 @@ export default class esql_parser extends Parser { let localctx: ProcessingCommandContext = new ProcessingCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 6, esql_parser.RULE_processingCommand); try { - this.state = 135; + this.state = 136; this._errHandler.sync(this); switch (this._input.LA(1)) { case 4: this.enterOuterAlt(localctx, 1); { - this.state = 122; + this.state = 123; this.evalCommand(); } break; case 8: this.enterOuterAlt(localctx, 2); { - this.state = 123; + this.state = 124; this.inlinestatsCommand(); } break; case 10: this.enterOuterAlt(localctx, 3); { - this.state = 124; + this.state = 125; this.limitCommand(); } break; case 9: this.enterOuterAlt(localctx, 4); { - this.state = 125; + this.state = 126; this.keepCommand(); } break; - case 15: + case 16: this.enterOuterAlt(localctx, 5); { - this.state = 126; + this.state = 127; this.sortCommand(); } break; - case 16: + case 17: this.enterOuterAlt(localctx, 6); { - this.state = 127; + this.state = 128; this.statsCommand(); } break; - case 17: + case 18: this.enterOuterAlt(localctx, 7); { - this.state = 128; + this.state = 129; this.whereCommand(); } break; case 2: this.enterOuterAlt(localctx, 8); { - this.state = 129; + this.state = 130; this.dropCommand(); } break; - case 12: + case 13: this.enterOuterAlt(localctx, 9); { - this.state = 130; + this.state = 131; this.renameCommand(); } break; case 1: this.enterOuterAlt(localctx, 10); { - this.state = 131; + this.state = 132; this.dissectCommand(); } break; case 7: this.enterOuterAlt(localctx, 11); { - this.state = 132; + this.state = 133; this.grokCommand(); } break; case 3: this.enterOuterAlt(localctx, 12); { - this.state = 133; + this.state = 134; this.enrichCommand(); } break; - case 11: + case 12: this.enterOuterAlt(localctx, 13); { - this.state = 134; + this.state = 135; this.mvExpandCommand(); } break; @@ -608,9 +621,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 137; - this.match(esql_parser.WHERE); this.state = 138; + this.match(esql_parser.WHERE); + this.state = 139; this.booleanExpression(0); } } @@ -648,7 +661,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 168; + this.state = 169; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 6, this._ctx) ) { case 1: @@ -657,9 +670,9 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 141; - this.match(esql_parser.NOT); this.state = 142; + this.match(esql_parser.NOT); + this.state = 143; this.booleanExpression(7); } break; @@ -668,7 +681,7 @@ export default class esql_parser extends Parser { localctx = new BooleanDefaultContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 143; + this.state = 144; this.valueExpression(); } break; @@ -677,7 +690,7 @@ export default class esql_parser extends Parser { localctx = new RegexExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 144; + this.state = 145; this.regexBooleanExpression(); } break; @@ -686,41 +699,41 @@ export default class esql_parser extends Parser { localctx = new LogicalInContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 145; + this.state = 146; this.valueExpression(); - this.state = 147; + this.state = 148; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===43) { + if (_la===44) { { - this.state = 146; + this.state = 147; this.match(esql_parser.NOT); } } - this.state = 149; - this.match(esql_parser.IN); this.state = 150; - this.match(esql_parser.LP); + this.match(esql_parser.IN); this.state = 151; + this.match(esql_parser.LP); + this.state = 152; this.valueExpression(); - this.state = 156; + this.state = 157; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===33) { + while (_la===34) { { { - this.state = 152; - this.match(esql_parser.COMMA); this.state = 153; + this.match(esql_parser.COMMA); + this.state = 154; this.valueExpression(); } } - this.state = 158; + this.state = 159; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 159; + this.state = 160; this.match(esql_parser.RP); } break; @@ -729,27 +742,27 @@ export default class esql_parser extends Parser { localctx = new IsNullContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 161; - this.valueExpression(); this.state = 162; + this.valueExpression(); + this.state = 163; this.match(esql_parser.IS); - this.state = 164; + this.state = 165; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===43) { + if (_la===44) { { - this.state = 163; + this.state = 164; this.match(esql_parser.NOT); } } - this.state = 166; + this.state = 167; this.match(esql_parser.NULL); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 178; + this.state = 179; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -759,7 +772,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 176; + this.state = 177; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 7, this._ctx) ) { case 1: @@ -767,13 +780,13 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 170; + this.state = 171; if (!(this.precpred(this._ctx, 4))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 4)"); } - this.state = 171; - (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.AND); this.state = 172; + (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.AND); + this.state = 173; (localctx as LogicalBinaryContext)._right = this.booleanExpression(5); } break; @@ -782,20 +795,20 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 173; + this.state = 174; if (!(this.precpred(this._ctx, 3))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 3)"); } - this.state = 174; - (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.OR); this.state = 175; + (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.OR); + this.state = 176; (localctx as LogicalBinaryContext)._right = this.booleanExpression(4); } break; } } } - this.state = 180; + this.state = 181; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); } @@ -821,48 +834,48 @@ export default class esql_parser extends Parser { this.enterRule(localctx, 12, esql_parser.RULE_regexBooleanExpression); let _la: number; try { - this.state = 195; + this.state = 196; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 11, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 181; + this.state = 182; this.valueExpression(); - this.state = 183; + this.state = 184; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===43) { + if (_la===44) { { - this.state = 182; + this.state = 183; this.match(esql_parser.NOT); } } - this.state = 185; - localctx._kind = this.match(esql_parser.LIKE); this.state = 186; + localctx._kind = this.match(esql_parser.LIKE); + this.state = 187; localctx._pattern = this.string_(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 188; + this.state = 189; this.valueExpression(); - this.state = 190; + this.state = 191; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===43) { + if (_la===44) { { - this.state = 189; + this.state = 190; this.match(esql_parser.NOT); } } - this.state = 192; - localctx._kind = this.match(esql_parser.RLIKE); this.state = 193; + localctx._kind = this.match(esql_parser.RLIKE); + this.state = 194; localctx._pattern = this.string_(); } break; @@ -887,14 +900,14 @@ export default class esql_parser extends Parser { let localctx: ValueExpressionContext = new ValueExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 14, esql_parser.RULE_valueExpression); try { - this.state = 202; + this.state = 203; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 12, this._ctx) ) { case 1: localctx = new ValueExpressionDefaultContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 197; + this.state = 198; this.operatorExpression(0); } break; @@ -902,11 +915,11 @@ export default class esql_parser extends Parser { localctx = new ComparisonContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 198; - (localctx as ComparisonContext)._left = this.operatorExpression(0); this.state = 199; - this.comparisonOperator(); + (localctx as ComparisonContext)._left = this.operatorExpression(0); this.state = 200; + this.comparisonOperator(); + this.state = 201; (localctx as ComparisonContext)._right = this.operatorExpression(0); } break; @@ -946,7 +959,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 208; + this.state = 209; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 13, this._ctx) ) { case 1: @@ -955,7 +968,7 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 205; + this.state = 206; this.primaryExpression(); } break; @@ -964,23 +977,23 @@ export default class esql_parser extends Parser { localctx = new ArithmeticUnaryContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 206; + this.state = 207; (localctx as ArithmeticUnaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===58 || _la===59)) { + if(!(_la===59 || _la===60)) { (localctx as ArithmeticUnaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 207; + this.state = 208; this.operatorExpression(3); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 218; + this.state = 219; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -990,7 +1003,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 216; + this.state = 217; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 14, this._ctx) ) { case 1: @@ -998,21 +1011,21 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 210; + this.state = 211; if (!(this.precpred(this._ctx, 2))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 2)"); } - this.state = 211; + this.state = 212; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & 7) !== 0))) { + if(!(((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & 7) !== 0))) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 212; + this.state = 213; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(3); } break; @@ -1021,28 +1034,28 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 213; + this.state = 214; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 214; + this.state = 215; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===58 || _la===59)) { + if(!(_la===59 || _la===60)) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 215; + this.state = 216; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(2); } break; } } } - this.state = 220; + this.state = 221; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); } @@ -1067,14 +1080,14 @@ export default class esql_parser extends Parser { let localctx: PrimaryExpressionContext = new PrimaryExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 18, esql_parser.RULE_primaryExpression); try { - this.state = 228; + this.state = 229; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 16, this._ctx) ) { case 1: localctx = new ConstantDefaultContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 221; + this.state = 222; this.constant(); } break; @@ -1082,7 +1095,7 @@ export default class esql_parser extends Parser { localctx = new DereferenceContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 222; + this.state = 223; this.qualifiedName(); } break; @@ -1090,7 +1103,7 @@ export default class esql_parser extends Parser { localctx = new FunctionContext(this, localctx); this.enterOuterAlt(localctx, 3); { - this.state = 223; + this.state = 224; this.functionExpression(); } break; @@ -1098,11 +1111,11 @@ export default class esql_parser extends Parser { localctx = new ParenthesizedExpressionContext(this, localctx); this.enterOuterAlt(localctx, 4); { - this.state = 224; - this.match(esql_parser.LP); this.state = 225; - this.booleanExpression(0); + this.match(esql_parser.LP); this.state = 226; + this.booleanExpression(0); + this.state = 227; this.match(esql_parser.RP); } break; @@ -1130,62 +1143,62 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 230; - this.identifier(); this.state = 231; + this.identifier(); + this.state = 232; this.match(esql_parser.LP); - this.state = 241; + this.state = 242; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 60: + case 61: { - this.state = 232; + this.state = 233; this.match(esql_parser.ASTERISK); } break; - case 26: case 27: case 28: - case 36: - case 39: - case 43: + case 29: + case 37: + case 40: case 44: - case 47: - case 50: - case 58: + case 45: + case 48: + case 51: case 59: - case 63: - case 65: + case 60: + case 64: case 66: + case 67: { { - this.state = 233; + this.state = 234; this.booleanExpression(0); - this.state = 238; + this.state = 239; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===33) { + while (_la===34) { { { - this.state = 234; - this.match(esql_parser.COMMA); this.state = 235; + this.match(esql_parser.COMMA); + this.state = 236; this.booleanExpression(0); } } - this.state = 240; + this.state = 241; this._errHandler.sync(this); _la = this._input.LA(1); } } } break; - case 49: + case 50: break; default: break; } - this.state = 243; + this.state = 244; this.match(esql_parser.RP); } } @@ -1210,9 +1223,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 245; - this.match(esql_parser.ROW); this.state = 246; + this.match(esql_parser.ROW); + this.state = 247; this.fields(); } } @@ -1238,23 +1251,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 248; + this.state = 249; this.field(); - this.state = 253; + this.state = 254; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 19, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 249; - this.match(esql_parser.COMMA); this.state = 250; + this.match(esql_parser.COMMA); + this.state = 251; this.field(); } } } - this.state = 255; + this.state = 256; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 19, this._ctx); } @@ -1279,24 +1292,24 @@ export default class esql_parser extends Parser { let localctx: FieldContext = new FieldContext(this, this._ctx, this.state); this.enterRule(localctx, 26, esql_parser.RULE_field); try { - this.state = 261; + this.state = 262; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 20, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 256; + this.state = 257; this.booleanExpression(0); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 257; - this.qualifiedName(); this.state = 258; - this.match(esql_parser.ASSIGN); + this.qualifiedName(); this.state = 259; + this.match(esql_parser.ASSIGN); + this.state = 260; this.booleanExpression(0); } break; @@ -1324,34 +1337,34 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 263; - this.match(esql_parser.FROM); this.state = 264; + this.match(esql_parser.FROM); + this.state = 265; this.fromIdentifier(); - this.state = 269; + this.state = 270; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 21, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 265; - this.match(esql_parser.COMMA); this.state = 266; + this.match(esql_parser.COMMA); + this.state = 267; this.fromIdentifier(); } } } - this.state = 271; + this.state = 272; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 21, this._ctx); } - this.state = 273; + this.state = 274; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 22, this._ctx) ) { case 1: { - this.state = 272; + this.state = 273; this.metadata(); } break; @@ -1377,20 +1390,20 @@ export default class esql_parser extends Parser { let localctx: MetadataContext = new MetadataContext(this, this._ctx, this.state); this.enterRule(localctx, 30, esql_parser.RULE_metadata); try { - this.state = 277; + this.state = 278; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 70: + case 71: this.enterOuterAlt(localctx, 1); { - this.state = 275; + this.state = 276; this.metadataOption(); } break; - case 63: + case 64: this.enterOuterAlt(localctx, 2); { - this.state = 276; + this.state = 277; this.deprecated_metadata(); } break; @@ -1420,25 +1433,25 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 279; - this.match(esql_parser.METADATA); this.state = 280; + this.match(esql_parser.METADATA); + this.state = 281; this.fromIdentifier(); - this.state = 285; + this.state = 286; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 24, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 281; - this.match(esql_parser.COMMA); this.state = 282; + this.match(esql_parser.COMMA); + this.state = 283; this.fromIdentifier(); } } } - this.state = 287; + this.state = 288; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 24, this._ctx); } @@ -1465,11 +1478,11 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 288; - this.match(esql_parser.OPENING_BRACKET); this.state = 289; - this.metadataOption(); + this.match(esql_parser.OPENING_BRACKET); this.state = 290; + this.metadataOption(); + this.state = 291; this.match(esql_parser.CLOSING_BRACKET); } } @@ -1494,9 +1507,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 292; - this.match(esql_parser.EVAL); this.state = 293; + this.match(esql_parser.EVAL); + this.state = 294; this.fields(); } } @@ -1521,26 +1534,26 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 295; + this.state = 296; this.match(esql_parser.STATS); - this.state = 297; + this.state = 298; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 25, this._ctx) ) { case 1: { - this.state = 296; + this.state = 297; localctx._stats = this.fields(); } break; } - this.state = 301; + this.state = 302; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 26, this._ctx) ) { case 1: { - this.state = 299; - this.match(esql_parser.BY); this.state = 300; + this.match(esql_parser.BY); + this.state = 301; localctx._grouping = this.fields(); } break; @@ -1568,18 +1581,18 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 303; - this.match(esql_parser.INLINESTATS); this.state = 304; + this.match(esql_parser.INLINESTATS); + this.state = 305; localctx._stats = this.fields(); - this.state = 307; + this.state = 308; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 27, this._ctx) ) { case 1: { - this.state = 305; - this.match(esql_parser.BY); this.state = 306; + this.match(esql_parser.BY); + this.state = 307; localctx._grouping = this.fields(); } break; @@ -1608,9 +1621,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 309; + this.state = 310; _la = this._input.LA(1); - if(!(_la===66 || _la===71)) { + if(!(_la===67 || _la===72)) { this._errHandler.recoverInline(this); } else { @@ -1641,23 +1654,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 311; + this.state = 312; this.identifier(); - this.state = 316; + this.state = 317; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 28, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 312; - this.match(esql_parser.DOT); this.state = 313; + this.match(esql_parser.DOT); + this.state = 314; this.identifier(); } } } - this.state = 318; + this.state = 319; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 28, this._ctx); } @@ -1685,23 +1698,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 319; + this.state = 320; this.identifierPattern(); - this.state = 324; + this.state = 325; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 29, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 320; - this.match(esql_parser.DOT); this.state = 321; + this.match(esql_parser.DOT); + this.state = 322; this.identifierPattern(); } } } - this.state = 326; + this.state = 327; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 29, this._ctx); } @@ -1729,9 +1742,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 327; + this.state = 328; _la = this._input.LA(1); - if(!(_la===65 || _la===66)) { + if(!(_la===66 || _la===67)) { this._errHandler.recoverInline(this); } else { @@ -1761,7 +1774,7 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 329; + this.state = 330; this.match(esql_parser.ID_PATTERN); } } @@ -1780,52 +1793,19 @@ export default class esql_parser extends Parser { return localctx; } // @RuleVersion(0) - public idPattern(): IdPatternContext { - let localctx: IdPatternContext = new IdPatternContext(this, this._ctx, this.state); - this.enterRule(localctx, 52, esql_parser.RULE_idPattern); - let _la: number; - try { - this.enterOuterAlt(localctx, 1); - { - this.state = 331; - _la = this._input.LA(1); - if(!(_la===66 || _la===105)) { - this._errHandler.recoverInline(this); - } - else { - this._errHandler.reportMatch(this); - this.consume(); - } - } - } - catch (re) { - if (re instanceof RecognitionException) { - localctx.exception = re; - this._errHandler.reportError(this, re); - this._errHandler.recover(this, re); - } else { - throw re; - } - } - finally { - this.exitRule(); - } - return localctx; - } - // @RuleVersion(0) public constant(): ConstantContext { let localctx: ConstantContext = new ConstantContext(this, this._ctx, this.state); - this.enterRule(localctx, 54, esql_parser.RULE_constant); + this.enterRule(localctx, 52, esql_parser.RULE_constant); let _la: number; try { - this.state = 375; + this.state = 374; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 33, this._ctx) ) { case 1: localctx = new NullLiteralContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 333; + this.state = 332; this.match(esql_parser.NULL); } break; @@ -1833,9 +1813,9 @@ export default class esql_parser extends Parser { localctx = new QualifiedIntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 334; + this.state = 333; this.integerValue(); - this.state = 335; + this.state = 334; this.match(esql_parser.UNQUOTED_IDENTIFIER); } break; @@ -1843,7 +1823,7 @@ export default class esql_parser extends Parser { localctx = new DecimalLiteralContext(this, localctx); this.enterOuterAlt(localctx, 3); { - this.state = 337; + this.state = 336; this.decimalValue(); } break; @@ -1851,7 +1831,7 @@ export default class esql_parser extends Parser { localctx = new IntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 4); { - this.state = 338; + this.state = 337; this.integerValue(); } break; @@ -1859,7 +1839,7 @@ export default class esql_parser extends Parser { localctx = new BooleanLiteralContext(this, localctx); this.enterOuterAlt(localctx, 5); { - this.state = 339; + this.state = 338; this.booleanValue(); } break; @@ -1867,7 +1847,7 @@ export default class esql_parser extends Parser { localctx = new InputParamContext(this, localctx); this.enterOuterAlt(localctx, 6); { - this.state = 340; + this.state = 339; this.match(esql_parser.PARAM); } break; @@ -1875,7 +1855,7 @@ export default class esql_parser extends Parser { localctx = new StringLiteralContext(this, localctx); this.enterOuterAlt(localctx, 7); { - this.state = 341; + this.state = 340; this.string_(); } break; @@ -1883,27 +1863,27 @@ export default class esql_parser extends Parser { localctx = new NumericArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 8); { - this.state = 342; + this.state = 341; this.match(esql_parser.OPENING_BRACKET); - this.state = 343; + this.state = 342; this.numericValue(); - this.state = 348; + this.state = 347; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===33) { + while (_la===34) { { { - this.state = 344; + this.state = 343; this.match(esql_parser.COMMA); - this.state = 345; + this.state = 344; this.numericValue(); } } - this.state = 350; + this.state = 349; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 351; + this.state = 350; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -1911,27 +1891,27 @@ export default class esql_parser extends Parser { localctx = new BooleanArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 9); { - this.state = 353; + this.state = 352; this.match(esql_parser.OPENING_BRACKET); - this.state = 354; + this.state = 353; this.booleanValue(); - this.state = 359; + this.state = 358; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===33) { + while (_la===34) { { { - this.state = 355; + this.state = 354; this.match(esql_parser.COMMA); - this.state = 356; + this.state = 355; this.booleanValue(); } } - this.state = 361; + this.state = 360; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 362; + this.state = 361; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -1939,27 +1919,27 @@ export default class esql_parser extends Parser { localctx = new StringArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 10); { - this.state = 364; + this.state = 363; this.match(esql_parser.OPENING_BRACKET); - this.state = 365; + this.state = 364; this.string_(); - this.state = 370; + this.state = 369; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===33) { + while (_la===34) { { { - this.state = 366; + this.state = 365; this.match(esql_parser.COMMA); - this.state = 367; + this.state = 366; this.string_(); } } - this.state = 372; + this.state = 371; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 373; + this.state = 372; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -1982,13 +1962,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public limitCommand(): LimitCommandContext { let localctx: LimitCommandContext = new LimitCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 56, esql_parser.RULE_limitCommand); + this.enterRule(localctx, 54, esql_parser.RULE_limitCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 377; + this.state = 376; this.match(esql_parser.LIMIT); - this.state = 378; + this.state = 377; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2009,30 +1989,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public sortCommand(): SortCommandContext { let localctx: SortCommandContext = new SortCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 58, esql_parser.RULE_sortCommand); + this.enterRule(localctx, 56, esql_parser.RULE_sortCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 380; + this.state = 379; this.match(esql_parser.SORT); - this.state = 381; + this.state = 380; this.orderExpression(); - this.state = 386; + this.state = 385; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 382; + this.state = 381; this.match(esql_parser.COMMA); - this.state = 383; + this.state = 382; this.orderExpression(); } } } - this.state = 388; + this.state = 387; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); } @@ -2055,22 +2035,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public orderExpression(): OrderExpressionContext { let localctx: OrderExpressionContext = new OrderExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 60, esql_parser.RULE_orderExpression); + this.enterRule(localctx, 58, esql_parser.RULE_orderExpression); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 389; + this.state = 388; this.booleanExpression(0); - this.state = 391; + this.state = 390; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 35, this._ctx) ) { case 1: { - this.state = 390; + this.state = 389; localctx._ordering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===31 || _la===34)) { + if(!(_la===32 || _la===35)) { localctx._ordering = this._errHandler.recoverInline(this); } else { @@ -2080,17 +2060,17 @@ export default class esql_parser extends Parser { } break; } - this.state = 395; + this.state = 394; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 36, this._ctx) ) { case 1: { - this.state = 393; + this.state = 392; this.match(esql_parser.NULLS); - this.state = 394; + this.state = 393; localctx._nullOrdering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===37 || _la===38)) { + if(!(_la===38 || _la===39)) { localctx._nullOrdering = this._errHandler.recoverInline(this); } else { @@ -2119,30 +2099,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public keepCommand(): KeepCommandContext { let localctx: KeepCommandContext = new KeepCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 62, esql_parser.RULE_keepCommand); + this.enterRule(localctx, 60, esql_parser.RULE_keepCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 397; + this.state = 396; this.match(esql_parser.KEEP); - this.state = 398; + this.state = 397; this.qualifiedNamePattern(); - this.state = 403; + this.state = 402; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 37, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 399; + this.state = 398; this.match(esql_parser.COMMA); - this.state = 400; + this.state = 399; this.qualifiedNamePattern(); } } } - this.state = 405; + this.state = 404; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 37, this._ctx); } @@ -2165,30 +2145,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public dropCommand(): DropCommandContext { let localctx: DropCommandContext = new DropCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 64, esql_parser.RULE_dropCommand); + this.enterRule(localctx, 62, esql_parser.RULE_dropCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 406; + this.state = 405; this.match(esql_parser.DROP); - this.state = 407; + this.state = 406; this.qualifiedNamePattern(); - this.state = 412; + this.state = 411; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 408; + this.state = 407; this.match(esql_parser.COMMA); - this.state = 409; + this.state = 408; this.qualifiedNamePattern(); } } } - this.state = 414; + this.state = 413; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 38, this._ctx); } @@ -2211,30 +2191,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public renameCommand(): RenameCommandContext { let localctx: RenameCommandContext = new RenameCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 66, esql_parser.RULE_renameCommand); + this.enterRule(localctx, 64, esql_parser.RULE_renameCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 415; + this.state = 414; this.match(esql_parser.RENAME); - this.state = 416; + this.state = 415; this.renameClause(); - this.state = 421; + this.state = 420; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 39, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 417; + this.state = 416; this.match(esql_parser.COMMA); - this.state = 418; + this.state = 417; this.renameClause(); } } } - this.state = 423; + this.state = 422; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 39, this._ctx); } @@ -2257,15 +2237,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public renameClause(): RenameClauseContext { let localctx: RenameClauseContext = new RenameClauseContext(this, this._ctx, this.state); - this.enterRule(localctx, 68, esql_parser.RULE_renameClause); + this.enterRule(localctx, 66, esql_parser.RULE_renameClause); try { this.enterOuterAlt(localctx, 1); { - this.state = 424; + this.state = 423; localctx._oldName = this.qualifiedNamePattern(); - this.state = 425; + this.state = 424; this.match(esql_parser.AS); - this.state = 426; + this.state = 425; localctx._newName = this.qualifiedNamePattern(); } } @@ -2286,22 +2266,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public dissectCommand(): DissectCommandContext { let localctx: DissectCommandContext = new DissectCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 70, esql_parser.RULE_dissectCommand); + this.enterRule(localctx, 68, esql_parser.RULE_dissectCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 428; + this.state = 427; this.match(esql_parser.DISSECT); - this.state = 429; + this.state = 428; this.primaryExpression(); - this.state = 430; + this.state = 429; this.string_(); - this.state = 432; + this.state = 431; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 40, this._ctx) ) { case 1: { - this.state = 431; + this.state = 430; this.commandOptions(); } break; @@ -2325,15 +2305,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public grokCommand(): GrokCommandContext { let localctx: GrokCommandContext = new GrokCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 72, esql_parser.RULE_grokCommand); + this.enterRule(localctx, 70, esql_parser.RULE_grokCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 434; + this.state = 433; this.match(esql_parser.GROK); - this.state = 435; + this.state = 434; this.primaryExpression(); - this.state = 436; + this.state = 435; this.string_(); } } @@ -2354,13 +2334,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public mvExpandCommand(): MvExpandCommandContext { let localctx: MvExpandCommandContext = new MvExpandCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 74, esql_parser.RULE_mvExpandCommand); + this.enterRule(localctx, 72, esql_parser.RULE_mvExpandCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 438; + this.state = 437; this.match(esql_parser.MV_EXPAND); - this.state = 439; + this.state = 438; this.qualifiedName(); } } @@ -2381,28 +2361,28 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public commandOptions(): CommandOptionsContext { let localctx: CommandOptionsContext = new CommandOptionsContext(this, this._ctx, this.state); - this.enterRule(localctx, 76, esql_parser.RULE_commandOptions); + this.enterRule(localctx, 74, esql_parser.RULE_commandOptions); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 441; + this.state = 440; this.commandOption(); - this.state = 446; + this.state = 445; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 442; + this.state = 441; this.match(esql_parser.COMMA); - this.state = 443; + this.state = 442; this.commandOption(); } } } - this.state = 448; + this.state = 447; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); } @@ -2425,15 +2405,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public commandOption(): CommandOptionContext { let localctx: CommandOptionContext = new CommandOptionContext(this, this._ctx, this.state); - this.enterRule(localctx, 78, esql_parser.RULE_commandOption); + this.enterRule(localctx, 76, esql_parser.RULE_commandOption); try { this.enterOuterAlt(localctx, 1); { - this.state = 449; + this.state = 448; this.identifier(); - this.state = 450; + this.state = 449; this.match(esql_parser.ASSIGN); - this.state = 451; + this.state = 450; this.constant(); } } @@ -2454,14 +2434,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public booleanValue(): BooleanValueContext { let localctx: BooleanValueContext = new BooleanValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 80, esql_parser.RULE_booleanValue); + this.enterRule(localctx, 78, esql_parser.RULE_booleanValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 453; + this.state = 452; _la = this._input.LA(1); - if(!(_la===36 || _la===50)) { + if(!(_la===37 || _la===51)) { this._errHandler.recoverInline(this); } else { @@ -2487,22 +2467,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public numericValue(): NumericValueContext { let localctx: NumericValueContext = new NumericValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 82, esql_parser.RULE_numericValue); + this.enterRule(localctx, 80, esql_parser.RULE_numericValue); try { - this.state = 457; + this.state = 456; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 42, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 455; + this.state = 454; this.decimalValue(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 456; + this.state = 455; this.integerValue(); } break; @@ -2525,19 +2505,19 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public decimalValue(): DecimalValueContext { let localctx: DecimalValueContext = new DecimalValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 84, esql_parser.RULE_decimalValue); + this.enterRule(localctx, 82, esql_parser.RULE_decimalValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 460; + this.state = 459; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===58 || _la===59) { + if (_la===59 || _la===60) { { - this.state = 459; + this.state = 458; _la = this._input.LA(1); - if(!(_la===58 || _la===59)) { + if(!(_la===59 || _la===60)) { this._errHandler.recoverInline(this); } else { @@ -2547,7 +2527,7 @@ export default class esql_parser extends Parser { } } - this.state = 462; + this.state = 461; this.match(esql_parser.DECIMAL_LITERAL); } } @@ -2568,19 +2548,19 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public integerValue(): IntegerValueContext { let localctx: IntegerValueContext = new IntegerValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 86, esql_parser.RULE_integerValue); + this.enterRule(localctx, 84, esql_parser.RULE_integerValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 465; + this.state = 464; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===58 || _la===59) { + if (_la===59 || _la===60) { { - this.state = 464; + this.state = 463; _la = this._input.LA(1); - if(!(_la===58 || _la===59)) { + if(!(_la===59 || _la===60)) { this._errHandler.recoverInline(this); } else { @@ -2590,7 +2570,7 @@ export default class esql_parser extends Parser { } } - this.state = 467; + this.state = 466; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2611,11 +2591,11 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public string_(): StringContext { let localctx: StringContext = new StringContext(this, this._ctx, this.state); - this.enterRule(localctx, 88, esql_parser.RULE_string); + this.enterRule(localctx, 86, esql_parser.RULE_string); try { this.enterOuterAlt(localctx, 1); { - this.state = 469; + this.state = 468; this.match(esql_parser.STRING); } } @@ -2636,14 +2616,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public comparisonOperator(): ComparisonOperatorContext { let localctx: ComparisonOperatorContext = new ComparisonOperatorContext(this, this._ctx, this.state); - this.enterRule(localctx, 90, esql_parser.RULE_comparisonOperator); + this.enterRule(localctx, 88, esql_parser.RULE_comparisonOperator); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 471; + this.state = 470; _la = this._input.LA(1); - if(!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 125) !== 0))) { + if(!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 125) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -2669,13 +2649,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public explainCommand(): ExplainCommandContext { let localctx: ExplainCommandContext = new ExplainCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 92, esql_parser.RULE_explainCommand); + this.enterRule(localctx, 90, esql_parser.RULE_explainCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 473; + this.state = 472; this.match(esql_parser.EXPLAIN); - this.state = 474; + this.state = 473; this.subqueryExpression(); } } @@ -2696,15 +2676,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public subqueryExpression(): SubqueryExpressionContext { let localctx: SubqueryExpressionContext = new SubqueryExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 94, esql_parser.RULE_subqueryExpression); + this.enterRule(localctx, 92, esql_parser.RULE_subqueryExpression); try { this.enterOuterAlt(localctx, 1); { - this.state = 476; + this.state = 475; this.match(esql_parser.OPENING_BRACKET); - this.state = 477; + this.state = 476; this.query(0); - this.state = 478; + this.state = 477; this.match(esql_parser.CLOSING_BRACKET); } } @@ -2725,31 +2705,43 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public showCommand(): ShowCommandContext { let localctx: ShowCommandContext = new ShowCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 96, esql_parser.RULE_showCommand); + this.enterRule(localctx, 94, esql_parser.RULE_showCommand); try { - this.state = 484; - this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 45, this._ctx) ) { - case 1: - localctx = new ShowInfoContext(this, localctx); - this.enterOuterAlt(localctx, 1); - { - this.state = 480; - this.match(esql_parser.SHOW); - this.state = 481; - this.match(esql_parser.INFO); - } - break; - case 2: - localctx = new ShowFunctionsContext(this, localctx); - this.enterOuterAlt(localctx, 2); - { - this.state = 482; - this.match(esql_parser.SHOW); - this.state = 483; - this.match(esql_parser.FUNCTIONS); - } - break; + localctx = new ShowInfoContext(this, localctx); + this.enterOuterAlt(localctx, 1); + { + this.state = 479; + this.match(esql_parser.SHOW); + this.state = 480; + this.match(esql_parser.INFO); + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } + // @RuleVersion(0) + public metaCommand(): MetaCommandContext { + let localctx: MetaCommandContext = new MetaCommandContext(this, this._ctx, this.state); + this.enterRule(localctx, 96, esql_parser.RULE_metaCommand); + try { + localctx = new MetaFunctionsContext(this, localctx); + this.enterOuterAlt(localctx, 1); + { + this.state = 482; + this.match(esql_parser.META); + this.state = 483; + this.match(esql_parser.FUNCTIONS); } } catch (re) { @@ -2774,48 +2766,48 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 486; + this.state = 485; this.match(esql_parser.ENRICH); - this.state = 487; + this.state = 486; localctx._policyName = this.match(esql_parser.ENRICH_POLICY_NAME); - this.state = 490; + this.state = 489; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 46, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 45, this._ctx) ) { case 1: { - this.state = 488; + this.state = 487; this.match(esql_parser.ON); - this.state = 489; + this.state = 488; localctx._matchField = this.qualifiedNamePattern(); } break; } - this.state = 501; + this.state = 500; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 48, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 47, this._ctx) ) { case 1: { - this.state = 492; + this.state = 491; this.match(esql_parser.WITH); - this.state = 493; + this.state = 492; this.enrichWithClause(); - this.state = 498; + this.state = 497; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 47, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 46, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 494; + this.state = 493; this.match(esql_parser.COMMA); - this.state = 495; + this.state = 494; this.enrichWithClause(); } } } - this.state = 500; + this.state = 499; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 47, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 46, this._ctx); } } break; @@ -2843,19 +2835,19 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 506; + this.state = 505; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 49, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 48, this._ctx) ) { case 1: { - this.state = 503; + this.state = 502; localctx._newName = this.qualifiedNamePattern(); - this.state = 504; + this.state = 503; this.match(esql_parser.ASSIGN); } break; } - this.state = 508; + this.state = 507; localctx._enrichField = this.qualifiedNamePattern(); } } @@ -2911,7 +2903,7 @@ export default class esql_parser extends Parser { return true; } - public static readonly _serializedATN: number[] = [4,1,105,511,2,0,7,0, + public static readonly _serializedATN: number[] = [4,1,108,510,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, @@ -2919,165 +2911,165 @@ export default class esql_parser extends Parser { 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,1,0,1,0,1,0,1,1,1,1,1,1, - 1,1,1,1,1,1,5,1,112,8,1,10,1,12,1,115,9,1,1,2,1,2,1,2,1,2,3,2,121,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,136,8,3,1,4,1,4,1, - 4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,148,8,5,1,5,1,5,1,5,1,5,1,5,5,5,155,8, - 5,10,5,12,5,158,9,5,1,5,1,5,1,5,1,5,1,5,3,5,165,8,5,1,5,1,5,3,5,169,8,5, - 1,5,1,5,1,5,1,5,1,5,1,5,5,5,177,8,5,10,5,12,5,180,9,5,1,6,1,6,3,6,184,8, - 6,1,6,1,6,1,6,1,6,1,6,3,6,191,8,6,1,6,1,6,1,6,3,6,196,8,6,1,7,1,7,1,7,1, - 7,1,7,3,7,203,8,7,1,8,1,8,1,8,1,8,3,8,209,8,8,1,8,1,8,1,8,1,8,1,8,1,8,5, - 8,217,8,8,10,8,12,8,220,9,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3,9,229,8,9,1,10, - 1,10,1,10,1,10,1,10,1,10,5,10,237,8,10,10,10,12,10,240,9,10,3,10,242,8, - 10,1,10,1,10,1,11,1,11,1,11,1,12,1,12,1,12,5,12,252,8,12,10,12,12,12,255, - 9,12,1,13,1,13,1,13,1,13,1,13,3,13,262,8,13,1,14,1,14,1,14,1,14,5,14,268, - 8,14,10,14,12,14,271,9,14,1,14,3,14,274,8,14,1,15,1,15,3,15,278,8,15,1, - 16,1,16,1,16,1,16,5,16,284,8,16,10,16,12,16,287,9,16,1,17,1,17,1,17,1,17, - 1,18,1,18,1,18,1,19,1,19,3,19,298,8,19,1,19,1,19,3,19,302,8,19,1,20,1,20, - 1,20,1,20,3,20,308,8,20,1,21,1,21,1,22,1,22,1,22,5,22,315,8,22,10,22,12, - 22,318,9,22,1,23,1,23,1,23,5,23,323,8,23,10,23,12,23,326,9,23,1,24,1,24, - 1,25,1,25,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1, - 27,1,27,1,27,5,27,347,8,27,10,27,12,27,350,9,27,1,27,1,27,1,27,1,27,1,27, - 1,27,5,27,358,8,27,10,27,12,27,361,9,27,1,27,1,27,1,27,1,27,1,27,1,27,5, - 27,369,8,27,10,27,12,27,372,9,27,1,27,1,27,3,27,376,8,27,1,28,1,28,1,28, - 1,29,1,29,1,29,1,29,5,29,385,8,29,10,29,12,29,388,9,29,1,30,1,30,3,30,392, - 8,30,1,30,1,30,3,30,396,8,30,1,31,1,31,1,31,1,31,5,31,402,8,31,10,31,12, - 31,405,9,31,1,32,1,32,1,32,1,32,5,32,411,8,32,10,32,12,32,414,9,32,1,33, - 1,33,1,33,1,33,5,33,420,8,33,10,33,12,33,423,9,33,1,34,1,34,1,34,1,34,1, - 35,1,35,1,35,1,35,3,35,433,8,35,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,38, - 1,38,1,38,5,38,445,8,38,10,38,12,38,448,9,38,1,39,1,39,1,39,1,39,1,40,1, - 40,1,41,1,41,3,41,458,8,41,1,42,3,42,461,8,42,1,42,1,42,1,43,3,43,466,8, - 43,1,43,1,43,1,44,1,44,1,45,1,45,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,48, - 1,48,1,48,1,48,3,48,485,8,48,1,49,1,49,1,49,1,49,3,49,491,8,49,1,49,1,49, - 1,49,1,49,5,49,497,8,49,10,49,12,49,500,9,49,3,49,502,8,49,1,50,1,50,1, - 50,3,50,507,8,50,1,50,1,50,1,50,0,3,2,10,16,51,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,98,100,0,9,1,0,58,59,1,0,60, - 62,2,0,66,66,71,71,1,0,65,66,2,0,66,66,105,105,2,0,31,31,34,34,1,0,37,38, - 2,0,36,36,50,50,2,0,51,51,53,57,536,0,102,1,0,0,0,2,105,1,0,0,0,4,120,1, - 0,0,0,6,135,1,0,0,0,8,137,1,0,0,0,10,168,1,0,0,0,12,195,1,0,0,0,14,202, - 1,0,0,0,16,208,1,0,0,0,18,228,1,0,0,0,20,230,1,0,0,0,22,245,1,0,0,0,24, - 248,1,0,0,0,26,261,1,0,0,0,28,263,1,0,0,0,30,277,1,0,0,0,32,279,1,0,0,0, - 34,288,1,0,0,0,36,292,1,0,0,0,38,295,1,0,0,0,40,303,1,0,0,0,42,309,1,0, - 0,0,44,311,1,0,0,0,46,319,1,0,0,0,48,327,1,0,0,0,50,329,1,0,0,0,52,331, - 1,0,0,0,54,375,1,0,0,0,56,377,1,0,0,0,58,380,1,0,0,0,60,389,1,0,0,0,62, - 397,1,0,0,0,64,406,1,0,0,0,66,415,1,0,0,0,68,424,1,0,0,0,70,428,1,0,0,0, - 72,434,1,0,0,0,74,438,1,0,0,0,76,441,1,0,0,0,78,449,1,0,0,0,80,453,1,0, - 0,0,82,457,1,0,0,0,84,460,1,0,0,0,86,465,1,0,0,0,88,469,1,0,0,0,90,471, - 1,0,0,0,92,473,1,0,0,0,94,476,1,0,0,0,96,484,1,0,0,0,98,486,1,0,0,0,100, - 506,1,0,0,0,102,103,3,2,1,0,103,104,5,0,0,1,104,1,1,0,0,0,105,106,6,1,-1, - 0,106,107,3,4,2,0,107,113,1,0,0,0,108,109,10,1,0,0,109,110,5,25,0,0,110, - 112,3,6,3,0,111,108,1,0,0,0,112,115,1,0,0,0,113,111,1,0,0,0,113,114,1,0, - 0,0,114,3,1,0,0,0,115,113,1,0,0,0,116,121,3,92,46,0,117,121,3,28,14,0,118, - 121,3,22,11,0,119,121,3,96,48,0,120,116,1,0,0,0,120,117,1,0,0,0,120,118, - 1,0,0,0,120,119,1,0,0,0,121,5,1,0,0,0,122,136,3,36,18,0,123,136,3,40,20, - 0,124,136,3,56,28,0,125,136,3,62,31,0,126,136,3,58,29,0,127,136,3,38,19, - 0,128,136,3,8,4,0,129,136,3,64,32,0,130,136,3,66,33,0,131,136,3,70,35,0, - 132,136,3,72,36,0,133,136,3,98,49,0,134,136,3,74,37,0,135,122,1,0,0,0,135, - 123,1,0,0,0,135,124,1,0,0,0,135,125,1,0,0,0,135,126,1,0,0,0,135,127,1,0, - 0,0,135,128,1,0,0,0,135,129,1,0,0,0,135,130,1,0,0,0,135,131,1,0,0,0,135, - 132,1,0,0,0,135,133,1,0,0,0,135,134,1,0,0,0,136,7,1,0,0,0,137,138,5,17, - 0,0,138,139,3,10,5,0,139,9,1,0,0,0,140,141,6,5,-1,0,141,142,5,43,0,0,142, - 169,3,10,5,7,143,169,3,14,7,0,144,169,3,12,6,0,145,147,3,14,7,0,146,148, - 5,43,0,0,147,146,1,0,0,0,147,148,1,0,0,0,148,149,1,0,0,0,149,150,5,40,0, - 0,150,151,5,39,0,0,151,156,3,14,7,0,152,153,5,33,0,0,153,155,3,14,7,0,154, - 152,1,0,0,0,155,158,1,0,0,0,156,154,1,0,0,0,156,157,1,0,0,0,157,159,1,0, - 0,0,158,156,1,0,0,0,159,160,5,49,0,0,160,169,1,0,0,0,161,162,3,14,7,0,162, - 164,5,41,0,0,163,165,5,43,0,0,164,163,1,0,0,0,164,165,1,0,0,0,165,166,1, - 0,0,0,166,167,5,44,0,0,167,169,1,0,0,0,168,140,1,0,0,0,168,143,1,0,0,0, - 168,144,1,0,0,0,168,145,1,0,0,0,168,161,1,0,0,0,169,178,1,0,0,0,170,171, - 10,4,0,0,171,172,5,30,0,0,172,177,3,10,5,5,173,174,10,3,0,0,174,175,5,46, - 0,0,175,177,3,10,5,4,176,170,1,0,0,0,176,173,1,0,0,0,177,180,1,0,0,0,178, - 176,1,0,0,0,178,179,1,0,0,0,179,11,1,0,0,0,180,178,1,0,0,0,181,183,3,14, - 7,0,182,184,5,43,0,0,183,182,1,0,0,0,183,184,1,0,0,0,184,185,1,0,0,0,185, - 186,5,42,0,0,186,187,3,88,44,0,187,196,1,0,0,0,188,190,3,14,7,0,189,191, - 5,43,0,0,190,189,1,0,0,0,190,191,1,0,0,0,191,192,1,0,0,0,192,193,5,48,0, - 0,193,194,3,88,44,0,194,196,1,0,0,0,195,181,1,0,0,0,195,188,1,0,0,0,196, - 13,1,0,0,0,197,203,3,16,8,0,198,199,3,16,8,0,199,200,3,90,45,0,200,201, - 3,16,8,0,201,203,1,0,0,0,202,197,1,0,0,0,202,198,1,0,0,0,203,15,1,0,0,0, - 204,205,6,8,-1,0,205,209,3,18,9,0,206,207,7,0,0,0,207,209,3,16,8,3,208, - 204,1,0,0,0,208,206,1,0,0,0,209,218,1,0,0,0,210,211,10,2,0,0,211,212,7, - 1,0,0,212,217,3,16,8,3,213,214,10,1,0,0,214,215,7,0,0,0,215,217,3,16,8, - 2,216,210,1,0,0,0,216,213,1,0,0,0,217,220,1,0,0,0,218,216,1,0,0,0,218,219, - 1,0,0,0,219,17,1,0,0,0,220,218,1,0,0,0,221,229,3,54,27,0,222,229,3,44,22, - 0,223,229,3,20,10,0,224,225,5,39,0,0,225,226,3,10,5,0,226,227,5,49,0,0, - 227,229,1,0,0,0,228,221,1,0,0,0,228,222,1,0,0,0,228,223,1,0,0,0,228,224, - 1,0,0,0,229,19,1,0,0,0,230,231,3,48,24,0,231,241,5,39,0,0,232,242,5,60, - 0,0,233,238,3,10,5,0,234,235,5,33,0,0,235,237,3,10,5,0,236,234,1,0,0,0, - 237,240,1,0,0,0,238,236,1,0,0,0,238,239,1,0,0,0,239,242,1,0,0,0,240,238, - 1,0,0,0,241,232,1,0,0,0,241,233,1,0,0,0,241,242,1,0,0,0,242,243,1,0,0,0, - 243,244,5,49,0,0,244,21,1,0,0,0,245,246,5,13,0,0,246,247,3,24,12,0,247, - 23,1,0,0,0,248,253,3,26,13,0,249,250,5,33,0,0,250,252,3,26,13,0,251,249, - 1,0,0,0,252,255,1,0,0,0,253,251,1,0,0,0,253,254,1,0,0,0,254,25,1,0,0,0, - 255,253,1,0,0,0,256,262,3,10,5,0,257,258,3,44,22,0,258,259,5,32,0,0,259, - 260,3,10,5,0,260,262,1,0,0,0,261,256,1,0,0,0,261,257,1,0,0,0,262,27,1,0, - 0,0,263,264,5,6,0,0,264,269,3,42,21,0,265,266,5,33,0,0,266,268,3,42,21, - 0,267,265,1,0,0,0,268,271,1,0,0,0,269,267,1,0,0,0,269,270,1,0,0,0,270,273, - 1,0,0,0,271,269,1,0,0,0,272,274,3,30,15,0,273,272,1,0,0,0,273,274,1,0,0, - 0,274,29,1,0,0,0,275,278,3,32,16,0,276,278,3,34,17,0,277,275,1,0,0,0,277, - 276,1,0,0,0,278,31,1,0,0,0,279,280,5,70,0,0,280,285,3,42,21,0,281,282,5, - 33,0,0,282,284,3,42,21,0,283,281,1,0,0,0,284,287,1,0,0,0,285,283,1,0,0, - 0,285,286,1,0,0,0,286,33,1,0,0,0,287,285,1,0,0,0,288,289,5,63,0,0,289,290, - 3,32,16,0,290,291,5,64,0,0,291,35,1,0,0,0,292,293,5,4,0,0,293,294,3,24, - 12,0,294,37,1,0,0,0,295,297,5,16,0,0,296,298,3,24,12,0,297,296,1,0,0,0, - 297,298,1,0,0,0,298,301,1,0,0,0,299,300,5,29,0,0,300,302,3,24,12,0,301, - 299,1,0,0,0,301,302,1,0,0,0,302,39,1,0,0,0,303,304,5,8,0,0,304,307,3,24, - 12,0,305,306,5,29,0,0,306,308,3,24,12,0,307,305,1,0,0,0,307,308,1,0,0,0, - 308,41,1,0,0,0,309,310,7,2,0,0,310,43,1,0,0,0,311,316,3,48,24,0,312,313, - 5,35,0,0,313,315,3,48,24,0,314,312,1,0,0,0,315,318,1,0,0,0,316,314,1,0, - 0,0,316,317,1,0,0,0,317,45,1,0,0,0,318,316,1,0,0,0,319,324,3,50,25,0,320, - 321,5,35,0,0,321,323,3,50,25,0,322,320,1,0,0,0,323,326,1,0,0,0,324,322, - 1,0,0,0,324,325,1,0,0,0,325,47,1,0,0,0,326,324,1,0,0,0,327,328,7,3,0,0, - 328,49,1,0,0,0,329,330,5,75,0,0,330,51,1,0,0,0,331,332,7,4,0,0,332,53,1, - 0,0,0,333,376,5,44,0,0,334,335,3,86,43,0,335,336,5,65,0,0,336,376,1,0,0, - 0,337,376,3,84,42,0,338,376,3,86,43,0,339,376,3,80,40,0,340,376,5,47,0, - 0,341,376,3,88,44,0,342,343,5,63,0,0,343,348,3,82,41,0,344,345,5,33,0,0, - 345,347,3,82,41,0,346,344,1,0,0,0,347,350,1,0,0,0,348,346,1,0,0,0,348,349, - 1,0,0,0,349,351,1,0,0,0,350,348,1,0,0,0,351,352,5,64,0,0,352,376,1,0,0, - 0,353,354,5,63,0,0,354,359,3,80,40,0,355,356,5,33,0,0,356,358,3,80,40,0, - 357,355,1,0,0,0,358,361,1,0,0,0,359,357,1,0,0,0,359,360,1,0,0,0,360,362, - 1,0,0,0,361,359,1,0,0,0,362,363,5,64,0,0,363,376,1,0,0,0,364,365,5,63,0, - 0,365,370,3,88,44,0,366,367,5,33,0,0,367,369,3,88,44,0,368,366,1,0,0,0, - 369,372,1,0,0,0,370,368,1,0,0,0,370,371,1,0,0,0,371,373,1,0,0,0,372,370, - 1,0,0,0,373,374,5,64,0,0,374,376,1,0,0,0,375,333,1,0,0,0,375,334,1,0,0, - 0,375,337,1,0,0,0,375,338,1,0,0,0,375,339,1,0,0,0,375,340,1,0,0,0,375,341, - 1,0,0,0,375,342,1,0,0,0,375,353,1,0,0,0,375,364,1,0,0,0,376,55,1,0,0,0, - 377,378,5,10,0,0,378,379,5,27,0,0,379,57,1,0,0,0,380,381,5,15,0,0,381,386, - 3,60,30,0,382,383,5,33,0,0,383,385,3,60,30,0,384,382,1,0,0,0,385,388,1, - 0,0,0,386,384,1,0,0,0,386,387,1,0,0,0,387,59,1,0,0,0,388,386,1,0,0,0,389, - 391,3,10,5,0,390,392,7,5,0,0,391,390,1,0,0,0,391,392,1,0,0,0,392,395,1, - 0,0,0,393,394,5,45,0,0,394,396,7,6,0,0,395,393,1,0,0,0,395,396,1,0,0,0, - 396,61,1,0,0,0,397,398,5,9,0,0,398,403,3,46,23,0,399,400,5,33,0,0,400,402, - 3,46,23,0,401,399,1,0,0,0,402,405,1,0,0,0,403,401,1,0,0,0,403,404,1,0,0, - 0,404,63,1,0,0,0,405,403,1,0,0,0,406,407,5,2,0,0,407,412,3,46,23,0,408, - 409,5,33,0,0,409,411,3,46,23,0,410,408,1,0,0,0,411,414,1,0,0,0,412,410, - 1,0,0,0,412,413,1,0,0,0,413,65,1,0,0,0,414,412,1,0,0,0,415,416,5,12,0,0, - 416,421,3,68,34,0,417,418,5,33,0,0,418,420,3,68,34,0,419,417,1,0,0,0,420, - 423,1,0,0,0,421,419,1,0,0,0,421,422,1,0,0,0,422,67,1,0,0,0,423,421,1,0, - 0,0,424,425,3,46,23,0,425,426,5,79,0,0,426,427,3,46,23,0,427,69,1,0,0,0, - 428,429,5,1,0,0,429,430,3,18,9,0,430,432,3,88,44,0,431,433,3,76,38,0,432, - 431,1,0,0,0,432,433,1,0,0,0,433,71,1,0,0,0,434,435,5,7,0,0,435,436,3,18, - 9,0,436,437,3,88,44,0,437,73,1,0,0,0,438,439,5,11,0,0,439,440,3,44,22,0, - 440,75,1,0,0,0,441,446,3,78,39,0,442,443,5,33,0,0,443,445,3,78,39,0,444, - 442,1,0,0,0,445,448,1,0,0,0,446,444,1,0,0,0,446,447,1,0,0,0,447,77,1,0, - 0,0,448,446,1,0,0,0,449,450,3,48,24,0,450,451,5,32,0,0,451,452,3,54,27, - 0,452,79,1,0,0,0,453,454,7,7,0,0,454,81,1,0,0,0,455,458,3,84,42,0,456,458, - 3,86,43,0,457,455,1,0,0,0,457,456,1,0,0,0,458,83,1,0,0,0,459,461,7,0,0, - 0,460,459,1,0,0,0,460,461,1,0,0,0,461,462,1,0,0,0,462,463,5,28,0,0,463, - 85,1,0,0,0,464,466,7,0,0,0,465,464,1,0,0,0,465,466,1,0,0,0,466,467,1,0, - 0,0,467,468,5,27,0,0,468,87,1,0,0,0,469,470,5,26,0,0,470,89,1,0,0,0,471, - 472,7,8,0,0,472,91,1,0,0,0,473,474,5,5,0,0,474,475,3,94,47,0,475,93,1,0, - 0,0,476,477,5,63,0,0,477,478,3,2,1,0,478,479,5,64,0,0,479,95,1,0,0,0,480, - 481,5,14,0,0,481,485,5,95,0,0,482,483,5,14,0,0,483,485,5,96,0,0,484,480, - 1,0,0,0,484,482,1,0,0,0,485,97,1,0,0,0,486,487,5,3,0,0,487,490,5,85,0,0, - 488,489,5,83,0,0,489,491,3,46,23,0,490,488,1,0,0,0,490,491,1,0,0,0,491, - 501,1,0,0,0,492,493,5,84,0,0,493,498,3,100,50,0,494,495,5,33,0,0,495,497, - 3,100,50,0,496,494,1,0,0,0,497,500,1,0,0,0,498,496,1,0,0,0,498,499,1,0, - 0,0,499,502,1,0,0,0,500,498,1,0,0,0,501,492,1,0,0,0,501,502,1,0,0,0,502, - 99,1,0,0,0,503,504,3,46,23,0,504,505,5,32,0,0,505,507,1,0,0,0,506,503,1, - 0,0,0,506,507,1,0,0,0,507,508,1,0,0,0,508,509,3,46,23,0,509,101,1,0,0,0, - 50,113,120,135,147,156,164,168,176,178,183,190,195,202,208,216,218,228, - 238,241,253,261,269,273,277,285,297,301,307,316,324,348,359,370,375,386, - 391,395,403,412,421,432,446,457,460,465,484,490,498,501,506]; + 1,1,1,1,1,1,5,1,112,8,1,10,1,12,1,115,9,1,1,2,1,2,1,2,1,2,1,2,3,2,122,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,137,8,3,1,4,1, + 4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,149,8,5,1,5,1,5,1,5,1,5,1,5,5,5,156, + 8,5,10,5,12,5,159,9,5,1,5,1,5,1,5,1,5,1,5,3,5,166,8,5,1,5,1,5,3,5,170,8, + 5,1,5,1,5,1,5,1,5,1,5,1,5,5,5,178,8,5,10,5,12,5,181,9,5,1,6,1,6,3,6,185, + 8,6,1,6,1,6,1,6,1,6,1,6,3,6,192,8,6,1,6,1,6,1,6,3,6,197,8,6,1,7,1,7,1,7, + 1,7,1,7,3,7,204,8,7,1,8,1,8,1,8,1,8,3,8,210,8,8,1,8,1,8,1,8,1,8,1,8,1,8, + 5,8,218,8,8,10,8,12,8,221,9,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3,9,230,8,9,1, + 10,1,10,1,10,1,10,1,10,1,10,5,10,238,8,10,10,10,12,10,241,9,10,3,10,243, + 8,10,1,10,1,10,1,11,1,11,1,11,1,12,1,12,1,12,5,12,253,8,12,10,12,12,12, + 256,9,12,1,13,1,13,1,13,1,13,1,13,3,13,263,8,13,1,14,1,14,1,14,1,14,5,14, + 269,8,14,10,14,12,14,272,9,14,1,14,3,14,275,8,14,1,15,1,15,3,15,279,8,15, + 1,16,1,16,1,16,1,16,5,16,285,8,16,10,16,12,16,288,9,16,1,17,1,17,1,17,1, + 17,1,18,1,18,1,18,1,19,1,19,3,19,299,8,19,1,19,1,19,3,19,303,8,19,1,20, + 1,20,1,20,1,20,3,20,309,8,20,1,21,1,21,1,22,1,22,1,22,5,22,316,8,22,10, + 22,12,22,319,9,22,1,23,1,23,1,23,5,23,324,8,23,10,23,12,23,327,9,23,1,24, + 1,24,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1, + 26,1,26,5,26,346,8,26,10,26,12,26,349,9,26,1,26,1,26,1,26,1,26,1,26,1,26, + 5,26,357,8,26,10,26,12,26,360,9,26,1,26,1,26,1,26,1,26,1,26,1,26,5,26,368, + 8,26,10,26,12,26,371,9,26,1,26,1,26,3,26,375,8,26,1,27,1,27,1,27,1,28,1, + 28,1,28,1,28,5,28,384,8,28,10,28,12,28,387,9,28,1,29,1,29,3,29,391,8,29, + 1,29,1,29,3,29,395,8,29,1,30,1,30,1,30,1,30,5,30,401,8,30,10,30,12,30,404, + 9,30,1,31,1,31,1,31,1,31,5,31,410,8,31,10,31,12,31,413,9,31,1,32,1,32,1, + 32,1,32,5,32,419,8,32,10,32,12,32,422,9,32,1,33,1,33,1,33,1,33,1,34,1,34, + 1,34,1,34,3,34,432,8,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,37,1,37,1, + 37,5,37,444,8,37,10,37,12,37,447,9,37,1,38,1,38,1,38,1,38,1,39,1,39,1,40, + 1,40,3,40,457,8,40,1,41,3,41,460,8,41,1,41,1,41,1,42,3,42,465,8,42,1,42, + 1,42,1,43,1,43,1,44,1,44,1,45,1,45,1,45,1,46,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,3,49,490,8,49,1,49,1,49,1,49,1,49, + 5,49,496,8,49,10,49,12,49,499,9,49,3,49,501,8,49,1,50,1,50,1,50,3,50,506, + 8,50,1,50,1,50,1,50,0,3,2,10,16,51,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,98,100,0,8,1,0,59,60,1,0,61,63,2,0,67, + 67,72,72,1,0,66,67,2,0,32,32,35,35,1,0,38,39,2,0,37,37,51,51,2,0,52,52, + 54,58,535,0,102,1,0,0,0,2,105,1,0,0,0,4,121,1,0,0,0,6,136,1,0,0,0,8,138, + 1,0,0,0,10,169,1,0,0,0,12,196,1,0,0,0,14,203,1,0,0,0,16,209,1,0,0,0,18, + 229,1,0,0,0,20,231,1,0,0,0,22,246,1,0,0,0,24,249,1,0,0,0,26,262,1,0,0,0, + 28,264,1,0,0,0,30,278,1,0,0,0,32,280,1,0,0,0,34,289,1,0,0,0,36,293,1,0, + 0,0,38,296,1,0,0,0,40,304,1,0,0,0,42,310,1,0,0,0,44,312,1,0,0,0,46,320, + 1,0,0,0,48,328,1,0,0,0,50,330,1,0,0,0,52,374,1,0,0,0,54,376,1,0,0,0,56, + 379,1,0,0,0,58,388,1,0,0,0,60,396,1,0,0,0,62,405,1,0,0,0,64,414,1,0,0,0, + 66,423,1,0,0,0,68,427,1,0,0,0,70,433,1,0,0,0,72,437,1,0,0,0,74,440,1,0, + 0,0,76,448,1,0,0,0,78,452,1,0,0,0,80,456,1,0,0,0,82,459,1,0,0,0,84,464, + 1,0,0,0,86,468,1,0,0,0,88,470,1,0,0,0,90,472,1,0,0,0,92,475,1,0,0,0,94, + 479,1,0,0,0,96,482,1,0,0,0,98,485,1,0,0,0,100,505,1,0,0,0,102,103,3,2,1, + 0,103,104,5,0,0,1,104,1,1,0,0,0,105,106,6,1,-1,0,106,107,3,4,2,0,107,113, + 1,0,0,0,108,109,10,1,0,0,109,110,5,26,0,0,110,112,3,6,3,0,111,108,1,0,0, + 0,112,115,1,0,0,0,113,111,1,0,0,0,113,114,1,0,0,0,114,3,1,0,0,0,115,113, + 1,0,0,0,116,122,3,90,45,0,117,122,3,28,14,0,118,122,3,22,11,0,119,122,3, + 94,47,0,120,122,3,96,48,0,121,116,1,0,0,0,121,117,1,0,0,0,121,118,1,0,0, + 0,121,119,1,0,0,0,121,120,1,0,0,0,122,5,1,0,0,0,123,137,3,36,18,0,124,137, + 3,40,20,0,125,137,3,54,27,0,126,137,3,60,30,0,127,137,3,56,28,0,128,137, + 3,38,19,0,129,137,3,8,4,0,130,137,3,62,31,0,131,137,3,64,32,0,132,137,3, + 68,34,0,133,137,3,70,35,0,134,137,3,98,49,0,135,137,3,72,36,0,136,123,1, + 0,0,0,136,124,1,0,0,0,136,125,1,0,0,0,136,126,1,0,0,0,136,127,1,0,0,0,136, + 128,1,0,0,0,136,129,1,0,0,0,136,130,1,0,0,0,136,131,1,0,0,0,136,132,1,0, + 0,0,136,133,1,0,0,0,136,134,1,0,0,0,136,135,1,0,0,0,137,7,1,0,0,0,138,139, + 5,18,0,0,139,140,3,10,5,0,140,9,1,0,0,0,141,142,6,5,-1,0,142,143,5,44,0, + 0,143,170,3,10,5,7,144,170,3,14,7,0,145,170,3,12,6,0,146,148,3,14,7,0,147, + 149,5,44,0,0,148,147,1,0,0,0,148,149,1,0,0,0,149,150,1,0,0,0,150,151,5, + 41,0,0,151,152,5,40,0,0,152,157,3,14,7,0,153,154,5,34,0,0,154,156,3,14, + 7,0,155,153,1,0,0,0,156,159,1,0,0,0,157,155,1,0,0,0,157,158,1,0,0,0,158, + 160,1,0,0,0,159,157,1,0,0,0,160,161,5,50,0,0,161,170,1,0,0,0,162,163,3, + 14,7,0,163,165,5,42,0,0,164,166,5,44,0,0,165,164,1,0,0,0,165,166,1,0,0, + 0,166,167,1,0,0,0,167,168,5,45,0,0,168,170,1,0,0,0,169,141,1,0,0,0,169, + 144,1,0,0,0,169,145,1,0,0,0,169,146,1,0,0,0,169,162,1,0,0,0,170,179,1,0, + 0,0,171,172,10,4,0,0,172,173,5,31,0,0,173,178,3,10,5,5,174,175,10,3,0,0, + 175,176,5,47,0,0,176,178,3,10,5,4,177,171,1,0,0,0,177,174,1,0,0,0,178,181, + 1,0,0,0,179,177,1,0,0,0,179,180,1,0,0,0,180,11,1,0,0,0,181,179,1,0,0,0, + 182,184,3,14,7,0,183,185,5,44,0,0,184,183,1,0,0,0,184,185,1,0,0,0,185,186, + 1,0,0,0,186,187,5,43,0,0,187,188,3,86,43,0,188,197,1,0,0,0,189,191,3,14, + 7,0,190,192,5,44,0,0,191,190,1,0,0,0,191,192,1,0,0,0,192,193,1,0,0,0,193, + 194,5,49,0,0,194,195,3,86,43,0,195,197,1,0,0,0,196,182,1,0,0,0,196,189, + 1,0,0,0,197,13,1,0,0,0,198,204,3,16,8,0,199,200,3,16,8,0,200,201,3,88,44, + 0,201,202,3,16,8,0,202,204,1,0,0,0,203,198,1,0,0,0,203,199,1,0,0,0,204, + 15,1,0,0,0,205,206,6,8,-1,0,206,210,3,18,9,0,207,208,7,0,0,0,208,210,3, + 16,8,3,209,205,1,0,0,0,209,207,1,0,0,0,210,219,1,0,0,0,211,212,10,2,0,0, + 212,213,7,1,0,0,213,218,3,16,8,3,214,215,10,1,0,0,215,216,7,0,0,0,216,218, + 3,16,8,2,217,211,1,0,0,0,217,214,1,0,0,0,218,221,1,0,0,0,219,217,1,0,0, + 0,219,220,1,0,0,0,220,17,1,0,0,0,221,219,1,0,0,0,222,230,3,52,26,0,223, + 230,3,44,22,0,224,230,3,20,10,0,225,226,5,40,0,0,226,227,3,10,5,0,227,228, + 5,50,0,0,228,230,1,0,0,0,229,222,1,0,0,0,229,223,1,0,0,0,229,224,1,0,0, + 0,229,225,1,0,0,0,230,19,1,0,0,0,231,232,3,48,24,0,232,242,5,40,0,0,233, + 243,5,61,0,0,234,239,3,10,5,0,235,236,5,34,0,0,236,238,3,10,5,0,237,235, + 1,0,0,0,238,241,1,0,0,0,239,237,1,0,0,0,239,240,1,0,0,0,240,243,1,0,0,0, + 241,239,1,0,0,0,242,233,1,0,0,0,242,234,1,0,0,0,242,243,1,0,0,0,243,244, + 1,0,0,0,244,245,5,50,0,0,245,21,1,0,0,0,246,247,5,14,0,0,247,248,3,24,12, + 0,248,23,1,0,0,0,249,254,3,26,13,0,250,251,5,34,0,0,251,253,3,26,13,0,252, + 250,1,0,0,0,253,256,1,0,0,0,254,252,1,0,0,0,254,255,1,0,0,0,255,25,1,0, + 0,0,256,254,1,0,0,0,257,263,3,10,5,0,258,259,3,44,22,0,259,260,5,33,0,0, + 260,261,3,10,5,0,261,263,1,0,0,0,262,257,1,0,0,0,262,258,1,0,0,0,263,27, + 1,0,0,0,264,265,5,6,0,0,265,270,3,42,21,0,266,267,5,34,0,0,267,269,3,42, + 21,0,268,266,1,0,0,0,269,272,1,0,0,0,270,268,1,0,0,0,270,271,1,0,0,0,271, + 274,1,0,0,0,272,270,1,0,0,0,273,275,3,30,15,0,274,273,1,0,0,0,274,275,1, + 0,0,0,275,29,1,0,0,0,276,279,3,32,16,0,277,279,3,34,17,0,278,276,1,0,0, + 0,278,277,1,0,0,0,279,31,1,0,0,0,280,281,5,71,0,0,281,286,3,42,21,0,282, + 283,5,34,0,0,283,285,3,42,21,0,284,282,1,0,0,0,285,288,1,0,0,0,286,284, + 1,0,0,0,286,287,1,0,0,0,287,33,1,0,0,0,288,286,1,0,0,0,289,290,5,64,0,0, + 290,291,3,32,16,0,291,292,5,65,0,0,292,35,1,0,0,0,293,294,5,4,0,0,294,295, + 3,24,12,0,295,37,1,0,0,0,296,298,5,17,0,0,297,299,3,24,12,0,298,297,1,0, + 0,0,298,299,1,0,0,0,299,302,1,0,0,0,300,301,5,30,0,0,301,303,3,24,12,0, + 302,300,1,0,0,0,302,303,1,0,0,0,303,39,1,0,0,0,304,305,5,8,0,0,305,308, + 3,24,12,0,306,307,5,30,0,0,307,309,3,24,12,0,308,306,1,0,0,0,308,309,1, + 0,0,0,309,41,1,0,0,0,310,311,7,2,0,0,311,43,1,0,0,0,312,317,3,48,24,0,313, + 314,5,36,0,0,314,316,3,48,24,0,315,313,1,0,0,0,316,319,1,0,0,0,317,315, + 1,0,0,0,317,318,1,0,0,0,318,45,1,0,0,0,319,317,1,0,0,0,320,325,3,50,25, + 0,321,322,5,36,0,0,322,324,3,50,25,0,323,321,1,0,0,0,324,327,1,0,0,0,325, + 323,1,0,0,0,325,326,1,0,0,0,326,47,1,0,0,0,327,325,1,0,0,0,328,329,7,3, + 0,0,329,49,1,0,0,0,330,331,5,76,0,0,331,51,1,0,0,0,332,375,5,45,0,0,333, + 334,3,84,42,0,334,335,5,66,0,0,335,375,1,0,0,0,336,375,3,82,41,0,337,375, + 3,84,42,0,338,375,3,78,39,0,339,375,5,48,0,0,340,375,3,86,43,0,341,342, + 5,64,0,0,342,347,3,80,40,0,343,344,5,34,0,0,344,346,3,80,40,0,345,343,1, + 0,0,0,346,349,1,0,0,0,347,345,1,0,0,0,347,348,1,0,0,0,348,350,1,0,0,0,349, + 347,1,0,0,0,350,351,5,65,0,0,351,375,1,0,0,0,352,353,5,64,0,0,353,358,3, + 78,39,0,354,355,5,34,0,0,355,357,3,78,39,0,356,354,1,0,0,0,357,360,1,0, + 0,0,358,356,1,0,0,0,358,359,1,0,0,0,359,361,1,0,0,0,360,358,1,0,0,0,361, + 362,5,65,0,0,362,375,1,0,0,0,363,364,5,64,0,0,364,369,3,86,43,0,365,366, + 5,34,0,0,366,368,3,86,43,0,367,365,1,0,0,0,368,371,1,0,0,0,369,367,1,0, + 0,0,369,370,1,0,0,0,370,372,1,0,0,0,371,369,1,0,0,0,372,373,5,65,0,0,373, + 375,1,0,0,0,374,332,1,0,0,0,374,333,1,0,0,0,374,336,1,0,0,0,374,337,1,0, + 0,0,374,338,1,0,0,0,374,339,1,0,0,0,374,340,1,0,0,0,374,341,1,0,0,0,374, + 352,1,0,0,0,374,363,1,0,0,0,375,53,1,0,0,0,376,377,5,10,0,0,377,378,5,28, + 0,0,378,55,1,0,0,0,379,380,5,16,0,0,380,385,3,58,29,0,381,382,5,34,0,0, + 382,384,3,58,29,0,383,381,1,0,0,0,384,387,1,0,0,0,385,383,1,0,0,0,385,386, + 1,0,0,0,386,57,1,0,0,0,387,385,1,0,0,0,388,390,3,10,5,0,389,391,7,4,0,0, + 390,389,1,0,0,0,390,391,1,0,0,0,391,394,1,0,0,0,392,393,5,46,0,0,393,395, + 7,5,0,0,394,392,1,0,0,0,394,395,1,0,0,0,395,59,1,0,0,0,396,397,5,9,0,0, + 397,402,3,46,23,0,398,399,5,34,0,0,399,401,3,46,23,0,400,398,1,0,0,0,401, + 404,1,0,0,0,402,400,1,0,0,0,402,403,1,0,0,0,403,61,1,0,0,0,404,402,1,0, + 0,0,405,406,5,2,0,0,406,411,3,46,23,0,407,408,5,34,0,0,408,410,3,46,23, + 0,409,407,1,0,0,0,410,413,1,0,0,0,411,409,1,0,0,0,411,412,1,0,0,0,412,63, + 1,0,0,0,413,411,1,0,0,0,414,415,5,13,0,0,415,420,3,66,33,0,416,417,5,34, + 0,0,417,419,3,66,33,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,65,1,0,0,0,422,420,1,0,0,0,423,424,3,46,23,0,424,425,5, + 80,0,0,425,426,3,46,23,0,426,67,1,0,0,0,427,428,5,1,0,0,428,429,3,18,9, + 0,429,431,3,86,43,0,430,432,3,74,37,0,431,430,1,0,0,0,431,432,1,0,0,0,432, + 69,1,0,0,0,433,434,5,7,0,0,434,435,3,18,9,0,435,436,3,86,43,0,436,71,1, + 0,0,0,437,438,5,12,0,0,438,439,3,44,22,0,439,73,1,0,0,0,440,445,3,76,38, + 0,441,442,5,34,0,0,442,444,3,76,38,0,443,441,1,0,0,0,444,447,1,0,0,0,445, + 443,1,0,0,0,445,446,1,0,0,0,446,75,1,0,0,0,447,445,1,0,0,0,448,449,3,48, + 24,0,449,450,5,33,0,0,450,451,3,52,26,0,451,77,1,0,0,0,452,453,7,6,0,0, + 453,79,1,0,0,0,454,457,3,82,41,0,455,457,3,84,42,0,456,454,1,0,0,0,456, + 455,1,0,0,0,457,81,1,0,0,0,458,460,7,0,0,0,459,458,1,0,0,0,459,460,1,0, + 0,0,460,461,1,0,0,0,461,462,5,29,0,0,462,83,1,0,0,0,463,465,7,0,0,0,464, + 463,1,0,0,0,464,465,1,0,0,0,465,466,1,0,0,0,466,467,5,28,0,0,467,85,1,0, + 0,0,468,469,5,27,0,0,469,87,1,0,0,0,470,471,7,7,0,0,471,89,1,0,0,0,472, + 473,5,5,0,0,473,474,3,92,46,0,474,91,1,0,0,0,475,476,5,64,0,0,476,477,3, + 2,1,0,477,478,5,65,0,0,478,93,1,0,0,0,479,480,5,15,0,0,480,481,5,96,0,0, + 481,95,1,0,0,0,482,483,5,11,0,0,483,484,5,100,0,0,484,97,1,0,0,0,485,486, + 5,3,0,0,486,489,5,86,0,0,487,488,5,84,0,0,488,490,3,46,23,0,489,487,1,0, + 0,0,489,490,1,0,0,0,490,500,1,0,0,0,491,492,5,85,0,0,492,497,3,100,50,0, + 493,494,5,34,0,0,494,496,3,100,50,0,495,493,1,0,0,0,496,499,1,0,0,0,497, + 495,1,0,0,0,497,498,1,0,0,0,498,501,1,0,0,0,499,497,1,0,0,0,500,491,1,0, + 0,0,500,501,1,0,0,0,501,99,1,0,0,0,502,503,3,46,23,0,503,504,5,33,0,0,504, + 506,1,0,0,0,505,502,1,0,0,0,505,506,1,0,0,0,506,507,1,0,0,0,507,508,3,46, + 23,0,508,101,1,0,0,0,49,113,121,136,148,157,165,169,177,179,184,191,196, + 203,209,217,219,229,239,242,254,262,270,274,278,286,298,302,308,317,325, + 347,358,369,374,385,390,394,402,411,420,431,445,456,459,464,489,497,500, + 505]; private static __ATN: ATN; public static get _ATN(): ATN { @@ -3195,6 +3187,9 @@ export class SourceCommandContext extends ParserRuleContext { public showCommand(): ShowCommandContext { return this.getTypedRuleContext(ShowCommandContext, 0) as ShowCommandContext; } + public metaCommand(): MetaCommandContext { + return this.getTypedRuleContext(MetaCommandContext, 0) as MetaCommandContext; + } public get ruleIndex(): number { return esql_parser.RULE_sourceCommand; } @@ -4272,33 +4267,6 @@ export class IdentifierPatternContext extends ParserRuleContext { } -export class IdPatternContext extends ParserRuleContext { - constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { - super(parent, invokingState); - this.parser = parser; - } - public UNQUOTED_ID_PATTERN(): TerminalNode { - return this.getToken(esql_parser.UNQUOTED_ID_PATTERN, 0); - } - public QUOTED_IDENTIFIER(): TerminalNode { - return this.getToken(esql_parser.QUOTED_IDENTIFIER, 0); - } - public get ruleIndex(): number { - return esql_parser.RULE_idPattern; - } - public enterRule(listener: esql_parserListener): void { - if(listener.enterIdPattern) { - listener.enterIdPattern(this); - } - } - public exitRule(listener: esql_parserListener): void { - if(listener.exitIdPattern) { - listener.exitIdPattern(this); - } - } -} - - export class ConstantContext extends ParserRuleContext { constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); @@ -5216,25 +5184,39 @@ export class ShowInfoContext extends ShowCommandContext { } } } -export class ShowFunctionsContext extends ShowCommandContext { - constructor(parser: esql_parser, ctx: ShowCommandContext) { + + +export class MetaCommandContext extends ParserRuleContext { + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public get ruleIndex(): number { + return esql_parser.RULE_metaCommand; + } + public copyFrom(ctx: MetaCommandContext): void { + super.copyFrom(ctx); + } +} +export class MetaFunctionsContext extends MetaCommandContext { + constructor(parser: esql_parser, ctx: MetaCommandContext) { super(parser, ctx.parentCtx, ctx.invokingState); super.copyFrom(ctx); } - public SHOW(): TerminalNode { - return this.getToken(esql_parser.SHOW, 0); + public META(): TerminalNode { + return this.getToken(esql_parser.META, 0); } public FUNCTIONS(): TerminalNode { return this.getToken(esql_parser.FUNCTIONS, 0); } public enterRule(listener: esql_parserListener): void { - if(listener.enterShowFunctions) { - listener.enterShowFunctions(this); + if(listener.enterMetaFunctions) { + listener.enterMetaFunctions(this); } } public exitRule(listener: esql_parserListener): void { - if(listener.exitShowFunctions) { - listener.exitShowFunctions(this); + if(listener.exitMetaFunctions) { + listener.exitMetaFunctions(this); } } } 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 97% 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 d340b1176084d..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"; @@ -42,7 +42,6 @@ import { QualifiedNameContext } from "./esql_parser"; import { QualifiedNamePatternContext } from "./esql_parser"; import { IdentifierContext } from "./esql_parser"; import { IdentifierPatternContext } from "./esql_parser"; -import { IdPatternContext } from "./esql_parser"; import { NullLiteralContext } from "./esql_parser"; import { QualifiedIntegerLiteralContext } from "./esql_parser"; import { DecimalLiteralContext } from "./esql_parser"; @@ -74,7 +73,7 @@ import { ComparisonOperatorContext } from "./esql_parser"; import { ExplainCommandContext } from "./esql_parser"; import { SubqueryExpressionContext } from "./esql_parser"; import { ShowInfoContext } from "./esql_parser"; -import { ShowFunctionsContext } from "./esql_parser"; +import { MetaFunctionsContext } from "./esql_parser"; import { EnrichCommandContext } from "./esql_parser"; import { EnrichWithClauseContext } from "./esql_parser"; @@ -498,16 +497,6 @@ export default class esql_parserListener extends ParseTreeListener { * @param ctx the parse tree */ exitIdentifierPattern?: (ctx: IdentifierPatternContext) => void; - /** - * Enter a parse tree produced by `esql_parser.idPattern`. - * @param ctx the parse tree - */ - enterIdPattern?: (ctx: IdPatternContext) => void; - /** - * Exit a parse tree produced by `esql_parser.idPattern`. - * @param ctx the parse tree - */ - exitIdPattern?: (ctx: IdPatternContext) => void; /** * Enter a parse tree produced by the `nullLiteral` * labeled alternative in `esql_parser.constant`. @@ -841,17 +830,17 @@ export default class esql_parserListener extends ParseTreeListener { */ exitShowInfo?: (ctx: ShowInfoContext) => void; /** - * Enter a parse tree produced by the `showFunctions` - * labeled alternative in `esql_parser.showCommand`. + * Enter a parse tree produced by the `metaFunctions` + * labeled alternative in `esql_parser.metaCommand`. * @param ctx the parse tree */ - enterShowFunctions?: (ctx: ShowFunctionsContext) => void; + enterMetaFunctions?: (ctx: MetaFunctionsContext) => void; /** - * Exit a parse tree produced by the `showFunctions` - * labeled alternative in `esql_parser.showCommand`. + * Exit a parse tree produced by the `metaFunctions` + * labeled alternative in `esql_parser.metaCommand`. * @param ctx the parse tree */ - exitShowFunctions?: (ctx: ShowFunctionsContext) => void; + exitMetaFunctions?: (ctx: MetaFunctionsContext) => void; /** * Enter a parse tree produced by `esql_parser.enrichCommand`. * @param ctx the parse tree 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 89% rename from packages/kbn-monaco/src/esql/lib/ast/ast_factory.ts rename to packages/kbn-esql-ast/src/ast_factory.ts index c543cc9c52caa..48b9a055aec94 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_factory.ts +++ b/packages/kbn-esql-ast/src/ast_factory.ts @@ -9,7 +9,7 @@ import type { ErrorNode, ParserRuleContext, TerminalNode } from 'antlr4'; import { type ShowInfoContext, - type ShowFunctionsContext, + type MetaFunctionsContext, type SingleStatementContext, type RowCommandContext, type FromCommandContext, @@ -27,9 +27,16 @@ import { type EnrichCommandContext, type WhereCommandContext, default as esql_parser, -} from '../../antlr/esql_parser'; -import { default as ESQLParserListener } from '../../antlr/esql_parser_listener'; -import { createCommand, createFunction, createOption, createLiteral } from './ast_helpers'; + type MetaCommandContext, +} from './antlr/esql_parser'; +import { default as ESQLParserListener } from './antlr/esql_parser_listener'; +import { + createCommand, + createFunction, + createOption, + createLiteral, + textExistsAndIsValid, +} from './ast_helpers'; import { getPosition } from './ast_position_utils'; import { collectAllSourceIdentifiers, @@ -64,7 +71,9 @@ export class AstListener implements ESQLParserListener { this.ast.push(commandAst); commandAst.text = ctx.getText(); - commandAst?.args.push(createFunction('info', ctx, getPosition(ctx.INFO().symbol))); + if (textExistsAndIsValid(ctx.INFO().getText())) { + commandAst?.args.push(createFunction('info', ctx, getPosition(ctx.INFO().symbol))); + } } /** @@ -72,12 +81,14 @@ export class AstListener implements ESQLParserListener { * labeled alternative in `esql_parser.showCommand`. * @param ctx the parse tree */ - exitShowFunctions(ctx: ShowFunctionsContext) { - const commandAst = createCommand('show', ctx); + exitMetaFunctions(ctx: MetaFunctionsContext) { + const commandAst = createCommand('meta', ctx); this.ast.push(commandAst); // update the text commandAst.text = ctx.getText(); - commandAst?.args.push(createFunction('functions', ctx, getPosition(ctx.FUNCTIONS().symbol))); + if (textExistsAndIsValid(ctx.FUNCTIONS().getText())) { + commandAst?.args.push(createFunction('functions', ctx, getPosition(ctx.FUNCTIONS().symbol))); + } } /** @@ -249,6 +260,15 @@ export class AstListener implements ESQLParserListener { const command = createCommand('show', ctx); this.ast.push(command); } + + /** + * Enter a parse tree produced by `esql_parser.metaCommand`. + * @param ctx the parse tree + */ + enterMetaCommand(ctx: MetaCommandContext) { + const command = createCommand('meta', ctx); + this.ast.push(command); + } /** * Exit a parse tree produced by `esql_parser.enrichCommand`. * @param ctx the parse tree diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts b/packages/kbn-esql-ast/src/ast_helpers.ts similarity index 97% rename from packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts rename to packages/kbn-esql-ast/src/ast_helpers.ts index c339342a0718d..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, @@ -201,16 +201,13 @@ export function computeLocationExtends(fn: ESQLFunction) { /* SCRIPT_MARKER_START */ function getQuotedText(ctx: ParserRuleContext) { - return [66 /* esql_parser.QUOTED_IDENTIFIER */] + return [67 /* esql_parser.QUOTED_IDENTIFIER */] .map((keyCode) => ctx.getToken(keyCode, 0)) .filter(nonNullable)[0]; } function getUnquotedText(ctx: ParserRuleContext) { - return [ - 65 /* esql_parser.UNQUOTED_IDENTIFIER */, 71 /* esql_parser.FROM_UNQUOTED_IDENTIFIER */, - 105 /* esql_parser.UNQUOTED_ID_PATTERN */, - ] + return [66 /* esql_parser.UNQUOTED_IDENTIFIER */, 72 /* esql_parser.FROM_UNQUOTED_IDENTIFIER */] .map((keyCode) => ctx.getToken(keyCode, 0)) .filter(nonNullable)[0]; } 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 38f26de275577..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,20 +319,27 @@ 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', () => { - testSuggestions('show ', ['functions', 'info']); - for (const fn of ['functions', 'info']) { + testSuggestions('show ', ['info']); + for (const fn of ['info']) { testSuggestions(`show ${fn} `, ['|']); } }); + describe('meta', () => { + testSuggestions('meta ', ['functions']); + for (const fn of ['functions']) { + testSuggestions(`meta ${fn} `, ['|']); + } + }); + describe('where', () => { const allEvalFns = getFunctionSignaturesByReturnType('where', 'any', { evalMath: true, @@ -638,7 +624,7 @@ describe('autocomplete', () => { evalMath: true, }), ], - 32 + '(' ); testSuggestions('from a | eval var0=round(b), var1=round(c) | stats ', [ @@ -650,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 @@ -705,7 +687,7 @@ describe('autocomplete', () => { 'round', ]), ], - 27 + '(' ); testSuggestions( 'from a | stats avg(round(', @@ -715,7 +697,7 @@ describe('autocomplete', () => { 'round', ]), ], - 26 + '(' ); testSuggestions( 'from a | stats avg(', @@ -733,7 +715,7 @@ describe('autocomplete', () => { 'round', ]), ], - 26 + '(' ); }); @@ -1152,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({ @@ -1169,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' }); @@ -1186,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 ); } @@ -1200,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 e43169c6adb78..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) { @@ -653,7 +648,7 @@ async function getExpressionSuggestionsByType( } )) ); - if (command.name === 'show') { + if (['show', 'meta'].includes(command.name)) { suggestions.push( ...getBuiltinCompatibleFunctionDefinition(command.name, undefined, 'any') ); @@ -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 d0dfabbf17223..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,10 +400,10 @@ 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: ['show'], + supportedCommands: ['meta'], signatures: [ { params: [], @@ -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 77% rename from packages/kbn-monaco/src/esql/lib/ast/definitions/commands.ts rename to packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts index d30a03cbc6ff2..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:', }), @@ -56,12 +62,25 @@ export const commandDefinitions: CommandDefinition[] = [ params: [{ name: 'index', type: 'source', wildcards: true }], }, }, + { + name: 'meta', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.metaDoc', { + defaultMessage: 'Returns information about the ES|QL environment', + }), + examples: ['meta functions'], + options: [], + modes: [], + signature: { + multipleParams: false, + params: [{ name: 'functions', type: 'function' }], + }, + }, { 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 functions', 'show info'], + examples: ['show info'], options: [], modes: [], signature: { @@ -71,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.', }), @@ -87,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', }); @@ -127,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', })) @@ -166,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', })) @@ -185,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.', }), @@ -204,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'], @@ -217,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.', }), @@ -231,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'], @@ -244,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'], @@ -261,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', })) @@ -275,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', }); @@ -287,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', }), @@ -309,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', }), @@ -323,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', }), @@ -340,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', }), @@ -357,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'], @@ -370,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.', }), @@ -380,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 d81c65184c8c5..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,30 +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.trim().toLowerCase() === 'show') { - return { - type: 'expression' as const, - // The ES grammar makes the "SHOW" command an invalid type at grammar level - // so we need to create a fake command to make it work the AST in this case - command: { - type: 'command', - name: 'show', - text: innerText.trim(), - location: { min: 0, max: innerText.length }, - incomplete: true, - args: [], - } as ESQLCommand, - node, - option, - }; - } - - 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 93% rename from packages/kbn-monaco/src/esql/lib/ast/validation/resources.ts rename to packages/kbn-esql-validation-autocomplete/src/validation/resources.ts index 85133e81fd4e9..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, @@ -56,7 +55,7 @@ export async function retrieveSources( if (!callbacks || commands.length < 1) { return new Set(); } - if (['row', 'show'].includes(commands[0].name)) { + if (['row', 'show', 'meta'].includes(commands[0].name)) { return new Set(); } const sources = await getSourcesHelper(callbacks)(); 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-journeys/journey/journey_ftr_harness.ts b/packages/kbn-journeys/journey/journey_ftr_harness.ts index b6234acfcfe9b..7ef05c29e9c8e 100644 --- a/packages/kbn-journeys/journey/journey_ftr_harness.ts +++ b/packages/kbn-journeys/journey/journey_ftr_harness.ts @@ -71,8 +71,8 @@ export class JourneyFtrHarness { // journey can be run to collect EBT/APM metrics or just as a functional test // TEST_INGEST_ES_DATA is defined via scripts/run_perfomance.js run only - private readonly isPerformanceRun = process.env.TEST_PERFORMANCE_PHASE || false; - private readonly shouldIngestEsData = !!process.env.TEST_INGEST_ES_DATA; + private readonly isPerformanceRun = !!process.env.TEST_PERFORMANCE_PHASE; + private readonly shouldIngestEsData = process.env.TEST_INGEST_ES_DATA === 'true' || false; // Update the Telemetry and APM global labels to link traces with journey private async updateTelemetryAndAPMLabels(labels: { [k: string]: string }) { diff --git a/packages/kbn-journeys/services/page/kibana_page.ts b/packages/kbn-journeys/services/page/kibana_page.ts index 3001d74a8e897..ef2f258a2bde7 100644 --- a/packages/kbn-journeys/services/page/kibana_page.ts +++ b/packages/kbn-journeys/services/page/kibana_page.ts @@ -8,11 +8,12 @@ import { subj } from '@kbn/test-subj-selector'; import { ToolingLog } from '@kbn/tooling-log'; -import { Page } from 'playwright'; +import { ElementHandle, Page } from 'playwright'; import { Retry } from '..'; interface WaitForRenderArgs { expectedItemsCount: number; + parentLocator?: string; itemLocator: string; checkAttribute: string; timeout: number; @@ -46,19 +47,35 @@ export class KibanaPage { async waitForRender({ expectedItemsCount, + parentLocator, itemLocator, checkAttribute, timeout, }: WaitForRenderArgs) { // we can't use `page.waitForFunction` because of CSP while testing on Cloud await this.retry.waitForWithTimeout( - `rendering of ${expectedItemsCount} elements with selector ${itemLocator} is completed`, + `rendering of ${expectedItemsCount} elements with selector ${itemLocator} ${ + parentLocator ? `and ${parentLocator} parent selector` : '' + } is completed`, timeout, async () => { - const renderingItems = await this.page.$$(itemLocator); - if (renderingItems.length === expectedItemsCount) { + const loadingItems: ElementHandle[] = []; + if (parentLocator) { + const parentElement = await this.page.$(parentLocator); + if (parentElement) { + loadingItems.push(...(await parentElement.$$(itemLocator))); + } else { + this.log.debug(`waitForRender: Can't locate ${parentLocator} element`); + return false; + } + } else { + loadingItems.push(...(await this.page.$$(itemLocator))); + } + // check if loading items count is matching the input + if (loadingItems.length === expectedItemsCount) { + // check if all loaded items are rendered const renderStatuses = await Promise.all( - renderingItems.map(async (item) => { + loadingItems.map(async (item) => { return (await item.getAttribute(checkAttribute)) === 'true'; }) ); @@ -70,7 +87,7 @@ export class KibanaPage { } else { // not all components are loaded yet this.log.debug( - `waitForRender: ${renderingItems.length} out of ${expectedItemsCount} are loaded...` + `waitForRender: ${loadingItems.length} out of ${expectedItemsCount} are loaded...` ); return false; } @@ -94,15 +111,18 @@ export class KibanaPage { } async waitForCharts({ + parentLocator, count, timeout = this.defaultTimeout, }: { + parentLocator?: string; count: number; timeout?: number; }) { await this.waitForRender({ expectedItemsCount: count, - itemLocator: '.echChartStatus', + parentLocator, + itemLocator: 'div.echChartStatus', checkAttribute: 'data-ech-render-complete', timeout, }); 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-lens-formula-docs/src/operations/time_range.ts b/packages/kbn-lens-formula-docs/src/operations/time_range.ts index 58107cbee1587..d1b86b729b23a 100644 --- a/packages/kbn-lens-formula-docs/src/operations/time_range.ts +++ b/packages/kbn-lens-formula-docs/src/operations/time_range.ts @@ -21,8 +21,11 @@ export const timeRange = buildContextVariableDocumentationDefinition({ defaultMessage: ` The specified time range, in milliseconds (ms). -Example: How long is the current time range? +Example: How long is the current time range in (ms)? \`time_range()\` + +Example: A static average per minute computed with the current time range: +\`(sum(bytes) / time_range()) * 1000 * 60\` `, }), }); 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/antlr/esql_lexer.g4 b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 deleted file mode 100644 index 1259f97d96651..0000000000000 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 +++ /dev/null @@ -1,357 +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. - */ - -lexer grammar esql_lexer; - -options { - caseInsensitive = true; -} - -DISSECT: 'dissect' -> pushMode(EXPRESSION_MODE); -DROP: 'drop' -> pushMode(PROJECT_MODE); -ENRICH: 'enrich' -> pushMode(ENRICH_MODE); -EVAL: 'eval' -> pushMode(EXPRESSION_MODE); -EXPLAIN: 'explain' -> pushMode(EXPLAIN_MODE); -FROM: 'from' -> pushMode(FROM_MODE); -GROK: 'grok' -> pushMode(EXPRESSION_MODE); -INLINESTATS: 'inlinestats' -> pushMode(EXPRESSION_MODE); -KEEP: 'keep' -> pushMode(PROJECT_MODE); -LIMIT: 'limit' -> pushMode(EXPRESSION_MODE); -MV_EXPAND: 'mv_expand' -> pushMode(MVEXPAND_MODE); -RENAME: 'rename' -> pushMode(RENAME_MODE); -ROW: 'row' -> pushMode(EXPRESSION_MODE); -SHOW: 'show' -> pushMode(SHOW_MODE); -SORT: 'sort' -> pushMode(EXPRESSION_MODE); -STATS: 'stats' -> pushMode(EXPRESSION_MODE); -WHERE: 'where' -> pushMode(EXPRESSION_MODE); -UNKNOWN_CMD: ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION_MODE); - -LINE_COMMENT: '//' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN); - -MULTILINE_COMMENT: - '/*' (MULTILINE_COMMENT | .)*? '*/' -> channel(HIDDEN); - -WS: [ \r\n\t]+ -> channel(HIDDEN); -// -// Explain -// -// -// -// -// -// -// -// -mode EXPLAIN_MODE; -EXPLAIN_OPENING_BRACKET: - OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(DEFAULT_MODE); -EXPLAIN_PIPE: PIPE -> type(PIPE), popMode; -EXPLAIN_WS: WS -> channel(HIDDEN); -EXPLAIN_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); -EXPLAIN_MULTILINE_COMMENT: - MULTILINE_COMMENT -> channel(HIDDEN); - -// -// Expression - used by most command -// -// -// -// -// -// -// -// -mode EXPRESSION_MODE; - -PIPE: '|' -> popMode; - -fragment DIGIT: [0-9]; - -fragment LETTER: [A-Za-z]; - -fragment ESCAPE_SEQUENCE: '\\' [tnr"\\]; - -fragment UNESCAPED_CHARS: ~[\r\n"\\]; - -fragment EXPONENT: [Ee] [+-]? DIGIT+; - -fragment ASPERAND: '@'; - -fragment BACKQUOTE: '`'; - -fragment BACKQUOTE_BLOCK: ~'`' | '``'; - -fragment UNDERSCORE: '_'; - -fragment UNQUOTED_ID_BODY: (LETTER | DIGIT | UNDERSCORE); - -STRING: - '"' (ESCAPE_SEQUENCE | UNESCAPED_CHARS)* '"' - | '"""' (~[\r\n])*? '"""' '"'? '"'?; - -INTEGER_LITERAL: DIGIT+; - -DECIMAL_LITERAL: - DIGIT+ DOT DIGIT* - | DOT DIGIT+ - | DIGIT+ (DOT DIGIT*)? EXPONENT - | DOT DIGIT+ EXPONENT; - -BY: 'by'; - -AND: 'and'; -ASC: 'asc'; -ASSIGN: '='; -COMMA: ','; -DESC: 'desc'; -DOT: '.'; -FALSE: 'false'; -FIRST: 'first'; -LAST: 'last'; -LP: '('; -IN: 'in'; -IS: 'is'; -LIKE: 'like'; -NOT: 'not'; -NULL: 'null'; -NULLS: 'nulls'; -OR: 'or'; -PARAM: '?'; -RLIKE: 'rlike'; -RP: ')'; -TRUE: 'true'; - -EQ: '=='; -CIEQ: '=~'; -NEQ: '!='; -LT: '<'; -LTE: '<='; -GT: '>'; -GTE: '>='; - -PLUS: '+'; -MINUS: '-'; -ASTERISK: '*'; -SLASH: '/'; -PERCENT: '%'; - -// Brackets are funny. We can happen upon a CLOSING_BRACKET in two ways - one way is to start in an -// explain command which then shifts us to expression mode. Thus, the two popModes on -// CLOSING_BRACKET. The other way could as the start of a multivalued field constant. To line up -// with the double pop the explain mode needs, we double push when we see that. -OPENING_BRACKET: - '[' -> pushMode(EXPRESSION_MODE), pushMode(EXPRESSION_MODE); -CLOSING_BRACKET: ']' -> popMode, popMode; - -UNQUOTED_IDENTIFIER: - LETTER UNQUOTED_ID_BODY* - // only allow @ at beginning of identifier to keep the option to allow @ as infix operator in - // the future also, single `_` and `@` characters are not valid identifiers - | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY+; - -fragment QUOTED_ID: BACKQUOTE BACKQUOTE_BLOCK+ BACKQUOTE; - -QUOTED_IDENTIFIER: QUOTED_ID; - -EXPR_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); - -EXPR_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); - -EXPR_WS: WS -> channel(HIDDEN); -// -// FROM command -// -// -// -// -// -// -// -// -mode FROM_MODE; -FROM_PIPE: PIPE -> type(PIPE), popMode; -FROM_OPENING_BRACKET: OPENING_BRACKET -> type(OPENING_BRACKET); -FROM_CLOSING_BRACKET: CLOSING_BRACKET -> type(CLOSING_BRACKET); -FROM_COMMA: COMMA -> type(COMMA); -FROM_ASSIGN: ASSIGN -> type(ASSIGN); - -METADATA: 'metadata'; - -fragment FROM_UNQUOTED_IDENTIFIER_PART: - ~[=`|,[\]/ \t\r\n] - | '/' ~[*/]; // allow single / but not followed by another / or * which would start a comment - -FROM_UNQUOTED_IDENTIFIER: FROM_UNQUOTED_IDENTIFIER_PART+; - -FROM_QUOTED_IDENTIFIER: - QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER); - -FROM_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); - -FROM_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); - -FROM_WS: WS -> channel(HIDDEN); -// -// DROP, KEEP -// -// -// -// -// -// -// -// -mode PROJECT_MODE; -PROJECT_PIPE: PIPE -> type(PIPE), popMode; -PROJECT_DOT: DOT -> type(DOT); -PROJECT_COMMA: COMMA -> type(COMMA); - -fragment UNQUOTED_ID_BODY_WITH_PATTERN: ( - LETTER - | DIGIT - | UNDERSCORE - | ASTERISK - ); - -fragment UNQUOTED_ID_PATTERN: (LETTER | ASTERISK) UNQUOTED_ID_BODY_WITH_PATTERN* - | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY_WITH_PATTERN+; - -ID_PATTERN: (UNQUOTED_ID_PATTERN | QUOTED_ID)+; - -PROJECT_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); - -PROJECT_MULTILINE_COMMENT: - MULTILINE_COMMENT -> channel(HIDDEN); - -PROJECT_WS: WS -> channel(HIDDEN); -// -// | RENAME a.b AS x, c AS y -// -// -// -// -// -// -// -// -mode RENAME_MODE; -RENAME_PIPE: PIPE -> type(PIPE), popMode; -RENAME_ASSIGN: ASSIGN -> type(ASSIGN); -RENAME_COMMA: COMMA -> type(COMMA); -RENAME_DOT: DOT -> type(DOT); - -AS: 'as'; - -RENAME_ID_PATTERN: ID_PATTERN -> type(ID_PATTERN); - -RENAME_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); - -RENAME_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); - -RENAME_WS: WS -> channel(HIDDEN); - -// | ENRICH ON key WITH fields -mode ENRICH_MODE; -ENRICH_PIPE: PIPE -> type(PIPE), popMode; -ENRICH_OPENING_BRACKET: - OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(SETTING_MODE); - -ON: 'on' -> pushMode(ENRICH_FIELD_MODE); -WITH: 'with' -> pushMode(ENRICH_FIELD_MODE); - -// similar to that of an index see -// https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html#indices-create-api-path-params -fragment ENRICH_POLICY_NAME_BODY: ~[\\/?"<>| ,#\t\r\n:]; - -ENRICH_POLICY_NAME: (ENRICH_POLICY_NAME_BODY+ COLON)? ENRICH_POLICY_NAME_BODY+; -// allow prefix for the policy to specify its resolution - -ENRICH_QUOTED_IDENTIFIER: - QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER); - -ENRICH_MODE_UNQUOTED_VALUE: - ENRICH_POLICY_NAME -> type(ENRICH_POLICY_NAME); - -ENRICH_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); - -ENRICH_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); - -ENRICH_WS: WS -> channel(HIDDEN); - -// submode for Enrich to allow different lexing between policy identifier (loose) and field identifiers -mode ENRICH_FIELD_MODE; -ENRICH_FIELD_PIPE: PIPE -> type(PIPE), popMode, popMode; -ENRICH_FIELD_ASSIGN: ASSIGN -> type(ASSIGN); -ENRICH_FIELD_COMMA: COMMA -> type(COMMA); -ENRICH_FIELD_DOT: DOT -> type(DOT); - -ENRICH_FIELD_WITH: WITH -> type(WITH); - -ENRICH_FIELD_ID_PATTERN: ID_PATTERN -> type(ID_PATTERN); - -ENRICH_FIELD_QUOTED_IDENTIFIER: - QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER); - -ENRICH_FIELD_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); - -ENRICH_FIELD_MULTILINE_COMMENT: - MULTILINE_COMMENT -> channel(HIDDEN); - -ENRICH_FIELD_WS: WS -> channel(HIDDEN); - -mode MVEXPAND_MODE; -MVEXPAND_PIPE: PIPE -> type(PIPE), popMode; -MVEXPAND_DOT: DOT -> type(DOT); - -MVEXPAND_QUOTED_IDENTIFIER: - QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER); - -MVEXPAND_UNQUOTED_IDENTIFIER: - UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER); - -MVEXPAND_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); - -MVEXPAND_MULTILINE_COMMENT: - MULTILINE_COMMENT -> channel(HIDDEN); - -MVEXPAND_WS: WS -> channel(HIDDEN); - -// -// SHOW INFO -// -// -// -// -// -// -// -// -mode SHOW_MODE; -SHOW_PIPE: PIPE -> type(PIPE), popMode; - -INFO: 'info'; -FUNCTIONS: 'functions'; - -SHOW_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); - -SHOW_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); - -SHOW_WS: WS -> channel(HIDDEN); - -mode SETTING_MODE; -SETTING_CLOSING_BRACKET: - CLOSING_BRACKET -> type(CLOSING_BRACKET), popMode; - -COLON: ':'; - -SETTING: (ASPERAND | DIGIT | DOT | LETTER | UNDERSCORE)+; - -SETTING_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); - -SETTTING_MULTILINE_COMMENT: - MULTILINE_COMMENT -> channel(HIDDEN); - -SETTING_WS: WS -> channel(HIDDEN); \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp deleted file mode 100644 index fd39ca68a50f8..0000000000000 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp +++ /dev/null @@ -1,387 +0,0 @@ -token literal names: -null -'dissect' -'drop' -'enrich' -'eval' -'explain' -'from' -'grok' -'inlinestats' -'keep' -'limit' -'mv_expand' -'rename' -'row' -'show' -'sort' -'stats' -'where' -null -null -null -null -null -null -null -'|' -null -null -null -'by' -'and' -'asc' -'=' -',' -'desc' -'.' -'false' -'first' -'last' -'(' -'in' -'is' -'like' -'not' -'null' -'nulls' -'or' -'?' -'rlike' -')' -'true' -'==' -'=~' -'!=' -'<' -'<=' -'>' -'>=' -'+' -'-' -'*' -'/' -'%' -null -']' -null -null -null -null -null -'metadata' -null -null -null -null -null -null -null -null -'as' -null -null -null -'on' -'with' -null -null -null -null -null -null -null -null -null -null -'info' -'functions' -null -null -null -':' -null -null -null -null - -token symbolic names: -null -DISSECT -DROP -ENRICH -EVAL -EXPLAIN -FROM -GROK -INLINESTATS -KEEP -LIMIT -MV_EXPAND -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 -CIEQ -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 -ID_PATTERN -PROJECT_LINE_COMMENT -PROJECT_MULTILINE_COMMENT -PROJECT_WS -AS -RENAME_LINE_COMMENT -RENAME_MULTILINE_COMMENT -RENAME_WS -ON -WITH -ENRICH_POLICY_NAME -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 -COLON -SETTING -SETTING_LINE_COMMENT -SETTTING_MULTILINE_COMMENT -SETTING_WS - -rule names: -DISSECT -DROP -ENRICH -EVAL -EXPLAIN -FROM -GROK -INLINESTATS -KEEP -LIMIT -MV_EXPAND -RENAME -ROW -SHOW -SORT -STATS -WHERE -UNKNOWN_CMD -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 -ASPERAND -BACKQUOTE -BACKQUOTE_BLOCK -UNDERSCORE -UNQUOTED_ID_BODY -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 -CIEQ -NEQ -LT -LTE -GT -GTE -PLUS -MINUS -ASTERISK -SLASH -PERCENT -OPENING_BRACKET -CLOSING_BRACKET -UNQUOTED_IDENTIFIER -QUOTED_ID -QUOTED_IDENTIFIER -EXPR_LINE_COMMENT -EXPR_MULTILINE_COMMENT -EXPR_WS -FROM_PIPE -FROM_OPENING_BRACKET -FROM_CLOSING_BRACKET -FROM_COMMA -FROM_ASSIGN -METADATA -FROM_UNQUOTED_IDENTIFIER_PART -FROM_UNQUOTED_IDENTIFIER -FROM_QUOTED_IDENTIFIER -FROM_LINE_COMMENT -FROM_MULTILINE_COMMENT -FROM_WS -PROJECT_PIPE -PROJECT_DOT -PROJECT_COMMA -UNQUOTED_ID_BODY_WITH_PATTERN -UNQUOTED_ID_PATTERN -ID_PATTERN -PROJECT_LINE_COMMENT -PROJECT_MULTILINE_COMMENT -PROJECT_WS -RENAME_PIPE -RENAME_ASSIGN -RENAME_COMMA -RENAME_DOT -AS -RENAME_ID_PATTERN -RENAME_LINE_COMMENT -RENAME_MULTILINE_COMMENT -RENAME_WS -ENRICH_PIPE -ENRICH_OPENING_BRACKET -ON -WITH -ENRICH_POLICY_NAME_BODY -ENRICH_POLICY_NAME -ENRICH_QUOTED_IDENTIFIER -ENRICH_MODE_UNQUOTED_VALUE -ENRICH_LINE_COMMENT -ENRICH_MULTILINE_COMMENT -ENRICH_WS -ENRICH_FIELD_PIPE -ENRICH_FIELD_ASSIGN -ENRICH_FIELD_COMMA -ENRICH_FIELD_DOT -ENRICH_FIELD_WITH -ENRICH_FIELD_ID_PATTERN -ENRICH_FIELD_QUOTED_IDENTIFIER -ENRICH_FIELD_LINE_COMMENT -ENRICH_FIELD_MULTILINE_COMMENT -ENRICH_FIELD_WS -MVEXPAND_PIPE -MVEXPAND_DOT -MVEXPAND_QUOTED_IDENTIFIER -MVEXPAND_UNQUOTED_IDENTIFIER -MVEXPAND_LINE_COMMENT -MVEXPAND_MULTILINE_COMMENT -MVEXPAND_WS -SHOW_PIPE -INFO -FUNCTIONS -SHOW_LINE_COMMENT -SHOW_MULTILINE_COMMENT -SHOW_WS -SETTING_CLOSING_BRACKET -COLON -SETTING -SETTING_LINE_COMMENT -SETTTING_MULTILINE_COMMENT -SETTING_WS - -channel names: -DEFAULT_TOKEN_CHANNEL -HIDDEN - -mode names: -DEFAULT_MODE -EXPLAIN_MODE -EXPRESSION_MODE -FROM_MODE -PROJECT_MODE -RENAME_MODE -ENRICH_MODE -ENRICH_FIELD_MODE -MVEXPAND_MODE -SHOW_MODE -SETTING_MODE - -atn: -[4, 0, 104, 1147, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 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, 2, 1, 2, 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, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 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, 10, 1, 10, 1, 10, 1, 10, 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, 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, 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, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 4, 17, 460, 8, 17, 11, 17, 12, 17, 461, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 470, 8, 18, 10, 18, 12, 18, 473, 9, 18, 1, 18, 3, 18, 476, 8, 18, 1, 18, 3, 18, 479, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 488, 8, 19, 10, 19, 12, 19, 491, 9, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 499, 8, 20, 11, 20, 12, 20, 500, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 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, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 542, 8, 31, 1, 31, 4, 31, 545, 8, 31, 11, 31, 12, 31, 546, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 556, 8, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 3, 36, 563, 8, 36, 1, 37, 1, 37, 1, 37, 5, 37, 568, 8, 37, 10, 37, 12, 37, 571, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 579, 8, 37, 10, 37, 12, 37, 582, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 589, 8, 37, 1, 37, 3, 37, 592, 8, 37, 3, 37, 594, 8, 37, 1, 38, 4, 38, 597, 8, 38, 11, 38, 12, 38, 598, 1, 39, 4, 39, 602, 8, 39, 11, 39, 12, 39, 603, 1, 39, 1, 39, 5, 39, 608, 8, 39, 10, 39, 12, 39, 611, 9, 39, 1, 39, 1, 39, 4, 39, 615, 8, 39, 11, 39, 12, 39, 616, 1, 39, 4, 39, 620, 8, 39, 11, 39, 12, 39, 621, 1, 39, 1, 39, 5, 39, 626, 8, 39, 10, 39, 12, 39, 629, 9, 39, 3, 39, 631, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 4, 39, 637, 8, 39, 11, 39, 12, 39, 638, 1, 39, 1, 39, 3, 39, 643, 8, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 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, 76, 1, 76, 5, 76, 771, 8, 76, 10, 76, 12, 76, 774, 9, 76, 1, 76, 1, 76, 3, 76, 778, 8, 76, 1, 76, 4, 76, 781, 8, 76, 11, 76, 12, 76, 782, 3, 76, 785, 8, 76, 1, 77, 1, 77, 4, 77, 789, 8, 77, 11, 77, 12, 77, 790, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 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, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 3, 88, 842, 8, 88, 1, 89, 4, 89, 845, 8, 89, 11, 89, 12, 89, 846, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 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, 3, 97, 882, 8, 97, 1, 98, 1, 98, 3, 98, 886, 8, 98, 1, 98, 5, 98, 889, 8, 98, 10, 98, 12, 98, 892, 9, 98, 1, 98, 1, 98, 3, 98, 896, 8, 98, 1, 98, 4, 98, 899, 8, 98, 11, 98, 12, 98, 900, 3, 98, 903, 8, 98, 1, 99, 1, 99, 4, 99, 907, 8, 99, 11, 99, 12, 99, 908, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 4, 117, 984, 8, 117, 11, 117, 12, 117, 985, 1, 117, 1, 117, 3, 117, 990, 8, 117, 1, 117, 4, 117, 993, 8, 117, 11, 117, 12, 117, 994, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 4, 148, 1132, 8, 148, 11, 148, 12, 148, 1133, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 2, 489, 580, 0, 152, 11, 1, 13, 2, 15, 3, 17, 4, 19, 5, 21, 6, 23, 7, 25, 8, 27, 9, 29, 10, 31, 11, 33, 12, 35, 13, 37, 14, 39, 15, 41, 16, 43, 17, 45, 18, 47, 19, 49, 20, 51, 21, 53, 0, 55, 0, 57, 22, 59, 23, 61, 24, 63, 25, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 0, 85, 26, 87, 27, 89, 28, 91, 29, 93, 30, 95, 31, 97, 32, 99, 33, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 115, 41, 117, 42, 119, 43, 121, 44, 123, 45, 125, 46, 127, 47, 129, 48, 131, 49, 133, 50, 135, 51, 137, 52, 139, 53, 141, 54, 143, 55, 145, 56, 147, 57, 149, 58, 151, 59, 153, 60, 155, 61, 157, 62, 159, 63, 161, 64, 163, 65, 165, 0, 167, 66, 169, 67, 171, 68, 173, 69, 175, 0, 177, 0, 179, 0, 181, 0, 183, 0, 185, 70, 187, 0, 189, 71, 191, 0, 193, 72, 195, 73, 197, 74, 199, 0, 201, 0, 203, 0, 205, 0, 207, 0, 209, 75, 211, 76, 213, 77, 215, 78, 217, 0, 219, 0, 221, 0, 223, 0, 225, 79, 227, 0, 229, 80, 231, 81, 233, 82, 235, 0, 237, 0, 239, 83, 241, 84, 243, 0, 245, 85, 247, 0, 249, 0, 251, 86, 253, 87, 255, 88, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 89, 273, 90, 275, 91, 277, 0, 279, 0, 281, 0, 283, 0, 285, 92, 287, 93, 289, 94, 291, 0, 293, 95, 295, 96, 297, 97, 299, 98, 301, 99, 303, 0, 305, 100, 307, 101, 309, 102, 311, 103, 313, 104, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 2, 0, 85, 85, 117, 117, 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, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1175, 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, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 1, 53, 1, 0, 0, 0, 1, 55, 1, 0, 0, 0, 1, 57, 1, 0, 0, 0, 1, 59, 1, 0, 0, 0, 1, 61, 1, 0, 0, 0, 2, 63, 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, 2, 153, 1, 0, 0, 0, 2, 155, 1, 0, 0, 0, 2, 157, 1, 0, 0, 0, 2, 159, 1, 0, 0, 0, 2, 161, 1, 0, 0, 0, 2, 163, 1, 0, 0, 0, 2, 167, 1, 0, 0, 0, 2, 169, 1, 0, 0, 0, 2, 171, 1, 0, 0, 0, 2, 173, 1, 0, 0, 0, 3, 175, 1, 0, 0, 0, 3, 177, 1, 0, 0, 0, 3, 179, 1, 0, 0, 0, 3, 181, 1, 0, 0, 0, 3, 183, 1, 0, 0, 0, 3, 185, 1, 0, 0, 0, 3, 189, 1, 0, 0, 0, 3, 191, 1, 0, 0, 0, 3, 193, 1, 0, 0, 0, 3, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 4, 199, 1, 0, 0, 0, 4, 201, 1, 0, 0, 0, 4, 203, 1, 0, 0, 0, 4, 209, 1, 0, 0, 0, 4, 211, 1, 0, 0, 0, 4, 213, 1, 0, 0, 0, 4, 215, 1, 0, 0, 0, 5, 217, 1, 0, 0, 0, 5, 219, 1, 0, 0, 0, 5, 221, 1, 0, 0, 0, 5, 223, 1, 0, 0, 0, 5, 225, 1, 0, 0, 0, 5, 227, 1, 0, 0, 0, 5, 229, 1, 0, 0, 0, 5, 231, 1, 0, 0, 0, 5, 233, 1, 0, 0, 0, 6, 235, 1, 0, 0, 0, 6, 237, 1, 0, 0, 0, 6, 239, 1, 0, 0, 0, 6, 241, 1, 0, 0, 0, 6, 245, 1, 0, 0, 0, 6, 247, 1, 0, 0, 0, 6, 249, 1, 0, 0, 0, 6, 251, 1, 0, 0, 0, 6, 253, 1, 0, 0, 0, 6, 255, 1, 0, 0, 0, 7, 257, 1, 0, 0, 0, 7, 259, 1, 0, 0, 0, 7, 261, 1, 0, 0, 0, 7, 263, 1, 0, 0, 0, 7, 265, 1, 0, 0, 0, 7, 267, 1, 0, 0, 0, 7, 269, 1, 0, 0, 0, 7, 271, 1, 0, 0, 0, 7, 273, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 8, 277, 1, 0, 0, 0, 8, 279, 1, 0, 0, 0, 8, 281, 1, 0, 0, 0, 8, 283, 1, 0, 0, 0, 8, 285, 1, 0, 0, 0, 8, 287, 1, 0, 0, 0, 8, 289, 1, 0, 0, 0, 9, 291, 1, 0, 0, 0, 9, 293, 1, 0, 0, 0, 9, 295, 1, 0, 0, 0, 9, 297, 1, 0, 0, 0, 9, 299, 1, 0, 0, 0, 9, 301, 1, 0, 0, 0, 10, 303, 1, 0, 0, 0, 10, 305, 1, 0, 0, 0, 10, 307, 1, 0, 0, 0, 10, 309, 1, 0, 0, 0, 10, 311, 1, 0, 0, 0, 10, 313, 1, 0, 0, 0, 11, 315, 1, 0, 0, 0, 13, 325, 1, 0, 0, 0, 15, 332, 1, 0, 0, 0, 17, 341, 1, 0, 0, 0, 19, 348, 1, 0, 0, 0, 21, 358, 1, 0, 0, 0, 23, 365, 1, 0, 0, 0, 25, 372, 1, 0, 0, 0, 27, 386, 1, 0, 0, 0, 29, 393, 1, 0, 0, 0, 31, 401, 1, 0, 0, 0, 33, 413, 1, 0, 0, 0, 35, 422, 1, 0, 0, 0, 37, 428, 1, 0, 0, 0, 39, 435, 1, 0, 0, 0, 41, 442, 1, 0, 0, 0, 43, 450, 1, 0, 0, 0, 45, 459, 1, 0, 0, 0, 47, 465, 1, 0, 0, 0, 49, 482, 1, 0, 0, 0, 51, 498, 1, 0, 0, 0, 53, 504, 1, 0, 0, 0, 55, 509, 1, 0, 0, 0, 57, 514, 1, 0, 0, 0, 59, 518, 1, 0, 0, 0, 61, 522, 1, 0, 0, 0, 63, 526, 1, 0, 0, 0, 65, 530, 1, 0, 0, 0, 67, 532, 1, 0, 0, 0, 69, 534, 1, 0, 0, 0, 71, 537, 1, 0, 0, 0, 73, 539, 1, 0, 0, 0, 75, 548, 1, 0, 0, 0, 77, 550, 1, 0, 0, 0, 79, 555, 1, 0, 0, 0, 81, 557, 1, 0, 0, 0, 83, 562, 1, 0, 0, 0, 85, 593, 1, 0, 0, 0, 87, 596, 1, 0, 0, 0, 89, 642, 1, 0, 0, 0, 91, 644, 1, 0, 0, 0, 93, 647, 1, 0, 0, 0, 95, 651, 1, 0, 0, 0, 97, 655, 1, 0, 0, 0, 99, 657, 1, 0, 0, 0, 101, 659, 1, 0, 0, 0, 103, 664, 1, 0, 0, 0, 105, 666, 1, 0, 0, 0, 107, 672, 1, 0, 0, 0, 109, 678, 1, 0, 0, 0, 111, 683, 1, 0, 0, 0, 113, 685, 1, 0, 0, 0, 115, 688, 1, 0, 0, 0, 117, 691, 1, 0, 0, 0, 119, 696, 1, 0, 0, 0, 121, 700, 1, 0, 0, 0, 123, 705, 1, 0, 0, 0, 125, 711, 1, 0, 0, 0, 127, 714, 1, 0, 0, 0, 129, 716, 1, 0, 0, 0, 131, 722, 1, 0, 0, 0, 133, 724, 1, 0, 0, 0, 135, 729, 1, 0, 0, 0, 137, 732, 1, 0, 0, 0, 139, 735, 1, 0, 0, 0, 141, 738, 1, 0, 0, 0, 143, 740, 1, 0, 0, 0, 145, 743, 1, 0, 0, 0, 147, 745, 1, 0, 0, 0, 149, 748, 1, 0, 0, 0, 151, 750, 1, 0, 0, 0, 153, 752, 1, 0, 0, 0, 155, 754, 1, 0, 0, 0, 157, 756, 1, 0, 0, 0, 159, 758, 1, 0, 0, 0, 161, 763, 1, 0, 0, 0, 163, 784, 1, 0, 0, 0, 165, 786, 1, 0, 0, 0, 167, 794, 1, 0, 0, 0, 169, 796, 1, 0, 0, 0, 171, 800, 1, 0, 0, 0, 173, 804, 1, 0, 0, 0, 175, 808, 1, 0, 0, 0, 177, 813, 1, 0, 0, 0, 179, 817, 1, 0, 0, 0, 181, 821, 1, 0, 0, 0, 183, 825, 1, 0, 0, 0, 185, 829, 1, 0, 0, 0, 187, 841, 1, 0, 0, 0, 189, 844, 1, 0, 0, 0, 191, 848, 1, 0, 0, 0, 193, 852, 1, 0, 0, 0, 195, 856, 1, 0, 0, 0, 197, 860, 1, 0, 0, 0, 199, 864, 1, 0, 0, 0, 201, 869, 1, 0, 0, 0, 203, 873, 1, 0, 0, 0, 205, 881, 1, 0, 0, 0, 207, 902, 1, 0, 0, 0, 209, 906, 1, 0, 0, 0, 211, 910, 1, 0, 0, 0, 213, 914, 1, 0, 0, 0, 215, 918, 1, 0, 0, 0, 217, 922, 1, 0, 0, 0, 219, 927, 1, 0, 0, 0, 221, 931, 1, 0, 0, 0, 223, 935, 1, 0, 0, 0, 225, 939, 1, 0, 0, 0, 227, 942, 1, 0, 0, 0, 229, 946, 1, 0, 0, 0, 231, 950, 1, 0, 0, 0, 233, 954, 1, 0, 0, 0, 235, 958, 1, 0, 0, 0, 237, 963, 1, 0, 0, 0, 239, 968, 1, 0, 0, 0, 241, 973, 1, 0, 0, 0, 243, 980, 1, 0, 0, 0, 245, 989, 1, 0, 0, 0, 247, 996, 1, 0, 0, 0, 249, 1000, 1, 0, 0, 0, 251, 1004, 1, 0, 0, 0, 253, 1008, 1, 0, 0, 0, 255, 1012, 1, 0, 0, 0, 257, 1016, 1, 0, 0, 0, 259, 1022, 1, 0, 0, 0, 261, 1026, 1, 0, 0, 0, 263, 1030, 1, 0, 0, 0, 265, 1034, 1, 0, 0, 0, 267, 1038, 1, 0, 0, 0, 269, 1042, 1, 0, 0, 0, 271, 1046, 1, 0, 0, 0, 273, 1050, 1, 0, 0, 0, 275, 1054, 1, 0, 0, 0, 277, 1058, 1, 0, 0, 0, 279, 1063, 1, 0, 0, 0, 281, 1067, 1, 0, 0, 0, 283, 1071, 1, 0, 0, 0, 285, 1075, 1, 0, 0, 0, 287, 1079, 1, 0, 0, 0, 289, 1083, 1, 0, 0, 0, 291, 1087, 1, 0, 0, 0, 293, 1092, 1, 0, 0, 0, 295, 1097, 1, 0, 0, 0, 297, 1107, 1, 0, 0, 0, 299, 1111, 1, 0, 0, 0, 301, 1115, 1, 0, 0, 0, 303, 1119, 1, 0, 0, 0, 305, 1124, 1, 0, 0, 0, 307, 1131, 1, 0, 0, 0, 309, 1135, 1, 0, 0, 0, 311, 1139, 1, 0, 0, 0, 313, 1143, 1, 0, 0, 0, 315, 316, 7, 0, 0, 0, 316, 317, 7, 1, 0, 0, 317, 318, 7, 2, 0, 0, 318, 319, 7, 2, 0, 0, 319, 320, 7, 3, 0, 0, 320, 321, 7, 4, 0, 0, 321, 322, 7, 5, 0, 0, 322, 323, 1, 0, 0, 0, 323, 324, 6, 0, 0, 0, 324, 12, 1, 0, 0, 0, 325, 326, 7, 0, 0, 0, 326, 327, 7, 6, 0, 0, 327, 328, 7, 7, 0, 0, 328, 329, 7, 8, 0, 0, 329, 330, 1, 0, 0, 0, 330, 331, 6, 1, 1, 0, 331, 14, 1, 0, 0, 0, 332, 333, 7, 3, 0, 0, 333, 334, 7, 9, 0, 0, 334, 335, 7, 6, 0, 0, 335, 336, 7, 1, 0, 0, 336, 337, 7, 4, 0, 0, 337, 338, 7, 10, 0, 0, 338, 339, 1, 0, 0, 0, 339, 340, 6, 2, 2, 0, 340, 16, 1, 0, 0, 0, 341, 342, 7, 3, 0, 0, 342, 343, 7, 11, 0, 0, 343, 344, 7, 12, 0, 0, 344, 345, 7, 13, 0, 0, 345, 346, 1, 0, 0, 0, 346, 347, 6, 3, 0, 0, 347, 18, 1, 0, 0, 0, 348, 349, 7, 3, 0, 0, 349, 350, 7, 14, 0, 0, 350, 351, 7, 8, 0, 0, 351, 352, 7, 13, 0, 0, 352, 353, 7, 12, 0, 0, 353, 354, 7, 1, 0, 0, 354, 355, 7, 9, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 6, 4, 3, 0, 357, 20, 1, 0, 0, 0, 358, 359, 7, 15, 0, 0, 359, 360, 7, 6, 0, 0, 360, 361, 7, 7, 0, 0, 361, 362, 7, 16, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 6, 5, 4, 0, 364, 22, 1, 0, 0, 0, 365, 366, 7, 17, 0, 0, 366, 367, 7, 6, 0, 0, 367, 368, 7, 7, 0, 0, 368, 369, 7, 18, 0, 0, 369, 370, 1, 0, 0, 0, 370, 371, 6, 6, 0, 0, 371, 24, 1, 0, 0, 0, 372, 373, 7, 1, 0, 0, 373, 374, 7, 9, 0, 0, 374, 375, 7, 13, 0, 0, 375, 376, 7, 1, 0, 0, 376, 377, 7, 9, 0, 0, 377, 378, 7, 3, 0, 0, 378, 379, 7, 2, 0, 0, 379, 380, 7, 5, 0, 0, 380, 381, 7, 12, 0, 0, 381, 382, 7, 5, 0, 0, 382, 383, 7, 2, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 6, 7, 0, 0, 385, 26, 1, 0, 0, 0, 386, 387, 7, 18, 0, 0, 387, 388, 7, 3, 0, 0, 388, 389, 7, 3, 0, 0, 389, 390, 7, 8, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 6, 8, 1, 0, 392, 28, 1, 0, 0, 0, 393, 394, 7, 13, 0, 0, 394, 395, 7, 1, 0, 0, 395, 396, 7, 16, 0, 0, 396, 397, 7, 1, 0, 0, 397, 398, 7, 5, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 6, 9, 0, 0, 400, 30, 1, 0, 0, 0, 401, 402, 7, 16, 0, 0, 402, 403, 7, 11, 0, 0, 403, 404, 5, 95, 0, 0, 404, 405, 7, 3, 0, 0, 405, 406, 7, 14, 0, 0, 406, 407, 7, 8, 0, 0, 407, 408, 7, 12, 0, 0, 408, 409, 7, 9, 0, 0, 409, 410, 7, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 6, 10, 5, 0, 412, 32, 1, 0, 0, 0, 413, 414, 7, 6, 0, 0, 414, 415, 7, 3, 0, 0, 415, 416, 7, 9, 0, 0, 416, 417, 7, 12, 0, 0, 417, 418, 7, 16, 0, 0, 418, 419, 7, 3, 0, 0, 419, 420, 1, 0, 0, 0, 420, 421, 6, 11, 6, 0, 421, 34, 1, 0, 0, 0, 422, 423, 7, 6, 0, 0, 423, 424, 7, 7, 0, 0, 424, 425, 7, 19, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 6, 12, 0, 0, 427, 36, 1, 0, 0, 0, 428, 429, 7, 2, 0, 0, 429, 430, 7, 10, 0, 0, 430, 431, 7, 7, 0, 0, 431, 432, 7, 19, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 6, 13, 7, 0, 434, 38, 1, 0, 0, 0, 435, 436, 7, 2, 0, 0, 436, 437, 7, 7, 0, 0, 437, 438, 7, 6, 0, 0, 438, 439, 7, 5, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 6, 14, 0, 0, 441, 40, 1, 0, 0, 0, 442, 443, 7, 2, 0, 0, 443, 444, 7, 5, 0, 0, 444, 445, 7, 12, 0, 0, 445, 446, 7, 5, 0, 0, 446, 447, 7, 2, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 6, 15, 0, 0, 449, 42, 1, 0, 0, 0, 450, 451, 7, 19, 0, 0, 451, 452, 7, 10, 0, 0, 452, 453, 7, 3, 0, 0, 453, 454, 7, 6, 0, 0, 454, 455, 7, 3, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 6, 16, 0, 0, 457, 44, 1, 0, 0, 0, 458, 460, 8, 20, 0, 0, 459, 458, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 459, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 17, 0, 0, 464, 46, 1, 0, 0, 0, 465, 466, 5, 47, 0, 0, 466, 467, 5, 47, 0, 0, 467, 471, 1, 0, 0, 0, 468, 470, 8, 21, 0, 0, 469, 468, 1, 0, 0, 0, 470, 473, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 475, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 474, 476, 5, 13, 0, 0, 475, 474, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 478, 1, 0, 0, 0, 477, 479, 5, 10, 0, 0, 478, 477, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 6, 18, 8, 0, 481, 48, 1, 0, 0, 0, 482, 483, 5, 47, 0, 0, 483, 484, 5, 42, 0, 0, 484, 489, 1, 0, 0, 0, 485, 488, 3, 49, 19, 0, 486, 488, 9, 0, 0, 0, 487, 485, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 491, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 490, 492, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 493, 5, 42, 0, 0, 493, 494, 5, 47, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 6, 19, 8, 0, 496, 50, 1, 0, 0, 0, 497, 499, 7, 22, 0, 0, 498, 497, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 6, 20, 8, 0, 503, 52, 1, 0, 0, 0, 504, 505, 3, 159, 74, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 21, 9, 0, 507, 508, 6, 21, 10, 0, 508, 54, 1, 0, 0, 0, 509, 510, 3, 63, 26, 0, 510, 511, 1, 0, 0, 0, 511, 512, 6, 22, 11, 0, 512, 513, 6, 22, 12, 0, 513, 56, 1, 0, 0, 0, 514, 515, 3, 51, 20, 0, 515, 516, 1, 0, 0, 0, 516, 517, 6, 23, 8, 0, 517, 58, 1, 0, 0, 0, 518, 519, 3, 47, 18, 0, 519, 520, 1, 0, 0, 0, 520, 521, 6, 24, 8, 0, 521, 60, 1, 0, 0, 0, 522, 523, 3, 49, 19, 0, 523, 524, 1, 0, 0, 0, 524, 525, 6, 25, 8, 0, 525, 62, 1, 0, 0, 0, 526, 527, 5, 124, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 6, 26, 12, 0, 529, 64, 1, 0, 0, 0, 530, 531, 7, 23, 0, 0, 531, 66, 1, 0, 0, 0, 532, 533, 7, 24, 0, 0, 533, 68, 1, 0, 0, 0, 534, 535, 5, 92, 0, 0, 535, 536, 7, 25, 0, 0, 536, 70, 1, 0, 0, 0, 537, 538, 8, 26, 0, 0, 538, 72, 1, 0, 0, 0, 539, 541, 7, 3, 0, 0, 540, 542, 7, 27, 0, 0, 541, 540, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 544, 1, 0, 0, 0, 543, 545, 3, 65, 27, 0, 544, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 544, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 74, 1, 0, 0, 0, 548, 549, 5, 64, 0, 0, 549, 76, 1, 0, 0, 0, 550, 551, 5, 96, 0, 0, 551, 78, 1, 0, 0, 0, 552, 556, 8, 28, 0, 0, 553, 554, 5, 96, 0, 0, 554, 556, 5, 96, 0, 0, 555, 552, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 556, 80, 1, 0, 0, 0, 557, 558, 5, 95, 0, 0, 558, 82, 1, 0, 0, 0, 559, 563, 3, 67, 28, 0, 560, 563, 3, 65, 27, 0, 561, 563, 3, 81, 35, 0, 562, 559, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 84, 1, 0, 0, 0, 564, 569, 5, 34, 0, 0, 565, 568, 3, 69, 29, 0, 566, 568, 3, 71, 30, 0, 567, 565, 1, 0, 0, 0, 567, 566, 1, 0, 0, 0, 568, 571, 1, 0, 0, 0, 569, 567, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 572, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 572, 594, 5, 34, 0, 0, 573, 574, 5, 34, 0, 0, 574, 575, 5, 34, 0, 0, 575, 576, 5, 34, 0, 0, 576, 580, 1, 0, 0, 0, 577, 579, 8, 21, 0, 0, 578, 577, 1, 0, 0, 0, 579, 582, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 580, 578, 1, 0, 0, 0, 581, 583, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 583, 584, 5, 34, 0, 0, 584, 585, 5, 34, 0, 0, 585, 586, 5, 34, 0, 0, 586, 588, 1, 0, 0, 0, 587, 589, 5, 34, 0, 0, 588, 587, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 591, 1, 0, 0, 0, 590, 592, 5, 34, 0, 0, 591, 590, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 594, 1, 0, 0, 0, 593, 564, 1, 0, 0, 0, 593, 573, 1, 0, 0, 0, 594, 86, 1, 0, 0, 0, 595, 597, 3, 65, 27, 0, 596, 595, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 88, 1, 0, 0, 0, 600, 602, 3, 65, 27, 0, 601, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 601, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 605, 1, 0, 0, 0, 605, 609, 3, 103, 46, 0, 606, 608, 3, 65, 27, 0, 607, 606, 1, 0, 0, 0, 608, 611, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 643, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 614, 3, 103, 46, 0, 613, 615, 3, 65, 27, 0, 614, 613, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 614, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 643, 1, 0, 0, 0, 618, 620, 3, 65, 27, 0, 619, 618, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 630, 1, 0, 0, 0, 623, 627, 3, 103, 46, 0, 624, 626, 3, 65, 27, 0, 625, 624, 1, 0, 0, 0, 626, 629, 1, 0, 0, 0, 627, 625, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 631, 1, 0, 0, 0, 629, 627, 1, 0, 0, 0, 630, 623, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 3, 73, 31, 0, 633, 643, 1, 0, 0, 0, 634, 636, 3, 103, 46, 0, 635, 637, 3, 65, 27, 0, 636, 635, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 636, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 3, 73, 31, 0, 641, 643, 1, 0, 0, 0, 642, 601, 1, 0, 0, 0, 642, 612, 1, 0, 0, 0, 642, 619, 1, 0, 0, 0, 642, 634, 1, 0, 0, 0, 643, 90, 1, 0, 0, 0, 644, 645, 7, 29, 0, 0, 645, 646, 7, 30, 0, 0, 646, 92, 1, 0, 0, 0, 647, 648, 7, 12, 0, 0, 648, 649, 7, 9, 0, 0, 649, 650, 7, 0, 0, 0, 650, 94, 1, 0, 0, 0, 651, 652, 7, 12, 0, 0, 652, 653, 7, 2, 0, 0, 653, 654, 7, 4, 0, 0, 654, 96, 1, 0, 0, 0, 655, 656, 5, 61, 0, 0, 656, 98, 1, 0, 0, 0, 657, 658, 5, 44, 0, 0, 658, 100, 1, 0, 0, 0, 659, 660, 7, 0, 0, 0, 660, 661, 7, 3, 0, 0, 661, 662, 7, 2, 0, 0, 662, 663, 7, 4, 0, 0, 663, 102, 1, 0, 0, 0, 664, 665, 5, 46, 0, 0, 665, 104, 1, 0, 0, 0, 666, 667, 7, 15, 0, 0, 667, 668, 7, 12, 0, 0, 668, 669, 7, 13, 0, 0, 669, 670, 7, 2, 0, 0, 670, 671, 7, 3, 0, 0, 671, 106, 1, 0, 0, 0, 672, 673, 7, 15, 0, 0, 673, 674, 7, 1, 0, 0, 674, 675, 7, 6, 0, 0, 675, 676, 7, 2, 0, 0, 676, 677, 7, 5, 0, 0, 677, 108, 1, 0, 0, 0, 678, 679, 7, 13, 0, 0, 679, 680, 7, 12, 0, 0, 680, 681, 7, 2, 0, 0, 681, 682, 7, 5, 0, 0, 682, 110, 1, 0, 0, 0, 683, 684, 5, 40, 0, 0, 684, 112, 1, 0, 0, 0, 685, 686, 7, 1, 0, 0, 686, 687, 7, 9, 0, 0, 687, 114, 1, 0, 0, 0, 688, 689, 7, 1, 0, 0, 689, 690, 7, 2, 0, 0, 690, 116, 1, 0, 0, 0, 691, 692, 7, 13, 0, 0, 692, 693, 7, 1, 0, 0, 693, 694, 7, 18, 0, 0, 694, 695, 7, 3, 0, 0, 695, 118, 1, 0, 0, 0, 696, 697, 7, 9, 0, 0, 697, 698, 7, 7, 0, 0, 698, 699, 7, 5, 0, 0, 699, 120, 1, 0, 0, 0, 700, 701, 7, 9, 0, 0, 701, 702, 7, 31, 0, 0, 702, 703, 7, 13, 0, 0, 703, 704, 7, 13, 0, 0, 704, 122, 1, 0, 0, 0, 705, 706, 7, 9, 0, 0, 706, 707, 7, 31, 0, 0, 707, 708, 7, 13, 0, 0, 708, 709, 7, 13, 0, 0, 709, 710, 7, 2, 0, 0, 710, 124, 1, 0, 0, 0, 711, 712, 7, 7, 0, 0, 712, 713, 7, 6, 0, 0, 713, 126, 1, 0, 0, 0, 714, 715, 5, 63, 0, 0, 715, 128, 1, 0, 0, 0, 716, 717, 7, 6, 0, 0, 717, 718, 7, 13, 0, 0, 718, 719, 7, 1, 0, 0, 719, 720, 7, 18, 0, 0, 720, 721, 7, 3, 0, 0, 721, 130, 1, 0, 0, 0, 722, 723, 5, 41, 0, 0, 723, 132, 1, 0, 0, 0, 724, 725, 7, 5, 0, 0, 725, 726, 7, 6, 0, 0, 726, 727, 7, 31, 0, 0, 727, 728, 7, 3, 0, 0, 728, 134, 1, 0, 0, 0, 729, 730, 5, 61, 0, 0, 730, 731, 5, 61, 0, 0, 731, 136, 1, 0, 0, 0, 732, 733, 5, 61, 0, 0, 733, 734, 5, 126, 0, 0, 734, 138, 1, 0, 0, 0, 735, 736, 5, 33, 0, 0, 736, 737, 5, 61, 0, 0, 737, 140, 1, 0, 0, 0, 738, 739, 5, 60, 0, 0, 739, 142, 1, 0, 0, 0, 740, 741, 5, 60, 0, 0, 741, 742, 5, 61, 0, 0, 742, 144, 1, 0, 0, 0, 743, 744, 5, 62, 0, 0, 744, 146, 1, 0, 0, 0, 745, 746, 5, 62, 0, 0, 746, 747, 5, 61, 0, 0, 747, 148, 1, 0, 0, 0, 748, 749, 5, 43, 0, 0, 749, 150, 1, 0, 0, 0, 750, 751, 5, 45, 0, 0, 751, 152, 1, 0, 0, 0, 752, 753, 5, 42, 0, 0, 753, 154, 1, 0, 0, 0, 754, 755, 5, 47, 0, 0, 755, 156, 1, 0, 0, 0, 756, 757, 5, 37, 0, 0, 757, 158, 1, 0, 0, 0, 758, 759, 5, 91, 0, 0, 759, 760, 1, 0, 0, 0, 760, 761, 6, 74, 0, 0, 761, 762, 6, 74, 0, 0, 762, 160, 1, 0, 0, 0, 763, 764, 5, 93, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 6, 75, 12, 0, 766, 767, 6, 75, 12, 0, 767, 162, 1, 0, 0, 0, 768, 772, 3, 67, 28, 0, 769, 771, 3, 83, 36, 0, 770, 769, 1, 0, 0, 0, 771, 774, 1, 0, 0, 0, 772, 770, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 785, 1, 0, 0, 0, 774, 772, 1, 0, 0, 0, 775, 778, 3, 81, 35, 0, 776, 778, 3, 75, 32, 0, 777, 775, 1, 0, 0, 0, 777, 776, 1, 0, 0, 0, 778, 780, 1, 0, 0, 0, 779, 781, 3, 83, 36, 0, 780, 779, 1, 0, 0, 0, 781, 782, 1, 0, 0, 0, 782, 780, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 785, 1, 0, 0, 0, 784, 768, 1, 0, 0, 0, 784, 777, 1, 0, 0, 0, 785, 164, 1, 0, 0, 0, 786, 788, 3, 77, 33, 0, 787, 789, 3, 79, 34, 0, 788, 787, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 788, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 793, 3, 77, 33, 0, 793, 166, 1, 0, 0, 0, 794, 795, 3, 165, 77, 0, 795, 168, 1, 0, 0, 0, 796, 797, 3, 47, 18, 0, 797, 798, 1, 0, 0, 0, 798, 799, 6, 79, 8, 0, 799, 170, 1, 0, 0, 0, 800, 801, 3, 49, 19, 0, 801, 802, 1, 0, 0, 0, 802, 803, 6, 80, 8, 0, 803, 172, 1, 0, 0, 0, 804, 805, 3, 51, 20, 0, 805, 806, 1, 0, 0, 0, 806, 807, 6, 81, 8, 0, 807, 174, 1, 0, 0, 0, 808, 809, 3, 63, 26, 0, 809, 810, 1, 0, 0, 0, 810, 811, 6, 82, 11, 0, 811, 812, 6, 82, 12, 0, 812, 176, 1, 0, 0, 0, 813, 814, 3, 159, 74, 0, 814, 815, 1, 0, 0, 0, 815, 816, 6, 83, 9, 0, 816, 178, 1, 0, 0, 0, 817, 818, 3, 161, 75, 0, 818, 819, 1, 0, 0, 0, 819, 820, 6, 84, 13, 0, 820, 180, 1, 0, 0, 0, 821, 822, 3, 99, 44, 0, 822, 823, 1, 0, 0, 0, 823, 824, 6, 85, 14, 0, 824, 182, 1, 0, 0, 0, 825, 826, 3, 97, 43, 0, 826, 827, 1, 0, 0, 0, 827, 828, 6, 86, 15, 0, 828, 184, 1, 0, 0, 0, 829, 830, 7, 16, 0, 0, 830, 831, 7, 3, 0, 0, 831, 832, 7, 5, 0, 0, 832, 833, 7, 12, 0, 0, 833, 834, 7, 0, 0, 0, 834, 835, 7, 12, 0, 0, 835, 836, 7, 5, 0, 0, 836, 837, 7, 12, 0, 0, 837, 186, 1, 0, 0, 0, 838, 842, 8, 32, 0, 0, 839, 840, 5, 47, 0, 0, 840, 842, 8, 33, 0, 0, 841, 838, 1, 0, 0, 0, 841, 839, 1, 0, 0, 0, 842, 188, 1, 0, 0, 0, 843, 845, 3, 187, 88, 0, 844, 843, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 844, 1, 0, 0, 0, 846, 847, 1, 0, 0, 0, 847, 190, 1, 0, 0, 0, 848, 849, 3, 167, 78, 0, 849, 850, 1, 0, 0, 0, 850, 851, 6, 90, 16, 0, 851, 192, 1, 0, 0, 0, 852, 853, 3, 47, 18, 0, 853, 854, 1, 0, 0, 0, 854, 855, 6, 91, 8, 0, 855, 194, 1, 0, 0, 0, 856, 857, 3, 49, 19, 0, 857, 858, 1, 0, 0, 0, 858, 859, 6, 92, 8, 0, 859, 196, 1, 0, 0, 0, 860, 861, 3, 51, 20, 0, 861, 862, 1, 0, 0, 0, 862, 863, 6, 93, 8, 0, 863, 198, 1, 0, 0, 0, 864, 865, 3, 63, 26, 0, 865, 866, 1, 0, 0, 0, 866, 867, 6, 94, 11, 0, 867, 868, 6, 94, 12, 0, 868, 200, 1, 0, 0, 0, 869, 870, 3, 103, 46, 0, 870, 871, 1, 0, 0, 0, 871, 872, 6, 95, 17, 0, 872, 202, 1, 0, 0, 0, 873, 874, 3, 99, 44, 0, 874, 875, 1, 0, 0, 0, 875, 876, 6, 96, 14, 0, 876, 204, 1, 0, 0, 0, 877, 882, 3, 67, 28, 0, 878, 882, 3, 65, 27, 0, 879, 882, 3, 81, 35, 0, 880, 882, 3, 153, 71, 0, 881, 877, 1, 0, 0, 0, 881, 878, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 881, 880, 1, 0, 0, 0, 882, 206, 1, 0, 0, 0, 883, 886, 3, 67, 28, 0, 884, 886, 3, 153, 71, 0, 885, 883, 1, 0, 0, 0, 885, 884, 1, 0, 0, 0, 886, 890, 1, 0, 0, 0, 887, 889, 3, 205, 97, 0, 888, 887, 1, 0, 0, 0, 889, 892, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 903, 1, 0, 0, 0, 892, 890, 1, 0, 0, 0, 893, 896, 3, 81, 35, 0, 894, 896, 3, 75, 32, 0, 895, 893, 1, 0, 0, 0, 895, 894, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 899, 3, 205, 97, 0, 898, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 885, 1, 0, 0, 0, 902, 895, 1, 0, 0, 0, 903, 208, 1, 0, 0, 0, 904, 907, 3, 207, 98, 0, 905, 907, 3, 165, 77, 0, 906, 904, 1, 0, 0, 0, 906, 905, 1, 0, 0, 0, 907, 908, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 210, 1, 0, 0, 0, 910, 911, 3, 47, 18, 0, 911, 912, 1, 0, 0, 0, 912, 913, 6, 100, 8, 0, 913, 212, 1, 0, 0, 0, 914, 915, 3, 49, 19, 0, 915, 916, 1, 0, 0, 0, 916, 917, 6, 101, 8, 0, 917, 214, 1, 0, 0, 0, 918, 919, 3, 51, 20, 0, 919, 920, 1, 0, 0, 0, 920, 921, 6, 102, 8, 0, 921, 216, 1, 0, 0, 0, 922, 923, 3, 63, 26, 0, 923, 924, 1, 0, 0, 0, 924, 925, 6, 103, 11, 0, 925, 926, 6, 103, 12, 0, 926, 218, 1, 0, 0, 0, 927, 928, 3, 97, 43, 0, 928, 929, 1, 0, 0, 0, 929, 930, 6, 104, 15, 0, 930, 220, 1, 0, 0, 0, 931, 932, 3, 99, 44, 0, 932, 933, 1, 0, 0, 0, 933, 934, 6, 105, 14, 0, 934, 222, 1, 0, 0, 0, 935, 936, 3, 103, 46, 0, 936, 937, 1, 0, 0, 0, 937, 938, 6, 106, 17, 0, 938, 224, 1, 0, 0, 0, 939, 940, 7, 12, 0, 0, 940, 941, 7, 2, 0, 0, 941, 226, 1, 0, 0, 0, 942, 943, 3, 209, 99, 0, 943, 944, 1, 0, 0, 0, 944, 945, 6, 108, 18, 0, 945, 228, 1, 0, 0, 0, 946, 947, 3, 47, 18, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 109, 8, 0, 949, 230, 1, 0, 0, 0, 950, 951, 3, 49, 19, 0, 951, 952, 1, 0, 0, 0, 952, 953, 6, 110, 8, 0, 953, 232, 1, 0, 0, 0, 954, 955, 3, 51, 20, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 111, 8, 0, 957, 234, 1, 0, 0, 0, 958, 959, 3, 63, 26, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 112, 11, 0, 961, 962, 6, 112, 12, 0, 962, 236, 1, 0, 0, 0, 963, 964, 3, 159, 74, 0, 964, 965, 1, 0, 0, 0, 965, 966, 6, 113, 9, 0, 966, 967, 6, 113, 19, 0, 967, 238, 1, 0, 0, 0, 968, 969, 7, 7, 0, 0, 969, 970, 7, 9, 0, 0, 970, 971, 1, 0, 0, 0, 971, 972, 6, 114, 20, 0, 972, 240, 1, 0, 0, 0, 973, 974, 7, 19, 0, 0, 974, 975, 7, 1, 0, 0, 975, 976, 7, 5, 0, 0, 976, 977, 7, 10, 0, 0, 977, 978, 1, 0, 0, 0, 978, 979, 6, 115, 20, 0, 979, 242, 1, 0, 0, 0, 980, 981, 8, 34, 0, 0, 981, 244, 1, 0, 0, 0, 982, 984, 3, 243, 116, 0, 983, 982, 1, 0, 0, 0, 984, 985, 1, 0, 0, 0, 985, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 988, 3, 305, 147, 0, 988, 990, 1, 0, 0, 0, 989, 983, 1, 0, 0, 0, 989, 990, 1, 0, 0, 0, 990, 992, 1, 0, 0, 0, 991, 993, 3, 243, 116, 0, 992, 991, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 992, 1, 0, 0, 0, 994, 995, 1, 0, 0, 0, 995, 246, 1, 0, 0, 0, 996, 997, 3, 167, 78, 0, 997, 998, 1, 0, 0, 0, 998, 999, 6, 118, 16, 0, 999, 248, 1, 0, 0, 0, 1000, 1001, 3, 245, 117, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 6, 119, 21, 0, 1003, 250, 1, 0, 0, 0, 1004, 1005, 3, 47, 18, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1007, 6, 120, 8, 0, 1007, 252, 1, 0, 0, 0, 1008, 1009, 3, 49, 19, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 6, 121, 8, 0, 1011, 254, 1, 0, 0, 0, 1012, 1013, 3, 51, 20, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 6, 122, 8, 0, 1015, 256, 1, 0, 0, 0, 1016, 1017, 3, 63, 26, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 6, 123, 11, 0, 1019, 1020, 6, 123, 12, 0, 1020, 1021, 6, 123, 12, 0, 1021, 258, 1, 0, 0, 0, 1022, 1023, 3, 97, 43, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 124, 15, 0, 1025, 260, 1, 0, 0, 0, 1026, 1027, 3, 99, 44, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 125, 14, 0, 1029, 262, 1, 0, 0, 0, 1030, 1031, 3, 103, 46, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 6, 126, 17, 0, 1033, 264, 1, 0, 0, 0, 1034, 1035, 3, 241, 115, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1037, 6, 127, 22, 0, 1037, 266, 1, 0, 0, 0, 1038, 1039, 3, 209, 99, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1041, 6, 128, 18, 0, 1041, 268, 1, 0, 0, 0, 1042, 1043, 3, 167, 78, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1045, 6, 129, 16, 0, 1045, 270, 1, 0, 0, 0, 1046, 1047, 3, 47, 18, 0, 1047, 1048, 1, 0, 0, 0, 1048, 1049, 6, 130, 8, 0, 1049, 272, 1, 0, 0, 0, 1050, 1051, 3, 49, 19, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, 6, 131, 8, 0, 1053, 274, 1, 0, 0, 0, 1054, 1055, 3, 51, 20, 0, 1055, 1056, 1, 0, 0, 0, 1056, 1057, 6, 132, 8, 0, 1057, 276, 1, 0, 0, 0, 1058, 1059, 3, 63, 26, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1061, 6, 133, 11, 0, 1061, 1062, 6, 133, 12, 0, 1062, 278, 1, 0, 0, 0, 1063, 1064, 3, 103, 46, 0, 1064, 1065, 1, 0, 0, 0, 1065, 1066, 6, 134, 17, 0, 1066, 280, 1, 0, 0, 0, 1067, 1068, 3, 167, 78, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1070, 6, 135, 16, 0, 1070, 282, 1, 0, 0, 0, 1071, 1072, 3, 163, 76, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 6, 136, 23, 0, 1074, 284, 1, 0, 0, 0, 1075, 1076, 3, 47, 18, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1078, 6, 137, 8, 0, 1078, 286, 1, 0, 0, 0, 1079, 1080, 3, 49, 19, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 138, 8, 0, 1082, 288, 1, 0, 0, 0, 1083, 1084, 3, 51, 20, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 6, 139, 8, 0, 1086, 290, 1, 0, 0, 0, 1087, 1088, 3, 63, 26, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 6, 140, 11, 0, 1090, 1091, 6, 140, 12, 0, 1091, 292, 1, 0, 0, 0, 1092, 1093, 7, 1, 0, 0, 1093, 1094, 7, 9, 0, 0, 1094, 1095, 7, 15, 0, 0, 1095, 1096, 7, 7, 0, 0, 1096, 294, 1, 0, 0, 0, 1097, 1098, 7, 15, 0, 0, 1098, 1099, 7, 31, 0, 0, 1099, 1100, 7, 9, 0, 0, 1100, 1101, 7, 4, 0, 0, 1101, 1102, 7, 5, 0, 0, 1102, 1103, 7, 1, 0, 0, 1103, 1104, 7, 7, 0, 0, 1104, 1105, 7, 9, 0, 0, 1105, 1106, 7, 2, 0, 0, 1106, 296, 1, 0, 0, 0, 1107, 1108, 3, 47, 18, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 6, 143, 8, 0, 1110, 298, 1, 0, 0, 0, 1111, 1112, 3, 49, 19, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 144, 8, 0, 1114, 300, 1, 0, 0, 0, 1115, 1116, 3, 51, 20, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 145, 8, 0, 1118, 302, 1, 0, 0, 0, 1119, 1120, 3, 161, 75, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 146, 13, 0, 1122, 1123, 6, 146, 12, 0, 1123, 304, 1, 0, 0, 0, 1124, 1125, 5, 58, 0, 0, 1125, 306, 1, 0, 0, 0, 1126, 1132, 3, 75, 32, 0, 1127, 1132, 3, 65, 27, 0, 1128, 1132, 3, 103, 46, 0, 1129, 1132, 3, 67, 28, 0, 1130, 1132, 3, 81, 35, 0, 1131, 1126, 1, 0, 0, 0, 1131, 1127, 1, 0, 0, 0, 1131, 1128, 1, 0, 0, 0, 1131, 1129, 1, 0, 0, 0, 1131, 1130, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 308, 1, 0, 0, 0, 1135, 1136, 3, 47, 18, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 6, 149, 8, 0, 1138, 310, 1, 0, 0, 0, 1139, 1140, 3, 49, 19, 0, 1140, 1141, 1, 0, 0, 0, 1141, 1142, 6, 150, 8, 0, 1142, 312, 1, 0, 0, 0, 1143, 1144, 3, 51, 20, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1146, 6, 151, 8, 0, 1146, 314, 1, 0, 0, 0, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 461, 471, 475, 478, 487, 489, 500, 541, 546, 555, 562, 567, 569, 580, 588, 591, 593, 598, 603, 609, 616, 621, 627, 630, 638, 642, 772, 777, 782, 784, 790, 841, 846, 881, 885, 890, 895, 900, 902, 906, 908, 985, 989, 994, 1131, 1133, 24, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 0, 1, 0, 7, 63, 0, 5, 0, 0, 7, 25, 0, 4, 0, 0, 7, 64, 0, 7, 33, 0, 7, 32, 0, 7, 66, 0, 7, 35, 0, 7, 75, 0, 5, 10, 0, 5, 7, 0, 7, 85, 0, 7, 84, 0, 7, 65, 0] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens b/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens deleted file mode 100644 index 4bf3584737d1d..0000000000000 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens +++ /dev/null @@ -1,164 +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 -RENAME=12 -ROW=13 -SHOW=14 -SORT=15 -STATS=16 -WHERE=17 -UNKNOWN_CMD=18 -LINE_COMMENT=19 -MULTILINE_COMMENT=20 -WS=21 -EXPLAIN_WS=22 -EXPLAIN_LINE_COMMENT=23 -EXPLAIN_MULTILINE_COMMENT=24 -PIPE=25 -STRING=26 -INTEGER_LITERAL=27 -DECIMAL_LITERAL=28 -BY=29 -AND=30 -ASC=31 -ASSIGN=32 -COMMA=33 -DESC=34 -DOT=35 -FALSE=36 -FIRST=37 -LAST=38 -LP=39 -IN=40 -IS=41 -LIKE=42 -NOT=43 -NULL=44 -NULLS=45 -OR=46 -PARAM=47 -RLIKE=48 -RP=49 -TRUE=50 -EQ=51 -CIEQ=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 -ID_PATTERN=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_POLICY_NAME=85 -ENRICH_LINE_COMMENT=86 -ENRICH_MULTILINE_COMMENT=87 -ENRICH_WS=88 -ENRICH_FIELD_LINE_COMMENT=89 -ENRICH_FIELD_MULTILINE_COMMENT=90 -ENRICH_FIELD_WS=91 -MVEXPAND_LINE_COMMENT=92 -MVEXPAND_MULTILINE_COMMENT=93 -MVEXPAND_WS=94 -INFO=95 -FUNCTIONS=96 -SHOW_LINE_COMMENT=97 -SHOW_MULTILINE_COMMENT=98 -SHOW_WS=99 -COLON=100 -SETTING=101 -SETTING_LINE_COMMENT=102 -SETTTING_MULTILINE_COMMENT=103 -SETTING_WS=104 -'dissect'=1 -'drop'=2 -'enrich'=3 -'eval'=4 -'explain'=5 -'from'=6 -'grok'=7 -'inlinestats'=8 -'keep'=9 -'limit'=10 -'mv_expand'=11 -'rename'=12 -'row'=13 -'show'=14 -'sort'=15 -'stats'=16 -'where'=17 -'|'=25 -'by'=29 -'and'=30 -'asc'=31 -'='=32 -','=33 -'desc'=34 -'.'=35 -'false'=36 -'first'=37 -'last'=38 -'('=39 -'in'=40 -'is'=41 -'like'=42 -'not'=43 -'null'=44 -'nulls'=45 -'or'=46 -'?'=47 -'rlike'=48 -')'=49 -'true'=50 -'=='=51 -'=~'=52 -'!='=53 -'<'=54 -'<='=55 -'>'=56 -'>='=57 -'+'=58 -'-'=59 -'*'=60 -'/'=61 -'%'=62 -']'=64 -'metadata'=70 -'as'=79 -'on'=83 -'with'=84 -'info'=95 -'functions'=96 -':'=100 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts deleted file mode 100644 index 937865a6c23cf..0000000000000 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts +++ /dev/null @@ -1,715 +0,0 @@ -// @ts-nocheck -// Generated from src/esql/antlr/esql_lexer.g4 by ANTLR 4.13.1 -// noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols -import { - ATN, - ATNDeserializer, - CharStream, - DecisionState, DFA, - Lexer, - LexerATNSimulator, - RuleContext, - PredictionContextCache, - Token -} from "antlr4"; -export default class esql_lexer extends Lexer { - public static readonly DISSECT = 1; - public static readonly DROP = 2; - public static readonly ENRICH = 3; - public static readonly EVAL = 4; - public static readonly EXPLAIN = 5; - public static readonly FROM = 6; - public static readonly GROK = 7; - public static readonly INLINESTATS = 8; - public static readonly KEEP = 9; - public static readonly LIMIT = 10; - public static readonly MV_EXPAND = 11; - public static readonly RENAME = 12; - public static readonly ROW = 13; - public static readonly SHOW = 14; - public static readonly SORT = 15; - public static readonly STATS = 16; - public static readonly WHERE = 17; - public static readonly UNKNOWN_CMD = 18; - public static readonly LINE_COMMENT = 19; - public static readonly MULTILINE_COMMENT = 20; - public static readonly WS = 21; - public static readonly EXPLAIN_WS = 22; - public static readonly EXPLAIN_LINE_COMMENT = 23; - public static readonly EXPLAIN_MULTILINE_COMMENT = 24; - public static readonly PIPE = 25; - public static readonly STRING = 26; - public static readonly INTEGER_LITERAL = 27; - public static readonly DECIMAL_LITERAL = 28; - public static readonly BY = 29; - public static readonly AND = 30; - public static readonly ASC = 31; - public static readonly ASSIGN = 32; - public static readonly COMMA = 33; - public static readonly DESC = 34; - public static readonly DOT = 35; - public static readonly FALSE = 36; - public static readonly FIRST = 37; - public static readonly LAST = 38; - public static readonly LP = 39; - public static readonly IN = 40; - public static readonly IS = 41; - public static readonly LIKE = 42; - public static readonly NOT = 43; - public static readonly NULL = 44; - public static readonly NULLS = 45; - public static readonly OR = 46; - public static readonly PARAM = 47; - public static readonly RLIKE = 48; - public static readonly RP = 49; - public static readonly TRUE = 50; - public static readonly EQ = 51; - public static readonly CIEQ = 52; - public static readonly NEQ = 53; - public static readonly LT = 54; - public static readonly LTE = 55; - public static readonly GT = 56; - public static readonly GTE = 57; - public static readonly PLUS = 58; - public static readonly MINUS = 59; - public static readonly ASTERISK = 60; - public static readonly SLASH = 61; - public static readonly PERCENT = 62; - public static readonly OPENING_BRACKET = 63; - public static readonly CLOSING_BRACKET = 64; - public static readonly UNQUOTED_IDENTIFIER = 65; - public static readonly QUOTED_IDENTIFIER = 66; - public static readonly EXPR_LINE_COMMENT = 67; - public static readonly EXPR_MULTILINE_COMMENT = 68; - public static readonly EXPR_WS = 69; - public static readonly METADATA = 70; - public static readonly FROM_UNQUOTED_IDENTIFIER = 71; - public static readonly FROM_LINE_COMMENT = 72; - public static readonly FROM_MULTILINE_COMMENT = 73; - public static readonly FROM_WS = 74; - public static readonly ID_PATTERN = 75; - public static readonly PROJECT_LINE_COMMENT = 76; - public static readonly PROJECT_MULTILINE_COMMENT = 77; - public static readonly PROJECT_WS = 78; - public static readonly AS = 79; - public static readonly RENAME_LINE_COMMENT = 80; - public static readonly RENAME_MULTILINE_COMMENT = 81; - public static readonly RENAME_WS = 82; - public static readonly ON = 83; - public static readonly WITH = 84; - public static readonly ENRICH_POLICY_NAME = 85; - public static readonly ENRICH_LINE_COMMENT = 86; - public static readonly ENRICH_MULTILINE_COMMENT = 87; - public static readonly ENRICH_WS = 88; - public static readonly ENRICH_FIELD_LINE_COMMENT = 89; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 90; - public static readonly ENRICH_FIELD_WS = 91; - public static readonly MVEXPAND_LINE_COMMENT = 92; - public static readonly MVEXPAND_MULTILINE_COMMENT = 93; - public static readonly MVEXPAND_WS = 94; - public static readonly INFO = 95; - public static readonly FUNCTIONS = 96; - public static readonly SHOW_LINE_COMMENT = 97; - public static readonly SHOW_MULTILINE_COMMENT = 98; - public static readonly SHOW_WS = 99; - public static readonly COLON = 100; - public static readonly SETTING = 101; - public static readonly SETTING_LINE_COMMENT = 102; - public static readonly SETTTING_MULTILINE_COMMENT = 103; - public static readonly SETTING_WS = 104; - public static readonly EOF = Token.EOF; - public static readonly EXPLAIN_MODE = 1; - public static readonly EXPRESSION_MODE = 2; - public static readonly FROM_MODE = 3; - public static readonly PROJECT_MODE = 4; - public static readonly RENAME_MODE = 5; - public static readonly ENRICH_MODE = 6; - public static readonly ENRICH_FIELD_MODE = 7; - public static readonly MVEXPAND_MODE = 8; - public static readonly SHOW_MODE = 9; - public static readonly SETTING_MODE = 10; - - public static readonly channelNames: string[] = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; - public static readonly literalNames: (string | null)[] = [ null, "'dissect'", - "'drop'", "'enrich'", - "'eval'", "'explain'", - "'from'", "'grok'", - "'inlinestats'", - "'keep'", "'limit'", - "'mv_expand'", - "'rename'", - "'row'", "'show'", - "'sort'", "'stats'", - "'where'", null, - null, null, - null, null, - null, null, - "'|'", null, - null, null, - "'by'", "'and'", - "'asc'", "'='", - "','", "'desc'", - "'.'", "'false'", - "'first'", "'last'", - "'('", "'in'", - "'is'", "'like'", - "'not'", "'null'", - "'nulls'", "'or'", - "'?'", "'rlike'", - "')'", "'true'", - "'=='", "'=~'", - "'!='", "'<'", - "'<='", "'>'", - "'>='", "'+'", - "'-'", "'*'", - "'/'", "'%'", - null, "']'", - null, null, - null, null, - null, "'metadata'", - null, null, - null, null, - null, null, - null, null, - "'as'", null, - null, null, - "'on'", "'with'", - null, null, - null, null, - null, null, - null, null, - null, null, - "'info'", "'functions'", - null, null, - null, "':'" ]; - public static readonly symbolicNames: (string | null)[] = [ null, "DISSECT", - "DROP", "ENRICH", - "EVAL", "EXPLAIN", - "FROM", "GROK", - "INLINESTATS", - "KEEP", "LIMIT", - "MV_EXPAND", - "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", "CIEQ", - "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", - "ID_PATTERN", - "PROJECT_LINE_COMMENT", - "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", - "AS", "RENAME_LINE_COMMENT", - "RENAME_MULTILINE_COMMENT", - "RENAME_WS", - "ON", "WITH", - "ENRICH_POLICY_NAME", - "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", - "COLON", "SETTING", - "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", - "SETTING_WS" ]; - public static readonly modeNames: string[] = [ "DEFAULT_MODE", "EXPLAIN_MODE", - "EXPRESSION_MODE", "FROM_MODE", - "PROJECT_MODE", "RENAME_MODE", - "ENRICH_MODE", "ENRICH_FIELD_MODE", - "MVEXPAND_MODE", "SHOW_MODE", - "SETTING_MODE", ]; - - public static readonly ruleNames: string[] = [ - "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "INLINESTATS", - "KEEP", "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", - "WHERE", "UNKNOWN_CMD", "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", - "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", - "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", "CIEQ", - "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", - "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", - "QUOTED_ID", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", - "FROM_COMMA", "FROM_ASSIGN", "METADATA", "FROM_UNQUOTED_IDENTIFIER_PART", - "FROM_UNQUOTED_IDENTIFIER", "FROM_QUOTED_IDENTIFIER", "FROM_LINE_COMMENT", - "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", - "UNQUOTED_ID_BODY_WITH_PATTERN", "UNQUOTED_ID_PATTERN", "ID_PATTERN", - "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "RENAME_PIPE", - "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", "AS", "RENAME_ID_PATTERN", - "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ENRICH_PIPE", - "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", "ENRICH_POLICY_NAME", - "ENRICH_QUOTED_IDENTIFIER", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", - "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", - "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", - "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", - "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", "SHOW_PIPE", "INFO", "FUNCTIONS", "SHOW_LINE_COMMENT", - "SHOW_MULTILINE_COMMENT", "SHOW_WS", "SETTING_CLOSING_BRACKET", "COLON", - "SETTING", "SETTING_LINE_COMMENT", "SETTTING_MULTILINE_COMMENT", "SETTING_WS", - ]; - - - constructor(input: CharStream) { - super(input); - this._interp = new LexerATNSimulator(this, esql_lexer._ATN, esql_lexer.DecisionsToDFA, new PredictionContextCache()); - } - - public get grammarFileName(): string { return "esql_lexer.g4"; } - - public get literalNames(): (string | null)[] { return esql_lexer.literalNames; } - public get symbolicNames(): (string | null)[] { return esql_lexer.symbolicNames; } - public get ruleNames(): string[] { return esql_lexer.ruleNames; } - - public get serializedATN(): number[] { return esql_lexer._serializedATN; } - - public get channelNames(): string[] { return esql_lexer.channelNames; } - - public get modeNames(): string[] { return esql_lexer.modeNames; } - - public static readonly _serializedATN: number[] = [4,0,104,1147,6,-1,6, - -1,6,-1,6,-1,6,-1,6,-1,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,2,124,7,124,2,125,7,125,2,126,7,126,2,127,7,127,2,128,7, - 128,2,129,7,129,2,130,7,130,2,131,7,131,2,132,7,132,2,133,7,133,2,134,7, - 134,2,135,7,135,2,136,7,136,2,137,7,137,2,138,7,138,2,139,7,139,2,140,7, - 140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,2,146,7, - 146,2,147,7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151,7,151,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,2,1,2,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,4,1,4,1,4,1,5,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,7,1,7,1,7,1,7,1,7,1,7,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,10,1,10,1,10,1,10,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,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,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,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,4,17,460,8,17,11,17,12, - 17,461,1,17,1,17,1,18,1,18,1,18,1,18,5,18,470,8,18,10,18,12,18,473,9,18, - 1,18,3,18,476,8,18,1,18,3,18,479,8,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19, - 5,19,488,8,19,10,19,12,19,491,9,19,1,19,1,19,1,19,1,19,1,19,1,20,4,20,499, - 8,20,11,20,12,20,500,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,22,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,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29,1,29,1,30,1,30,1,31,1,31, - 3,31,542,8,31,1,31,4,31,545,8,31,11,31,12,31,546,1,32,1,32,1,33,1,33,1, - 34,1,34,1,34,3,34,556,8,34,1,35,1,35,1,36,1,36,1,36,3,36,563,8,36,1,37, - 1,37,1,37,5,37,568,8,37,10,37,12,37,571,9,37,1,37,1,37,1,37,1,37,1,37,1, - 37,5,37,579,8,37,10,37,12,37,582,9,37,1,37,1,37,1,37,1,37,1,37,3,37,589, - 8,37,1,37,3,37,592,8,37,3,37,594,8,37,1,38,4,38,597,8,38,11,38,12,38,598, - 1,39,4,39,602,8,39,11,39,12,39,603,1,39,1,39,5,39,608,8,39,10,39,12,39, - 611,9,39,1,39,1,39,4,39,615,8,39,11,39,12,39,616,1,39,4,39,620,8,39,11, - 39,12,39,621,1,39,1,39,5,39,626,8,39,10,39,12,39,629,9,39,3,39,631,8,39, - 1,39,1,39,1,39,1,39,4,39,637,8,39,11,39,12,39,638,1,39,1,39,3,39,643,8, - 39,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,43,1,43,1,44, - 1,44,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1, - 48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,51,1,51, - 1,51,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1, - 55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,58,1,58, - 1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,62,1, - 62,1,62,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,66,1,66,1,66,1,67,1,67, - 1,68,1,68,1,68,1,69,1,69,1,70,1,70,1,71,1,71,1,72,1,72,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,76,1,76,5,76,771,8,76,10,76, - 12,76,774,9,76,1,76,1,76,3,76,778,8,76,1,76,4,76,781,8,76,11,76,12,76,782, - 3,76,785,8,76,1,77,1,77,4,77,789,8,77,11,77,12,77,790,1,77,1,77,1,78,1, - 78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,82,1,82, - 1,82,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,86,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,88, - 1,88,1,88,3,88,842,8,88,1,89,4,89,845,8,89,11,89,12,89,846,1,90,1,90,1, - 90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94, - 1,94,1,94,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,3,97,882,8,97,1,98,1,98,3,98,886,8,98,1,98,5,98,889,8,98,10,98, - 12,98,892,9,98,1,98,1,98,3,98,896,8,98,1,98,4,98,899,8,98,11,98,12,98,900, - 3,98,903,8,98,1,99,1,99,4,99,907,8,99,11,99,12,99,908,1,100,1,100,1,100, - 1,100,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,103,1,103,1,103, - 1,103,1,103,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,106,1,106, - 1,106,1,106,1,107,1,107,1,107,1,108,1,108,1,108,1,108,1,109,1,109,1,109, - 1,109,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,112,1,112,1,112, - 1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114,1,114, - 1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,117,4,117,984,8, - 117,11,117,12,117,985,1,117,1,117,3,117,990,8,117,1,117,4,117,993,8,117, - 11,117,12,117,994,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,120, - 1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,123, - 1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,125,1,125,1,125, - 1,125,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,128,1,128,1,128, - 1,128,1,129,1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,131,1,131,1,131, - 1,131,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,133,1,134,1,134, - 1,134,1,134,1,135,1,135,1,135,1,135,1,136,1,136,1,136,1,136,1,137,1,137, - 1,137,1,137,1,138,1,138,1,138,1,138,1,139,1,139,1,139,1,139,1,140,1,140, - 1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142, - 1,142,1,142,1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143,1,144,1,144, - 1,144,1,144,1,145,1,145,1,145,1,145,1,146,1,146,1,146,1,146,1,146,1,147, - 1,147,1,148,1,148,1,148,1,148,1,148,4,148,1132,8,148,11,148,12,148,1133, - 1,149,1,149,1,149,1,149,1,150,1,150,1,150,1,150,1,151,1,151,1,151,1,151, - 2,489,580,0,152,11,1,13,2,15,3,17,4,19,5,21,6,23,7,25,8,27,9,29,10,31,11, - 33,12,35,13,37,14,39,15,41,16,43,17,45,18,47,19,49,20,51,21,53,0,55,0,57, - 22,59,23,61,24,63,25,65,0,67,0,69,0,71,0,73,0,75,0,77,0,79,0,81,0,83,0, - 85,26,87,27,89,28,91,29,93,30,95,31,97,32,99,33,101,34,103,35,105,36,107, - 37,109,38,111,39,113,40,115,41,117,42,119,43,121,44,123,45,125,46,127,47, - 129,48,131,49,133,50,135,51,137,52,139,53,141,54,143,55,145,56,147,57,149, - 58,151,59,153,60,155,61,157,62,159,63,161,64,163,65,165,0,167,66,169,67, - 171,68,173,69,175,0,177,0,179,0,181,0,183,0,185,70,187,0,189,71,191,0,193, - 72,195,73,197,74,199,0,201,0,203,0,205,0,207,0,209,75,211,76,213,77,215, - 78,217,0,219,0,221,0,223,0,225,79,227,0,229,80,231,81,233,82,235,0,237, - 0,239,83,241,84,243,0,245,85,247,0,249,0,251,86,253,87,255,88,257,0,259, - 0,261,0,263,0,265,0,267,0,269,0,271,89,273,90,275,91,277,0,279,0,281,0, - 283,0,285,92,287,93,289,94,291,0,293,95,295,96,297,97,299,98,301,99,303, - 0,305,100,307,101,309,102,311,103,313,104,11,0,1,2,3,4,5,6,7,8,9,10,35, - 2,0,68,68,100,100,2,0,73,73,105,105,2,0,83,83,115,115,2,0,69,69,101,101, - 2,0,67,67,99,99,2,0,84,84,116,116,2,0,82,82,114,114,2,0,79,79,111,111,2, - 0,80,80,112,112,2,0,78,78,110,110,2,0,72,72,104,104,2,0,86,86,118,118,2, - 0,65,65,97,97,2,0,76,76,108,108,2,0,88,88,120,120,2,0,70,70,102,102,2,0, - 77,77,109,109,2,0,71,71,103,103,2,0,75,75,107,107,2,0,87,87,119,119,6,0, - 9,10,13,13,32,32,47,47,91,91,93,93,2,0,10,10,13,13,3,0,9,10,13,13,32,32, - 1,0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82,84,84,92,92,110,110,114, - 114,116,116,4,0,10,10,13,13,34,34,92,92,2,0,43,43,45,45,1,0,96,96,2,0,66, - 66,98,98,2,0,89,89,121,121,2,0,85,85,117,117,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,11,0,9,10,13,13,32, - 32,34,35,44,44,47,47,58,58,60,60,62,63,92,92,124,124,1175,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,0,45,1, - 0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,1,53,1,0,0,0,1,55,1,0,0,0, - 1,57,1,0,0,0,1,59,1,0,0,0,1,61,1,0,0,0,2,63,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,2,153,1,0,0,0,2,155,1,0,0,0,2,157,1,0,0,0,2,159,1,0,0,0, - 2,161,1,0,0,0,2,163,1,0,0,0,2,167,1,0,0,0,2,169,1,0,0,0,2,171,1,0,0,0,2, - 173,1,0,0,0,3,175,1,0,0,0,3,177,1,0,0,0,3,179,1,0,0,0,3,181,1,0,0,0,3,183, - 1,0,0,0,3,185,1,0,0,0,3,189,1,0,0,0,3,191,1,0,0,0,3,193,1,0,0,0,3,195,1, - 0,0,0,3,197,1,0,0,0,4,199,1,0,0,0,4,201,1,0,0,0,4,203,1,0,0,0,4,209,1,0, - 0,0,4,211,1,0,0,0,4,213,1,0,0,0,4,215,1,0,0,0,5,217,1,0,0,0,5,219,1,0,0, - 0,5,221,1,0,0,0,5,223,1,0,0,0,5,225,1,0,0,0,5,227,1,0,0,0,5,229,1,0,0,0, - 5,231,1,0,0,0,5,233,1,0,0,0,6,235,1,0,0,0,6,237,1,0,0,0,6,239,1,0,0,0,6, - 241,1,0,0,0,6,245,1,0,0,0,6,247,1,0,0,0,6,249,1,0,0,0,6,251,1,0,0,0,6,253, - 1,0,0,0,6,255,1,0,0,0,7,257,1,0,0,0,7,259,1,0,0,0,7,261,1,0,0,0,7,263,1, - 0,0,0,7,265,1,0,0,0,7,267,1,0,0,0,7,269,1,0,0,0,7,271,1,0,0,0,7,273,1,0, - 0,0,7,275,1,0,0,0,8,277,1,0,0,0,8,279,1,0,0,0,8,281,1,0,0,0,8,283,1,0,0, - 0,8,285,1,0,0,0,8,287,1,0,0,0,8,289,1,0,0,0,9,291,1,0,0,0,9,293,1,0,0,0, - 9,295,1,0,0,0,9,297,1,0,0,0,9,299,1,0,0,0,9,301,1,0,0,0,10,303,1,0,0,0, - 10,305,1,0,0,0,10,307,1,0,0,0,10,309,1,0,0,0,10,311,1,0,0,0,10,313,1,0, - 0,0,11,315,1,0,0,0,13,325,1,0,0,0,15,332,1,0,0,0,17,341,1,0,0,0,19,348, - 1,0,0,0,21,358,1,0,0,0,23,365,1,0,0,0,25,372,1,0,0,0,27,386,1,0,0,0,29, - 393,1,0,0,0,31,401,1,0,0,0,33,413,1,0,0,0,35,422,1,0,0,0,37,428,1,0,0,0, - 39,435,1,0,0,0,41,442,1,0,0,0,43,450,1,0,0,0,45,459,1,0,0,0,47,465,1,0, - 0,0,49,482,1,0,0,0,51,498,1,0,0,0,53,504,1,0,0,0,55,509,1,0,0,0,57,514, - 1,0,0,0,59,518,1,0,0,0,61,522,1,0,0,0,63,526,1,0,0,0,65,530,1,0,0,0,67, - 532,1,0,0,0,69,534,1,0,0,0,71,537,1,0,0,0,73,539,1,0,0,0,75,548,1,0,0,0, - 77,550,1,0,0,0,79,555,1,0,0,0,81,557,1,0,0,0,83,562,1,0,0,0,85,593,1,0, - 0,0,87,596,1,0,0,0,89,642,1,0,0,0,91,644,1,0,0,0,93,647,1,0,0,0,95,651, - 1,0,0,0,97,655,1,0,0,0,99,657,1,0,0,0,101,659,1,0,0,0,103,664,1,0,0,0,105, - 666,1,0,0,0,107,672,1,0,0,0,109,678,1,0,0,0,111,683,1,0,0,0,113,685,1,0, - 0,0,115,688,1,0,0,0,117,691,1,0,0,0,119,696,1,0,0,0,121,700,1,0,0,0,123, - 705,1,0,0,0,125,711,1,0,0,0,127,714,1,0,0,0,129,716,1,0,0,0,131,722,1,0, - 0,0,133,724,1,0,0,0,135,729,1,0,0,0,137,732,1,0,0,0,139,735,1,0,0,0,141, - 738,1,0,0,0,143,740,1,0,0,0,145,743,1,0,0,0,147,745,1,0,0,0,149,748,1,0, - 0,0,151,750,1,0,0,0,153,752,1,0,0,0,155,754,1,0,0,0,157,756,1,0,0,0,159, - 758,1,0,0,0,161,763,1,0,0,0,163,784,1,0,0,0,165,786,1,0,0,0,167,794,1,0, - 0,0,169,796,1,0,0,0,171,800,1,0,0,0,173,804,1,0,0,0,175,808,1,0,0,0,177, - 813,1,0,0,0,179,817,1,0,0,0,181,821,1,0,0,0,183,825,1,0,0,0,185,829,1,0, - 0,0,187,841,1,0,0,0,189,844,1,0,0,0,191,848,1,0,0,0,193,852,1,0,0,0,195, - 856,1,0,0,0,197,860,1,0,0,0,199,864,1,0,0,0,201,869,1,0,0,0,203,873,1,0, - 0,0,205,881,1,0,0,0,207,902,1,0,0,0,209,906,1,0,0,0,211,910,1,0,0,0,213, - 914,1,0,0,0,215,918,1,0,0,0,217,922,1,0,0,0,219,927,1,0,0,0,221,931,1,0, - 0,0,223,935,1,0,0,0,225,939,1,0,0,0,227,942,1,0,0,0,229,946,1,0,0,0,231, - 950,1,0,0,0,233,954,1,0,0,0,235,958,1,0,0,0,237,963,1,0,0,0,239,968,1,0, - 0,0,241,973,1,0,0,0,243,980,1,0,0,0,245,989,1,0,0,0,247,996,1,0,0,0,249, - 1000,1,0,0,0,251,1004,1,0,0,0,253,1008,1,0,0,0,255,1012,1,0,0,0,257,1016, - 1,0,0,0,259,1022,1,0,0,0,261,1026,1,0,0,0,263,1030,1,0,0,0,265,1034,1,0, - 0,0,267,1038,1,0,0,0,269,1042,1,0,0,0,271,1046,1,0,0,0,273,1050,1,0,0,0, - 275,1054,1,0,0,0,277,1058,1,0,0,0,279,1063,1,0,0,0,281,1067,1,0,0,0,283, - 1071,1,0,0,0,285,1075,1,0,0,0,287,1079,1,0,0,0,289,1083,1,0,0,0,291,1087, - 1,0,0,0,293,1092,1,0,0,0,295,1097,1,0,0,0,297,1107,1,0,0,0,299,1111,1,0, - 0,0,301,1115,1,0,0,0,303,1119,1,0,0,0,305,1124,1,0,0,0,307,1131,1,0,0,0, - 309,1135,1,0,0,0,311,1139,1,0,0,0,313,1143,1,0,0,0,315,316,7,0,0,0,316, - 317,7,1,0,0,317,318,7,2,0,0,318,319,7,2,0,0,319,320,7,3,0,0,320,321,7,4, - 0,0,321,322,7,5,0,0,322,323,1,0,0,0,323,324,6,0,0,0,324,12,1,0,0,0,325, - 326,7,0,0,0,326,327,7,6,0,0,327,328,7,7,0,0,328,329,7,8,0,0,329,330,1,0, - 0,0,330,331,6,1,1,0,331,14,1,0,0,0,332,333,7,3,0,0,333,334,7,9,0,0,334, - 335,7,6,0,0,335,336,7,1,0,0,336,337,7,4,0,0,337,338,7,10,0,0,338,339,1, - 0,0,0,339,340,6,2,2,0,340,16,1,0,0,0,341,342,7,3,0,0,342,343,7,11,0,0,343, - 344,7,12,0,0,344,345,7,13,0,0,345,346,1,0,0,0,346,347,6,3,0,0,347,18,1, - 0,0,0,348,349,7,3,0,0,349,350,7,14,0,0,350,351,7,8,0,0,351,352,7,13,0,0, - 352,353,7,12,0,0,353,354,7,1,0,0,354,355,7,9,0,0,355,356,1,0,0,0,356,357, - 6,4,3,0,357,20,1,0,0,0,358,359,7,15,0,0,359,360,7,6,0,0,360,361,7,7,0,0, - 361,362,7,16,0,0,362,363,1,0,0,0,363,364,6,5,4,0,364,22,1,0,0,0,365,366, - 7,17,0,0,366,367,7,6,0,0,367,368,7,7,0,0,368,369,7,18,0,0,369,370,1,0,0, - 0,370,371,6,6,0,0,371,24,1,0,0,0,372,373,7,1,0,0,373,374,7,9,0,0,374,375, - 7,13,0,0,375,376,7,1,0,0,376,377,7,9,0,0,377,378,7,3,0,0,378,379,7,2,0, - 0,379,380,7,5,0,0,380,381,7,12,0,0,381,382,7,5,0,0,382,383,7,2,0,0,383, - 384,1,0,0,0,384,385,6,7,0,0,385,26,1,0,0,0,386,387,7,18,0,0,387,388,7,3, - 0,0,388,389,7,3,0,0,389,390,7,8,0,0,390,391,1,0,0,0,391,392,6,8,1,0,392, - 28,1,0,0,0,393,394,7,13,0,0,394,395,7,1,0,0,395,396,7,16,0,0,396,397,7, - 1,0,0,397,398,7,5,0,0,398,399,1,0,0,0,399,400,6,9,0,0,400,30,1,0,0,0,401, - 402,7,16,0,0,402,403,7,11,0,0,403,404,5,95,0,0,404,405,7,3,0,0,405,406, - 7,14,0,0,406,407,7,8,0,0,407,408,7,12,0,0,408,409,7,9,0,0,409,410,7,0,0, - 0,410,411,1,0,0,0,411,412,6,10,5,0,412,32,1,0,0,0,413,414,7,6,0,0,414,415, - 7,3,0,0,415,416,7,9,0,0,416,417,7,12,0,0,417,418,7,16,0,0,418,419,7,3,0, - 0,419,420,1,0,0,0,420,421,6,11,6,0,421,34,1,0,0,0,422,423,7,6,0,0,423,424, - 7,7,0,0,424,425,7,19,0,0,425,426,1,0,0,0,426,427,6,12,0,0,427,36,1,0,0, - 0,428,429,7,2,0,0,429,430,7,10,0,0,430,431,7,7,0,0,431,432,7,19,0,0,432, - 433,1,0,0,0,433,434,6,13,7,0,434,38,1,0,0,0,435,436,7,2,0,0,436,437,7,7, - 0,0,437,438,7,6,0,0,438,439,7,5,0,0,439,440,1,0,0,0,440,441,6,14,0,0,441, - 40,1,0,0,0,442,443,7,2,0,0,443,444,7,5,0,0,444,445,7,12,0,0,445,446,7,5, - 0,0,446,447,7,2,0,0,447,448,1,0,0,0,448,449,6,15,0,0,449,42,1,0,0,0,450, - 451,7,19,0,0,451,452,7,10,0,0,452,453,7,3,0,0,453,454,7,6,0,0,454,455,7, - 3,0,0,455,456,1,0,0,0,456,457,6,16,0,0,457,44,1,0,0,0,458,460,8,20,0,0, - 459,458,1,0,0,0,460,461,1,0,0,0,461,459,1,0,0,0,461,462,1,0,0,0,462,463, - 1,0,0,0,463,464,6,17,0,0,464,46,1,0,0,0,465,466,5,47,0,0,466,467,5,47,0, - 0,467,471,1,0,0,0,468,470,8,21,0,0,469,468,1,0,0,0,470,473,1,0,0,0,471, - 469,1,0,0,0,471,472,1,0,0,0,472,475,1,0,0,0,473,471,1,0,0,0,474,476,5,13, - 0,0,475,474,1,0,0,0,475,476,1,0,0,0,476,478,1,0,0,0,477,479,5,10,0,0,478, - 477,1,0,0,0,478,479,1,0,0,0,479,480,1,0,0,0,480,481,6,18,8,0,481,48,1,0, - 0,0,482,483,5,47,0,0,483,484,5,42,0,0,484,489,1,0,0,0,485,488,3,49,19,0, - 486,488,9,0,0,0,487,485,1,0,0,0,487,486,1,0,0,0,488,491,1,0,0,0,489,490, - 1,0,0,0,489,487,1,0,0,0,490,492,1,0,0,0,491,489,1,0,0,0,492,493,5,42,0, - 0,493,494,5,47,0,0,494,495,1,0,0,0,495,496,6,19,8,0,496,50,1,0,0,0,497, - 499,7,22,0,0,498,497,1,0,0,0,499,500,1,0,0,0,500,498,1,0,0,0,500,501,1, - 0,0,0,501,502,1,0,0,0,502,503,6,20,8,0,503,52,1,0,0,0,504,505,3,159,74, - 0,505,506,1,0,0,0,506,507,6,21,9,0,507,508,6,21,10,0,508,54,1,0,0,0,509, - 510,3,63,26,0,510,511,1,0,0,0,511,512,6,22,11,0,512,513,6,22,12,0,513,56, - 1,0,0,0,514,515,3,51,20,0,515,516,1,0,0,0,516,517,6,23,8,0,517,58,1,0,0, - 0,518,519,3,47,18,0,519,520,1,0,0,0,520,521,6,24,8,0,521,60,1,0,0,0,522, - 523,3,49,19,0,523,524,1,0,0,0,524,525,6,25,8,0,525,62,1,0,0,0,526,527,5, - 124,0,0,527,528,1,0,0,0,528,529,6,26,12,0,529,64,1,0,0,0,530,531,7,23,0, - 0,531,66,1,0,0,0,532,533,7,24,0,0,533,68,1,0,0,0,534,535,5,92,0,0,535,536, - 7,25,0,0,536,70,1,0,0,0,537,538,8,26,0,0,538,72,1,0,0,0,539,541,7,3,0,0, - 540,542,7,27,0,0,541,540,1,0,0,0,541,542,1,0,0,0,542,544,1,0,0,0,543,545, - 3,65,27,0,544,543,1,0,0,0,545,546,1,0,0,0,546,544,1,0,0,0,546,547,1,0,0, - 0,547,74,1,0,0,0,548,549,5,64,0,0,549,76,1,0,0,0,550,551,5,96,0,0,551,78, - 1,0,0,0,552,556,8,28,0,0,553,554,5,96,0,0,554,556,5,96,0,0,555,552,1,0, - 0,0,555,553,1,0,0,0,556,80,1,0,0,0,557,558,5,95,0,0,558,82,1,0,0,0,559, - 563,3,67,28,0,560,563,3,65,27,0,561,563,3,81,35,0,562,559,1,0,0,0,562,560, - 1,0,0,0,562,561,1,0,0,0,563,84,1,0,0,0,564,569,5,34,0,0,565,568,3,69,29, - 0,566,568,3,71,30,0,567,565,1,0,0,0,567,566,1,0,0,0,568,571,1,0,0,0,569, - 567,1,0,0,0,569,570,1,0,0,0,570,572,1,0,0,0,571,569,1,0,0,0,572,594,5,34, - 0,0,573,574,5,34,0,0,574,575,5,34,0,0,575,576,5,34,0,0,576,580,1,0,0,0, - 577,579,8,21,0,0,578,577,1,0,0,0,579,582,1,0,0,0,580,581,1,0,0,0,580,578, - 1,0,0,0,581,583,1,0,0,0,582,580,1,0,0,0,583,584,5,34,0,0,584,585,5,34,0, - 0,585,586,5,34,0,0,586,588,1,0,0,0,587,589,5,34,0,0,588,587,1,0,0,0,588, - 589,1,0,0,0,589,591,1,0,0,0,590,592,5,34,0,0,591,590,1,0,0,0,591,592,1, - 0,0,0,592,594,1,0,0,0,593,564,1,0,0,0,593,573,1,0,0,0,594,86,1,0,0,0,595, - 597,3,65,27,0,596,595,1,0,0,0,597,598,1,0,0,0,598,596,1,0,0,0,598,599,1, - 0,0,0,599,88,1,0,0,0,600,602,3,65,27,0,601,600,1,0,0,0,602,603,1,0,0,0, - 603,601,1,0,0,0,603,604,1,0,0,0,604,605,1,0,0,0,605,609,3,103,46,0,606, - 608,3,65,27,0,607,606,1,0,0,0,608,611,1,0,0,0,609,607,1,0,0,0,609,610,1, - 0,0,0,610,643,1,0,0,0,611,609,1,0,0,0,612,614,3,103,46,0,613,615,3,65,27, - 0,614,613,1,0,0,0,615,616,1,0,0,0,616,614,1,0,0,0,616,617,1,0,0,0,617,643, - 1,0,0,0,618,620,3,65,27,0,619,618,1,0,0,0,620,621,1,0,0,0,621,619,1,0,0, - 0,621,622,1,0,0,0,622,630,1,0,0,0,623,627,3,103,46,0,624,626,3,65,27,0, - 625,624,1,0,0,0,626,629,1,0,0,0,627,625,1,0,0,0,627,628,1,0,0,0,628,631, - 1,0,0,0,629,627,1,0,0,0,630,623,1,0,0,0,630,631,1,0,0,0,631,632,1,0,0,0, - 632,633,3,73,31,0,633,643,1,0,0,0,634,636,3,103,46,0,635,637,3,65,27,0, - 636,635,1,0,0,0,637,638,1,0,0,0,638,636,1,0,0,0,638,639,1,0,0,0,639,640, - 1,0,0,0,640,641,3,73,31,0,641,643,1,0,0,0,642,601,1,0,0,0,642,612,1,0,0, - 0,642,619,1,0,0,0,642,634,1,0,0,0,643,90,1,0,0,0,644,645,7,29,0,0,645,646, - 7,30,0,0,646,92,1,0,0,0,647,648,7,12,0,0,648,649,7,9,0,0,649,650,7,0,0, - 0,650,94,1,0,0,0,651,652,7,12,0,0,652,653,7,2,0,0,653,654,7,4,0,0,654,96, - 1,0,0,0,655,656,5,61,0,0,656,98,1,0,0,0,657,658,5,44,0,0,658,100,1,0,0, - 0,659,660,7,0,0,0,660,661,7,3,0,0,661,662,7,2,0,0,662,663,7,4,0,0,663,102, - 1,0,0,0,664,665,5,46,0,0,665,104,1,0,0,0,666,667,7,15,0,0,667,668,7,12, - 0,0,668,669,7,13,0,0,669,670,7,2,0,0,670,671,7,3,0,0,671,106,1,0,0,0,672, - 673,7,15,0,0,673,674,7,1,0,0,674,675,7,6,0,0,675,676,7,2,0,0,676,677,7, - 5,0,0,677,108,1,0,0,0,678,679,7,13,0,0,679,680,7,12,0,0,680,681,7,2,0,0, - 681,682,7,5,0,0,682,110,1,0,0,0,683,684,5,40,0,0,684,112,1,0,0,0,685,686, - 7,1,0,0,686,687,7,9,0,0,687,114,1,0,0,0,688,689,7,1,0,0,689,690,7,2,0,0, - 690,116,1,0,0,0,691,692,7,13,0,0,692,693,7,1,0,0,693,694,7,18,0,0,694,695, - 7,3,0,0,695,118,1,0,0,0,696,697,7,9,0,0,697,698,7,7,0,0,698,699,7,5,0,0, - 699,120,1,0,0,0,700,701,7,9,0,0,701,702,7,31,0,0,702,703,7,13,0,0,703,704, - 7,13,0,0,704,122,1,0,0,0,705,706,7,9,0,0,706,707,7,31,0,0,707,708,7,13, - 0,0,708,709,7,13,0,0,709,710,7,2,0,0,710,124,1,0,0,0,711,712,7,7,0,0,712, - 713,7,6,0,0,713,126,1,0,0,0,714,715,5,63,0,0,715,128,1,0,0,0,716,717,7, - 6,0,0,717,718,7,13,0,0,718,719,7,1,0,0,719,720,7,18,0,0,720,721,7,3,0,0, - 721,130,1,0,0,0,722,723,5,41,0,0,723,132,1,0,0,0,724,725,7,5,0,0,725,726, - 7,6,0,0,726,727,7,31,0,0,727,728,7,3,0,0,728,134,1,0,0,0,729,730,5,61,0, - 0,730,731,5,61,0,0,731,136,1,0,0,0,732,733,5,61,0,0,733,734,5,126,0,0,734, - 138,1,0,0,0,735,736,5,33,0,0,736,737,5,61,0,0,737,140,1,0,0,0,738,739,5, - 60,0,0,739,142,1,0,0,0,740,741,5,60,0,0,741,742,5,61,0,0,742,144,1,0,0, - 0,743,744,5,62,0,0,744,146,1,0,0,0,745,746,5,62,0,0,746,747,5,61,0,0,747, - 148,1,0,0,0,748,749,5,43,0,0,749,150,1,0,0,0,750,751,5,45,0,0,751,152,1, - 0,0,0,752,753,5,42,0,0,753,154,1,0,0,0,754,755,5,47,0,0,755,156,1,0,0,0, - 756,757,5,37,0,0,757,158,1,0,0,0,758,759,5,91,0,0,759,760,1,0,0,0,760,761, - 6,74,0,0,761,762,6,74,0,0,762,160,1,0,0,0,763,764,5,93,0,0,764,765,1,0, - 0,0,765,766,6,75,12,0,766,767,6,75,12,0,767,162,1,0,0,0,768,772,3,67,28, - 0,769,771,3,83,36,0,770,769,1,0,0,0,771,774,1,0,0,0,772,770,1,0,0,0,772, - 773,1,0,0,0,773,785,1,0,0,0,774,772,1,0,0,0,775,778,3,81,35,0,776,778,3, - 75,32,0,777,775,1,0,0,0,777,776,1,0,0,0,778,780,1,0,0,0,779,781,3,83,36, - 0,780,779,1,0,0,0,781,782,1,0,0,0,782,780,1,0,0,0,782,783,1,0,0,0,783,785, - 1,0,0,0,784,768,1,0,0,0,784,777,1,0,0,0,785,164,1,0,0,0,786,788,3,77,33, - 0,787,789,3,79,34,0,788,787,1,0,0,0,789,790,1,0,0,0,790,788,1,0,0,0,790, - 791,1,0,0,0,791,792,1,0,0,0,792,793,3,77,33,0,793,166,1,0,0,0,794,795,3, - 165,77,0,795,168,1,0,0,0,796,797,3,47,18,0,797,798,1,0,0,0,798,799,6,79, - 8,0,799,170,1,0,0,0,800,801,3,49,19,0,801,802,1,0,0,0,802,803,6,80,8,0, - 803,172,1,0,0,0,804,805,3,51,20,0,805,806,1,0,0,0,806,807,6,81,8,0,807, - 174,1,0,0,0,808,809,3,63,26,0,809,810,1,0,0,0,810,811,6,82,11,0,811,812, - 6,82,12,0,812,176,1,0,0,0,813,814,3,159,74,0,814,815,1,0,0,0,815,816,6, - 83,9,0,816,178,1,0,0,0,817,818,3,161,75,0,818,819,1,0,0,0,819,820,6,84, - 13,0,820,180,1,0,0,0,821,822,3,99,44,0,822,823,1,0,0,0,823,824,6,85,14, - 0,824,182,1,0,0,0,825,826,3,97,43,0,826,827,1,0,0,0,827,828,6,86,15,0,828, - 184,1,0,0,0,829,830,7,16,0,0,830,831,7,3,0,0,831,832,7,5,0,0,832,833,7, - 12,0,0,833,834,7,0,0,0,834,835,7,12,0,0,835,836,7,5,0,0,836,837,7,12,0, - 0,837,186,1,0,0,0,838,842,8,32,0,0,839,840,5,47,0,0,840,842,8,33,0,0,841, - 838,1,0,0,0,841,839,1,0,0,0,842,188,1,0,0,0,843,845,3,187,88,0,844,843, - 1,0,0,0,845,846,1,0,0,0,846,844,1,0,0,0,846,847,1,0,0,0,847,190,1,0,0,0, - 848,849,3,167,78,0,849,850,1,0,0,0,850,851,6,90,16,0,851,192,1,0,0,0,852, - 853,3,47,18,0,853,854,1,0,0,0,854,855,6,91,8,0,855,194,1,0,0,0,856,857, - 3,49,19,0,857,858,1,0,0,0,858,859,6,92,8,0,859,196,1,0,0,0,860,861,3,51, - 20,0,861,862,1,0,0,0,862,863,6,93,8,0,863,198,1,0,0,0,864,865,3,63,26,0, - 865,866,1,0,0,0,866,867,6,94,11,0,867,868,6,94,12,0,868,200,1,0,0,0,869, - 870,3,103,46,0,870,871,1,0,0,0,871,872,6,95,17,0,872,202,1,0,0,0,873,874, - 3,99,44,0,874,875,1,0,0,0,875,876,6,96,14,0,876,204,1,0,0,0,877,882,3,67, - 28,0,878,882,3,65,27,0,879,882,3,81,35,0,880,882,3,153,71,0,881,877,1,0, - 0,0,881,878,1,0,0,0,881,879,1,0,0,0,881,880,1,0,0,0,882,206,1,0,0,0,883, - 886,3,67,28,0,884,886,3,153,71,0,885,883,1,0,0,0,885,884,1,0,0,0,886,890, - 1,0,0,0,887,889,3,205,97,0,888,887,1,0,0,0,889,892,1,0,0,0,890,888,1,0, - 0,0,890,891,1,0,0,0,891,903,1,0,0,0,892,890,1,0,0,0,893,896,3,81,35,0,894, - 896,3,75,32,0,895,893,1,0,0,0,895,894,1,0,0,0,896,898,1,0,0,0,897,899,3, - 205,97,0,898,897,1,0,0,0,899,900,1,0,0,0,900,898,1,0,0,0,900,901,1,0,0, - 0,901,903,1,0,0,0,902,885,1,0,0,0,902,895,1,0,0,0,903,208,1,0,0,0,904,907, - 3,207,98,0,905,907,3,165,77,0,906,904,1,0,0,0,906,905,1,0,0,0,907,908,1, - 0,0,0,908,906,1,0,0,0,908,909,1,0,0,0,909,210,1,0,0,0,910,911,3,47,18,0, - 911,912,1,0,0,0,912,913,6,100,8,0,913,212,1,0,0,0,914,915,3,49,19,0,915, - 916,1,0,0,0,916,917,6,101,8,0,917,214,1,0,0,0,918,919,3,51,20,0,919,920, - 1,0,0,0,920,921,6,102,8,0,921,216,1,0,0,0,922,923,3,63,26,0,923,924,1,0, - 0,0,924,925,6,103,11,0,925,926,6,103,12,0,926,218,1,0,0,0,927,928,3,97, - 43,0,928,929,1,0,0,0,929,930,6,104,15,0,930,220,1,0,0,0,931,932,3,99,44, - 0,932,933,1,0,0,0,933,934,6,105,14,0,934,222,1,0,0,0,935,936,3,103,46,0, - 936,937,1,0,0,0,937,938,6,106,17,0,938,224,1,0,0,0,939,940,7,12,0,0,940, - 941,7,2,0,0,941,226,1,0,0,0,942,943,3,209,99,0,943,944,1,0,0,0,944,945, - 6,108,18,0,945,228,1,0,0,0,946,947,3,47,18,0,947,948,1,0,0,0,948,949,6, - 109,8,0,949,230,1,0,0,0,950,951,3,49,19,0,951,952,1,0,0,0,952,953,6,110, - 8,0,953,232,1,0,0,0,954,955,3,51,20,0,955,956,1,0,0,0,956,957,6,111,8,0, - 957,234,1,0,0,0,958,959,3,63,26,0,959,960,1,0,0,0,960,961,6,112,11,0,961, - 962,6,112,12,0,962,236,1,0,0,0,963,964,3,159,74,0,964,965,1,0,0,0,965,966, - 6,113,9,0,966,967,6,113,19,0,967,238,1,0,0,0,968,969,7,7,0,0,969,970,7, - 9,0,0,970,971,1,0,0,0,971,972,6,114,20,0,972,240,1,0,0,0,973,974,7,19,0, - 0,974,975,7,1,0,0,975,976,7,5,0,0,976,977,7,10,0,0,977,978,1,0,0,0,978, - 979,6,115,20,0,979,242,1,0,0,0,980,981,8,34,0,0,981,244,1,0,0,0,982,984, - 3,243,116,0,983,982,1,0,0,0,984,985,1,0,0,0,985,983,1,0,0,0,985,986,1,0, - 0,0,986,987,1,0,0,0,987,988,3,305,147,0,988,990,1,0,0,0,989,983,1,0,0,0, - 989,990,1,0,0,0,990,992,1,0,0,0,991,993,3,243,116,0,992,991,1,0,0,0,993, - 994,1,0,0,0,994,992,1,0,0,0,994,995,1,0,0,0,995,246,1,0,0,0,996,997,3,167, - 78,0,997,998,1,0,0,0,998,999,6,118,16,0,999,248,1,0,0,0,1000,1001,3,245, - 117,0,1001,1002,1,0,0,0,1002,1003,6,119,21,0,1003,250,1,0,0,0,1004,1005, - 3,47,18,0,1005,1006,1,0,0,0,1006,1007,6,120,8,0,1007,252,1,0,0,0,1008,1009, - 3,49,19,0,1009,1010,1,0,0,0,1010,1011,6,121,8,0,1011,254,1,0,0,0,1012,1013, - 3,51,20,0,1013,1014,1,0,0,0,1014,1015,6,122,8,0,1015,256,1,0,0,0,1016,1017, - 3,63,26,0,1017,1018,1,0,0,0,1018,1019,6,123,11,0,1019,1020,6,123,12,0,1020, - 1021,6,123,12,0,1021,258,1,0,0,0,1022,1023,3,97,43,0,1023,1024,1,0,0,0, - 1024,1025,6,124,15,0,1025,260,1,0,0,0,1026,1027,3,99,44,0,1027,1028,1,0, - 0,0,1028,1029,6,125,14,0,1029,262,1,0,0,0,1030,1031,3,103,46,0,1031,1032, - 1,0,0,0,1032,1033,6,126,17,0,1033,264,1,0,0,0,1034,1035,3,241,115,0,1035, - 1036,1,0,0,0,1036,1037,6,127,22,0,1037,266,1,0,0,0,1038,1039,3,209,99,0, - 1039,1040,1,0,0,0,1040,1041,6,128,18,0,1041,268,1,0,0,0,1042,1043,3,167, - 78,0,1043,1044,1,0,0,0,1044,1045,6,129,16,0,1045,270,1,0,0,0,1046,1047, - 3,47,18,0,1047,1048,1,0,0,0,1048,1049,6,130,8,0,1049,272,1,0,0,0,1050,1051, - 3,49,19,0,1051,1052,1,0,0,0,1052,1053,6,131,8,0,1053,274,1,0,0,0,1054,1055, - 3,51,20,0,1055,1056,1,0,0,0,1056,1057,6,132,8,0,1057,276,1,0,0,0,1058,1059, - 3,63,26,0,1059,1060,1,0,0,0,1060,1061,6,133,11,0,1061,1062,6,133,12,0,1062, - 278,1,0,0,0,1063,1064,3,103,46,0,1064,1065,1,0,0,0,1065,1066,6,134,17,0, - 1066,280,1,0,0,0,1067,1068,3,167,78,0,1068,1069,1,0,0,0,1069,1070,6,135, - 16,0,1070,282,1,0,0,0,1071,1072,3,163,76,0,1072,1073,1,0,0,0,1073,1074, - 6,136,23,0,1074,284,1,0,0,0,1075,1076,3,47,18,0,1076,1077,1,0,0,0,1077, - 1078,6,137,8,0,1078,286,1,0,0,0,1079,1080,3,49,19,0,1080,1081,1,0,0,0,1081, - 1082,6,138,8,0,1082,288,1,0,0,0,1083,1084,3,51,20,0,1084,1085,1,0,0,0,1085, - 1086,6,139,8,0,1086,290,1,0,0,0,1087,1088,3,63,26,0,1088,1089,1,0,0,0,1089, - 1090,6,140,11,0,1090,1091,6,140,12,0,1091,292,1,0,0,0,1092,1093,7,1,0,0, - 1093,1094,7,9,0,0,1094,1095,7,15,0,0,1095,1096,7,7,0,0,1096,294,1,0,0,0, - 1097,1098,7,15,0,0,1098,1099,7,31,0,0,1099,1100,7,9,0,0,1100,1101,7,4,0, - 0,1101,1102,7,5,0,0,1102,1103,7,1,0,0,1103,1104,7,7,0,0,1104,1105,7,9,0, - 0,1105,1106,7,2,0,0,1106,296,1,0,0,0,1107,1108,3,47,18,0,1108,1109,1,0, - 0,0,1109,1110,6,143,8,0,1110,298,1,0,0,0,1111,1112,3,49,19,0,1112,1113, - 1,0,0,0,1113,1114,6,144,8,0,1114,300,1,0,0,0,1115,1116,3,51,20,0,1116,1117, - 1,0,0,0,1117,1118,6,145,8,0,1118,302,1,0,0,0,1119,1120,3,161,75,0,1120, - 1121,1,0,0,0,1121,1122,6,146,13,0,1122,1123,6,146,12,0,1123,304,1,0,0,0, - 1124,1125,5,58,0,0,1125,306,1,0,0,0,1126,1132,3,75,32,0,1127,1132,3,65, - 27,0,1128,1132,3,103,46,0,1129,1132,3,67,28,0,1130,1132,3,81,35,0,1131, - 1126,1,0,0,0,1131,1127,1,0,0,0,1131,1128,1,0,0,0,1131,1129,1,0,0,0,1131, - 1130,1,0,0,0,1132,1133,1,0,0,0,1133,1131,1,0,0,0,1133,1134,1,0,0,0,1134, - 308,1,0,0,0,1135,1136,3,47,18,0,1136,1137,1,0,0,0,1137,1138,6,149,8,0,1138, - 310,1,0,0,0,1139,1140,3,49,19,0,1140,1141,1,0,0,0,1141,1142,6,150,8,0,1142, - 312,1,0,0,0,1143,1144,3,51,20,0,1144,1145,1,0,0,0,1145,1146,6,151,8,0,1146, - 314,1,0,0,0,57,0,1,2,3,4,5,6,7,8,9,10,461,471,475,478,487,489,500,541,546, - 555,562,567,569,580,588,591,593,598,603,609,616,621,627,630,638,642,772, - 777,782,784,790,841,846,881,885,890,895,900,902,906,908,985,989,994,1131, - 1133,24,5,2,0,5,4,0,5,6,0,5,1,0,5,3,0,5,8,0,5,5,0,5,9,0,0,1,0,7,63,0,5, - 0,0,7,25,0,4,0,0,7,64,0,7,33,0,7,32,0,7,66,0,7,35,0,7,75,0,5,10,0,5,7,0, - 7,85,0,7,84,0,7,65,0]; - - private static __ATN: ATN; - public static get _ATN(): ATN { - if (!esql_lexer.__ATN) { - esql_lexer.__ATN = new ATNDeserializer().deserialize(esql_lexer._serializedATN); - } - - return esql_lexer.__ATN; - } - - - static DecisionsToDFA = esql_lexer._ATN.decisionToState.map( (ds: DecisionState, index: number) => new DFA(ds, index) ); -} \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp deleted file mode 100644 index 32e2022ab0849..0000000000000 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp +++ /dev/null @@ -1,272 +0,0 @@ -token literal names: -null -'dissect' -'drop' -'enrich' -'eval' -'explain' -'from' -'grok' -'inlinestats' -'keep' -'limit' -'mv_expand' -'rename' -'row' -'show' -'sort' -'stats' -'where' -null -null -null -null -null -null -null -'|' -null -null -null -'by' -'and' -'asc' -'=' -',' -'desc' -'.' -'false' -'first' -'last' -'(' -'in' -'is' -'like' -'not' -'null' -'nulls' -'or' -'?' -'rlike' -')' -'true' -'==' -'=~' -'!=' -'<' -'<=' -'>' -'>=' -'+' -'-' -'*' -'/' -'%' -null -']' -null -null -null -null -null -'metadata' -null -null -null -null -null -null -null -null -'as' -null -null -null -'on' -'with' -null -null -null -null -null -null -null -null -null -null -'info' -'functions' -null -null -null -':' -null -null -null -null -null - -token symbolic names: -null -DISSECT -DROP -ENRICH -EVAL -EXPLAIN -FROM -GROK -INLINESTATS -KEEP -LIMIT -MV_EXPAND -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 -CIEQ -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 -ID_PATTERN -PROJECT_LINE_COMMENT -PROJECT_MULTILINE_COMMENT -PROJECT_WS -AS -RENAME_LINE_COMMENT -RENAME_MULTILINE_COMMENT -RENAME_WS -ON -WITH -ENRICH_POLICY_NAME -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 -COLON -SETTING -SETTING_LINE_COMMENT -SETTTING_MULTILINE_COMMENT -SETTING_WS -UNQUOTED_ID_PATTERN - -rule names: -singleStatement -query -sourceCommand -processingCommand -whereCommand -booleanExpression -regexBooleanExpression -valueExpression -operatorExpression -primaryExpression -functionExpression -rowCommand -fields -field -fromCommand -metadata -metadataOption -deprecated_metadata -evalCommand -statsCommand -inlinestatsCommand -fromIdentifier -qualifiedName -qualifiedNamePattern -identifier -identifierPattern -idPattern -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, 105, 511, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 112, 8, 1, 10, 1, 12, 1, 115, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 121, 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, 136, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 148, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 155, 8, 5, 10, 5, 12, 5, 158, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 165, 8, 5, 1, 5, 1, 5, 3, 5, 169, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 177, 8, 5, 10, 5, 12, 5, 180, 9, 5, 1, 6, 1, 6, 3, 6, 184, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 191, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 196, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 203, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 209, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 217, 8, 8, 10, 8, 12, 8, 220, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 229, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 237, 8, 10, 10, 10, 12, 10, 240, 9, 10, 3, 10, 242, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 5, 12, 252, 8, 12, 10, 12, 12, 12, 255, 9, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 262, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 268, 8, 14, 10, 14, 12, 14, 271, 9, 14, 1, 14, 3, 14, 274, 8, 14, 1, 15, 1, 15, 3, 15, 278, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 284, 8, 16, 10, 16, 12, 16, 287, 9, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 3, 19, 298, 8, 19, 1, 19, 1, 19, 3, 19, 302, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 308, 8, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 5, 22, 315, 8, 22, 10, 22, 12, 22, 318, 9, 22, 1, 23, 1, 23, 1, 23, 5, 23, 323, 8, 23, 10, 23, 12, 23, 326, 9, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 347, 8, 27, 10, 27, 12, 27, 350, 9, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 358, 8, 27, 10, 27, 12, 27, 361, 9, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 369, 8, 27, 10, 27, 12, 27, 372, 9, 27, 1, 27, 1, 27, 3, 27, 376, 8, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 385, 8, 29, 10, 29, 12, 29, 388, 9, 29, 1, 30, 1, 30, 3, 30, 392, 8, 30, 1, 30, 1, 30, 3, 30, 396, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 402, 8, 31, 10, 31, 12, 31, 405, 9, 31, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 411, 8, 32, 10, 32, 12, 32, 414, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 420, 8, 33, 10, 33, 12, 33, 423, 9, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 433, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 5, 38, 445, 8, 38, 10, 38, 12, 38, 448, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 3, 41, 458, 8, 41, 1, 42, 3, 42, 461, 8, 42, 1, 42, 1, 42, 1, 43, 3, 43, 466, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 485, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 491, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 497, 8, 49, 10, 49, 12, 49, 500, 9, 49, 3, 49, 502, 8, 49, 1, 50, 1, 50, 1, 50, 3, 50, 507, 8, 50, 1, 50, 1, 50, 1, 50, 0, 3, 2, 10, 16, 51, 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, 98, 100, 0, 9, 1, 0, 58, 59, 1, 0, 60, 62, 2, 0, 66, 66, 71, 71, 1, 0, 65, 66, 2, 0, 66, 66, 105, 105, 2, 0, 31, 31, 34, 34, 1, 0, 37, 38, 2, 0, 36, 36, 50, 50, 2, 0, 51, 51, 53, 57, 536, 0, 102, 1, 0, 0, 0, 2, 105, 1, 0, 0, 0, 4, 120, 1, 0, 0, 0, 6, 135, 1, 0, 0, 0, 8, 137, 1, 0, 0, 0, 10, 168, 1, 0, 0, 0, 12, 195, 1, 0, 0, 0, 14, 202, 1, 0, 0, 0, 16, 208, 1, 0, 0, 0, 18, 228, 1, 0, 0, 0, 20, 230, 1, 0, 0, 0, 22, 245, 1, 0, 0, 0, 24, 248, 1, 0, 0, 0, 26, 261, 1, 0, 0, 0, 28, 263, 1, 0, 0, 0, 30, 277, 1, 0, 0, 0, 32, 279, 1, 0, 0, 0, 34, 288, 1, 0, 0, 0, 36, 292, 1, 0, 0, 0, 38, 295, 1, 0, 0, 0, 40, 303, 1, 0, 0, 0, 42, 309, 1, 0, 0, 0, 44, 311, 1, 0, 0, 0, 46, 319, 1, 0, 0, 0, 48, 327, 1, 0, 0, 0, 50, 329, 1, 0, 0, 0, 52, 331, 1, 0, 0, 0, 54, 375, 1, 0, 0, 0, 56, 377, 1, 0, 0, 0, 58, 380, 1, 0, 0, 0, 60, 389, 1, 0, 0, 0, 62, 397, 1, 0, 0, 0, 64, 406, 1, 0, 0, 0, 66, 415, 1, 0, 0, 0, 68, 424, 1, 0, 0, 0, 70, 428, 1, 0, 0, 0, 72, 434, 1, 0, 0, 0, 74, 438, 1, 0, 0, 0, 76, 441, 1, 0, 0, 0, 78, 449, 1, 0, 0, 0, 80, 453, 1, 0, 0, 0, 82, 457, 1, 0, 0, 0, 84, 460, 1, 0, 0, 0, 86, 465, 1, 0, 0, 0, 88, 469, 1, 0, 0, 0, 90, 471, 1, 0, 0, 0, 92, 473, 1, 0, 0, 0, 94, 476, 1, 0, 0, 0, 96, 484, 1, 0, 0, 0, 98, 486, 1, 0, 0, 0, 100, 506, 1, 0, 0, 0, 102, 103, 3, 2, 1, 0, 103, 104, 5, 0, 0, 1, 104, 1, 1, 0, 0, 0, 105, 106, 6, 1, -1, 0, 106, 107, 3, 4, 2, 0, 107, 113, 1, 0, 0, 0, 108, 109, 10, 1, 0, 0, 109, 110, 5, 25, 0, 0, 110, 112, 3, 6, 3, 0, 111, 108, 1, 0, 0, 0, 112, 115, 1, 0, 0, 0, 113, 111, 1, 0, 0, 0, 113, 114, 1, 0, 0, 0, 114, 3, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 116, 121, 3, 92, 46, 0, 117, 121, 3, 28, 14, 0, 118, 121, 3, 22, 11, 0, 119, 121, 3, 96, 48, 0, 120, 116, 1, 0, 0, 0, 120, 117, 1, 0, 0, 0, 120, 118, 1, 0, 0, 0, 120, 119, 1, 0, 0, 0, 121, 5, 1, 0, 0, 0, 122, 136, 3, 36, 18, 0, 123, 136, 3, 40, 20, 0, 124, 136, 3, 56, 28, 0, 125, 136, 3, 62, 31, 0, 126, 136, 3, 58, 29, 0, 127, 136, 3, 38, 19, 0, 128, 136, 3, 8, 4, 0, 129, 136, 3, 64, 32, 0, 130, 136, 3, 66, 33, 0, 131, 136, 3, 70, 35, 0, 132, 136, 3, 72, 36, 0, 133, 136, 3, 98, 49, 0, 134, 136, 3, 74, 37, 0, 135, 122, 1, 0, 0, 0, 135, 123, 1, 0, 0, 0, 135, 124, 1, 0, 0, 0, 135, 125, 1, 0, 0, 0, 135, 126, 1, 0, 0, 0, 135, 127, 1, 0, 0, 0, 135, 128, 1, 0, 0, 0, 135, 129, 1, 0, 0, 0, 135, 130, 1, 0, 0, 0, 135, 131, 1, 0, 0, 0, 135, 132, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 134, 1, 0, 0, 0, 136, 7, 1, 0, 0, 0, 137, 138, 5, 17, 0, 0, 138, 139, 3, 10, 5, 0, 139, 9, 1, 0, 0, 0, 140, 141, 6, 5, -1, 0, 141, 142, 5, 43, 0, 0, 142, 169, 3, 10, 5, 7, 143, 169, 3, 14, 7, 0, 144, 169, 3, 12, 6, 0, 145, 147, 3, 14, 7, 0, 146, 148, 5, 43, 0, 0, 147, 146, 1, 0, 0, 0, 147, 148, 1, 0, 0, 0, 148, 149, 1, 0, 0, 0, 149, 150, 5, 40, 0, 0, 150, 151, 5, 39, 0, 0, 151, 156, 3, 14, 7, 0, 152, 153, 5, 33, 0, 0, 153, 155, 3, 14, 7, 0, 154, 152, 1, 0, 0, 0, 155, 158, 1, 0, 0, 0, 156, 154, 1, 0, 0, 0, 156, 157, 1, 0, 0, 0, 157, 159, 1, 0, 0, 0, 158, 156, 1, 0, 0, 0, 159, 160, 5, 49, 0, 0, 160, 169, 1, 0, 0, 0, 161, 162, 3, 14, 7, 0, 162, 164, 5, 41, 0, 0, 163, 165, 5, 43, 0, 0, 164, 163, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 166, 1, 0, 0, 0, 166, 167, 5, 44, 0, 0, 167, 169, 1, 0, 0, 0, 168, 140, 1, 0, 0, 0, 168, 143, 1, 0, 0, 0, 168, 144, 1, 0, 0, 0, 168, 145, 1, 0, 0, 0, 168, 161, 1, 0, 0, 0, 169, 178, 1, 0, 0, 0, 170, 171, 10, 4, 0, 0, 171, 172, 5, 30, 0, 0, 172, 177, 3, 10, 5, 5, 173, 174, 10, 3, 0, 0, 174, 175, 5, 46, 0, 0, 175, 177, 3, 10, 5, 4, 176, 170, 1, 0, 0, 0, 176, 173, 1, 0, 0, 0, 177, 180, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 11, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 181, 183, 3, 14, 7, 0, 182, 184, 5, 43, 0, 0, 183, 182, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 5, 42, 0, 0, 186, 187, 3, 88, 44, 0, 187, 196, 1, 0, 0, 0, 188, 190, 3, 14, 7, 0, 189, 191, 5, 43, 0, 0, 190, 189, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 193, 5, 48, 0, 0, 193, 194, 3, 88, 44, 0, 194, 196, 1, 0, 0, 0, 195, 181, 1, 0, 0, 0, 195, 188, 1, 0, 0, 0, 196, 13, 1, 0, 0, 0, 197, 203, 3, 16, 8, 0, 198, 199, 3, 16, 8, 0, 199, 200, 3, 90, 45, 0, 200, 201, 3, 16, 8, 0, 201, 203, 1, 0, 0, 0, 202, 197, 1, 0, 0, 0, 202, 198, 1, 0, 0, 0, 203, 15, 1, 0, 0, 0, 204, 205, 6, 8, -1, 0, 205, 209, 3, 18, 9, 0, 206, 207, 7, 0, 0, 0, 207, 209, 3, 16, 8, 3, 208, 204, 1, 0, 0, 0, 208, 206, 1, 0, 0, 0, 209, 218, 1, 0, 0, 0, 210, 211, 10, 2, 0, 0, 211, 212, 7, 1, 0, 0, 212, 217, 3, 16, 8, 3, 213, 214, 10, 1, 0, 0, 214, 215, 7, 0, 0, 0, 215, 217, 3, 16, 8, 2, 216, 210, 1, 0, 0, 0, 216, 213, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 17, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 221, 229, 3, 54, 27, 0, 222, 229, 3, 44, 22, 0, 223, 229, 3, 20, 10, 0, 224, 225, 5, 39, 0, 0, 225, 226, 3, 10, 5, 0, 226, 227, 5, 49, 0, 0, 227, 229, 1, 0, 0, 0, 228, 221, 1, 0, 0, 0, 228, 222, 1, 0, 0, 0, 228, 223, 1, 0, 0, 0, 228, 224, 1, 0, 0, 0, 229, 19, 1, 0, 0, 0, 230, 231, 3, 48, 24, 0, 231, 241, 5, 39, 0, 0, 232, 242, 5, 60, 0, 0, 233, 238, 3, 10, 5, 0, 234, 235, 5, 33, 0, 0, 235, 237, 3, 10, 5, 0, 236, 234, 1, 0, 0, 0, 237, 240, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 242, 1, 0, 0, 0, 240, 238, 1, 0, 0, 0, 241, 232, 1, 0, 0, 0, 241, 233, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 5, 49, 0, 0, 244, 21, 1, 0, 0, 0, 245, 246, 5, 13, 0, 0, 246, 247, 3, 24, 12, 0, 247, 23, 1, 0, 0, 0, 248, 253, 3, 26, 13, 0, 249, 250, 5, 33, 0, 0, 250, 252, 3, 26, 13, 0, 251, 249, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 25, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 262, 3, 10, 5, 0, 257, 258, 3, 44, 22, 0, 258, 259, 5, 32, 0, 0, 259, 260, 3, 10, 5, 0, 260, 262, 1, 0, 0, 0, 261, 256, 1, 0, 0, 0, 261, 257, 1, 0, 0, 0, 262, 27, 1, 0, 0, 0, 263, 264, 5, 6, 0, 0, 264, 269, 3, 42, 21, 0, 265, 266, 5, 33, 0, 0, 266, 268, 3, 42, 21, 0, 267, 265, 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 272, 274, 3, 30, 15, 0, 273, 272, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 29, 1, 0, 0, 0, 275, 278, 3, 32, 16, 0, 276, 278, 3, 34, 17, 0, 277, 275, 1, 0, 0, 0, 277, 276, 1, 0, 0, 0, 278, 31, 1, 0, 0, 0, 279, 280, 5, 70, 0, 0, 280, 285, 3, 42, 21, 0, 281, 282, 5, 33, 0, 0, 282, 284, 3, 42, 21, 0, 283, 281, 1, 0, 0, 0, 284, 287, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 33, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 288, 289, 5, 63, 0, 0, 289, 290, 3, 32, 16, 0, 290, 291, 5, 64, 0, 0, 291, 35, 1, 0, 0, 0, 292, 293, 5, 4, 0, 0, 293, 294, 3, 24, 12, 0, 294, 37, 1, 0, 0, 0, 295, 297, 5, 16, 0, 0, 296, 298, 3, 24, 12, 0, 297, 296, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 300, 5, 29, 0, 0, 300, 302, 3, 24, 12, 0, 301, 299, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 39, 1, 0, 0, 0, 303, 304, 5, 8, 0, 0, 304, 307, 3, 24, 12, 0, 305, 306, 5, 29, 0, 0, 306, 308, 3, 24, 12, 0, 307, 305, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 41, 1, 0, 0, 0, 309, 310, 7, 2, 0, 0, 310, 43, 1, 0, 0, 0, 311, 316, 3, 48, 24, 0, 312, 313, 5, 35, 0, 0, 313, 315, 3, 48, 24, 0, 314, 312, 1, 0, 0, 0, 315, 318, 1, 0, 0, 0, 316, 314, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 45, 1, 0, 0, 0, 318, 316, 1, 0, 0, 0, 319, 324, 3, 50, 25, 0, 320, 321, 5, 35, 0, 0, 321, 323, 3, 50, 25, 0, 322, 320, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 47, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 327, 328, 7, 3, 0, 0, 328, 49, 1, 0, 0, 0, 329, 330, 5, 75, 0, 0, 330, 51, 1, 0, 0, 0, 331, 332, 7, 4, 0, 0, 332, 53, 1, 0, 0, 0, 333, 376, 5, 44, 0, 0, 334, 335, 3, 86, 43, 0, 335, 336, 5, 65, 0, 0, 336, 376, 1, 0, 0, 0, 337, 376, 3, 84, 42, 0, 338, 376, 3, 86, 43, 0, 339, 376, 3, 80, 40, 0, 340, 376, 5, 47, 0, 0, 341, 376, 3, 88, 44, 0, 342, 343, 5, 63, 0, 0, 343, 348, 3, 82, 41, 0, 344, 345, 5, 33, 0, 0, 345, 347, 3, 82, 41, 0, 346, 344, 1, 0, 0, 0, 347, 350, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 351, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 351, 352, 5, 64, 0, 0, 352, 376, 1, 0, 0, 0, 353, 354, 5, 63, 0, 0, 354, 359, 3, 80, 40, 0, 355, 356, 5, 33, 0, 0, 356, 358, 3, 80, 40, 0, 357, 355, 1, 0, 0, 0, 358, 361, 1, 0, 0, 0, 359, 357, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 362, 1, 0, 0, 0, 361, 359, 1, 0, 0, 0, 362, 363, 5, 64, 0, 0, 363, 376, 1, 0, 0, 0, 364, 365, 5, 63, 0, 0, 365, 370, 3, 88, 44, 0, 366, 367, 5, 33, 0, 0, 367, 369, 3, 88, 44, 0, 368, 366, 1, 0, 0, 0, 369, 372, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 370, 371, 1, 0, 0, 0, 371, 373, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 373, 374, 5, 64, 0, 0, 374, 376, 1, 0, 0, 0, 375, 333, 1, 0, 0, 0, 375, 334, 1, 0, 0, 0, 375, 337, 1, 0, 0, 0, 375, 338, 1, 0, 0, 0, 375, 339, 1, 0, 0, 0, 375, 340, 1, 0, 0, 0, 375, 341, 1, 0, 0, 0, 375, 342, 1, 0, 0, 0, 375, 353, 1, 0, 0, 0, 375, 364, 1, 0, 0, 0, 376, 55, 1, 0, 0, 0, 377, 378, 5, 10, 0, 0, 378, 379, 5, 27, 0, 0, 379, 57, 1, 0, 0, 0, 380, 381, 5, 15, 0, 0, 381, 386, 3, 60, 30, 0, 382, 383, 5, 33, 0, 0, 383, 385, 3, 60, 30, 0, 384, 382, 1, 0, 0, 0, 385, 388, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 59, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 389, 391, 3, 10, 5, 0, 390, 392, 7, 5, 0, 0, 391, 390, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 395, 1, 0, 0, 0, 393, 394, 5, 45, 0, 0, 394, 396, 7, 6, 0, 0, 395, 393, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 61, 1, 0, 0, 0, 397, 398, 5, 9, 0, 0, 398, 403, 3, 46, 23, 0, 399, 400, 5, 33, 0, 0, 400, 402, 3, 46, 23, 0, 401, 399, 1, 0, 0, 0, 402, 405, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 63, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 406, 407, 5, 2, 0, 0, 407, 412, 3, 46, 23, 0, 408, 409, 5, 33, 0, 0, 409, 411, 3, 46, 23, 0, 410, 408, 1, 0, 0, 0, 411, 414, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 65, 1, 0, 0, 0, 414, 412, 1, 0, 0, 0, 415, 416, 5, 12, 0, 0, 416, 421, 3, 68, 34, 0, 417, 418, 5, 33, 0, 0, 418, 420, 3, 68, 34, 0, 419, 417, 1, 0, 0, 0, 420, 423, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 67, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 424, 425, 3, 46, 23, 0, 425, 426, 5, 79, 0, 0, 426, 427, 3, 46, 23, 0, 427, 69, 1, 0, 0, 0, 428, 429, 5, 1, 0, 0, 429, 430, 3, 18, 9, 0, 430, 432, 3, 88, 44, 0, 431, 433, 3, 76, 38, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 71, 1, 0, 0, 0, 434, 435, 5, 7, 0, 0, 435, 436, 3, 18, 9, 0, 436, 437, 3, 88, 44, 0, 437, 73, 1, 0, 0, 0, 438, 439, 5, 11, 0, 0, 439, 440, 3, 44, 22, 0, 440, 75, 1, 0, 0, 0, 441, 446, 3, 78, 39, 0, 442, 443, 5, 33, 0, 0, 443, 445, 3, 78, 39, 0, 444, 442, 1, 0, 0, 0, 445, 448, 1, 0, 0, 0, 446, 444, 1, 0, 0, 0, 446, 447, 1, 0, 0, 0, 447, 77, 1, 0, 0, 0, 448, 446, 1, 0, 0, 0, 449, 450, 3, 48, 24, 0, 450, 451, 5, 32, 0, 0, 451, 452, 3, 54, 27, 0, 452, 79, 1, 0, 0, 0, 453, 454, 7, 7, 0, 0, 454, 81, 1, 0, 0, 0, 455, 458, 3, 84, 42, 0, 456, 458, 3, 86, 43, 0, 457, 455, 1, 0, 0, 0, 457, 456, 1, 0, 0, 0, 458, 83, 1, 0, 0, 0, 459, 461, 7, 0, 0, 0, 460, 459, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 5, 28, 0, 0, 463, 85, 1, 0, 0, 0, 464, 466, 7, 0, 0, 0, 465, 464, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 468, 5, 27, 0, 0, 468, 87, 1, 0, 0, 0, 469, 470, 5, 26, 0, 0, 470, 89, 1, 0, 0, 0, 471, 472, 7, 8, 0, 0, 472, 91, 1, 0, 0, 0, 473, 474, 5, 5, 0, 0, 474, 475, 3, 94, 47, 0, 475, 93, 1, 0, 0, 0, 476, 477, 5, 63, 0, 0, 477, 478, 3, 2, 1, 0, 478, 479, 5, 64, 0, 0, 479, 95, 1, 0, 0, 0, 480, 481, 5, 14, 0, 0, 481, 485, 5, 95, 0, 0, 482, 483, 5, 14, 0, 0, 483, 485, 5, 96, 0, 0, 484, 480, 1, 0, 0, 0, 484, 482, 1, 0, 0, 0, 485, 97, 1, 0, 0, 0, 486, 487, 5, 3, 0, 0, 487, 490, 5, 85, 0, 0, 488, 489, 5, 83, 0, 0, 489, 491, 3, 46, 23, 0, 490, 488, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 501, 1, 0, 0, 0, 492, 493, 5, 84, 0, 0, 493, 498, 3, 100, 50, 0, 494, 495, 5, 33, 0, 0, 495, 497, 3, 100, 50, 0, 496, 494, 1, 0, 0, 0, 497, 500, 1, 0, 0, 0, 498, 496, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 502, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 501, 492, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 99, 1, 0, 0, 0, 503, 504, 3, 46, 23, 0, 504, 505, 5, 32, 0, 0, 505, 507, 1, 0, 0, 0, 506, 503, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 3, 46, 23, 0, 509, 101, 1, 0, 0, 0, 50, 113, 120, 135, 147, 156, 164, 168, 176, 178, 183, 190, 195, 202, 208, 216, 218, 228, 238, 241, 253, 261, 269, 273, 277, 285, 297, 301, 307, 316, 324, 348, 359, 370, 375, 386, 391, 395, 403, 412, 421, 432, 446, 457, 460, 465, 484, 490, 498, 501, 506] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens b/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens deleted file mode 100644 index fc827c0dfcf8b..0000000000000 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens +++ /dev/null @@ -1,165 +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 -RENAME=12 -ROW=13 -SHOW=14 -SORT=15 -STATS=16 -WHERE=17 -UNKNOWN_CMD=18 -LINE_COMMENT=19 -MULTILINE_COMMENT=20 -WS=21 -EXPLAIN_WS=22 -EXPLAIN_LINE_COMMENT=23 -EXPLAIN_MULTILINE_COMMENT=24 -PIPE=25 -STRING=26 -INTEGER_LITERAL=27 -DECIMAL_LITERAL=28 -BY=29 -AND=30 -ASC=31 -ASSIGN=32 -COMMA=33 -DESC=34 -DOT=35 -FALSE=36 -FIRST=37 -LAST=38 -LP=39 -IN=40 -IS=41 -LIKE=42 -NOT=43 -NULL=44 -NULLS=45 -OR=46 -PARAM=47 -RLIKE=48 -RP=49 -TRUE=50 -EQ=51 -CIEQ=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 -ID_PATTERN=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_POLICY_NAME=85 -ENRICH_LINE_COMMENT=86 -ENRICH_MULTILINE_COMMENT=87 -ENRICH_WS=88 -ENRICH_FIELD_LINE_COMMENT=89 -ENRICH_FIELD_MULTILINE_COMMENT=90 -ENRICH_FIELD_WS=91 -MVEXPAND_LINE_COMMENT=92 -MVEXPAND_MULTILINE_COMMENT=93 -MVEXPAND_WS=94 -INFO=95 -FUNCTIONS=96 -SHOW_LINE_COMMENT=97 -SHOW_MULTILINE_COMMENT=98 -SHOW_WS=99 -COLON=100 -SETTING=101 -SETTING_LINE_COMMENT=102 -SETTTING_MULTILINE_COMMENT=103 -SETTING_WS=104 -UNQUOTED_ID_PATTERN=105 -'dissect'=1 -'drop'=2 -'enrich'=3 -'eval'=4 -'explain'=5 -'from'=6 -'grok'=7 -'inlinestats'=8 -'keep'=9 -'limit'=10 -'mv_expand'=11 -'rename'=12 -'row'=13 -'show'=14 -'sort'=15 -'stats'=16 -'where'=17 -'|'=25 -'by'=29 -'and'=30 -'asc'=31 -'='=32 -','=33 -'desc'=34 -'.'=35 -'false'=36 -'first'=37 -'last'=38 -'('=39 -'in'=40 -'is'=41 -'like'=42 -'not'=43 -'null'=44 -'nulls'=45 -'or'=46 -'?'=47 -'rlike'=48 -')'=49 -'true'=50 -'=='=51 -'=~'=52 -'!='=53 -'<'=54 -'<='=55 -'>'=56 -'>='=57 -'+'=58 -'-'=59 -'*'=60 -'/'=61 -'%'=62 -']'=64 -'metadata'=70 -'as'=79 -'on'=83 -'with'=84 -'info'=95 -'functions'=96 -':'=100 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 39d2ccd562c06..0000000000000 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/esql_validation_meta_tests.json +++ /dev/null @@ -1,8670 +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": "show", - "error": true - }, - { - "query": "show functions", - "error": false - }, - { - "query": "show info", - "error": false - }, - { - "query": "show functions()", - "error": true - }, - { - "query": "show functions blah", - "error": true - }, - { - "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 937d9a27e4707..0000000000000 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts +++ /dev/null @@ -1,2394 +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', 'row', 'show'}`, - ]) - ); - }); - - describe('from', () => { - testErrorsAndWarnings('f', [ - "SyntaxError: mismatched input 'f' expecting {'explain', 'from', '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('show', () => { - testErrorsAndWarnings('show', ["SyntaxError: no viable alternative at input 'show'"]); - testErrorsAndWarnings('show functions', []); - testErrorsAndWarnings('show info', []); - testErrorsAndWarnings('show functions()', [ - "SyntaxError: token recognition error at: '('", - "SyntaxError: token recognition error at: ')'", - ]); - testErrorsAndWarnings('show 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('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: 'Fi'", - "SyntaxError: token recognition error at: 'e'", - "SyntaxError: token recognition error at: 'l'", - "SyntaxError: token recognition error at: 'd'", - "SyntaxError: no viable alternative at input 'show '", - ]); - }); - - 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 show command', async () => { - const callbackMocks = getCallbackMocks(); - await validateAst(`show 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: 'show functions', - }); - }); - - 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 1647b954ada7d..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', @@ -76,6 +72,7 @@ export const buildESQlTheme = (): monaco.editor.IStandaloneThemeData => ({ 'expr_ws', 'row', 'show', + 'meta', 'limit', 'nulls_ordering_direction', 'nulls_ordering', 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-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 3328cb2b10f87..bb04f9d5b4eb4 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -126,6 +126,7 @@ pageLoadAssetSize: savedSearch: 16225 screenshotMode: 17856 screenshotting: 22870 + searchConnectors: 30000 searchPlayground: 19325 searchprofiler: 67080 security: 81771 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-search-connectors/index.ts b/packages/kbn-search-connectors/index.ts index ebba7cc8b2555..012d23a38abd0 100644 --- a/packages/kbn-search-connectors/index.ts +++ b/packages/kbn-search-connectors/index.ts @@ -15,7 +15,6 @@ export const CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX = '.search-acl-filter-'; export const CRAWLER_SERVICE_TYPE = 'elastic-crawler'; export * from './components'; -export * from './connectors'; export * from './lib'; export * from './types'; export * from './utils'; 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/packages/presentation/presentation_publishing/index.ts b/packages/presentation/presentation_publishing/index.ts index 12a2680d180bf..08b76826b727e 100644 --- a/packages/presentation/presentation_publishing/index.ts +++ b/packages/presentation/presentation_publishing/index.ts @@ -76,7 +76,8 @@ export { type PublishesTimeRange, type PublishesUnifiedSearch, type PublishesWritableUnifiedSearch, -} from './interfaces/publishes_unified_search'; +} from './interfaces/unified_search/publishes_unified_search'; +export { initializeTimeRange } from './interfaces/unified_search/initialize_time_range'; export { apiPublishesSavedObjectId, useSavedObjectId, diff --git a/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.test.ts b/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.test.ts new file mode 100644 index 0000000000000..2e1136f1fa2bc --- /dev/null +++ b/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.test.ts @@ -0,0 +1,148 @@ +/* + * 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 { TimeRange } from '@kbn/es-query'; +import { BehaviorSubject, skip } from 'rxjs'; +import { initializeTimeRange } from './initialize_time_range'; + +describe('initialize time range', () => { + describe('appliedTimeRange$', () => { + let timeRange: TimeRange | undefined; + const parentApi = { + timeRange$: new BehaviorSubject(undefined), + }; + + describe('local and parent time range', () => { + beforeEach(() => { + timeRange = { + from: 'now-15m', + to: 'now', + }; + parentApi.timeRange$.next({ + from: 'now-24h', + to: 'now', + }); + }); + + it('should return local time range', () => { + const { appliedTimeRange$ } = initializeTimeRange({ timeRange }, parentApi); + expect(appliedTimeRange$.value).toEqual({ + from: 'now-15m', + to: 'now', + }); + }); + + it('should emit when local time range changes', async () => { + let emitCount = 0; + const { appliedTimeRange$, timeRangeApi } = initializeTimeRange({ timeRange }, parentApi); + + const subscribe = appliedTimeRange$.pipe(skip(1)).subscribe(() => { + emitCount++; + }); + + timeRangeApi.setTimeRange({ + from: 'now-16m', + to: 'now', + }); + await new Promise(process.nextTick); + + expect(emitCount).toBe(1); + expect(appliedTimeRange$.value).toEqual({ + from: 'now-16m', + to: 'now', + }); + + subscribe.unsubscribe(); + }); + + it('should not emit when parent time range changes', async () => { + let emitCount = 0; + const { appliedTimeRange$ } = initializeTimeRange({ timeRange }, parentApi); + + const subscribe = appliedTimeRange$.pipe(skip(1)).subscribe(() => { + emitCount++; + }); + + parentApi.timeRange$.next({ + from: 'now-25h', + to: 'now', + }); + await new Promise(process.nextTick); + + expect(emitCount).toBe(0); + expect(appliedTimeRange$.value).toEqual({ + from: 'now-15m', + to: 'now', + }); + + subscribe.unsubscribe(); + }); + + it('should emit parent time range when local time range is cleared', async () => { + let emitCount = 0; + const { appliedTimeRange$, timeRangeApi } = initializeTimeRange({ timeRange }, parentApi); + + const subscribe = appliedTimeRange$.pipe(skip(1)).subscribe(() => { + emitCount++; + }); + + timeRangeApi.setTimeRange(undefined); + await new Promise(process.nextTick); + + expect(emitCount).toBe(1); + expect(appliedTimeRange$.value).toEqual({ + from: 'now-24h', + to: 'now', + }); + + subscribe.unsubscribe(); + }); + }); + + describe('only parent time range', () => { + beforeEach(() => { + timeRange = undefined; + parentApi.timeRange$.next({ + from: 'now-24h', + to: 'now', + }); + }); + + it('should return parent time range', () => { + const { appliedTimeRange$ } = initializeTimeRange({ timeRange }, parentApi); + expect(appliedTimeRange$.value).toEqual({ + from: 'now-24h', + to: 'now', + }); + }); + + it('should emit when parent time range changes', async () => { + let emitCount = 0; + const { appliedTimeRange$ } = initializeTimeRange({ timeRange }, parentApi); + + const subscribe = appliedTimeRange$.pipe(skip(1)).subscribe(() => { + emitCount++; + }); + + parentApi.timeRange$.next({ + from: 'now-25h', + to: 'now', + }); + await new Promise(process.nextTick); + + expect(emitCount).toBe(1); + expect(appliedTimeRange$.value).toEqual({ + from: 'now-25h', + to: 'now', + }); + + subscribe.unsubscribe(); + }); + }); + }); +}); diff --git a/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts b/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts new file mode 100644 index 0000000000000..8ff5314d046a1 --- /dev/null +++ b/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts @@ -0,0 +1,74 @@ +/* + * 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 { BehaviorSubject } from 'rxjs'; +import fastIsEqual from 'fast-deep-equal'; +import { TimeRange } from '@kbn/es-query'; +import { PublishingSubject } from '../../publishing_subject'; +import { StateComparators } from '../../comparators'; +import { + apiPublishesTimeRange, + PublishesTimeRange, + PublishesWritableTimeRange, +} from './publishes_unified_search'; + +export interface SerializedTimeRange { + timeRange: TimeRange | undefined; +} + +export const initializeTimeRange = ( + rawState: SerializedTimeRange, + parentApi?: unknown +): { + appliedTimeRange$: PublishingSubject; + cleanupTimeRange: () => void; + serializeTimeRange: () => SerializedTimeRange; + timeRangeApi: PublishesWritableTimeRange; + timeRangeComparators: StateComparators; +} => { + const timeRange$ = new BehaviorSubject(rawState.timeRange); + function setTimeRange(nextTimeRange: TimeRange | undefined) { + timeRange$.next(nextTimeRange); + } + const appliedTimeRange$ = new BehaviorSubject( + timeRange$.value ?? (parentApi as Partial)?.timeRange$?.value + ); + + const subscriptions = timeRange$.subscribe((timeRange) => { + appliedTimeRange$.next( + timeRange ?? (parentApi as Partial)?.timeRange$?.value + ); + }); + if (apiPublishesTimeRange(parentApi)) { + subscriptions.add( + parentApi?.timeRange$.subscribe((parentTimeRange) => { + if (timeRange$?.value) { + return; + } + appliedTimeRange$.next(parentTimeRange); + }) + ); + } + + return { + appliedTimeRange$, + cleanupTimeRange: () => { + subscriptions.unsubscribe(); + }, + serializeTimeRange: () => ({ + timeRange: timeRange$.value, + }), + timeRangeComparators: { + timeRange: [timeRange$, setTimeRange, fastIsEqual], + } as StateComparators, + timeRangeApi: { + timeRange$, + setTimeRange, + }, + }; +}; diff --git a/packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts b/packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts similarity index 88% rename from packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts rename to packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts index c5a047d7696fe..4f344a71aaf4d 100644 --- a/packages/presentation/presentation_publishing/interfaces/publishes_unified_search.ts +++ b/packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts @@ -7,23 +7,27 @@ */ import { TimeRange, Filter, Query, AggregateQuery } from '@kbn/es-query'; -import { PublishingSubject } from '../publishing_subject'; +import { PublishingSubject } from '../../publishing_subject'; export interface PublishesTimeRange { timeRange$: PublishingSubject; } +export type PublishesWritableTimeRange = PublishesTimeRange & { + setTimeRange: (timeRange: TimeRange | undefined) => void; +}; + export type PublishesUnifiedSearch = PublishesTimeRange & { isCompatibleWithUnifiedSearch?: () => boolean; filters$: PublishingSubject; query$: PublishingSubject; }; -export type PublishesWritableUnifiedSearch = PublishesUnifiedSearch & { - setTimeRange: (timeRange: TimeRange | undefined) => void; - setFilters: (filters: Filter[] | undefined) => void; - setQuery: (query: Query | undefined) => void; -}; +export type PublishesWritableUnifiedSearch = PublishesUnifiedSearch & + PublishesWritableTimeRange & { + setFilters: (filters: Filter[] | undefined) => void; + setQuery: (query: Query | undefined) => void; + }; export const apiPublishesTimeRange = ( unknownApi: null | unknown 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/chart_expressions/expression_gauge/common/constants.ts b/src/plugins/chart_expressions/expression_gauge/common/constants.ts index 484e2864d3c46..0dfebd48e6d90 100644 --- a/src/plugins/chart_expressions/expression_gauge/common/constants.ts +++ b/src/plugins/chart_expressions/expression_gauge/common/constants.ts @@ -12,6 +12,7 @@ export const GAUGE_FUNCTION_RENDERER_NAME = 'gauge_renderer'; export const GaugeShapes = { HORIZONTAL_BULLET: 'horizontalBullet', VERTICAL_BULLET: 'verticalBullet', + SEMI_CIRCLE: 'semiCircle', ARC: 'arc', CIRCLE: 'circle', } as const; diff --git a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/__snapshots__/gauge_function.test.ts.snap b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/__snapshots__/gauge_function.test.ts.snap index 93339463a7715..740f7c758974a 100644 --- a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/__snapshots__/gauge_function.test.ts.snap +++ b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/__snapshots__/gauge_function.test.ts.snap @@ -50,7 +50,7 @@ Object { "palette": undefined, "percentageMode": false, "respectRanges": false, - "shape": "arc", + "shape": "semiCircle", "ticksPosition": "auto", }, "canNavigateToLens": false, @@ -91,7 +91,7 @@ Object { "args": Object { "ariaLabel": undefined, "centralMajor": undefined, - "centralMajorMode": "auto", + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -144,6 +144,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -196,6 +198,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -248,6 +252,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -355,7 +361,7 @@ Object { "args": Object { "ariaLabel": undefined, "centralMajor": undefined, - "centralMajorMode": "auto", + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -408,6 +414,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -460,6 +468,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -512,6 +522,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -564,6 +576,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -616,6 +630,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -668,6 +684,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "palette", "commonLabel": undefined, "goal": undefined, @@ -713,6 +731,60 @@ Object { } `; +exports[`interpreter/functions#gauge returns an object with the correct structure for the semiCircle shape 1`] = ` +Object { + "as": "gauge", + "type": "render", + "value": Object { + "args": Object { + "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, + "colorMode": "none", + "commonLabel": undefined, + "goal": undefined, + "labelMajor": "title", + "labelMajorMode": "custom", + "labelMinor": undefined, + "max": undefined, + "metric": "col-0-1", + "min": "col-1-2", + "palette": undefined, + "percentageMode": false, + "respectRanges": false, + "shape": "semiCircle", + "ticksPosition": "auto", + }, + "canNavigateToLens": false, + "data": Object { + "columns": Array [ + Object { + "id": "col-0-1", + "meta": Object { + "type": "number", + }, + "name": "Count", + }, + Object { + "id": "col-1-2", + "meta": Object { + "type": "string", + }, + "name": "Dest", + }, + ], + "rows": Array [ + Object { + "col-0-1": 0, + }, + ], + "type": "datatable", + }, + "overrides": undefined, + }, +} +`; + exports[`interpreter/functions#gauge returns an object with the correct structure for the verticalBullet shape 1`] = ` Object { "as": "gauge", @@ -720,6 +792,8 @@ Object { "value": Object { "args": Object { "ariaLabel": undefined, + "centralMajor": undefined, + "centralMajorMode": undefined, "colorMode": "none", "commonLabel": undefined, "goal": undefined, @@ -764,7 +838,3 @@ Object { }, } `; - -exports[`interpreter/functions#gauge throws error if centralMajor or centralMajorMode are provided for the horizontalBullet shape 1`] = `"Fields \\"centralMajor\\" and \\"centralMajorMode\\" are not supported by the shape \\"horizontalBullet\\""`; - -exports[`interpreter/functions#gauge throws error if centralMajor or centralMajorMode are provided for the vertical shape 1`] = `"Fields \\"centralMajor\\" and \\"centralMajorMode\\" are not supported by the shape \\"verticalBullet\\""`; diff --git a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.test.ts b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.test.ts index b6a966a7cd858..be1c0a1cac3e2 100644 --- a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.test.ts +++ b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.test.ts @@ -65,34 +65,13 @@ describe('interpreter/functions#gauge', () => { it(`returns an object with the correct structure for the arc if centralMajor and centralMajorMode are passed`, () => { const actual = fn(context, { ...args, - shape: GaugeShapes.ARC, + shape: GaugeShapes.SEMI_CIRCLE, centralMajor: 'Some label', centralMajorMode: GaugeCentralMajorModes.CUSTOM, }); expect(actual).toMatchSnapshot(); }); - it(`throws error if centralMajor or centralMajorMode are provided for the horizontalBullet shape`, () => { - const actual = () => - fn(context, { - ...args, - centralMajor: 'Some label', - centralMajorMode: GaugeCentralMajorModes.CUSTOM, - }); - expect(actual).toThrowErrorMatchingSnapshot(); - }); - - it(`throws error if centralMajor or centralMajorMode are provided for the vertical shape`, () => { - const actual = () => - fn(context, { - ...args, - shape: GaugeShapes.VERTICAL_BULLET, - centralMajor: 'Some label', - centralMajorMode: GaugeCentralMajorModes.CUSTOM, - }); - expect(actual).toThrowErrorMatchingSnapshot(); - }); - it('logs correct datatable to inspector', async () => { let loggedTable: Datatable; const handlers = { diff --git a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.ts b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.ts index 0346cef6b4ef2..fc811a899786c 100644 --- a/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.ts +++ b/src/plugins/chart_expressions/expression_gauge/common/expression_functions/gauge_function.ts @@ -11,22 +11,11 @@ import { prepareLogTable, validateAccessor } from '@kbn/visualizations-plugin/co import { GaugeExpressionFunctionDefinition, GaugeRenderProps } from '../types'; import { EXPRESSION_GAUGE_NAME, - GaugeCentralMajorModes, GaugeColorModes, GaugeLabelMajorModes, GaugeShapes, GaugeTicksPositions, } from '../constants'; -import { isRoundShape } from '../utils'; - -export const errors = { - centralMajorNotSupportedForShapeError: (shape: string) => - i18n.translate('expressionGauge.functions.gauge.errors.centralMajorNotSupportedForShapeError', { - defaultMessage: - 'Fields "centralMajor" and "centralMajorMode" are not supported by the shape "{shape}"', - values: { shape }, - }), -}; const strings = { getMetricHelp: () => @@ -60,6 +49,7 @@ export const gaugeFunction = (): GaugeExpressionFunctionDefinition => ({ options: [ GaugeShapes.HORIZONTAL_BULLET, GaugeShapes.VERTICAL_BULLET, + GaugeShapes.SEMI_CIRCLE, GaugeShapes.ARC, GaugeShapes.CIRCLE, ], @@ -139,12 +129,14 @@ export const gaugeFunction = (): GaugeExpressionFunctionDefinition => ({ }), }, centralMajor: { + deprecated: true, types: ['string'], help: i18n.translate('expressionGauge.functions.gauge.args.centralMajor.help', { defaultMessage: 'Specifies the centralMajor of the gauge chart displayed inside the chart.', }), }, centralMajorMode: { + deprecated: true, types: ['string'], options: [GaugeLabelMajorModes.NONE, GaugeLabelMajorModes.AUTO, GaugeLabelMajorModes.CUSTOM], help: i18n.translate('expressionGauge.functions.gauge.args.centralMajorMode.help', { @@ -152,8 +144,8 @@ export const gaugeFunction = (): GaugeExpressionFunctionDefinition => ({ }), strict: true, }, - // used only in legacy gauge, consider it as @deprecated percentageMode: { + deprecated: true, // used only in legacy gauge, consider it as @deprecated types: ['boolean'], default: false, help: i18n.translate('expressionGauge.functions.gauge.percentageMode.help', { @@ -186,12 +178,7 @@ export const gaugeFunction = (): GaugeExpressionFunctionDefinition => ({ validateAccessor(args.max, data.columns); validateAccessor(args.goal, data.columns); - const { centralMajor, centralMajorMode, ...restArgs } = args; - const { metric, min, max, goal } = restArgs; - - if (!isRoundShape(args.shape) && (centralMajorMode || centralMajor)) { - throw new Error(errors.centralMajorNotSupportedForShapeError(args.shape)); - } + const { metric, min, max, goal } = args; if (handlers?.inspectorAdapters?.tables) { handlers.inspectorAdapters.tables.reset(); @@ -211,21 +198,13 @@ export const gaugeFunction = (): GaugeExpressionFunctionDefinition => ({ handlers.inspectorAdapters.tables.logDatatable('default', logTable); } - const centralMajorArgs = isRoundShape(args.shape) - ? { - centralMajorMode: !centralMajorMode ? GaugeCentralMajorModes.AUTO : centralMajorMode, - centralMajor, - } - : {}; - return { type: 'render', as: EXPRESSION_GAUGE_NAME, value: { data, args: { - ...restArgs, - ...centralMajorArgs, + ...args, ariaLabel: args.ariaLabel ?? (handlers.variables?.embeddableTitle as string) ?? diff --git a/src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts b/src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts index b354c176f7e0c..cd9ac1fbd741a 100644 --- a/src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts +++ b/src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts @@ -41,19 +41,27 @@ export interface GaugeState { labelMajorMode: GaugeLabelMajorMode; labelMajor?: string; labelMinor?: string; - centralMajorMode?: GaugeCentralMajorMode; - centralMajor?: string; colorMode?: GaugeColorMode; palette?: PaletteOutput; shape: GaugeShape; - /** @deprecated This field is deprecated and going to be removed in the futher release versions. */ - percentageMode?: boolean; respectRanges?: boolean; commonLabel?: string; + /** + * @deprecated Use `labelMajorMode` instead + */ + centralMajorMode?: GaugeCentralMajorMode; + /** + * @deprecated Use `labelMajor` instead + */ + centralMajor?: string; + /** + * This field is deprecated and will be removed in a future release + * @deprecated + */ + percentageMode?: boolean; } export type GaugeArguments = GaugeState & { - shape: GaugeShape; colorMode: GaugeColorMode; palette?: PaletteOutput; ariaLabel?: string; diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap index fee45e99d9f85..662bdc02805b0 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap @@ -546,28 +546,41 @@ exports[`GaugeComponent renders the chart 1`] = ` ] } /> - `; diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.test.tsx b/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.test.tsx index 47b9a94675583..ca21711d9bfb7 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.test.tsx +++ b/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.test.tsx @@ -21,7 +21,14 @@ import { GaugeColorModes, } from '../../common'; import GaugeComponent from './gauge_component'; -import { Chart, Goal, Settings } from '@elastic/charts'; +import { + Chart, + Bullet, + Settings, + BulletProps, + ColorBandSimpleConfig, + Color, +} from '@elastic/charts'; jest.mock('@elastic/charts', () => { const original = jest.requireActual('@elastic/charts'); @@ -166,8 +173,9 @@ describe('GaugeComponent', function () { }, data: createData({ 'metric-accessor': 12, 'min-accessor': 0, 'max-accessor': 10 }), } as GaugeRenderProps; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('actual')).toEqual(10); + const bullet = shallowWithIntl().find(Bullet); + const datum = bullet.prop('data')[0]?.[0]; + expect(datum?.value).toEqual(12); }); describe('labelMajor and labelMinor settings', () => { @@ -180,9 +188,10 @@ describe('GaugeComponent', function () { labelMinor: '', }, }; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('labelMajor')).toEqual(''); - expect(goal.prop('labelMinor')).toEqual(''); + const bullet = shallowWithIntl().find(Bullet); + const datum = bullet.prop('data')[0]?.[0]; + expect(datum?.title).toEqual(''); + expect(datum?.subtitle).toEqual(''); }); it('displays custom labelMajor and labelMinor when passed', () => { const customProps = { @@ -194,9 +203,10 @@ describe('GaugeComponent', function () { labelMinor: 'custom labelMinor', }, }; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('labelMajor')).toEqual('custom labelMajor '); - expect(goal.prop('labelMinor')).toEqual('custom labelMinor '); + const bullet = shallowWithIntl().find(Bullet); + const datum = bullet.prop('data')[0]?.[0]; + expect(datum?.title).toEqual('custom labelMajor'); + expect(datum?.subtitle).toEqual('custom labelMinor'); }); it('displays auto labelMajor', () => { const customProps = { @@ -207,8 +217,9 @@ describe('GaugeComponent', function () { labelMajor: '', }, }; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('labelMajor')).toEqual('Count of records '); + const bullet = shallowWithIntl().find(Bullet); + const datum = bullet.prop('data')[0]?.[0]; + expect(datum?.title).toEqual('Count of records'); }); }); @@ -237,9 +248,11 @@ describe('GaugeComponent', function () { ticksPosition: GaugeTicksPositions.BANDS, }, } as GaugeRenderProps; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('ticks')).toEqual([0, 1, 2, 3, 4, 10]); - expect(goal.prop('bands')).toEqual([0, 1, 2, 3, 4, 10]); + const bullet = shallowWithIntl().find(Bullet); + const datum = bullet.prop('data')[0]?.[0]; + expect((datum?.ticks as () => number[])?.()).toEqual([0, 1, 2, 3, 4, 10]); + const colorBands = bullet.prop('colorBands'); + expect(colorBands).toEqual(['#D3DAE6', '#D3DAE6']); }); it('sets proper color bands if palette steps are smaller than minimum', () => { const palette = { @@ -265,8 +278,9 @@ describe('GaugeComponent', function () { ticksPosition: GaugeTicksPositions.BANDS, }, } as GaugeRenderProps; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('bands')).toEqual([0, 4, 10]); + const bullet = shallowWithIntl().find(Bullet); + const colorBands = bullet.prop('colorBands'); + expect(colorBands).toEqual(['#D3DAE6', '#D3DAE6']); }); it('sets proper color bands if percent palette steps are smaller than 0', () => { const palette = { @@ -292,8 +306,9 @@ describe('GaugeComponent', function () { ticksPosition: GaugeTicksPositions.BANDS, }, } as GaugeRenderProps; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('bands')).toEqual([0, 8, 10]); + const bullet = shallowWithIntl().find(Bullet); + const colorBands = bullet.prop('colorBands'); + expect(colorBands).toEqual(['#D3DAE6', '#D3DAE6']); }); it('doesnt set bands for values differing <10%', () => { const palette = { @@ -319,8 +334,9 @@ describe('GaugeComponent', function () { ticksPosition: GaugeTicksPositions.BANDS, }, } as GaugeRenderProps; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('bands')).toEqual([0, 1, 1.5, 3, 10]); + const bullet = shallowWithIntl().find(Bullet); + const colorBands = bullet.prop('colorBands'); + expect(colorBands).toEqual(['#D3DAE6', '#D3DAE6']); }); it('sets proper color bands for values greater than maximum', () => { const palette = { @@ -346,8 +362,9 @@ describe('GaugeComponent', function () { ticksPosition: GaugeTicksPositions.BANDS, }, } as GaugeRenderProps; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('bands')).toEqual([0, 10]); + const bullet = shallowWithIntl().find(Bullet); + const colorBands = bullet.prop('colorBands'); + expect(colorBands).toEqual(['#D3DAE6', '#D3DAE6']); }); it('passes number bands from color palette with no stops defined', () => { const palette = { @@ -374,8 +391,10 @@ describe('GaugeComponent', function () { max: 'max-accessor', }, } as GaugeRenderProps; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('bands')).toEqual([0, 5, 10]); + const bullet = shallowWithIntl().find(Bullet); + const colorBands = bullet.prop('colorBands'); + expect(colorBands?.steps).toEqual([0, 5, 10]); + expect(colorBands?.colors).toEqual(['rgba(255,255,255,0)', 'rgba(255,255,255,0)']); }); it('passes percent bands from color palette', () => { const palette = { @@ -402,8 +421,10 @@ describe('GaugeComponent', function () { max: 'max-accessor', }, } as GaugeRenderProps; - const goal = shallowWithIntl().find(Goal); - expect(goal.prop('bands')).toEqual([0, 2, 6, 8, 10]); + const bullet = shallowWithIntl().find(Bullet); + const colorBands = bullet.prop('colorBands'); + expect(colorBands?.steps).toEqual([0, 2, 6, 8, 10]); + expect(colorBands?.colors).toEqual(['blue', 'blue', 'blue', 'blue']); }); }); diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.tsx b/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.tsx index 94dd091cb8e00..714ac6f3e057e 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.tsx +++ b/src/plugins/chart_expressions/expression_gauge/public/components/gauge_component.tsx @@ -5,22 +5,22 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import React, { FC, memo, useCallback, useEffect } from 'react'; -import { Chart, Goal, Settings } from '@elastic/charts'; +import React, { FC, useCallback } from 'react'; +import { Chart, Bullet, BulletProps, Settings } from '@elastic/charts'; +import { useEuiTheme } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import type { PaletteOutput } from '@kbn/coloring'; import { FieldFormat } from '@kbn/field-formats-plugin/common'; import type { CustomPaletteState } from '@kbn/charts-plugin/public'; import { EmptyPlaceholder } from '@kbn/charts-plugin/public'; -import { type ChartSizeSpec, getOverridesFor } from '@kbn/chart-expressions-common'; -import { isVisDimension } from '@kbn/visualizations-plugin/common/utils'; +import { getOverridesFor } from '@kbn/chart-expressions-common'; +import { findAccessor, isVisDimension } from '@kbn/visualizations-plugin/common/utils'; import { i18n } from '@kbn/i18n'; import { GaugeRenderProps, GaugeLabelMajorMode, GaugeLabelMajorModes, GaugeColorModes, - GaugeShapes, GaugeTicksPositions, } from '../../common'; import { @@ -29,15 +29,14 @@ import { getMinValue, getValueFromAccessor, getSubtypeByGaugeType, - getGoalConfig, computeMinMax, } from './utils'; -import { getIcons } from './utils/icons'; +import { getGaugeIconByType } from './utils/icons'; import './index.scss'; import { GaugeCentralMajorMode, GaugeTicksPosition } from '../../common/types'; -import { isBulletShape, isRoundShape } from '../../common/utils'; import './gauge.scss'; +import { useGaugeSizeByType } from './utils/use_gauge_size_by_type'; declare global { interface Window { @@ -153,12 +152,7 @@ function getTicksLabels(baseStops: number[]) { }); } -function getTicks( - ticksPosition: GaugeTicksPosition, - range: [number, number], - colorBands?: number[], - percentageMode?: boolean -) { +function getTicks(ticksPosition: GaugeTicksPosition, colorBands?: number[]) { if (ticksPosition === GaugeTicksPositions.HIDDEN) { return []; } @@ -168,272 +162,254 @@ function getTicks( } } -export const GaugeComponent: FC = memo( - ({ - data, - args, - uiState, - formatFactory, - paletteService, - chartsThemeService, - renderComplete, - overrides, - setChartSize, - }) => { - const { - shape: gaugeType, - palette, - colorMode, - labelMinor, - labelMajor, - labelMajorMode, - centralMajor, - centralMajorMode, - ticksPosition, - commonLabel, - } = args; - - const chartBaseTheme = chartsThemeService.useChartsBaseTheme(); - - const getColor = useCallback( - ( - value, - paletteConfig: PaletteOutput, - bands: number[], - percentageMode?: boolean - ) => { - let stops = paletteConfig.params?.stops ?? []; - - if (percentageMode) { - stops = bands.map((v) => v * 100); +export const GaugeComponent: FC = ({ + data, + args, + uiState, + formatFactory, + paletteService, + chartsThemeService, + renderComplete, + overrides, + setChartSize, +}) => { + const { + shape: gaugeType, + palette, + colorMode, + labelMinor, + labelMajor, + labelMajorMode, + ticksPosition, + commonLabel, + } = args; + + const { euiTheme } = useEuiTheme(); + const chartBaseTheme = chartsThemeService.useChartsBaseTheme(); + useGaugeSizeByType(gaugeType, setChartSize); + + const getColor = useCallback( + ( + value, + paletteConfig: PaletteOutput, + bands: number[], + percentageMode?: boolean + ) => { + const stops = percentageMode ? bands.map((v) => v * 100) : paletteConfig.params?.stops ?? []; + + return paletteService + .get(paletteConfig?.name ?? 'custom') + .getColorForValue?.( + value, + { ...paletteConfig.params, stops }, + computeMinMax(paletteConfig, bands) + ); + }, + [paletteService] + ); + + // Legacy chart was not formatting numbers, when was forming overrideColors. + // To support the behavior of the color overriding, it is required to skip all the formatting, except percent. + const overrideColor = useCallback( + (value: number, bands: number[], formatter?: FieldFormat) => { + const overrideColors = uiState?.get('vis.colors') ?? {}; + const valueIndex = bands.findIndex((band, index, allBands) => { + if (index === allBands.length - 1) { + return false; } - const { min, max } = computeMinMax(paletteConfig, bands); - - return paletteService - .get(paletteConfig?.name ?? 'custom') - .getColorForValue?.(value, { ...paletteConfig.params, stops }, { min, max }); - }, - [paletteService] - ); - - // Legacy chart was not formatting numbers, when was forming overrideColors. - // To support the behavior of the color overriding, it is required to skip all the formatting, except percent. - const overrideColor = useCallback( - (value: number, bands: number[], formatter?: FieldFormat) => { - const overrideColors = uiState?.get('vis.colors') ?? {}; - const valueIndex = bands.findIndex((band, index, allBands) => { - if (index === allBands.length - 1) { - return false; - } - - return value >= band && value < allBands[index + 1]; - }); - - if (valueIndex < 0 || valueIndex === bands.length - 1) { - return undefined; - } - const curValue = bands[valueIndex]; - const nextValue = bands[valueIndex + 1]; - - return overrideColors[ - `${formatter?.convert(curValue) ?? curValue} - ${ - formatter?.convert(nextValue) ?? nextValue - }` - ]; - }, - [uiState] - ); + return value >= band && value < allBands[index + 1]; + }); + + if (valueIndex < 0 || valueIndex === bands.length - 1) { + return undefined; + } + const curValue = bands[valueIndex]; + const nextValue = bands[valueIndex + 1]; + + return overrideColors[ + `${formatter?.convert(curValue) ?? curValue} - ${ + formatter?.convert(nextValue) ?? nextValue + }` + ]; + }, + [uiState] + ); + + const onRenderChange = useCallback( + (isRendered: boolean = true) => { + if (isRendered) { + renderComplete(); + } + }, + [renderComplete] + ); + + const accessors = getAccessorsFromArgs(args, data.columns); + const metricAccessor = accessors?.metric; + + if (!metricAccessor) { + // Chart is not ready + return null; + } - const onRenderChange = useCallback( - (isRendered: boolean = true) => { - if (isRendered) { - renderComplete(); - } - }, - [renderComplete] - ); + const metricColumn = data.columns.find((col) => col.id === metricAccessor); - useEffect(() => { - const chartSizeSpec: ChartSizeSpec = { - maxDimensions: { - ...(gaugeType === GaugeShapes.HORIZONTAL_BULLET - ? { - x: { value: 600, unit: 'pixels' }, - y: { value: 300, unit: 'pixels' }, - } - : { - y: { value: 600, unit: 'pixels' }, - x: { value: 300, unit: 'pixels' }, - }), - }, - }; + const chartData = data.rows.filter( + (v) => typeof v[metricAccessor] === 'number' || Array.isArray(v[metricAccessor]) + ); + const row = chartData?.[0]; - setChartSize(chartSizeSpec); - }, [gaugeType, setChartSize]); + const metricValue = args.metric ? getValueFromAccessor(metricAccessor, row) : undefined; + const metricName = findAccessor(metricAccessor, data.columns)?.name; - const table = data; - const accessors = getAccessorsFromArgs(args, table.columns); + const icon = getGaugeIconByType(gaugeType); - if (!accessors || !accessors.metric) { - // Chart is not ready - return null; - } + if (typeof metricValue !== 'number') { + return ; + } - const metricColumn = table.columns.find((col) => col.id === accessors.metric); + const goal = accessors.goal ? getValueFromAccessor(accessors.goal, row) : undefined; + const min = getMinValue(row, accessors, palette?.params, args.respectRanges); + const max = getMaxValue(row, accessors, palette?.params, args.respectRanges); - const chartData = table.rows.filter( - (v) => typeof v[accessors.metric!] === 'number' || Array.isArray(v[accessors.metric!]) + if (min === max) { + return ( + + } + renderComplete={onRenderChange} + /> ); - const row = chartData?.[0]; - - const metricValue = args.metric ? getValueFromAccessor(accessors.metric, row) : undefined; - - const icon = getIcons(gaugeType); + } - if (typeof metricValue !== 'number') { - return ; - } + if (min > max) { + return ( + + } + renderComplete={onRenderChange} + /> + ); + } + const customMetricFormatParams = isVisDimension(args.metric) ? args.metric.format : undefined; + const tableMetricFormatParams = metricColumn?.meta?.params?.params + ? metricColumn?.meta?.params + : undefined; + + const defaultMetricFormatParams = { + id: 'number', + params: { + pattern: max - min > 5 ? `0,0` : `0,0.0`, + }, + }; + + const tickFormatter = formatFactory( + customMetricFormatParams ?? tableMetricFormatParams ?? defaultMetricFormatParams + ); + + let bands: number[] = (palette?.params as CustomPaletteState) + ? normalizeBands(palette?.params as CustomPaletteState, { min, max }) + : [min, max]; + let actualValue = metricValue; + + if (args.percentageMode && palette?.params && palette?.params.stops?.length) { + bands = normalizeBandsLegacy(palette?.params as CustomPaletteState, actualValue); + actualValue = actualValueToPercentsLegacy(palette?.params as CustomPaletteState, actualValue); + } - const goal = accessors.goal ? getValueFromAccessor(accessors.goal, row) : undefined; - const min = getMinValue(row, accessors, palette?.params, args.respectRanges); - const max = getMaxValue(row, accessors, palette?.params, args.respectRanges); - - if (min === max) { - return ( - - } - renderComplete={onRenderChange} - /> - ); - } + const ticks = getTicks(ticksPosition, bands); + const labelMajorTitle = getTitle(labelMajorMode, labelMajor, metricColumn?.name); - if (min > max) { - return ( - - } - renderComplete={onRenderChange} - /> - ); - } - const customMetricFormatParams = isVisDimension(args.metric) ? args.metric.format : undefined; - const tableMetricFormatParams = metricColumn?.meta?.params?.params - ? metricColumn?.meta?.params - : undefined; - - const defaultMetricFormatParams = { - id: 'number', - params: { - pattern: max - min > 5 ? `0,0` : `0,0.0`, - }, - }; + const colorFn = (val: number) => { + const value = getPreviousSectionValue(val, bands); - const tickFormatter = formatFactory( - customMetricFormatParams ?? tableMetricFormatParams ?? defaultMetricFormatParams + const overridedColor = overrideColor( + value, + args.percentageMode ? bands : args.palette?.params?.stops ?? [], + args.percentageMode ? tickFormatter : undefined ); - let bands: number[] = (palette?.params as CustomPaletteState) - ? normalizeBands(palette?.params as CustomPaletteState, { min, max }) - : [min, max]; - - // TODO: format in charts - let actualValue = Math.round(Math.min(Math.max(metricValue, min), max) * 1000) / 1000; - - if (args.percentageMode && palette?.params && palette?.params.stops?.length) { - bands = normalizeBandsLegacy(palette?.params as CustomPaletteState, actualValue); - actualValue = actualValueToPercentsLegacy(palette?.params as CustomPaletteState, actualValue); + if (overridedColor) { + return overridedColor; } - const totalTicks = getTicks(ticksPosition, [min, max], bands, args.percentageMode); - const ticks = - totalTicks && gaugeType === GaugeShapes.CIRCLE - ? totalTicks.slice(0, totalTicks.length - 1) - : totalTicks; - - const goalConfig = getGoalConfig(gaugeType); - - const labelMajorTitle = getTitle(labelMajorMode, labelMajor, metricColumn?.name); - - // added extra space for nice rendering - const majorExtraSpaces = isBulletShape(gaugeType) ? ' ' : ''; - const minorExtraSpaces = isBulletShape(gaugeType) ? ' ' : ''; - - const extraTitles = isRoundShape(gaugeType) - ? { - centralMinor: tickFormatter.convert(actualValue), - centralMajor: getTitle(centralMajorMode, centralMajor, metricColumn?.name), - } - : {}; - - return ( -
- - } - debugState={window._echDebugStateFlag ?? false} - theme={[{ background: { color: 'transparent' } }]} - baseTheme={chartBaseTheme} - ariaLabel={args.ariaLabel} - ariaUseDefaultSummary={!args.ariaLabel} - onRenderChange={onRenderChange} - locale={i18n.getLocale()} - {...getOverridesFor(overrides, 'settings')} - /> - = bands[0] && goal <= bands[bands.length - 1] ? goal : undefined} - actual={actualValue} - tickValueFormatter={({ value: tickValue }) => tickFormatter.convert(tickValue)} - tooltipValueFormatter={(tooltipValue) => tickFormatter.convert(tooltipValue)} - bands={bands} - ticks={ticks} - domain={{ min, max }} - bandFillColor={ - colorMode === GaugeColorModes.PALETTE - ? (val) => { - const value = getPreviousSectionValue(val.value, bands); - - const overridedColor = overrideColor( - value, - args.percentageMode ? bands : args.palette?.params?.stops ?? [], - args.percentageMode ? tickFormatter : undefined - ); - - if (overridedColor) { - return overridedColor; - } - return args.palette - ? getColor(value, args.palette, bands, args.percentageMode) ?? TRANSPARENT - : TRANSPARENT; - } - : () => TRANSPARENT - } - labelMajor={labelMajorTitle ? `${labelMajorTitle}${majorExtraSpaces}` : labelMajorTitle} - labelMinor={labelMinor ? `${labelMinor}${minorExtraSpaces}` : ''} - {...extraTitles} - {...goalConfig} - {...getOverridesFor(overrides, 'gauge')} - /> - - {commonLabel &&
{commonLabel}
} -
- ); - } -); + return args.palette + ? getColor(value, args.palette, bands, args.percentageMode) ?? TRANSPARENT + : TRANSPARENT; + }; + const getColorConfig = (): BulletProps['colorBands'] => { + if (colorMode === GaugeColorModes.NONE) + return [euiTheme.colors.lightShade, euiTheme.colors.lightShade]; + + return { + steps: bands, + colors: bands.map((b) => colorFn(b)).slice(1), + }; + }; + + return ( +
+ + } + debugState={window._echDebugStateFlag ?? false} + theme={[{ background: { color: 'transparent' } }]} + baseTheme={chartBaseTheme} + ariaLabel={args.ariaLabel} + ariaUseDefaultSummary={!args.ariaLabel} + onRenderChange={onRenderChange} + locale={i18n.getLocale()} + {...getOverridesFor(overrides, 'settings')} + /> + = bands[0] && goal <= bands[bands.length - 1] ? goal : undefined, + value: actualValue, + title: labelMajorTitle, + subtitle: labelMinor, + domain: [min, max], + ticks: ticks ? () => ticks : undefined, + valueFormatter: (tickValue) => tickFormatter.convert(tickValue), + tickFormatter: (tickValue) => tickFormatter.convert(tickValue), + }, + ], + ]} + /> + + {commonLabel &&
{commonLabel}
} +
+ ); +}; // default export required for React.Lazy // eslint-disable-next-line import/no-default-export diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/index.scss b/src/plugins/chart_expressions/expression_gauge/public/components/index.scss index 22a1e4318b5e5..fb7addf29ae55 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/index.scss +++ b/src/plugins/chart_expressions/expression_gauge/public/components/index.scss @@ -6,5 +6,4 @@ // with a visible glitch. This make the chart library resilient to this extra reflow overflow: hidden; user-select: text; - padding: $euiSizeS; } diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/utils/gauge_types.ts b/src/plugins/chart_expressions/expression_gauge/public/components/utils/gauge_types.ts index f3fd0bec250f9..c859a59f8b326 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/utils/gauge_types.ts +++ b/src/plugins/chart_expressions/expression_gauge/public/components/utils/gauge_types.ts @@ -6,15 +6,16 @@ * Side Public License, v 1. */ -import { GoalProps } from '@elastic/charts'; +import { BulletProps, BulletSubtype } from '@elastic/charts'; import { GaugeShape, GaugeShapes } from '../../../common'; -export const getSubtypeByGaugeType = (type: GaugeShape): GoalProps['subtype'] => +export const getSubtypeByGaugeType = (type: GaugeShape): BulletProps['subtype'] => (( { - [GaugeShapes.HORIZONTAL_BULLET]: 'horizontalBullet', - [GaugeShapes.VERTICAL_BULLET]: 'verticalBullet', - [GaugeShapes.ARC]: 'goal', - [GaugeShapes.CIRCLE]: 'goal', + [GaugeShapes.HORIZONTAL_BULLET]: BulletSubtype.horizontal, + [GaugeShapes.VERTICAL_BULLET]: BulletSubtype.vertical, + [GaugeShapes.SEMI_CIRCLE]: BulletSubtype.halfCircle, + [GaugeShapes.ARC]: BulletSubtype.twoThirdsCircle, + [GaugeShapes.CIRCLE]: BulletSubtype.circle, } as const )[type]); diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/utils/goal_config.ts b/src/plugins/chart_expressions/expression_gauge/public/components/utils/goal_config.ts deleted file mode 100644 index bba9f0d5b489b..0000000000000 --- a/src/plugins/chart_expressions/expression_gauge/public/components/utils/goal_config.ts +++ /dev/null @@ -1,29 +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 { GoalProps } from '@elastic/charts'; -import { GaugeShape, GaugeShapes } from '../../../common'; - -const getCicleConfig = () => ({ - angleStart: Math.PI / 2, - angleEnd: -(Math.PI + Math.PI / 2), -}); - -const getArcConfig = () => ({ - angleStart: Math.PI + (Math.PI - (2 * Math.PI) / 2.5) / 2, - angleEnd: -(Math.PI - (2 * Math.PI) / 2.5) / 2, -}); - -const empty = () => ({}); - -export const getGoalConfig = (type: GaugeShape): Partial => - ({ - [GaugeShapes.HORIZONTAL_BULLET]: empty, - [GaugeShapes.VERTICAL_BULLET]: empty, - [GaugeShapes.ARC]: getArcConfig, - [GaugeShapes.CIRCLE]: getCicleConfig, - }[type]()); diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/utils/icons.ts b/src/plugins/chart_expressions/expression_gauge/public/components/utils/icons.ts index 33d8427892392..341e528cb1521 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/utils/icons.ts +++ b/src/plugins/chart_expressions/expression_gauge/public/components/utils/icons.ts @@ -6,13 +6,20 @@ * Side Public License, v 1. */ -import { IconChartHorizontalBullet, IconChartVerticalBullet } from '@kbn/chart-icons'; +import { + IconChartHorizontalBullet, + IconChartVerticalBullet, + IconChartGaugeSemiCircle, + IconChartGaugeArc, + IconChartGaugeCircle, +} from '@kbn/chart-icons'; import { GaugeShape, GaugeShapes } from '../../../common'; -export const getIcons = (type: GaugeShape) => +export const getGaugeIconByType = (type: GaugeShape) => ({ [GaugeShapes.HORIZONTAL_BULLET]: IconChartHorizontalBullet, [GaugeShapes.VERTICAL_BULLET]: IconChartVerticalBullet, - [GaugeShapes.ARC]: 'visGoal', - [GaugeShapes.CIRCLE]: 'visGoal', + [GaugeShapes.SEMI_CIRCLE]: IconChartGaugeSemiCircle, + [GaugeShapes.ARC]: IconChartGaugeArc, + [GaugeShapes.CIRCLE]: IconChartGaugeCircle, }[type]); diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/utils/index.ts b/src/plugins/chart_expressions/expression_gauge/public/components/utils/index.ts index 639c2a7821b55..c003664a793dd 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/utils/index.ts +++ b/src/plugins/chart_expressions/expression_gauge/public/components/utils/index.ts @@ -8,6 +8,5 @@ export * from './accessors'; export * from './gauge_types'; -export * from './goal_config'; export { computeMinMax } from './helpers'; diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/utils/use_gauge_size_by_type.ts b/src/plugins/chart_expressions/expression_gauge/public/components/utils/use_gauge_size_by_type.ts new file mode 100644 index 0000000000000..cc596a5b32dd0 --- /dev/null +++ b/src/plugins/chart_expressions/expression_gauge/public/components/utils/use_gauge_size_by_type.ts @@ -0,0 +1,62 @@ +/* + * 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 { useEffect } from 'react'; +import { ChartSizeSpec } from '@kbn/chart-expressions-common'; +import { GaugeShape, GaugeShapes } from '../../../common'; + +export const useGaugeSizeByType = (type: GaugeShape, setChartSize: (d: ChartSizeSpec) => void) => { + useEffect(() => { + const maxDimensions: Record = { + [GaugeShapes.SEMI_CIRCLE]: { + maxDimensions: { + x: { value: 600, unit: 'pixels' }, + y: { value: 600, unit: 'pixels' }, + }, + aspectRatio: { + x: 2, + y: 1.25, + }, + }, + [GaugeShapes.ARC]: { + maxDimensions: { + x: { value: 600, unit: 'pixels' }, + y: { value: 600, unit: 'pixels' }, + }, + aspectRatio: { + x: 1.1, + y: 1, + }, + }, + [GaugeShapes.CIRCLE]: { + maxDimensions: { + x: { value: 600, unit: 'pixels' }, + y: { value: 600, unit: 'pixels' }, + }, + aspectRatio: { + x: 1, + y: 1, + }, + }, + [GaugeShapes.HORIZONTAL_BULLET]: { + maxDimensions: { + x: { value: 600, unit: 'pixels' }, + y: { value: 200, unit: 'pixels' }, + }, + }, + [GaugeShapes.VERTICAL_BULLET]: { + maxDimensions: { + x: { value: 400, unit: 'pixels' }, + y: { value: 600, unit: 'pixels' }, + }, + }, + }; + + setChartSize(maxDimensions[type]); + }, [type, setChartSize]); +}; diff --git a/src/plugins/chart_expressions/expression_gauge/public/expression_renderers/gauge_renderer.tsx b/src/plugins/chart_expressions/expression_gauge/public/expression_renderers/gauge_renderer.tsx index 74c3d8bb52737..e25dfbfcd945c 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/expression_renderers/gauge_renderer.tsx +++ b/src/plugins/chart_expressions/expression_gauge/public/expression_renderers/gauge_renderer.tsx @@ -51,6 +51,15 @@ export const gaugeRenderer: ( case GaugeShapes.VERTICAL_BULLET: type = `${EXPRESSION_GAUGE_NAME}_vertical`; break; + case GaugeShapes.SEMI_CIRCLE: + type = `${EXPRESSION_GAUGE_NAME}_semi_circle`; + break; + case GaugeShapes.ARC: + type = `${EXPRESSION_GAUGE_NAME}_arc`; + break; + case GaugeShapes.CIRCLE: + type = `${EXPRESSION_GAUGE_NAME}_circle`; + break; default: type = EXPRESSION_GAUGE_NAME; } 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 { - const testEmbeddableFactory: ReactEmbeddableFactory = { - type: 'test', - deserializeState: jest.fn(), - buildEmbeddable: jest.fn(), - }; + const getTestEmbeddableFactory = () => + Promise.resolve({ + type: 'test', + deserializeState: jest.fn(), + buildEmbeddable: jest.fn(), + } as ReactEmbeddableFactory); it('throws an error if requested embeddable factory type is not registered', () => { - expect(() => getReactEmbeddableFactory('notRegistered')).toThrowErrorMatchingInlineSnapshot( - `"No embeddable factory found for type: notRegistered"` + expect(() => getReactEmbeddableFactory('notRegistered')).rejects.toThrow( + 'No embeddable factory found for type: notRegistered' ); }); it('can register and get an embeddable factory', () => { - registerReactEmbeddableFactory(testEmbeddableFactory); - expect(getReactEmbeddableFactory('test')).toBe(testEmbeddableFactory); + const returnedFactory = getTestEmbeddableFactory(); + registerReactEmbeddableFactory('test', getTestEmbeddableFactory); + expect(getReactEmbeddableFactory('test')).toEqual(returnedFactory); }); it('can check if a factory is registered', () => { diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts index 964cba236e31b..481be8b5b5bb8 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts @@ -9,32 +9,40 @@ import { i18n } from '@kbn/i18n'; import { DefaultEmbeddableApi, ReactEmbeddableFactory } from './types'; -const registry: { [key: string]: ReactEmbeddableFactory } = {}; +const registry: { [key: string]: () => Promise> } = {}; +/** + * Registers a new React embeddable factory. This should be called at plugin start time. + * + * @param type The key to register the factory under. This should be the same as the `type` key in the factory definition. + * @param getFactory an async function that gets the factory definition for this key. This should always async import the + * actual factory definition file to avoid polluting page load. + */ export const registerReactEmbeddableFactory = < StateType extends object = object, APIType extends DefaultEmbeddableApi = DefaultEmbeddableApi >( - factory: ReactEmbeddableFactory + type: string, + getFactory: () => Promise> ) => { - if (registry[factory.type] !== undefined) + if (registry[type] !== undefined) throw new Error( i18n.translate('embeddableApi.reactEmbeddable.factoryAlreadyExistsError', { defaultMessage: 'An embeddable factory for for type: {key} is already registered.', - values: { key: factory.type }, + values: { key: type }, }) ); - registry[factory.type] = factory; + registry[type] = getFactory; }; export const reactEmbeddableRegistryHasKey = (key: string) => registry[key] !== undefined; -export const getReactEmbeddableFactory = < +export const getReactEmbeddableFactory = async < StateType extends object = object, ApiType extends DefaultEmbeddableApi = DefaultEmbeddableApi >( key: string -): ReactEmbeddableFactory => { +): Promise> => { if (registry[key] === undefined) throw new Error( i18n.translate('embeddableApi.reactEmbeddable.factoryNotFoundError', { @@ -42,5 +50,5 @@ export const getReactEmbeddableFactory = < values: { key }, }) ); - return registry[key]; + return registry[key](); }; diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx index 883854f65863f..368cdcf0957c1 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx @@ -6,6 +6,7 @@ * Side Public License, v 1. */ import { getMockPresentationContainer } from '@kbn/presentation-containers/mocks'; +import { setStubKibanaServices as setupPresentationPanelServices } from '@kbn/presentation-panel-plugin/public/mocks'; import { render, waitFor, screen } from '@testing-library/react'; import React from 'react'; @@ -35,7 +36,7 @@ describe('react embeddable renderer', () => { ); return { Component: () => ( -
+
SUPER TEST COMPONENT, name: {state.name} bork: {state.bork}
), @@ -44,29 +45,38 @@ describe('react embeddable renderer', () => { }, }; + const getTestEmbeddableFactory = async () => { + return testEmbeddableFactory; + }; + beforeAll(() => { - registerReactEmbeddableFactory(testEmbeddableFactory); + registerReactEmbeddableFactory('test', getTestEmbeddableFactory); + setupPresentationPanelServices(); }); - it('deserializes given state', () => { + it('deserializes given state', async () => { render(); - expect(testEmbeddableFactory.deserializeState).toHaveBeenCalledWith({ - rawState: { bork: 'blorp?' }, + await waitFor(() => { + expect(testEmbeddableFactory.deserializeState).toHaveBeenCalledWith({ + rawState: { bork: 'blorp?' }, + }); }); }); - it('builds the embeddable', () => { + it('builds the embeddable', async () => { const buildEmbeddableSpy = jest.spyOn(testEmbeddableFactory, 'buildEmbeddable'); render(); - expect(buildEmbeddableSpy).toHaveBeenCalledWith( - { bork: 'blorp?' }, - expect.any(Function), - expect.any(String), - undefined - ); + await waitFor(() => { + expect(buildEmbeddableSpy).toHaveBeenCalledWith( + { bork: 'blorp?' }, + expect.any(Function), + expect.any(String), + undefined + ); + }); }); - it('builds the embeddable, providing an id', () => { + it('builds the embeddable, providing an id', async () => { const buildEmbeddableSpy = jest.spyOn(testEmbeddableFactory, 'buildEmbeddable'); render( { state={{ rawState: { bork: 'blorp?' } }} /> ); - expect(buildEmbeddableSpy).toHaveBeenCalledWith( - { bork: 'blorp?' }, - expect.any(Function), - '12345', - undefined - ); + await waitFor(() => { + expect(buildEmbeddableSpy).toHaveBeenCalledWith( + { bork: 'blorp?' }, + expect.any(Function), + '12345', + undefined + ); + }); }); - it('builds the embeddable, providing a parent', () => { + it('builds the embeddable, providing a parent', async () => { const buildEmbeddableSpy = jest.spyOn(testEmbeddableFactory, 'buildEmbeddable'); const parentApi = getMockPresentationContainer(); render( @@ -93,18 +105,27 @@ describe('react embeddable renderer', () => { parentApi={parentApi} /> ); - expect(buildEmbeddableSpy).toHaveBeenCalledWith( - { bork: 'blorp?' }, - expect.any(Function), - expect.any(String), - parentApi - ); + await waitFor(() => { + expect(buildEmbeddableSpy).toHaveBeenCalledWith( + { bork: 'blorp?' }, + expect.any(Function), + expect.any(String), + parentApi + ); + }); }); - it('renders the given component once it resolves', () => { - render(); - waitFor(() => { - expect(screen.findByText('SUPER TEST COMPONENT, name: Kuni Garu')).toBeInTheDocument(); + it('renders the given component once it resolves', async () => { + render( + + ); + await waitFor(() => { + expect(screen.queryByTestId('superTestEmbeddable')).toHaveTextContent( + 'SUPER TEST COMPONENT, name: Kuni Garu bork: Dara' + ); }); }); diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx index ec5a763bae28d..2f97d64df923d 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx @@ -11,17 +11,13 @@ import { PresentationContainer, SerializedPanelState, } from '@kbn/presentation-containers'; -import { PresentationPanel } from '@kbn/presentation-panel-plugin/public'; +import { PresentationPanel, PresentationPanelProps } from '@kbn/presentation-panel-plugin/public'; import { StateComparators } from '@kbn/presentation-publishing'; import React, { useEffect, useImperativeHandle, useMemo, useRef } from 'react'; import { v4 as generateId } from 'uuid'; import { getReactEmbeddableFactory } from './react_embeddable_registry'; import { startTrackingEmbeddableUnsavedChanges } from './react_embeddable_unsaved_changes'; -import { - DefaultEmbeddableApi, - ReactEmbeddableApiRegistration, - ReactEmbeddableFactory, -} from './types'; +import { DefaultEmbeddableApi, ReactEmbeddableApiRegistration } from './types'; /** * Renders a component from the React Embeddable registry into a Presentation Panel. @@ -37,12 +33,22 @@ export const ReactEmbeddableRenderer = < state, parentApi, onApiAvailable, + panelProps, }: { maybeId?: string; type: string; state: SerializedPanelState; parentApi?: PresentationContainer; onApiAvailable?: (api: ApiType) => void; + panelProps?: Pick< + PresentationPanelProps, + | 'showShadow' + | 'showBorder' + | 'showBadges' + | 'showNotifications' + | 'hideHeader' + | 'hideInspector' + >; }) => { const cleanupFunction = useRef<(() => void) | null>(null); @@ -50,10 +56,7 @@ export const ReactEmbeddableRenderer = < () => (async () => { const uuid = maybeId ?? generateId(); - const factory = getReactEmbeddableFactory(type) as ReactEmbeddableFactory< - StateType, - ApiType - >; + const factory = await getReactEmbeddableFactory(type); const registerApi = ( apiRegistration: ReactEmbeddableApiRegistration, comparators: StateComparators @@ -109,5 +112,5 @@ export const ReactEmbeddableRenderer = < }; }, []); - return ; + return ; }; diff --git a/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts b/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts index 04e487b00baad..fc83af9062100 100644 --- a/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { memoize } from 'lodash'; import { i18n } from '@kbn/i18n'; import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createTrycloudOption1, createTrycloudOption2 } from './onprem_cloud_instructions'; @@ -13,324 +14,354 @@ import { getSpaceIdForBeatsTutorial } from './get_space_id_for_beats_tutorial'; import { TutorialContext } from '../../services/tutorials/lib/tutorials_registry_types'; import { cloudPasswordAndResetLink } from './cloud_instructions'; -export const createMetricbeatInstructions = (context: TutorialContext) => { - const SSL_DOC_URL = `https://www.elastic.co/guide/en/beats/metricbeat/${context.kibanaBranch}/configuration-ssl.html#ca-sha256`; - - return { - INSTALL: { - OSX: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.install.osxTitle', { - defaultMessage: 'Download and install Metricbeat', - }), - textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.install.osxTextPre', { - defaultMessage: 'First time using Metricbeat? See the [Quick Start]({link}).', - values: { - link: '{config.docs.beats.metricbeat}/metricbeat-installation-configuration.html', - }, - }), - commands: [ - 'curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-{config.kibana.version}-darwin-x86_64.tar.gz', - 'tar xzvf metricbeat-{config.kibana.version}-darwin-x86_64.tar.gz', - 'cd metricbeat-{config.kibana.version}-darwin-x86_64/', - ], - }, - DEB: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.install.debTitle', { - defaultMessage: 'Download and install Metricbeat', - }), - textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.install.debTextPre', { - defaultMessage: 'First time using Metricbeat? See the [Quick Start]({link}).', - values: { - link: '{config.docs.beats.metricbeat}/metricbeat-installation-configuration.html', - }, - }), - commands: [ - 'curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-{config.kibana.version}-amd64.deb', - 'sudo dpkg -i metricbeat-{config.kibana.version}-amd64.deb', - ], - textPost: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.install.debTextPost', - { - defaultMessage: 'Looking for the 32-bit packages? See the [Download page]({link}).', - values: { link: 'https://www.elastic.co/downloads/beats/metricbeat' }, - } - ), - }, - RPM: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.install.rpmTitle', { - defaultMessage: 'Download and install Metricbeat', - }), - textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.install.rpmTextPre', { - defaultMessage: 'First time using Metricbeat? See the [Quick Start]({link}).', - values: { - link: '{config.docs.beats.metricbeat}/metricbeat-installation-configuration.html', - }, - }), - commands: [ - 'curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-{config.kibana.version}-x86_64.rpm', - 'sudo rpm -vi metricbeat-{config.kibana.version}-x86_64.rpm', - ], - textPost: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.install.debTextPost', - { - defaultMessage: 'Looking for the 32-bit packages? See the [Download page]({link}).', - values: { link: 'https://www.elastic.co/downloads/beats/metricbeat' }, - } - ), - }, - WINDOWS: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.install.windowsTitle', { - defaultMessage: 'Download and install Metricbeat', - }), - textPre: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.install.windowsTextPre', - { - defaultMessage: - 'First time using Metricbeat? See the [Quick Start]({metricbeatLink}).\n\ +export const createMetricbeatInstructions = memoize( + (context: TutorialContext) => { + const SSL_DOC_URL = `https://www.elastic.co/guide/en/beats/metricbeat/${context.kibanaBranch}/configuration-ssl.html#ca-sha256`; + const spaceId = getSpaceIdForBeatsTutorial(context); + return { + INSTALL: { + OSX: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.install.osxTitle', { + defaultMessage: 'Download and install Metricbeat', + }), + textPre: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.install.osxTextPre', + { + defaultMessage: 'First time using Metricbeat? See the [Quick Start]({link}).', + values: { + link: '{config.docs.beats.metricbeat}/metricbeat-installation-configuration.html', + }, + } + ), + commands: [ + 'curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-{config.kibana.version}-darwin-x86_64.tar.gz', + 'tar xzvf metricbeat-{config.kibana.version}-darwin-x86_64.tar.gz', + 'cd metricbeat-{config.kibana.version}-darwin-x86_64/', + ], + }, + DEB: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.install.debTitle', { + defaultMessage: 'Download and install Metricbeat', + }), + textPre: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.install.debTextPre', + { + defaultMessage: 'First time using Metricbeat? See the [Quick Start]({link}).', + values: { + link: '{config.docs.beats.metricbeat}/metricbeat-installation-configuration.html', + }, + } + ), + commands: [ + 'curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-{config.kibana.version}-amd64.deb', + 'sudo dpkg -i metricbeat-{config.kibana.version}-amd64.deb', + ], + textPost: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.install.debTextPost', + { + defaultMessage: 'Looking for the 32-bit packages? See the [Download page]({link}).', + values: { link: 'https://www.elastic.co/downloads/beats/metricbeat' }, + } + ), + }, + RPM: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.install.rpmTitle', { + defaultMessage: 'Download and install Metricbeat', + }), + textPre: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.install.rpmTextPre', + { + defaultMessage: 'First time using Metricbeat? See the [Quick Start]({link}).', + values: { + link: '{config.docs.beats.metricbeat}/metricbeat-installation-configuration.html', + }, + } + ), + commands: [ + 'curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-{config.kibana.version}-x86_64.rpm', + 'sudo rpm -vi metricbeat-{config.kibana.version}-x86_64.rpm', + ], + textPost: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.install.debTextPost', + { + defaultMessage: 'Looking for the 32-bit packages? See the [Download page]({link}).', + values: { link: 'https://www.elastic.co/downloads/beats/metricbeat' }, + } + ), + }, + WINDOWS: { + title: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.install.windowsTitle', + { + defaultMessage: 'Download and install Metricbeat', + } + ), + textPre: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.install.windowsTextPre', + { + defaultMessage: + 'First time using Metricbeat? See the [Quick Start]({metricbeatLink}).\n\ 1. Download the Metricbeat Windows zip file from the [Download]({elasticLink}) page.\n\ 2. Extract the contents of the zip file into {folderPath}.\n\ 3. Rename the {directoryName} directory to `Metricbeat`.\n\ 4. Open a PowerShell prompt as an Administrator (right-click the PowerShell icon and select \ **Run As Administrator**). If you are running Windows XP, you might need to download and install PowerShell.\n\ 5. From the PowerShell prompt, run the following commands to install Metricbeat as a Windows service.', - values: { - directoryName: '`metricbeat-{config.kibana.version}-windows`', - folderPath: '`C:\\Program Files`', - metricbeatLink: - '{config.docs.beats.metricbeat}/metricbeat-installation-configuration.html', - elasticLink: 'https://www.elastic.co/downloads/beats/metricbeat', - }, - } - ), - commands: ['cd "C:\\Program Files\\Metricbeat"', '.\\install-service-metricbeat.ps1'], - textPost: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.install.windowsTextPost', - { - defaultMessage: - 'Modify the settings under `output.elasticsearch` in the {path} file to point to your Elasticsearch installation.', - values: { path: '`C:\\Program Files\\Metricbeat\\metricbeat.yml`' }, - } - ), - }, - }, - START: { - OSX: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.start.osxTitle', { - defaultMessage: 'Start Metricbeat', - }), - textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.start.osxTextPre', { - defaultMessage: - 'The `setup` command loads the Kibana dashboards. If the dashboards are already set up, omit this command.', - }), - commands: ['./metricbeat setup', './metricbeat -e'], - }, - DEB: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.start.debTitle', { - defaultMessage: 'Start Metricbeat', - }), - textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.start.debTextPre', { - defaultMessage: - 'The `setup` command loads the Kibana dashboards. If the dashboards are already set up, omit this command.', - }), - commands: ['sudo metricbeat setup', 'sudo service metricbeat start'], - }, - RPM: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.start.rpmTitle', { - defaultMessage: 'Start Metricbeat', - }), - textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.start.rpmTextPre', { - defaultMessage: - 'The `setup` command loads the Kibana dashboards. If the dashboards are already set up, omit this command.', - }), - commands: ['sudo metricbeat setup', 'sudo service metricbeat start'], + values: { + directoryName: '`metricbeat-{config.kibana.version}-windows`', + folderPath: '`C:\\Program Files`', + metricbeatLink: + '{config.docs.beats.metricbeat}/metricbeat-installation-configuration.html', + elasticLink: 'https://www.elastic.co/downloads/beats/metricbeat', + }, + } + ), + commands: ['cd "C:\\Program Files\\Metricbeat"', '.\\install-service-metricbeat.ps1'], + textPost: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.install.windowsTextPost', + { + defaultMessage: + 'Modify the settings under `output.elasticsearch` in the {path} file to point to your Elasticsearch installation.', + values: { path: '`C:\\Program Files\\Metricbeat\\metricbeat.yml`' }, + } + ), + }, }, - WINDOWS: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.start.windowsTitle', { - defaultMessage: 'Start Metricbeat', - }), - textPre: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.start.windowsTextPre', - { + START: { + OSX: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.start.osxTitle', { + defaultMessage: 'Start Metricbeat', + }), + textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.start.osxTextPre', { defaultMessage: 'The `setup` command loads the Kibana dashboards. If the dashboards are already set up, omit this command.', - } - ), - commands: ['.\\metricbeat.exe setup', 'Start-Service metricbeat'], - }, - }, - CONFIG: { - OSX: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.config.osxTitle', { - defaultMessage: 'Edit the configuration', - }), - textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.config.osxTextPre', { - defaultMessage: 'Modify {path} to set the connection information:', - values: { - path: '`metricbeat.yml`', - }, - }), - commands: [ - 'output.elasticsearch:', - ' hosts: [""]', - ' username: "elastic"', - ' password: ""', - " # If using Elasticsearch's default certificate", - ' ssl.ca_trusted_fingerprint: ""', - 'setup.kibana:', - ' host: ""', - getSpaceIdForBeatsTutorial(context), - ], - textPost: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.config.osxTextPostMarkdown', - { + }), + commands: ['./metricbeat setup', './metricbeat -e'], + }, + DEB: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.start.debTitle', { + defaultMessage: 'Start Metricbeat', + }), + textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.start.debTextPre', { + defaultMessage: + 'The `setup` command loads the Kibana dashboards. If the dashboards are already set up, omit this command.', + }), + commands: ['sudo metricbeat setup', 'sudo service metricbeat start'], + }, + RPM: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.start.rpmTitle', { + defaultMessage: 'Start Metricbeat', + }), + textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.start.rpmTextPre', { defaultMessage: - 'Where {passwordTemplate} is the password of the `elastic` user, {esUrlTemplate} is the URL of \ + 'The `setup` command loads the Kibana dashboards. If the dashboards are already set up, omit this command.', + }), + commands: ['sudo metricbeat setup', 'sudo service metricbeat start'], + }, + WINDOWS: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.start.windowsTitle', { + defaultMessage: 'Start Metricbeat', + }), + textPre: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.start.windowsTextPre', + { + defaultMessage: + 'The `setup` command loads the Kibana dashboards. If the dashboards are already set up, omit this command.', + } + ), + commands: ['.\\metricbeat.exe setup', 'Start-Service metricbeat'], + }, + }, + CONFIG: { + OSX: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.config.osxTitle', { + defaultMessage: 'Edit the configuration', + }), + textPre: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.config.osxTextPre', + { + defaultMessage: 'Modify {path} to set the connection information:', + values: { + path: '`metricbeat.yml`', + }, + } + ), + commands: [ + 'output.elasticsearch:', + ' hosts: [""]', + ' username: "elastic"', + ' password: ""', + " # If using Elasticsearch's default certificate", + ' ssl.ca_trusted_fingerprint: ""', + 'setup.kibana:', + ' host: ""', + spaceId, + ], + textPost: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.config.osxTextPostMarkdown', + { + defaultMessage: + 'Where {passwordTemplate} is the password of the `elastic` user, {esUrlTemplate} is the URL of \ Elasticsearch, and {kibanaUrlTemplate} is the URL of Kibana. To [configure SSL]({configureSslUrl}) with the \ default certificate generated by Elasticsearch, add its fingerprint in {esCertFingerprintTemplate}.\n\n\ > **_Important:_** Do not use the built-in `elastic` user to secure clients in a production environment. Instead set up \ authorized users or API keys, and do not expose passwords in configuration files. [Learn more]({linkUrl}).', - values: { - passwordTemplate: '``', - esUrlTemplate: '``', - kibanaUrlTemplate: '``', - configureSslUrl: SSL_DOC_URL, - esCertFingerprintTemplate: '``', - linkUrl: '{config.docs.beats.metricbeat}/securing-metricbeat.html', - }, - } - ), - }, - DEB: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.config.debTitle', { - defaultMessage: 'Edit the configuration', - }), - textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.config.debTextPre', { - defaultMessage: 'Modify {path} to set the connection information:', - values: { - path: '`/etc/metricbeat/metricbeat.yml`', - }, - }), - commands: [ - 'output.elasticsearch:', - ' hosts: [""]', - ' username: "elastic"', - ' password: ""', - " # If using Elasticsearch's default certificate", - ' ssl.ca_trusted_fingerprint: ""', - 'setup.kibana:', - ' host: ""', - getSpaceIdForBeatsTutorial(context), - ], - textPost: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.config.debTextPostMarkdown', - { - defaultMessage: - 'Where {passwordTemplate} is the password of the `elastic` user, {esUrlTemplate} is the URL of \ + values: { + passwordTemplate: '``', + esUrlTemplate: '``', + kibanaUrlTemplate: '``', + configureSslUrl: SSL_DOC_URL, + esCertFingerprintTemplate: '``', + linkUrl: '{config.docs.beats.metricbeat}/securing-metricbeat.html', + }, + } + ), + }, + DEB: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.config.debTitle', { + defaultMessage: 'Edit the configuration', + }), + textPre: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.config.debTextPre', + { + defaultMessage: 'Modify {path} to set the connection information:', + values: { + path: '`/etc/metricbeat/metricbeat.yml`', + }, + } + ), + commands: [ + 'output.elasticsearch:', + ' hosts: [""]', + ' username: "elastic"', + ' password: ""', + " # If using Elasticsearch's default certificate", + ' ssl.ca_trusted_fingerprint: ""', + 'setup.kibana:', + ' host: ""', + spaceId, + ], + textPost: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.config.debTextPostMarkdown', + { + defaultMessage: + 'Where {passwordTemplate} is the password of the `elastic` user, {esUrlTemplate} is the URL of \ Elasticsearch, and {kibanaUrlTemplate} is the URL of Kibana. To [configure SSL]({configureSslUrl}) with the \ default certificate generated by Elasticsearch, add its fingerprint in {esCertFingerprintTemplate}.\n\n\ > **_Important:_** Do not use the built-in `elastic` user to secure clients in a production environment. Instead set up \ authorized users or API keys, and do not expose passwords in configuration files. [Learn more]({linkUrl}).', - values: { - passwordTemplate: '``', - esUrlTemplate: '``', - kibanaUrlTemplate: '``', - configureSslUrl: SSL_DOC_URL, - esCertFingerprintTemplate: '``', - linkUrl: '{config.docs.beats.metricbeat}/securing-metricbeat.html', - }, - } - ), - }, - RPM: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.config.rpmTitle', { - defaultMessage: 'Edit the configuration', - }), - textPre: i18n.translate('home.tutorials.common.metricbeatInstructions.config.rpmTextPre', { - defaultMessage: 'Modify {path} to set the connection information:', - values: { - path: '`/etc/metricbeat/metricbeat.yml`', - }, - }), - commands: [ - 'output.elasticsearch:', - ' hosts: [""]', - ' username: "elastic"', - ' password: ""', - " # If using Elasticsearch's default certificate", - ' ssl.ca_trusted_fingerprint: ""', - 'setup.kibana:', - ' host: ""', - getSpaceIdForBeatsTutorial(context), - ], - textPost: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.config.rpmTextPostMarkdown', - { - defaultMessage: - 'Where {passwordTemplate} is the password of the `elastic` user, {esUrlTemplate} is the URL of \ + values: { + passwordTemplate: '``', + esUrlTemplate: '``', + kibanaUrlTemplate: '``', + configureSslUrl: SSL_DOC_URL, + esCertFingerprintTemplate: '``', + linkUrl: '{config.docs.beats.metricbeat}/securing-metricbeat.html', + }, + } + ), + }, + RPM: { + title: i18n.translate('home.tutorials.common.metricbeatInstructions.config.rpmTitle', { + defaultMessage: 'Edit the configuration', + }), + textPre: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.config.rpmTextPre', + { + defaultMessage: 'Modify {path} to set the connection information:', + values: { + path: '`/etc/metricbeat/metricbeat.yml`', + }, + } + ), + commands: [ + 'output.elasticsearch:', + ' hosts: [""]', + ' username: "elastic"', + ' password: ""', + " # If using Elasticsearch's default certificate", + ' ssl.ca_trusted_fingerprint: ""', + 'setup.kibana:', + ' host: ""', + spaceId, + ], + textPost: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.config.rpmTextPostMarkdown', + { + defaultMessage: + 'Where {passwordTemplate} is the password of the `elastic` user, {esUrlTemplate} is the URL of \ Elasticsearch, and {kibanaUrlTemplate} is the URL of Kibana. To [configure SSL]({configureSslUrl}) with the \ default certificate generated by Elasticsearch, add its fingerprint in {esCertFingerprintTemplate}.\n\n\ > **_Important:_** Do not use the built-in `elastic` user to secure clients in a production environment. Instead set up \ authorized users or API keys, and do not expose passwords in configuration files. [Learn more]({linkUrl}).', - values: { - passwordTemplate: '``', - esUrlTemplate: '``', - kibanaUrlTemplate: '``', - configureSslUrl: SSL_DOC_URL, - esCertFingerprintTemplate: '``', - linkUrl: '{config.docs.beats.metricbeat}/securing-metricbeat.html', - }, - } - ), - }, - WINDOWS: { - title: i18n.translate('home.tutorials.common.metricbeatInstructions.config.windowsTitle', { - defaultMessage: 'Edit the configuration', - }), - textPre: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.config.windowsTextPre', - { - defaultMessage: 'Modify {path} to set the connection information:', - values: { - path: '`C:\\Program Files\\Metricbeat\\metricbeat.yml`', - }, - } - ), - commands: [ - 'output.elasticsearch:', - ' hosts: [""]', - ' username: "elastic"', - ' password: ""', - " # If using Elasticsearch's default certificate", - ' ssl.ca_trusted_fingerprint: ""', - 'setup.kibana:', - ' host: ""', - getSpaceIdForBeatsTutorial(context), - ], - textPost: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.config.windowsTextPostMarkdown', - { - defaultMessage: - 'Where {passwordTemplate} is the password of the `elastic` user, {esUrlTemplate} is the URL of \ + values: { + passwordTemplate: '``', + esUrlTemplate: '``', + kibanaUrlTemplate: '``', + configureSslUrl: SSL_DOC_URL, + esCertFingerprintTemplate: '``', + linkUrl: '{config.docs.beats.metricbeat}/securing-metricbeat.html', + }, + } + ), + }, + WINDOWS: { + title: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.config.windowsTitle', + { + defaultMessage: 'Edit the configuration', + } + ), + textPre: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.config.windowsTextPre', + { + defaultMessage: 'Modify {path} to set the connection information:', + values: { + path: '`C:\\Program Files\\Metricbeat\\metricbeat.yml`', + }, + } + ), + commands: [ + 'output.elasticsearch:', + ' hosts: [""]', + ' username: "elastic"', + ' password: ""', + " # If using Elasticsearch's default certificate", + ' ssl.ca_trusted_fingerprint: ""', + 'setup.kibana:', + ' host: ""', + spaceId, + ], + textPost: i18n.translate( + 'home.tutorials.common.metricbeatInstructions.config.windowsTextPostMarkdown', + { + defaultMessage: + 'Where {passwordTemplate} is the password of the `elastic` user, {esUrlTemplate} is the URL of \ Elasticsearch, and {kibanaUrlTemplate} is the URL of Kibana. To [configure SSL]({configureSslUrl}) with the \ default certificate generated by Elasticsearch, add its fingerprint in {esCertFingerprintTemplate}.\n\n\ > **_Important:_** Do not use the built-in `elastic` user to secure clients in a production environment. Instead set up \ authorized users or API keys, and do not expose passwords in configuration files. [Learn more]({linkUrl}).', - values: { - passwordTemplate: '``', - esUrlTemplate: '``', - kibanaUrlTemplate: '``', - configureSslUrl: SSL_DOC_URL, - esCertFingerprintTemplate: '``', - linkUrl: '{config.docs.beats.metricbeat}/securing-metricbeat.html', - }, - } - ), + values: { + passwordTemplate: '``', + esUrlTemplate: '``', + kibanaUrlTemplate: '``', + configureSslUrl: SSL_DOC_URL, + esCertFingerprintTemplate: '``', + linkUrl: '{config.docs.beats.metricbeat}/securing-metricbeat.html', + }, + } + ), + }, }, - }, - }; -}; + }; + }, + // key resolver based on the context keys effectively used + (context: TutorialContext) => { + return `${context.kibanaBranch}|${context.spaceId ?? 'default'}`; + } +); -export const createMetricbeatCloudInstructions = () => ({ +export const createMetricbeatCloudInstructions = memoize(() => ({ CONFIG: { OSX: { title: i18n.translate('home.tutorials.common.metricbeatCloudInstructions.config.osxTitle', { @@ -400,7 +431,7 @@ export const createMetricbeatCloudInstructions = () => ({ textPost: cloudPasswordAndResetLink, }, }, -}); +})); export function metricbeatEnableInstructions(moduleName: string) { return { @@ -498,6 +529,7 @@ export function metricbeatStatusCheck(moduleName: string) { export function onPremInstructions(moduleName: string, context: TutorialContext) { const METRICBEAT_INSTRUCTIONS = createMetricbeatInstructions(context); + const METRICBEAT_ENABLE_INSTRUCTIONS = metricbeatEnableInstructions(moduleName); return { instructionSets: [ @@ -514,7 +546,7 @@ export function onPremInstructions(moduleName: string, context: TutorialContext) instructions: [ METRICBEAT_INSTRUCTIONS.INSTALL.OSX, METRICBEAT_INSTRUCTIONS.CONFIG.OSX, - metricbeatEnableInstructions(moduleName).OSX, + METRICBEAT_ENABLE_INSTRUCTIONS.OSX, METRICBEAT_INSTRUCTIONS.START.OSX, ], }, @@ -523,7 +555,7 @@ export function onPremInstructions(moduleName: string, context: TutorialContext) instructions: [ METRICBEAT_INSTRUCTIONS.INSTALL.DEB, METRICBEAT_INSTRUCTIONS.CONFIG.DEB, - metricbeatEnableInstructions(moduleName).DEB, + METRICBEAT_ENABLE_INSTRUCTIONS.DEB, METRICBEAT_INSTRUCTIONS.START.DEB, ], }, @@ -532,7 +564,7 @@ export function onPremInstructions(moduleName: string, context: TutorialContext) instructions: [ METRICBEAT_INSTRUCTIONS.INSTALL.RPM, METRICBEAT_INSTRUCTIONS.CONFIG.RPM, - metricbeatEnableInstructions(moduleName).RPM, + METRICBEAT_ENABLE_INSTRUCTIONS.RPM, METRICBEAT_INSTRUCTIONS.START.RPM, ], }, @@ -541,7 +573,7 @@ export function onPremInstructions(moduleName: string, context: TutorialContext) instructions: [ METRICBEAT_INSTRUCTIONS.INSTALL.WINDOWS, METRICBEAT_INSTRUCTIONS.CONFIG.WINDOWS, - metricbeatEnableInstructions(moduleName).WINDOWS, + METRICBEAT_ENABLE_INSTRUCTIONS.WINDOWS, METRICBEAT_INSTRUCTIONS.START.WINDOWS, ], }, @@ -556,6 +588,7 @@ export function onPremCloudInstructions(moduleName: string, context: TutorialCon const TRYCLOUD_OPTION1 = createTrycloudOption1(); const TRYCLOUD_OPTION2 = createTrycloudOption2(); const METRICBEAT_INSTRUCTIONS = createMetricbeatInstructions(context); + const METRICBEAT_ENABLE_INSTRUCTIONS = metricbeatEnableInstructions(moduleName); return { instructionSets: [ @@ -574,7 +607,7 @@ export function onPremCloudInstructions(moduleName: string, context: TutorialCon TRYCLOUD_OPTION2, METRICBEAT_INSTRUCTIONS.INSTALL.OSX, METRICBEAT_INSTRUCTIONS.CONFIG.OSX, - metricbeatEnableInstructions(moduleName).OSX, + METRICBEAT_ENABLE_INSTRUCTIONS.OSX, METRICBEAT_INSTRUCTIONS.START.OSX, ], }, @@ -585,7 +618,7 @@ export function onPremCloudInstructions(moduleName: string, context: TutorialCon TRYCLOUD_OPTION2, METRICBEAT_INSTRUCTIONS.INSTALL.DEB, METRICBEAT_INSTRUCTIONS.CONFIG.DEB, - metricbeatEnableInstructions(moduleName).DEB, + METRICBEAT_ENABLE_INSTRUCTIONS.DEB, METRICBEAT_INSTRUCTIONS.START.DEB, ], }, @@ -596,7 +629,7 @@ export function onPremCloudInstructions(moduleName: string, context: TutorialCon TRYCLOUD_OPTION2, METRICBEAT_INSTRUCTIONS.INSTALL.RPM, METRICBEAT_INSTRUCTIONS.CONFIG.RPM, - metricbeatEnableInstructions(moduleName).RPM, + METRICBEAT_ENABLE_INSTRUCTIONS.RPM, METRICBEAT_INSTRUCTIONS.START.RPM, ], }, @@ -607,7 +640,7 @@ export function onPremCloudInstructions(moduleName: string, context: TutorialCon TRYCLOUD_OPTION2, METRICBEAT_INSTRUCTIONS.INSTALL.WINDOWS, METRICBEAT_INSTRUCTIONS.CONFIG.WINDOWS, - metricbeatEnableInstructions(moduleName).WINDOWS, + METRICBEAT_ENABLE_INSTRUCTIONS.WINDOWS, METRICBEAT_INSTRUCTIONS.START.WINDOWS, ], }, @@ -621,6 +654,7 @@ export function onPremCloudInstructions(moduleName: string, context: TutorialCon export function cloudInstructions(moduleName: string, context: TutorialContext) { const METRICBEAT_INSTRUCTIONS = createMetricbeatInstructions(context); const METRICBEAT_CLOUD_INSTRUCTIONS = createMetricbeatCloudInstructions(); + const METRICBEAT_ENABLE_INSTRUCTIONS = metricbeatEnableInstructions(moduleName); return { instructionSets: [ @@ -637,7 +671,7 @@ export function cloudInstructions(moduleName: string, context: TutorialContext) instructions: [ METRICBEAT_INSTRUCTIONS.INSTALL.OSX, METRICBEAT_CLOUD_INSTRUCTIONS.CONFIG.OSX, - metricbeatEnableInstructions(moduleName).OSX, + METRICBEAT_ENABLE_INSTRUCTIONS.OSX, METRICBEAT_INSTRUCTIONS.START.OSX, ], }, @@ -646,7 +680,7 @@ export function cloudInstructions(moduleName: string, context: TutorialContext) instructions: [ METRICBEAT_INSTRUCTIONS.INSTALL.DEB, METRICBEAT_CLOUD_INSTRUCTIONS.CONFIG.DEB, - metricbeatEnableInstructions(moduleName).DEB, + METRICBEAT_ENABLE_INSTRUCTIONS.DEB, METRICBEAT_INSTRUCTIONS.START.DEB, ], }, @@ -655,7 +689,7 @@ export function cloudInstructions(moduleName: string, context: TutorialContext) instructions: [ METRICBEAT_INSTRUCTIONS.INSTALL.RPM, METRICBEAT_CLOUD_INSTRUCTIONS.CONFIG.RPM, - metricbeatEnableInstructions(moduleName).RPM, + METRICBEAT_ENABLE_INSTRUCTIONS.RPM, METRICBEAT_INSTRUCTIONS.START.RPM, ], }, @@ -664,7 +698,7 @@ export function cloudInstructions(moduleName: string, context: TutorialContext) instructions: [ METRICBEAT_INSTRUCTIONS.INSTALL.WINDOWS, METRICBEAT_CLOUD_INSTRUCTIONS.CONFIG.WINDOWS, - metricbeatEnableInstructions(moduleName).WINDOWS, + METRICBEAT_ENABLE_INSTRUCTIONS.WINDOWS, METRICBEAT_INSTRUCTIONS.START.WINDOWS, ], }, diff --git a/src/plugins/home/server/tutorials/instructions/onprem_cloud_instructions.ts b/src/plugins/home/server/tutorials/instructions/onprem_cloud_instructions.ts index 66fab1e4502de..921fa29f88b77 100644 --- a/src/plugins/home/server/tutorials/instructions/onprem_cloud_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/onprem_cloud_instructions.ts @@ -6,9 +6,10 @@ * Side Public License, v 1. */ +import { memoize } from 'lodash'; import { i18n } from '@kbn/i18n'; -export const createTrycloudOption1 = () => ({ +export const createTrycloudOption1 = memoize(() => ({ title: i18n.translate('home.tutorials.common.premCloudInstructions.option1.title', { defaultMessage: 'Option 1: Try in Elastic Cloud', }), @@ -27,9 +28,9 @@ To create a cluster, in Elastic Cloud console:\n\ link: 'https://www.elastic.co/cloud/as-a-service/signup?blade=kib', }, }), -}); +})); -export const createTrycloudOption2 = () => ({ +export const createTrycloudOption2 = memoize(() => ({ title: i18n.translate('home.tutorials.common.premCloudInstructions.option2.title', { defaultMessage: 'Option 2: Connect local Kibana to a Cloud instance', }), @@ -43,4 +44,4 @@ Save the **Elasticsearch** endpoint as {urlTemplate} and the cluster **Password* passwordTemplate: '``', }, }), -}); +})); 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 925bf021baf92..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.' }, @@ -515,10 +519,6 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, }, - 'labs:dashboard:linksPanel': { - type: 'boolean', - _meta: { description: 'Non-default value of setting.' }, - }, 'discover:showFieldStatistics': { type: 'boolean', _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 bb5cc9382f42b..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; @@ -142,7 +143,6 @@ export interface UsageStats { 'labs:canvas:useDataService': boolean; 'labs:presentation:timeToPresent': boolean; 'labs:dashboard:enable_ui': boolean; - 'labs:dashboard:linksPanel': boolean; 'labs:dashboard:deferBelowFold': boolean; 'discover:rowHeightOption': number; hideAnnouncements: boolean; diff --git a/src/plugins/links/public/_mixins.scss b/src/plugins/links/public/_mixins.scss index cc9b7a5168d80..b41c0d7f1ab62 100644 --- a/src/plugins/links/public/_mixins.scss +++ b/src/plugins/links/public/_mixins.scss @@ -25,7 +25,7 @@ } @mixin euiFlyout { - @include kibanaFullBodyHeight(); + height: calc(100vh - var(--euiFixedHeadersOffset, 0)); position: fixed; display: flex; inline-size: 50vw; diff --git a/src/plugins/links/public/components/editor/links_editor.tsx b/src/plugins/links/public/components/editor/links_editor.tsx index 0b9b21d7b6147..2a146ab5430cd 100644 --- a/src/plugins/links/public/components/editor/links_editor.tsx +++ b/src/plugins/links/public/components/editor/links_editor.tsx @@ -10,7 +10,6 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import useMountedState from 'react-use/lib/useMountedState'; import { - EuiBadge, EuiButton, EuiButtonEmpty, EuiButtonGroup, @@ -28,7 +27,6 @@ import { EuiFormRow, EuiSwitch, EuiTitle, - EuiToolTip, } from '@elastic/eui'; import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; @@ -91,7 +89,7 @@ const LinksEditor = ({ ); const [isSaving, setIsSaving] = useState(false); const [orderedLinks, setOrderedLinks] = useState([]); - const [saveByReference, setSaveByReference] = useState(!initialLinks ? true : isByReference); + const [saveByReference, setSaveByReference] = useState(!initialLinks ? false : isByReference); const isEditingExisting = initialLinks || isByReference; @@ -173,19 +171,6 @@ const LinksEditor = ({ - - - {/* The EuiBadge needs an empty title to prevent the default tooltip */} - - {LinksStrings.editor.panelEditor.getTechnicalPreviewLabel()} - - - diff --git a/src/plugins/links/public/components/links_strings.ts b/src/plugins/links/public/components/links_strings.ts index 61dd98f40f542..8c6f1c888fb12 100644 --- a/src/plugins/links/public/components/links_strings.ts +++ b/src/plugins/links/public/components/links_strings.ts @@ -37,15 +37,6 @@ export const LinksStrings = { defaultMessage: 'Close', }), panelEditor: { - getTechnicalPreviewTooltip: () => - i18n.translate('links.panelEditor.technicalPreviewTooltip', { - defaultMessage: - 'This functionality is in technical preview and may be changed or removed completely in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features.', - }), - getTechnicalPreviewLabel: () => - i18n.translate('links.panelEditor.technicalPreviewLabel', { - defaultMessage: 'Technical preview', - }), getLinksTitle: () => i18n.translate('links.panelEditor.linksTitle', { defaultMessage: 'Links', diff --git a/src/plugins/links/public/embeddable/links_embeddable_factory.ts b/src/plugins/links/public/embeddable/links_embeddable_factory.ts index e1446aff316af..fa489ff4ee977 100644 --- a/src/plugins/links/public/embeddable/links_embeddable_factory.ts +++ b/src/plugins/links/public/embeddable/links_embeddable_factory.ts @@ -26,11 +26,7 @@ import { LinksAttributes } from '../../common/content_management'; import { extract, inject } from '../../common/embeddable'; import { LinksStrings } from '../components/links_strings'; import { getLinksAttributeService } from '../services/attribute_service'; -import { - coreServices, - presentationUtil, - untilPluginStartServicesReady, -} from '../services/kibana_services'; +import { coreServices, untilPluginStartServicesReady } from '../services/kibana_services'; import type { LinksEmbeddable } from './links_embeddable'; import { LinksByReferenceInput, LinksEditorFlyoutReturn, LinksInput } from './types'; @@ -89,7 +85,7 @@ export class LinksFactoryDefinition } public canCreateNew() { - return presentationUtil.labsService.isProjectEnabled('labs:dashboard:linksPanel'); + return true; } public getDefaultInput(): Partial { diff --git a/src/plugins/links/public/plugin.ts b/src/plugins/links/public/plugin.ts index f72f45d4c6a22..ca13281fd2512 100644 --- a/src/plugins/links/public/plugin.ts +++ b/src/plugins/links/public/plugin.ts @@ -80,7 +80,7 @@ export class LinksPlugin title: APP_NAME, icon: APP_ICON, description: LinksStrings.getDescription(), - stage: 'experimental', + stage: 'production', appExtensions: { visualizations: { docTypes: [CONTENT_ID], @@ -98,7 +98,7 @@ export class LinksPlugin updatedAt, icon: APP_ICON, typeTitle: APP_NAME, - stage: 'experimental', + stage: 'production', savedObjectType: type, }; }, 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/presentation_util/common/labs.ts b/src/plugins/presentation_util/common/labs.ts index a6ac9c7d8ae71..86c05810723bd 100644 --- a/src/plugins/presentation_util/common/labs.ts +++ b/src/plugins/presentation_util/common/labs.ts @@ -10,20 +10,12 @@ import { i18n } from '@kbn/i18n'; export const LABS_PROJECT_PREFIX = 'labs:'; export const DEFER_BELOW_FOLD = `${LABS_PROJECT_PREFIX}dashboard:deferBelowFold` as const; -export const DASHBOARD_LINKS_PANEL = `${LABS_PROJECT_PREFIX}dashboard:linksPanel` as const; export const BY_VALUE_EMBEDDABLE = `${LABS_PROJECT_PREFIX}canvas:byValueEmbeddable` as const; -export const projectIDs = [DEFER_BELOW_FOLD, BY_VALUE_EMBEDDABLE, DASHBOARD_LINKS_PANEL] as const; +export const projectIDs = [DEFER_BELOW_FOLD, BY_VALUE_EMBEDDABLE] as const; export const environmentNames = ['kibana', 'browser', 'session'] as const; export const solutionNames = ['canvas', 'dashboard', 'presentation'] as const; -const technicalPreviewLabel = i18n.translate( - 'presentationUtil.advancedSettings.technicalPreviewLabel', - { - defaultMessage: 'technical preview', - } -); - /** * This is a list of active Labs Projects for the Presentation Team. It is the "source of truth" for all projects * provided to users of our solutions in Kibana. @@ -43,23 +35,6 @@ export const projects: { [ID in ProjectID]: ProjectConfig & { id: ID } } = { }), solutions: ['dashboard'], }, - [DASHBOARD_LINKS_PANEL]: { - id: DASHBOARD_LINKS_PANEL, - isActive: true, - isDisplayed: true, - environments: ['kibana', 'browser', 'session'], - name: i18n.translate('presentationUtil.labs.enableLinksPanelProjectName', { - defaultMessage: 'Enable links panel', - }), - description: i18n.translate('presentationUtil.labs.enableLinksPanelProjectDescription', { - defaultMessage: - '{technicalPreviewLabel} Enables the links panel for dashboard, which allows dashboard authors to easily link dashboards together.', - values: { - technicalPreviewLabel: `[${technicalPreviewLabel}]`, - }, - }), - solutions: ['dashboard'], - }, [BY_VALUE_EMBEDDABLE]: { id: BY_VALUE_EMBEDDABLE, isActive: true, diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/__snapshots__/table.test.tsx.snap b/src/plugins/saved_objects_management/public/management_section/objects_table/components/__snapshots__/table.test.tsx.snap index 06893662c8454..159ef79066a89 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/__snapshots__/table.test.tsx.snap +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/__snapshots__/table.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Table prevents saved objects from being deleted 1`] = ` +exports[`Table prevents hidden saved objects from being deleted 1`] = ` @@ -275,13 +275,6 @@ exports[`Table should render normally 1`] = ` toolsRight={ Array [ - } delay="regular" display="inlineBlock" position="top" diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/delete_confirm_modal.test.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/components/delete_confirm_modal.test.tsx index 260ebfc5dc956..8dffee1b91b64 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/delete_confirm_modal.test.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/delete_confirm_modal.test.tsx @@ -200,34 +200,6 @@ describe('DeleteConfirmModal', () => { }); }); - it('excludes the managed objects from the table and displays a callout', () => { - const objs = [ - createObject({ managed: true }), - createObject({ managed: false }), - createObject({ managed: true }), - createObject({ hiddenType: true }), - ]; - - const wrapper = mountWithIntl( - - ); - - expect(wrapper.find('.euiTableRow')).toHaveLength(1); - - const callout = findTestSubject(wrapper, 'cannotDeleteObjectsConfirmWarning'); - expect(callout).toHaveLength(1); - - expect(callout.text()).toMatchInlineSnapshot( - `"Some objects have been excluded1 object is hidden and cannot be deleted.2 objects are managed by Elastic and cannot be deleted."` - ); - }); - describe('shared objects warning', () => { it('does not display a callout when no objects are shared', () => { const objs = [ diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/delete_confirm_modal.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/components/delete_confirm_modal.tsx index 83adac8880aab..877d0ab97f806 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/delete_confirm_modal.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/delete_confirm_modal.tsx @@ -52,12 +52,9 @@ export const DeleteConfirmModal: FC = ({ const hiddenObjects = useMemo(() => { return selectedObjects.filter((obj) => obj.meta.hiddenType); }, [selectedObjects]); - const managedObjects = useMemo(() => { - return selectedObjects.filter((obj) => obj.managed); - }, [selectedObjects]); const deletableObjects = useMemo(() => { return selectedObjects - .filter((obj) => !obj.meta.hiddenType && !obj.managed) + .filter((obj) => !obj.meta.hiddenType) .map(({ type, id, meta, namespaces = [] }) => { const { title = '', icon = 'apps' } = meta; const isShared = namespaces.length > 1 || namespaces.includes('*'); @@ -88,7 +85,7 @@ export const DeleteConfirmModal: FC = ({ - {hiddenObjects.length + managedObjects.length > 0 && ( + {hiddenObjects.length > 0 && ( <> = ({ />

)} - - {managedObjects.length > 0 && ( -

- -

- )}
diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.test.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.test.tsx index 4b72e11b0968e..6d459c9029e27 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.test.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.test.tsx @@ -112,11 +112,11 @@ describe('Table', () => { expect(component.state().isSearchTextValid).toBe(true); }); - it(`prevents saved objects from being deleted`, () => { + it(`prevents hidden saved objects from being deleted`, () => { const selectedSavedObjects = [ - { type: 'visualization', meta: { hiddenType: false } }, - { type: 'search', meta: { hiddenType: false } }, - { type: 'index-pattern', meta: { hiddenType: false } }, + { type: 'visualization', meta: { hiddenType: true } }, + { type: 'search', meta: { hiddenType: true } }, + { type: 'index-pattern', meta: { hiddenType: true } }, ] as any; const customizedProps = { ...defaultProps, @@ -157,32 +157,15 @@ describe('Table', () => { expect(onActionRefresh).toHaveBeenCalled(); }); - describe('managed content', () => { - it('keeps the delete button disabled when the selection only contains managed and hidden SOs', async () => { - const managedSavedObjects = [ - { type: 'visualization', managed: true, meta: { hiddenType: false } }, - { type: 'search', managed: true, meta: { hiddenType: false } }, - { type: 'index-pattern', managed: true, meta: { hiddenType: false } }, - ] as any; - + describe('hidden SOs', () => { + it('keeps the delete button disabled for hidden SOs', async () => { const hiddenSavedObjects = [ { type: 'visualization', managed: false, meta: { hiddenType: true } }, { type: 'search', managed: false, meta: { hiddenType: true } }, { type: 'index-pattern', managed: false, meta: { hiddenType: true } }, ] as any; - const { rerender } = render( - - - - ); - - await waitFor(() => { - expect(screen.getByTestId('savedObjectsManagementDelete')).toBeDisabled(); - expect(screen.getByRole('button', { name: 'Export' })).toBeEnabled(); - }); - - rerender( + render(
@@ -192,28 +175,14 @@ describe('Table', () => { expect(screen.getByTestId('savedObjectsManagementDelete')).toBeDisabled(); expect(screen.getByRole('button', { name: 'Export' })).toBeEnabled(); }); - - rerender( - -
- - ); - - await waitFor(() => { - expect(screen.getByTestId('savedObjectsManagementDelete')).toBeDisabled(); - expect(screen.getByRole('button', { name: 'Export' })).toBeEnabled(); - }); }); - it('enables the delete button when the selection contains at least one unmanaged, non-hidden SO', async () => { + it('enables the delete button when the selection contains at least one non-hidden SO', async () => { const selectedSavedObjects = [ - { type: 'visualization', managed: true, meta: { hiddenType: false } }, - { type: 'search', managed: true, meta: { hiddenType: false } }, - { type: 'index-pattern', managed: false, meta: { hiddenType: true } }, - { type: 'lens', managed: false, meta: { hiddenType: false } }, // deletable! + { type: 'visualization', meta: { hiddenType: true } }, + { type: 'search', meta: { hiddenType: true } }, + { type: 'index-pattern', meta: { hiddenType: true } }, + { type: 'lens', meta: { hiddenType: false } }, // deletable! ] as any; render( diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.tsx index dbdf57533cd93..1d2e2e14b4050 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.tsx @@ -387,6 +387,8 @@ export class Table extends PureComponent { const activeActionContents = this.state.activeAction?.render() ?? null; const exceededResultCount = totalItemCount > MAX_PAGINATED_ITEM; + const allHidden = selectedSavedObjects.every(({ meta: { hiddenType } }) => hiddenType); + return ( {activeActionContents} @@ -398,10 +400,12 @@ export class Table extends PureComponent { toolsRight={[ + allHidden ? ( + + ) : undefined } > { iconType="trash" color="danger" onClick={onDelete} - isDisabled={ - selectedSavedObjects.filter( - ({ managed, meta: { hiddenType } }) => !managed && !hiddenType - ).length === 0 || !capabilities.savedObjectsManagement.delete - } + isDisabled={allHidden || !capabilities.savedObjectsManagement.delete} title={ capabilities.savedObjectsManagement.delete ? undefined diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx index e4daf584888c3..e84d957f39239 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx @@ -528,7 +528,7 @@ export class SavedObjectsTable extends Component !object.meta.hiddenType && !object.managed) + .filter((object) => !object.meta.hiddenType) .map(({ id, type }) => ({ id, type })) ); diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index ead61475284a7..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": { @@ -10218,12 +10224,6 @@ "description": "Non-default value of setting." } }, - "labs:dashboard:linksPanel": { - "type": "boolean", - "_meta": { - "description": "Non-default value of setting." - } - }, "discover:showFieldStatistics": { "type": "boolean", "_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/gauge/kibana.jsonc b/src/plugins/vis_types/gauge/kibana.jsonc index 14347a2e62ce3..7897ac6a6a3b1 100644 --- a/src/plugins/vis_types/gauge/kibana.jsonc +++ b/src/plugins/vis_types/gauge/kibana.jsonc @@ -19,6 +19,7 @@ ], "requiredBundles": [ "visDefaultEditor", + "expressionGauge", "kibanaUtils" ], "extraPublicDirs": [ diff --git a/src/plugins/vis_types/gauge/public/__snapshots__/to_ast.test.ts.snap b/src/plugins/vis_types/gauge/public/__snapshots__/to_ast.test.ts.snap index 79af22ed442a7..286bf5c00b88e 100644 --- a/src/plugins/vis_types/gauge/public/__snapshots__/to_ast.test.ts.snap +++ b/src/plugins/vis_types/gauge/public/__snapshots__/to_ast.test.ts.snap @@ -5,14 +5,11 @@ Object { "chain": Array [ Object { "arguments": Object { - "centralMajorMode": Array [ - "custom", - ], "colorMode": Array [ "palette", ], "labelMajorMode": Array [ - "none", + "custom", ], "labelMinor": Array [ "some custom sublabel", diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts index de88fb0a7a866..7e745b127a23a 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.test.ts @@ -9,7 +9,7 @@ import { ColorSchemas } from '@kbn/charts-plugin/common'; import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; import { getConfiguration } from './gauge'; -import { GaugeVisParams } from '../../types'; +import { GaugeType, GaugeVisParams } from '../../types'; const params: GaugeVisParams = { addTooltip: false, @@ -49,35 +49,70 @@ const params: GaugeVisParams = { }; describe('getConfiguration', () => { - const palette = { - name: 'custom', - params: { name: 'custom' }, - type: 'palette', - } as PaletteOutput; + const getPalette = (gaugeType: GaugeType) => + ({ + name: 'custom', + params: { name: 'custom', gaugeType }, + type: 'palette', + } as PaletteOutput); - test('shourd return correct configuration', () => { + test('shourd return correct configuration - Arc', () => { const layerId = 'layer-id'; const metricAccessor = 'metric-id'; const minAccessor = 'min-accessor'; const maxAccessor = 'max-accessor'; expect( - getConfiguration(layerId, params, palette, { + getConfiguration(layerId, params, getPalette('Arc'), { metricAccessor, minAccessor, maxAccessor, }) ).toEqual({ colorMode: 'palette', - labelMajorMode: 'auto', - labelMinor: undefined, + labelMajorMode: 'none', layerId: 'layer-id', layerType: 'data', maxAccessor: 'max-accessor', metricAccessor: 'metric-id', minAccessor: 'min-accessor', - palette: { name: 'custom', params: { name: 'custom' }, type: 'palette' }, - shape: 'horizontalBullet', - ticksPosition: 'bands', + palette: { + name: 'custom', + params: { name: 'custom', gaugeType: 'Arc' }, + type: 'palette', + }, + percentageMode: false, + shape: 'arc', + ticksPosition: 'hidden', + }); + }); + + test('shourd return correct configuration - Circle', () => { + const layerId = 'layer-id'; + const metricAccessor = 'metric-id'; + const minAccessor = 'min-accessor'; + const maxAccessor = 'max-accessor'; + expect( + getConfiguration(layerId, params, getPalette('Circle'), { + metricAccessor, + minAccessor, + maxAccessor, + }) + ).toEqual({ + colorMode: 'palette', + labelMajorMode: 'none', + layerId: 'layer-id', + layerType: 'data', + maxAccessor: 'max-accessor', + metricAccessor: 'metric-id', + minAccessor: 'min-accessor', + palette: { + name: 'custom', + params: { name: 'custom', gaugeType: 'Circle' }, + type: 'palette', + }, + percentageMode: false, + shape: 'arc', + ticksPosition: 'hidden', }); }); }); diff --git a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts index 9da64a38f8811..07ebb947b5764 100644 --- a/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts +++ b/src/plugins/vis_types/gauge/public/convert_to_lens/configurations/gauge.ts @@ -8,6 +8,7 @@ import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; import { GaugeVisConfiguration } from '@kbn/visualizations-plugin/common'; +import { getDefaultGaugeArgsFromParams } from '../../to_ast'; import { GaugeVisParams } from '../../types'; export const getConfiguration = ( @@ -24,18 +25,14 @@ export const getConfiguration = ( maxAccessor: string; } ): GaugeVisConfiguration => { - const showLabels = Boolean(params.gauge.labels.show); return { + ...getDefaultGaugeArgsFromParams(params.gauge), layerId, layerType: 'data', palette, metricAccessor, minAccessor, maxAccessor, - shape: 'horizontalBullet', - ticksPosition: 'bands', - labelMajorMode: 'auto', colorMode: palette ? 'palette' : 'none', - labelMinor: showLabels ? params.gauge.style.subText : undefined, }; }; diff --git a/src/plugins/vis_types/gauge/public/to_ast.ts b/src/plugins/vis_types/gauge/public/to_ast.ts index 8f7576b0b80c4..0109338244ac1 100644 --- a/src/plugins/vis_types/gauge/public/to_ast.ts +++ b/src/plugins/vis_types/gauge/public/to_ast.ts @@ -9,11 +9,20 @@ import { getStopsWithColorsFromRanges } from '@kbn/visualizations-plugin/common/utils'; import { getVisSchemas, SchemaConfig, VisToExpressionAst } from '@kbn/visualizations-plugin/public'; import { buildExpression, buildExpressionFunction } from '@kbn/expressions-plugin/public'; -import type { +import { + GaugeArguments, GaugeExpressionFunctionDefinition, GaugeShape, + GaugeShapes, } from '@kbn/expression-gauge-plugin/common'; -import { GaugeType, GaugeVisParams } from './types'; +import { Gauge, GaugeType, GaugeVisParams } from './types'; + +const gaugeTypeToShape = (type: GaugeType): GaugeShape => { + return { + [GaugeType.Arc]: GaugeShapes.ARC, + [GaugeType.Circle]: GaugeShapes.CIRCLE, + }[type]; +}; const prepareDimension = (params: SchemaConfig) => { const visdimension = buildExpressionFunction('visdimension', { accessor: params.accessor }); @@ -26,30 +35,30 @@ const prepareDimension = (params: SchemaConfig) => { return buildExpression([visdimension]); }; -const gaugeTypeToShape = (type: GaugeType): GaugeShape => { - const arc: GaugeShape = 'arc'; - const circle: GaugeShape = 'circle'; +export const getDefaultGaugeArgsFromParams = ({ + gaugeType, + percentageMode, + scale, + style, + labels, +}: Gauge): GaugeArguments => { + const labelMajorMode = labels.show ? (style.subText ? 'custom' : 'auto') : 'none'; return { - [GaugeType.Arc]: arc, - [GaugeType.Circle]: circle, - }[type]; + shape: gaugeTypeToShape(gaugeType), + ticksPosition: scale.show ? 'auto' : 'hidden', + colorMode: 'palette', + labelMajorMode, + ...(labelMajorMode === 'custom' ? { labelMinor: style.subText } : {}), + percentageMode, + }; }; export const toExpressionAst: VisToExpressionAst = (vis, params) => { const schemas = getVisSchemas(vis, params); - const { - gaugeType, - percentageMode, - percentageFormatPattern, - colorSchema, - colorsRange, - invertColors, - scale, - style, - labels, - } = vis.params.gauge; + const { percentageMode, percentageFormatPattern, colorSchema, colorsRange, invertColors } = + vis.params.gauge; // fix formatter for percentage mode if (percentageMode === true) { @@ -61,18 +70,13 @@ export const toExpressionAst: VisToExpressionAst = (vis, params) }); } - const centralMajorMode = labels.show ? (style.subText ? 'custom' : 'auto') : 'none'; const gauge = buildExpressionFunction('gauge', { - shape: gaugeTypeToShape(gaugeType), + ...getDefaultGaugeArgsFromParams(vis.params.gauge), metric: schemas.metric.map(prepareDimension), - ticksPosition: scale.show ? 'auto' : 'hidden', - labelMajorMode: 'none', - colorMode: 'palette', - centralMajorMode, - ...(centralMajorMode === 'custom' ? { labelMinor: style.subText } : {}), + labelMajor: schemas.metric?.[0]?.label, percentageMode, respectRanges: true, - commonLabel: schemas.metric?.[0]?.label, + commonLabel: schemas.metric.length > 1 ? schemas.metric?.[0]?.label : undefined, }); if (colorsRange && colorsRange.length) { 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/src/plugins/visualizations/common/convert_to_lens/constants.ts b/src/plugins/visualizations/common/convert_to_lens/constants.ts index 00890884fd722..a3e93030177e5 100644 --- a/src/plugins/visualizations/common/convert_to_lens/constants.ts +++ b/src/plugins/visualizations/common/convert_to_lens/constants.ts @@ -108,6 +108,7 @@ export const RANGE_MODES = { export const GaugeShapes = { HORIZONTAL_BULLET: 'horizontalBullet', VERTICAL_BULLET: 'verticalBullet', + SEMI_CIRCLE: 'semiCircle', ARC: 'arc', CIRCLE: 'circle', } as const; diff --git a/src/plugins/visualizations/common/utils/accessors.ts b/src/plugins/visualizations/common/utils/accessors.ts index 5e4e143025dbc..929d0fae7b4b4 100644 --- a/src/plugins/visualizations/common/utils/accessors.ts +++ b/src/plugins/visualizations/common/utils/accessors.ts @@ -16,11 +16,43 @@ const getAccessorByIndex = (accessor: number, columns: Datatable['columns']) => const getAccessorById = (accessor: DatatableColumn['id'], columns: Datatable['columns']) => columns.find((c) => c.id === accessor); -export const findAccessorOrFail = (accessor: string | number, columns: DatatableColumn[]) => { - const foundAccessor = - typeof accessor === 'number' - ? getAccessorByIndex(accessor, columns) - : getAccessorById(accessor, columns); +export function findAccessor( + accessor: string, + columns: DatatableColumn[] +): DatatableColumn | undefined; +export function findAccessor( + accessor: number, + columns: DatatableColumn[] +): number | DatatableColumn | undefined; +export function findAccessor( + // eslint-disable-next-line @typescript-eslint/unified-signatures + accessor: string | number, + columns: DatatableColumn[] +): number | DatatableColumn | undefined; +export function findAccessor( + accessor: string | number, + columns: DatatableColumn[] +): number | DatatableColumn | undefined { + return typeof accessor === 'number' + ? getAccessorByIndex(accessor, columns) + : getAccessorById(accessor, columns); +} + +export function findAccessorOrFail(accessor: string, columns: DatatableColumn[]): DatatableColumn; +export function findAccessorOrFail( + accessor: number, + columns: DatatableColumn[] +): number | DatatableColumn; +export function findAccessorOrFail( + // eslint-disable-next-line @typescript-eslint/unified-signatures + accessor: string | number, + columns: DatatableColumn[] +): number | DatatableColumn; +export function findAccessorOrFail( + accessor: string | number, + columns: DatatableColumn[] +): number | DatatableColumn { + const foundAccessor = findAccessor(accessor, columns); if (foundAccessor === undefined) { throw new Error( @@ -32,7 +64,7 @@ export const findAccessorOrFail = (accessor: string | number, columns: Datatable } return foundAccessor; -}; +} export const getAccessorByDimension = ( dimension: string | ExpressionValueVisDimension, diff --git a/src/plugins/visualizations/common/utils/index.ts b/src/plugins/visualizations/common/utils/index.ts index d960607238394..758e8aca3e3d8 100644 --- a/src/plugins/visualizations/common/utils/index.ts +++ b/src/plugins/visualizations/common/utils/index.ts @@ -9,6 +9,7 @@ export { prepareLogTable } from './prepare_log_table'; export type { Dimension } from './prepare_log_table'; export { + findAccessor, findAccessorOrFail, getAccessorByDimension, validateAccessor, 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/apps/discover/group2/_data_grid_row_height.ts b/test/functional/apps/discover/group2/_data_grid_row_height.ts index d1191eca828ac..0c0c56c510e28 100644 --- a/test/functional/apps/discover/group2/_data_grid_row_height.ts +++ b/test/functional/apps/discover/group2/_data_grid_row_height.ts @@ -19,7 +19,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const defaultSettings = { defaultIndex: 'logstash-*' }; const security = getService('security'); - describe('discover data grid row height', function describeIndexTests() { + // FLAKY: https://github.com/elastic/kibana/issues/179300 + describe.skip('discover data grid row height', function describeIndexTests() { before(async () => { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); await browser.setWindowSize(1200, 2000); diff --git a/test/functional/apps/discover/group4/_runtime_fields_editor.ts b/test/functional/apps/discover/group4/_runtime_fields_editor.ts index b9a956ce0d97b..7c084f64dc72a 100644 --- a/test/functional/apps/discover/group4/_runtime_fields_editor.ts +++ b/test/functional/apps/discover/group4/_runtime_fields_editor.ts @@ -40,6 +40,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }; // Failing: See https://github.com/elastic/kibana/issues/179297 + // FLAKY: https://github.com/elastic/kibana/issues/179310 describe.skip('discover integration with runtime fields editor', function describeIndexTests() { before(async function () { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); diff --git a/test/functional/page_objects/dashboard_page_links.ts b/test/functional/page_objects/dashboard_page_links.ts index 3e1f04ef4c21e..90a56be8a5725 100644 --- a/test/functional/page_objects/dashboard_page_links.ts +++ b/test/functional/page_objects/dashboard_page_links.ts @@ -17,17 +17,6 @@ export class DashboardPageLinks extends FtrService { private readonly testSubjects = this.ctx.getService('testSubjects'); private readonly comboBox = this.ctx.getService('comboBox'); - private readonly header = this.ctx.getPageObject('header'); - private readonly settings = this.ctx.getPageObject('settings'); - - public async toggleLinksLab(value?: boolean) { - this.log.debug(`toggle the links lab setting to ${value}`); - await this.header.clickStackManagement(); - await this.settings.clickKibanaSettings(); - - await this.settings.toggleAdvancedSettingCheckbox('labs:dashboard:linksPanel', value); - } - /* ----------------------------------------------------------- Links panel ----------------------------------------------------------- */ 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 ce1aeae2efb2c..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"], @@ -1358,6 +1364,8 @@ "@kbn/search-api-panels/*": ["packages/kbn-search-api-panels/*"], "@kbn/search-connectors": ["packages/kbn-search-connectors"], "@kbn/search-connectors/*": ["packages/kbn-search-connectors/*"], + "@kbn/search-connectors-plugin": ["x-pack/plugins/search_connectors"], + "@kbn/search-connectors-plugin/*": ["x-pack/plugins/search_connectors/*"], "@kbn/search-errors": ["packages/kbn-search-errors"], "@kbn/search-errors/*": ["packages/kbn-search-errors/*"], "@kbn/search-examples-plugin": ["examples/search_examples"], 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/performance/journeys_e2e/infra_hosts_view.ts b/x-pack/performance/journeys_e2e/infra_hosts_view.ts index d7f2beb661ce3..81d0744d1b859 100644 --- a/x-pack/performance/journeys_e2e/infra_hosts_view.ts +++ b/x-pack/performance/journeys_e2e/infra_hosts_view.ts @@ -29,7 +29,11 @@ export const journey = new Journey({ // wait for table to be loaded await page.waitForSelector(subj('hostsView-table-loaded')); // wait for metric charts to be loaded - await kibanaPage.waitForCharts({ count: 5, timeout: 60000 }); + await kibanaPage.waitForCharts({ + parentLocator: subj('hostsViewKPIGrid'), + count: 5, + timeout: 60000, + }); }) .step('Go to single host asset details view', async ({ page, kibanaPage }) => { // get the links to asset details page @@ -37,5 +41,9 @@ export const journey = new Journey({ // click on the first host in the table to see asset details await hostsTableLinks.first().click(); // wait for metric charts on the asset details view to be loaded - await kibanaPage.waitForCharts({ count: 4, timeout: 60000 }); + await kibanaPage.waitForCharts({ + parentLocator: subj('infraAssetDetailsKPIGrid'), + count: 4, + timeout: 60000, + }); }); 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/components/all_cases/status_filter.test.tsx b/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx index 3dac9d201ced4..66e8eca5b0784 100644 --- a/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx @@ -19,7 +19,8 @@ const LABELS = { inProgress: i18n.STATUS_IN_PROGRESS, }; -describe('StatusFilter', () => { +// FLAKY: https://github.com/elastic/kibana/issues/177334 +describe.skip('StatusFilter', () => { const onChange = jest.fn(); const defaultProps = { selectedOptionKeys: [], 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 dbc9d4fad0081..9277e8c82c080 100644 --- a/x-pack/plugins/enterprise_search/kibana.jsonc +++ b/x-pack/plugins/enterprise_search/kibana.jsonc @@ -24,12 +24,14 @@ "embeddable", "share", "console", + "searchConnectors", "searchPlayground" ], "optionalPlugins": [ "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 80d42ffefe882..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 @@ -34,11 +34,13 @@ export const mockKibanaValues = { isCloudEnabled: false, }, config: { host: 'http://localhost:3002' }, + connectorTypes: [], consolePlugin: {}, data: dataPluginMock.createStartContract(), 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/connector_detail/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx index 26df487caf199..cb6a0f16eea92 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { useActions, useValues } from 'kea'; @@ -34,17 +34,15 @@ import { useCloudDetails } from '../../../shared/cloud_details/cloud_details'; import { docLinks } from '../../../shared/doc_links'; import { generateEncodedPath } from '../../../shared/encode_path_params'; import { HttpLogic } from '../../../shared/http'; +import { KibanaLogic } from '../../../shared/kibana'; import { LicensingLogic } from '../../../shared/licensing'; import { EuiButtonTo, EuiLinkTo } from '../../../shared/react_router_helpers'; import { GenerateConnectorApiKeyApiLogic } from '../../api/connector/generate_connector_api_key_api_logic'; import { CONNECTOR_DETAIL_TAB_PATH } from '../../routes'; import { SyncsContextMenu } from '../search_index/components/header_actions/syncs_context_menu'; import { ApiKeyConfig } from '../search_index/connector/api_key_configuration'; -import { - BETA_CONNECTORS, - CONNECTORS, - getConnectorTemplate, -} from '../search_index/connector/constants'; + +import { getConnectorTemplate } from '../search_index/connector/constants'; import { AttachIndexBox } from './attach_index_box'; import { ConnectorDetailTabId } from './connector_detail'; @@ -58,6 +56,13 @@ export const ConnectorConfiguration: React.FC = () => { const cloudContext = useCloudDetails(); const { hasPlatinumLicense } = useValues(LicensingLogic); const { errorConnectingMessage, http } = useValues(HttpLogic); + + const { connectorTypes } = useValues(KibanaLogic); + const BETA_CONNECTORS = useMemo( + () => connectorTypes.filter(({ isBeta }) => isBeta), + [connectorTypes] + ); + const { fetchConnector, updateConnectorConfiguration } = useActions(ConnectorViewLogic); if (!connector) { @@ -69,7 +74,7 @@ export const ConnectorConfiguration: React.FC = () => { } const hasApiKey = !!(connector.api_key_id ?? apiKeyData); - const docsUrl = CONNECTORS.find( + const docsUrl = connectorTypes.find( ({ serviceType }) => serviceType === connector.service_type )?.docsUrl; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_stats.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_stats.tsx index 0a01b91c9d3d6..09db1326768a0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_stats.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_stats.tsx @@ -6,6 +6,8 @@ */ import React, { ReactNode } from 'react'; +import { useValues } from 'kea'; + import { EuiBadge, EuiFlexGrid, @@ -23,6 +25,7 @@ import { i18n } from '@kbn/i18n'; import { Connector, ConnectorStatus, ElasticsearchIndex } from '@kbn/search-connectors'; import { generateEncodedPath } from '../../../shared/encode_path_params'; +import { KibanaLogic } from '../../../shared/kibana'; import { EuiButtonEmptyTo, EuiButtonTo } from '../../../shared/react_router_helpers'; import { CONNECTOR_DETAIL_TAB_PATH } from '../../routes'; import { @@ -30,8 +33,6 @@ import { connectorStatusToText, } from '../../utils/connector_status_helpers'; -import { CONNECTORS } from '../search_index/connector/constants'; - import { ConnectorDetailTabId } from './connector_detail'; export interface ConnectorStatsProps { @@ -87,7 +88,8 @@ const configureLabel = i18n.translate( ); export const ConnectorStats: React.FC = ({ connector, indexData }) => { - const connectorDefinition = CONNECTORS.find((c) => c.serviceType === connector.service_type); + const { connectorTypes } = useValues(KibanaLogic); + const connectorDefinition = connectorTypes.find((c) => c.serviceType === connector.service_type); return ( @@ -105,9 +107,9 @@ export const ConnectorStats: React.FC = ({ connector, index alignItems="center" justifyContent="spaceBetween" > - {connectorDefinition && connectorDefinition.icon && ( + {connectorDefinition && connectorDefinition.iconPath && ( - + )} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx index 04c49f07b377e..4b9119ba2e5b3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { useValues } from 'kea'; @@ -31,7 +31,6 @@ import { BetaConnectorCallout } from '../../../shared/beta/beta_connector_callou import { docLinks } from '../../../shared/doc_links'; import { generateEncodedPath } from '../../../shared/encode_path_params'; import { HttpLogic } from '../../../shared/http'; -import { CONNECTOR_ICONS } from '../../../shared/icons/connector_icons'; import { KibanaLogic } from '../../../shared/kibana'; import { EuiButtonTo } from '../../../shared/react_router_helpers'; @@ -41,7 +40,6 @@ import { hasConfiguredConfiguration } from '../../utils/has_configured_configura import { SyncsContextMenu } from '../search_index/components/header_actions/syncs_context_menu'; import { ApiKeyConfig } from '../search_index/connector/api_key_configuration'; -import { BETA_CONNECTORS, NATIVE_CONNECTORS } from '../search_index/connector/constants'; import { ConvertConnector } from '../search_index/connector/native_connector_configuration/convert_connector'; import { NativeConnectorConfigurationConfig } from '../search_index/connector/native_connector_configuration/native_connector_configuration_config'; import { ResearchConfiguration } from '../search_index/connector/native_connector_configuration/research_configuration'; @@ -52,10 +50,16 @@ import { ConnectorViewLogic } from './connector_view_logic'; export const NativeConnectorConfiguration: React.FC = () => { const { connector } = useValues(ConnectorViewLogic); - const { config } = useValues(KibanaLogic); + const { config, connectorTypes: connectors } = useValues(KibanaLogic); const { errorConnectingMessage } = useValues(HttpLogic); const { data: apiKeyData } = useValues(GenerateConnectorApiKeyApiLogic); + const NATIVE_CONNECTORS = useMemo( + () => connectors.filter(({ isNative }) => isNative), + [connectors] + ); + const BETA_CONNECTORS = useMemo(() => connectors.filter(({ isBeta }) => isBeta), [connectors]); + if (!connector) { return <>; } @@ -66,7 +70,6 @@ export const NativeConnectorConfiguration: React.FC = () => { docsUrl: '', externalAuthDocsUrl: '', externalDocsUrl: '', - icon: CONNECTOR_ICONS.custom, iconPath: 'custom.svg', isBeta: true, isNative: true, @@ -82,7 +85,7 @@ export const NativeConnectorConfiguration: React.FC = () => { connector.scheduling.full.enabled || connector.scheduling.incremental.enabled; const hasResearched = hasDescription || hasConfigured || hasConfiguredAdvanced; - const icon = nativeConnector.icon; + const iconPath = nativeConnector.iconPath; const hasDocumentLevelSecurity = connector.features?.[FeatureName.DOCUMENT_LEVEL_SECURITY]?.enabled || false; @@ -100,9 +103,9 @@ export const NativeConnectorConfiguration: React.FC = () => { - {icon && ( + {iconPath && ( - + )} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connector_type.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connector_type.tsx index ac68551af5ebe..ae07ebe05f96a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connector_type.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connector_type.tsx @@ -7,25 +7,28 @@ import React from 'react'; +import { useValues } from 'kea'; + import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { CRAWLER_SERVICE_TYPE } from '@kbn/search-connectors'; -import { CONNECTORS } from '../search_index/connector/constants'; +import { KibanaLogic } from '../../../shared/kibana'; export interface ConnectorTypeProps { serviceType: string; } export const ConnectorType: React.FC = ({ serviceType }) => { - const connector = CONNECTORS.find((c) => c.serviceType === serviceType); + const { connectorTypes } = useValues(KibanaLogic); + const connector = connectorTypes.find((c) => c.serviceType === serviceType); return ( - {connector && connector.icon && ( + {connector && connector.iconPath && ( - + )} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_description_badge_popout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_description_badge_popout.tsx index 7b1d9bbee5e95..f4af323ab034d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_description_badge_popout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_description_badge_popout.tsx @@ -17,7 +17,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import connectorLogo from '../../../../../assets/source_icons/network_drive.svg'; +import connectorLogo from '../../../../../assets/images/connector_logo_network_drive_version.svg'; const nativePopoverPanels = [ { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/select_connector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/select_connector.tsx index c7421a95e9a3d..dbbdd49f07914 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/select_connector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/select_connector.tsx @@ -36,7 +36,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { CONNECTOR_CLIENTS_TYPE, CONNECTOR_NATIVE_TYPE } from '../../../../../../common/constants'; -import connectorLogo from '../../../../../assets/source_icons/network_drive.svg'; +import connectorLogo from '../../../../../assets/images/connector_logo_network_drive_version.svg'; import { BACK_BUTTON_LABEL } from '../../../../shared/constants'; import { KibanaLogic } from '../../../../shared/kibana'; @@ -46,8 +46,6 @@ import { parseQueryParams } from '../../../../shared/query_params'; import { NEW_CONNECTOR_PATH, NEW_INDEX_PATH } from '../../../routes'; import { EnterpriseSearchContentPageTemplate } from '../../layout'; -import { CONNECTORS } from '../../search_index/connector/constants'; - import { connectorsBreadcrumbs } from '../connectors'; import { ConnectorCheckable } from './connector_checkable'; @@ -69,7 +67,7 @@ export const parseConnectorFilter = (filter: string | string[] | null): Connecto export const SelectConnector: React.FC = () => { const { search } = useLocation(); - const { isCloud } = useValues(KibanaLogic); + const { connectorTypes, isCloud } = useValues(KibanaLogic); const { hasPlatinumLicense } = useValues(LicensingLogic); const hasNativeAccess = isCloud; const { filter } = parseQueryParams(search); @@ -83,18 +81,18 @@ export const SelectConnector: React.FC = () => { const [searchTerm, setSearchTerm] = useState(''); const filteredConnectors = useMemo(() => { const nativeConnectors = hasNativeAccess - ? CONNECTORS.filter((connector) => connector.isNative).sort((a, b) => - a.name.localeCompare(b.name) - ) + ? connectorTypes + .filter((connector) => connector.isNative) + .sort((a, b) => a.name.localeCompare(b.name)) : []; const nonNativeConnectors = hasNativeAccess - ? CONNECTORS.filter((connector) => !connector.isNative).sort((a, b) => - a.name.localeCompare(b.name) - ) - : CONNECTORS.sort((a, b) => a.name.localeCompare(b.name)); + ? connectorTypes + .filter((connector) => !connector.isNative) + .sort((a, b) => a.name.localeCompare(b.name)) + : connectorTypes.sort((a, b) => a.name.localeCompare(b.name)); const connectors = !hasNativeAccess || useClientsFilter - ? CONNECTORS.sort((a, b) => a.name.localeCompare(b.name)) + ? connectorTypes.sort((a, b) => a.name.localeCompare(b.name)) : [...nativeConnectors, ...nonNativeConnectors]; return connectors @@ -141,7 +139,7 @@ export const SelectConnector: React.FC = () => { {hasNativeAccess && ( setSelectedConnectorFilter(null)} > @@ -155,7 +153,7 @@ export const SelectConnector: React.FC = () => { {hasNativeAccess && ( connector.isNative).length} + quantity={connectorTypes.filter((connector) => connector.isNative).length} isSelected={useNativeFilter} onClick={() => setSelectedConnectorFilter(!useNativeFilter ? CONNECTOR_NATIVE_TYPE : null) @@ -171,7 +169,7 @@ export const SelectConnector: React.FC = () => { )} setSelectedConnectorFilter(!useClientsFilter ? CONNECTOR_CLIENTS_TYPE : null) @@ -187,7 +185,7 @@ export const SelectConnector: React.FC = () => { {!hasNativeAccess && ( connector.isNative).length} + quantity={connectorTypes.filter((connector) => connector.isNative).length} isSelected={useNativeFilter} onClick={() => setSelectedConnectorFilter(!useNativeFilter ? CONNECTOR_NATIVE_TYPE : null) @@ -319,7 +317,7 @@ export const SelectConnector: React.FC = () => { showNativePopover={(!hasNativeAccess && useNativeFilter) ?? false} showLicensePopover={connector.platinumOnly && !hasPlatinumLicense && !isCloud} isDisabled={(!hasNativeAccess && useNativeFilter) ?? false} - iconType={connector.icon} + iconType={connector.iconPath} isBeta={connector.isBeta} isTechPreview={Boolean(connector.isTechPreview)} showNativeBadge={ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/method_connector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/method_connector.tsx index b64b0a84a063b..b7d38da28bcec 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/method_connector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/method_connector.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useEffect } from 'react'; +import React, { useEffect, useMemo } from 'react'; import { useActions, useValues } from 'kea'; @@ -22,7 +22,6 @@ import { import { AddConnectorApiLogic } from '../../../api/connector/add_connector_api_logic'; import { FetchCloudHealthApiLogic } from '../../../api/stats/fetch_cloud_health_api_logic'; -import { BETA_CONNECTORS, NATIVE_CONNECTORS } from '../../search_index/connector/constants'; import { errorToText } from '../utils/error_to_text'; @@ -40,8 +39,16 @@ export const MethodConnector: React.FC = ({ }) => { const { apiReset, makeRequest } = useActions(AddConnectorLogic); const { error, status } = useValues(AddConnectorApiLogic); - const { isCloud } = useValues(KibanaLogic); + const { connectorTypes, isCloud } = useValues(KibanaLogic); const { hasPlatinumLicense } = useValues(LicensingLogic); + const NATIVE_CONNECTORS = useMemo( + () => connectorTypes.filter(({ isNative }) => isNative), + [connectorTypes] + ); + const BETA_CONNECTORS = useMemo( + () => connectorTypes.filter(({ isBeta }) => isBeta), + [connectorTypes] + ); const isNativeAvailable = Boolean(NATIVE_CONNECTORS.find((connector) => connector.serviceType === serviceType)) && diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/new_search_index_page.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/new_search_index_page.tsx index e80168ab079cf..56ce81695c0af 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/new_search_index_page.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/new_search_index_page.tsx @@ -9,20 +9,24 @@ import React from 'react'; import { useLocation } from 'react-router-dom'; +import { useValues } from 'kea'; + import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { ConnectorDefinition } from '@kbn/search-connectors-plugin/public'; + import { CONNECTOR_CLIENTS_TYPE, CONNECTOR_NATIVE_TYPE, INGESTION_METHOD_IDS, } from '../../../../../common/constants'; +import { KibanaLogic } from '../../../shared/kibana'; import { parseQueryParams } from '../../../shared/query_params'; import { connectorsBreadcrumbs, crawlersBreadcrumbs } from '../connectors/connectors'; import { EnterpriseSearchContentPageTemplate } from '../layout/page_template'; -import { CONNECTORS } from '../search_index/connector/constants'; import { baseBreadcrumbs } from '../search_indices'; import { MethodApi } from './method_api/method_api'; @@ -30,7 +34,11 @@ import { MethodConnector } from './method_connector/method_connector'; import { MethodCrawler } from './method_crawler/method_crawler'; import { getIngestionMethodIconType } from './utils'; -function getTitle(method: string, serviceType: string): string { +function getTitle( + method: string, + serviceType: string, + connectorTypes: ConnectorDefinition[] +): string { switch (method) { case INGESTION_METHOD_IDS.API: return i18n.translate('xpack.enterpriseSearch.content.new_index.apiTitle', { @@ -38,7 +46,7 @@ function getTitle(method: string, serviceType: string): string { }); case INGESTION_METHOD_IDS.CONNECTOR: { const connector = - Boolean(serviceType) && CONNECTORS.find((item) => item.serviceType === serviceType); + Boolean(serviceType) && connectorTypes.find((item) => item.serviceType === serviceType); return connector ? i18n.translate('xpack.enterpriseSearch.content.new_index.connectorTitleWithServiceType', { defaultMessage: 'New {name} connector', @@ -96,11 +104,15 @@ const parseIsNativeParam = (queryString: string | string[] | null): boolean | un return undefined; }; -const getBreadcrumb = (method: string, serviceType: string): string[] => { +const getBreadcrumb = ( + method: string, + serviceType: string, + connectorTypes: ConnectorDefinition[] +): string[] => { switch (method) { case INGESTION_METHOD_IDS.CONNECTOR: const connector = - Boolean(serviceType) && CONNECTORS.find((item) => item.serviceType === serviceType); + Boolean(serviceType) && connectorTypes.find((item) => item.serviceType === serviceType); const thisConnectorBreadcrumb = connector ? i18n.translate( @@ -160,6 +172,7 @@ export interface NewSearchIndexPageProps { type: string; } export const NewSearchIndexPage: React.FC = ({ type }) => { + const { connectorTypes } = useValues(KibanaLogic); const { search } = useLocation(); const { service_type: inputServiceType, connector_type: inputConnectorType } = parseQueryParams(search); @@ -171,7 +184,7 @@ export const NewSearchIndexPage: React.FC = ({ type }) return ( = ({ type }) - {getTitle(type, serviceType)} + {getTitle(type, serviceType, connectorTypes)} {type === INGESTION_METHOD_IDS.CONNECTOR && ( {getConnectorModeBadge(isNative)} )} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts index 397b959ae8f7f..08a47b9a1b097 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts @@ -7,226 +7,8 @@ import dedent from 'dedent'; -import { CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; - -import { docLinks } from '../../../../shared/doc_links'; -import { CONNECTOR_ICONS } from '../../../../shared/icons/connector_icons'; import { ApiKey } from '../../../api/connector/generate_connector_api_key_api_logic'; -import { ConnectorClientSideDefinition } from './types'; - -export const CONNECTORS_DICT: Record = { - azure_blob_storage: { - docsUrl: docLinks.connectorsAzureBlobStorage, - externalAuthDocsUrl: 'https://learn.microsoft.com/azure/storage/common/authorize-data-access', - externalDocsUrl: 'https://learn.microsoft.com/azure/storage/blobs/', - icon: CONNECTOR_ICONS.azure_blob_storage, - platinumOnly: true, - }, - box: { - docsUrl: docLinks.connectorsBox, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.box, - platinumOnly: true, - }, - confluence: { - docsUrl: docLinks.connectorsConfluence, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.confluence_cloud, - platinumOnly: true, - }, - custom: { - docsUrl: docLinks.connectors, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.custom, - }, - dropbox: { - docsUrl: docLinks.connectorsDropbox, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.dropbox, - platinumOnly: true, - }, - github: { - docsUrl: docLinks.connectorsGithub, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.github, - platinumOnly: true, - }, - gmail: { - docsUrl: docLinks.connectorsGmail, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.gmail, - platinumOnly: true, - }, - google_cloud_storage: { - docsUrl: docLinks.connectorsGoogleCloudStorage, - externalAuthDocsUrl: 'https://cloud.google.com/storage/docs/authentication', - externalDocsUrl: 'https://cloud.google.com/storage/docs', - icon: CONNECTOR_ICONS.google_cloud_storage, - platinumOnly: true, - }, - google_drive: { - docsUrl: docLinks.connectorsGoogleDrive, - externalAuthDocsUrl: 'https://cloud.google.com/iam/docs/service-account-overview', - externalDocsUrl: 'https://developers.google.com/drive', - icon: CONNECTOR_ICONS.google_drive, - platinumOnly: true, - }, - jira: { - docsUrl: docLinks.connectorsJira, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.jira_cloud, - platinumOnly: true, - }, - microsoft_teams: { - docsUrl: docLinks.connectorsTeams, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.teams, - platinumOnly: true, - }, - mongodb: { - docsUrl: docLinks.connectorsMongoDB, - externalAuthDocsUrl: 'https://www.mongodb.com/docs/atlas/app-services/authentication/', - externalDocsUrl: 'https://www.mongodb.com/docs/', - icon: CONNECTOR_ICONS.mongodb, - platinumOnly: true, - }, - mssql: { - docsUrl: docLinks.connectorsMicrosoftSQL, - externalAuthDocsUrl: - 'https://learn.microsoft.com/sql/relational-databases/security/authentication-access/getting-started-with-database-engine-permissions', - externalDocsUrl: 'https://learn.microsoft.com/sql/', - icon: CONNECTOR_ICONS.microsoft_sql, - platinumOnly: true, - }, - mysql: { - docsUrl: docLinks.connectorsMySQL, - externalDocsUrl: 'https://dev.mysql.com/doc/', - icon: CONNECTOR_ICONS.mysql, - platinumOnly: true, - }, - network_drive: { - docsUrl: docLinks.connectorsNetworkDrive, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.network_drive, - platinumOnly: true, - }, - notion: { - docsUrl: docLinks.connectorsNotion, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.notion, - platinumOnly: true, - }, - onedrive: { - docsUrl: docLinks.connectorsOneDrive, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.onedrive, - platinumOnly: true, - }, - oracle: { - docsUrl: docLinks.connectorsOracle, - externalAuthDocsUrl: - 'https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html', - externalDocsUrl: 'https://docs.oracle.com/database/oracle/oracle-database/', - icon: CONNECTOR_ICONS.oracle, - platinumOnly: true, - }, - outlook: { - docsUrl: docLinks.connectorsOutlook, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.outlook, - platinumOnly: true, - }, - postgresql: { - docsUrl: docLinks.connectorsPostgreSQL, - externalAuthDocsUrl: 'https://www.postgresql.org/docs/15/auth-methods.html', - externalDocsUrl: 'https://www.postgresql.org/docs/', - icon: CONNECTOR_ICONS.postgresql, - platinumOnly: true, - }, - redis: { - docsUrl: docLinks.connectorsRedis, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.redis, - platinumOnly: true, - }, - s3: { - docsUrl: docLinks.connectorsS3, - externalAuthDocsUrl: 'https://docs.aws.amazon.com/s3/index.html', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.amazon_s3, - platinumOnly: true, - }, - salesforce: { - docsUrl: docLinks.connectorsSalesforce, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.salesforce, - platinumOnly: true, - }, - servicenow: { - docsUrl: docLinks.connectorsServiceNow, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.servicenow, - platinumOnly: true, - }, - sharepoint_online: { - docsUrl: docLinks.connectorsSharepointOnline, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.sharepoint_online, - platinumOnly: true, - }, - sharepoint_server: { - docsUrl: docLinks.connectorsSharepoint, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.sharepoint, - platinumOnly: true, - }, - slack: { - docsUrl: docLinks.connectorsSlack, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.slack, - platinumOnly: true, - }, - zoom: { - docsUrl: docLinks.connectorsZoom, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.zoom, - platinumOnly: true, - }, -}; - -export const CONNECTORS = CONNECTOR_DEFINITIONS.map((connector) => ({ - ...connector, - ...(connector.serviceType && CONNECTORS_DICT[connector.serviceType] - ? CONNECTORS_DICT[connector.serviceType] - : CONNECTORS_DICT.custom), -})); - -export const CUSTOM_CONNECTORS = CONNECTORS.filter(({ isNative }) => !isNative); - -export const NATIVE_CONNECTORS = CONNECTORS.filter(({ isNative }) => isNative); - -export const BETA_CONNECTORS = CONNECTORS.filter(({ isBeta }) => isBeta); - export const getConnectorTemplate = ({ apiKeyData, connectorData, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx index 14da52928b957..8d7b85123f520 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx @@ -17,6 +17,8 @@ import { Connector, ConnectorStatus } from '@kbn/search-connectors'; import { ConnectorConfigurationComponent } from '@kbn/search-connectors/components/configuration/connector_configuration'; +import { ConnectorDefinition } from '@kbn/search-connectors-plugin/common/types'; + import { Status } from '../../../../../../../common/types/api'; import { docLinks } from '../../../../../shared/doc_links'; @@ -24,7 +26,6 @@ import { HttpLogic } from '../../../../../shared/http'; import { LicensingLogic } from '../../../../../shared/licensing'; import { ConnectorConfigurationApiLogic } from '../../../../api/connector/update_connector_configuration_api_logic'; -import { ConnectorDefinition } from '../types'; interface NativeConnectorConfigurationConfigProps { connector: Connector; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/research_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/research_configuration.tsx index 8f32044356a68..993c7b9e1ac0b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/research_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/research_configuration.tsx @@ -11,7 +11,7 @@ import { EuiText, EuiSpacer, EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic import { i18n } from '@kbn/i18n'; -import { ConnectorDefinition } from '../types'; +import { ConnectorDefinition } from '@kbn/search-connectors-plugin/common/types'; interface ResearchConfigurationProps { nativeConnector: ConnectorDefinition; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector_total_stats.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector_total_stats.tsx index 2fceb211c86c4..20adba6d298a5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector_total_stats.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector_total_stats.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { useValues } from 'kea'; @@ -19,18 +19,23 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { KibanaLogic } from '../../../shared/kibana'; import { isConnectorIndex } from '../../utils/indices'; import { languageToText } from '../../utils/language_to_text'; import { ConnectorOverviewPanels } from './connector/connector_overview_panels'; -import { NATIVE_CONNECTORS } from './connector/constants'; import { NameAndDescriptionStats } from './name_and_description_stats'; import { OverviewLogic } from './overview.logic'; export const ConnectorTotalStats: React.FC = () => { const { indexData, isError, isLoading } = useValues(OverviewLogic); + const { connectorTypes } = useValues(KibanaLogic); const hideStats = isLoading || isError; + const NATIVE_CONNECTORS = useMemo( + () => connectorTypes.filter(({ isNative }) => isNative), + [connectorTypes] + ); if (!isConnectorIndex(indexData)) { return <>; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.ts index 762ba90e3b319..20e9e23bef251 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.ts @@ -251,6 +251,7 @@ export const AddDomainLogic = kea { to={generateEncodedPath(SEARCH_INDEX_CRAWLER_DOMAIN_DETAIL_PATH, { domainId: domain.id, indexName, + tabId: 'domain_management', })} > {domain.url} @@ -95,6 +96,7 @@ export const DomainsTable: React.FC = () => { generateEncodedPath(SEARCH_INDEX_CRAWLER_DOMAIN_DETAIL_PATH, { domainId: domain.id, indexName, + tabId: 'domain_management', }) ); }, 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/enterprise_search_content/components/search_index/indices/indices_nav.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/indices/indices_nav.tsx index 461c150710307..c3e754bdd9b62 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/indices/indices_nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/indices/indices_nav.tsx @@ -154,6 +154,7 @@ export const useIndicesNav = () => { } ), ...generateNavLink({ + shouldShowActiveForSubroutes: true, to: generateEncodedPath(SEARCH_INDEX_TAB_PATH, { indexName, tabId: SearchIndexTabId.DOMAIN_MANAGEMENT, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/routes.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/routes.ts index 902870752035c..9ce2d02db36d6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/routes.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/routes.ts @@ -29,7 +29,7 @@ export const NEW_INDEX_SELECT_CONNECTOR_CLIENTS_PATH = `${CONNECTORS_PATH}/selec export const SEARCH_INDEX_PATH = `${SEARCH_INDICES_PATH}/:indexName`; export const SEARCH_INDEX_TAB_PATH = `${SEARCH_INDEX_PATH}/:tabId`; export const SEARCH_INDEX_TAB_DETAIL_PATH = `${SEARCH_INDEX_TAB_PATH}/:detailId`; -export const SEARCH_INDEX_CRAWLER_DOMAIN_DETAIL_PATH = `${SEARCH_INDEX_PATH}/domain_management/:domainId`; +export const SEARCH_INDEX_CRAWLER_DOMAIN_DETAIL_PATH = `${SEARCH_INDEX_TAB_PATH}/:domainId`; export const OLD_SEARCH_INDEX_CRAWLER_DOMAIN_DETAIL_PATH = `${SEARCH_INDEX_PATH}/crawler/domains/:domainId`; export const ML_MANAGE_TRAINED_MODELS_PATH = '/app/ml/trained_models'; 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 d4a21f4cd6c36..6e2de90ee1f1d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.test.tsx @@ -5,6 +5,8 @@ * 2.0. */ +import { searchConnectorsMock } from '@kbn/search-connectors-plugin/public/plugin.mock'; + import React from 'react'; import { act } from '@testing-library/react'; @@ -39,8 +41,12 @@ describe('renderApp', () => { charts: chartPluginMock.createStartContract(), data: dataPluginMock.createStartContract(), guidedOnboarding: guidedOnboardingMock.createStart(), + indexManagement: { + getIndexMappingComponent: jest.fn(), + }, lens: lensPluginMock.createStartContract(), licensing: licensingMock.createStart(), + searchConnectors: searchConnectorsMock.createStart(), security: securityMock.createStart(), share: sharePluginMock.createStartContract(), ml: mlPluginMock.createStartContract(), diff --git a/x-pack/plugins/enterprise_search/public/applications/index.tsx b/x-pack/plugins/enterprise_search/public/applications/index.tsx index 77fc9f181db3f..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,9 @@ export const renderApp = ( } catch { user = null; } + const indexMappingComponent = indexManagementPlugin.getIndexMappingComponent({ history }); + + const connectorTypes = plugins.searchConnectors?.getConnectorTypes() || []; const unmountKibanaLogic = mountKibanaLogic({ application, @@ -106,11 +118,13 @@ export const renderApp = ( charts, cloud, config, + connectorTypes, console: plugins.console, - esConfig, data: plugins.data, + esConfig, guidedOnboarding, history, + indexMappingComponent, isSidebarEnabled, lens, ml, diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/icons/connector_icons.ts b/x-pack/plugins/enterprise_search/public/applications/shared/icons/connector_icons.ts deleted file mode 100644 index 1c1bd168f8e1f..0000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/shared/icons/connector_icons.ts +++ /dev/null @@ -1,66 +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 azure_blob_storage from '../../../assets/source_icons/azure_blob_storage.svg'; -import box from '../../../assets/source_icons/box.svg'; -import confluence_cloud from '../../../assets/source_icons/confluence_cloud.svg'; -import custom from '../../../assets/source_icons/custom.svg'; -import dropbox from '../../../assets/source_icons/dropbox.svg'; -import github from '../../../assets/source_icons/github.svg'; -import gmail from '../../../assets/source_icons/gmail.svg'; -import google_cloud_storage from '../../../assets/source_icons/google_cloud_storage.svg'; -import google_drive from '../../../assets/source_icons/google_drive.svg'; -import jira_cloud from '../../../assets/source_icons/jira_cloud.svg'; -import mongodb from '../../../assets/source_icons/mongodb.svg'; -import microsoft_sql from '../../../assets/source_icons/mssql.svg'; -import mysql from '../../../assets/source_icons/mysql.svg'; -import network_drive from '../../../assets/source_icons/network_drive.svg'; -import notion from '../../../assets/source_icons/notion.svg'; -import onedrive from '../../../assets/source_icons/onedrive.svg'; -import oracle from '../../../assets/source_icons/oracle.svg'; -import outlook from '../../../assets/source_icons/outlook.svg'; -import postgresql from '../../../assets/source_icons/postgresql.svg'; -import redis from '../../../assets/source_icons/redis.svg'; -import amazon_s3 from '../../../assets/source_icons/s3.svg'; -import salesforce from '../../../assets/source_icons/salesforce.svg'; -import servicenow from '../../../assets/source_icons/servicenow.svg'; -import sharepoint from '../../../assets/source_icons/sharepoint.svg'; -import sharepoint_online from '../../../assets/source_icons/sharepoint_online.svg'; -import slack from '../../../assets/source_icons/slack.svg'; -import teams from '../../../assets/source_icons/teams.svg'; -import zoom from '../../../assets/source_icons/zoom.svg'; - -export const CONNECTOR_ICONS = { - amazon_s3, - azure_blob_storage, - box, - confluence_cloud, - custom, - dropbox, - github, - gmail, - google_cloud_storage, - google_drive, - jira_cloud, - microsoft_sql, - mongodb, - mysql, - network_drive, - notion, - onedrive, - oracle, - outlook, - postgresql, - redis, - salesforce, - servicenow, - sharepoint, - sharepoint_online, - slack, - teams, - zoom, -}; 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 12088c50ab88e..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,9 +22,11 @@ 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'; +import { ConnectorDefinition } from '@kbn/search-connectors-plugin/public'; import { SearchPlaygroundPluginStart } from '@kbn/search-playground/public'; import { AuthenticatedUser, SecurityPluginStart } from '@kbn/security-plugin/public'; import { SharePluginStart } from '@kbn/share-plugin/public'; @@ -44,11 +46,13 @@ export interface KibanaLogicProps { charts: ChartsPluginStart; cloud?: CloudSetup; config: ClientConfigType; + connectorTypes: ConnectorDefinition[]; console?: ConsolePluginStart; data: DataPublicPluginStart; esConfig: ESConfig; guidedOnboarding?: GuidedOnboardingPluginStart; history: ScopedHistory; + indexMappingComponent: React.FC; isSidebarEnabled: boolean; lens: LensPublicStart; ml: MlPluginStart; @@ -83,11 +87,13 @@ export const KibanaLogic = kea>({ charts: [props.charts, {}], cloud: [props.cloud || {}, {}], config: [props.config || {}, {}], + connectorTypes: [props.connectorTypes || [], {}], consolePlugin: [props.console || {}, {}], data: [props.data, {}], 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 86eeb909480f2..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 @@ -48,12 +48,16 @@ export const mockKibanaProps: KibanaLogicProps = { enabled: true, }, }, + connectorTypes: [], data: dataPluginMock.createStartContract(), esConfig: { elasticsearch_host: 'https://your_deployment_url', }, guidedOnboarding: {}, history: mockHistory, + indexMappingComponent: () => { + return <>; + }, isSidebarEnabled: true, lens: { EmbeddableComponent: jest.fn(), diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/network_drive.svg b/x-pack/plugins/enterprise_search/public/assets/images/connector_logo_network_drive_version.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/network_drive.svg rename to x-pack/plugins/enterprise_search/public/assets/images/connector_logo_network_drive_version.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/index.svg b/x-pack/plugins/enterprise_search/public/assets/images/index.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/index.svg rename to x-pack/plugins/enterprise_search/public/assets/images/index.svg diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts index 81884546e44f4..87f6476b1ac2b 100644 --- a/x-pack/plugins/enterprise_search/public/plugin.ts +++ b/x-pack/plugins/enterprise_search/public/plugin.ts @@ -21,10 +21,12 @@ 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'; import { ELASTICSEARCH_URL_PLACEHOLDER } from '@kbn/search-api-panels/constants'; +import { SearchConnectorsPluginStart } from '@kbn/search-connectors-plugin/public'; import { SearchPlaygroundPluginStart } from '@kbn/search-playground/public'; import { SecurityPluginSetup, SecurityPluginStart } from '@kbn/security-plugin/public'; import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; @@ -71,9 +73,11 @@ export interface PluginsStart { console?: ConsolePluginStart; data: DataPublicPluginStart; guidedOnboarding: GuidedOnboardingPluginStart; + indexManagement: IndexManagementPluginStart; lens: LensPublicStart; licensing: LicensingPluginStart; ml: MlPluginStart; + searchConnectors: SearchConnectorsPluginStart; searchPlayground: SearchPlaygroundPluginStart; security: SecurityPluginStart; share: SharePluginStart; diff --git a/x-pack/plugins/enterprise_search/server/integrations.ts b/x-pack/plugins/enterprise_search/server/integrations.ts index 7c90aa8627ef4..82320ccd852f4 100644 --- a/x-pack/plugins/enterprise_search/server/integrations.ts +++ b/x-pack/plugins/enterprise_search/server/integrations.ts @@ -4,20 +4,17 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import type { HttpServiceSetup } from '@kbn/core/server'; - import type { CustomIntegrationsPluginSetup } from '@kbn/custom-integrations-plugin/server'; import { i18n } from '@kbn/i18n'; - -import { CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; +import { ConnectorServerSideDefinition } from '@kbn/search-connectors-plugin/server'; import { ConfigType } from '.'; export const registerEnterpriseSearchIntegrations = ( config: ConfigType, - http: HttpServiceSetup, customIntegrations: CustomIntegrationsPluginSetup, - isCloud: boolean + isCloud: boolean, + connectors: ConnectorServerSideDefinition[] ) => { const nativeSearchTag = config.hasNativeConnectors && isCloud ? ['native_search'] : []; if (config.canDeployEntSearch) { @@ -85,7 +82,7 @@ export const registerEnterpriseSearchIntegrations = ( }); if (config.hasConnectors) { - CONNECTOR_DEFINITIONS.forEach((connector) => { + connectors.forEach((connector) => { const connectorType = connector.isNative && isCloud ? 'native' : 'connector_client'; const categories = connector.isNative ? [...(connector.categories || []), ...nativeSearchTag] @@ -96,9 +93,7 @@ export const registerEnterpriseSearchIntegrations = ( description: connector.description || '', icons: [ { - src: http.basePath.prepend( - `/plugins/enterpriseSearch/assets/source_icons/${connector.iconPath}` - ), + src: connector.iconPath, type: 'svg', }, ], diff --git a/x-pack/plugins/enterprise_search/server/plugin.ts b/x-pack/plugins/enterprise_search/server/plugin.ts index 73574f1b98d03..6e8e5e43c8fa9 100644 --- a/x-pack/plugins/enterprise_search/server/plugin.ts +++ b/x-pack/plugins/enterprise_search/server/plugin.ts @@ -23,6 +23,7 @@ import { GlobalSearchPluginSetup } from '@kbn/global-search-plugin/server'; import type { GuidedOnboardingPluginSetup } from '@kbn/guided-onboarding-plugin/server'; import { LogsSharedPluginSetup } from '@kbn/logs-shared-plugin/server'; import type { MlPluginSetup } from '@kbn/ml-plugin/server'; +import { SearchConnectorsPluginSetup } from '@kbn/search-connectors-plugin/server'; import { SecurityPluginSetup, SecurityPluginStart } from '@kbn/security-plugin/server'; import { SpacesPluginStart } from '@kbn/spaces-plugin/server'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; @@ -93,6 +94,7 @@ interface PluginsSetup { guidedOnboarding?: GuidedOnboardingPluginSetup; logsShared: LogsSharedPluginSetup; ml?: MlPluginSetup; + searchConnectors?: SearchConnectorsPluginSetup; security: SecurityPluginSetup; usageCollection?: UsageCollectionSetup; } @@ -147,6 +149,7 @@ export class EnterpriseSearchPlugin implements Plugin { ml, guidedOnboarding, cloud, + searchConnectors, }: PluginsSetup ) { this.globalConfigService.setup(elasticsearch.legacy.config$, cloud); @@ -163,7 +166,12 @@ export class EnterpriseSearchPlugin implements Plugin { const isCloud = !!cloud.cloudId; if (customIntegrations) { - registerEnterpriseSearchIntegrations(config, http, customIntegrations, isCloud); + registerEnterpriseSearchIntegrations( + config, + customIntegrations, + isCloud, + searchConnectors?.getConnectorTypes() || [] + ); } /* @@ -343,8 +351,15 @@ export class EnterpriseSearchPlugin implements Plugin { */ if (globalSearch) { - globalSearch.registerResultProvider(getSearchResultProvider(http.basePath, config, isCloud)); - globalSearch.registerResultProvider(getIndicesSearchResultProvider(http.basePath)); + globalSearch.registerResultProvider( + getSearchResultProvider( + config, + searchConnectors?.getConnectorTypes() || [], + isCloud, + http.staticAssets.getPluginAssetHref('images/crawler.svg') + ) + ); + globalSearch.registerResultProvider(getIndicesSearchResultProvider(http.staticAssets)); } } diff --git a/x-pack/plugins/enterprise_search/server/utils/indices_search_result_provider.test.ts b/x-pack/plugins/enterprise_search/server/utils/indices_search_result_provider.test.ts index facae46be72a4..cd1e0fde4706e 100644 --- a/x-pack/plugins/enterprise_search/server/utils/indices_search_result_provider.test.ts +++ b/x-pack/plugins/enterprise_search/server/utils/indices_search_result_provider.test.ts @@ -14,11 +14,11 @@ import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../common/constants'; import { getIndicesSearchResultProvider } from './indices_search_result_provider'; describe('Enterprise Search - indices search provider', () => { - const basePathMock = { - prepend: (input: string) => `/kbn${input}`, + const staticAssetsMock = { + getPluginAssetHref: (input: string) => `/kbn/${input}`, } as any; - const indicesSearchResultProvider = getIndicesSearchResultProvider(basePathMock); + const indicesSearchResultProvider = getIndicesSearchResultProvider(staticAssetsMock); const regularIndexResponse = { 'search-github-api': { @@ -54,7 +54,7 @@ describe('Enterprise Search - indices search provider', () => { path: `${ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL}/search_indices/search-github-api`, prependBasePath: true, }, - icon: '/kbn/plugins/enterpriseSearch/assets/source_icons/index.svg', + icon: '/kbn/images/index.svg', }; const msftIndex = { @@ -66,7 +66,7 @@ describe('Enterprise Search - indices search provider', () => { path: `${ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL}/search_indices/search-msft-sql-index`, prependBasePath: true, }, - icon: '/kbn/plugins/enterpriseSearch/assets/source_icons/index.svg', + icon: '/kbn/images/index.svg', }; beforeEach(() => {}); diff --git a/x-pack/plugins/enterprise_search/server/utils/indices_search_result_provider.ts b/x-pack/plugins/enterprise_search/server/utils/indices_search_result_provider.ts index c826be87fcdfc..478ee92d69f4e 100644 --- a/x-pack/plugins/enterprise_search/server/utils/indices_search_result_provider.ts +++ b/x-pack/plugins/enterprise_search/server/utils/indices_search_result_provider.ts @@ -7,7 +7,7 @@ import { from, takeUntil } from 'rxjs'; -import { IBasePath } from '@kbn/core-http-server'; +import { IStaticAssets } from '@kbn/core-http-browser'; import { GlobalSearchProviderResult, GlobalSearchResultProvider, @@ -18,7 +18,9 @@ import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../common/constants'; import { getIndexData } from '../lib/indices/utils/get_index_data'; -export function getIndicesSearchResultProvider(basePath: IBasePath): GlobalSearchResultProvider { +export function getIndicesSearchResultProvider( + staticAssets: IStaticAssets +): GlobalSearchResultProvider { return { find: ({ term, types, tags }, { aborted$, client, maxResults }) => { if (!client || !term || tags || (types && !types.includes('indices'))) { @@ -45,7 +47,7 @@ export function getIndicesSearchResultProvider(basePath: IBasePath): GlobalSearc return { id: indexName, title: indexName, - icon: basePath.prepend('/plugins/enterpriseSearch/assets/source_icons/index.svg'), + icon: staticAssets.getPluginAssetHref('images/index.svg'), type: i18n.translate('xpack.enterpriseSearch.searchIndexProvider.type.name', { defaultMessage: 'Index', }), diff --git a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts index 37ec58ac8c17a..9f9966b5e5998 100644 --- a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts +++ b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts @@ -18,13 +18,38 @@ const getTestScheduler = () => { }); }; -describe('Enterprise Search search provider', () => { - const basePathMock = { - prepend: (input: string) => `/kbn${input}`, - } as any; +const connectors = [ + { + categories: [ + 'enterprise_search', + 'datastore', + 'elastic_stack', + 'connector', + 'connector_client', + ], + description: 'Search over your mongo content', + iconPath: 'mongodb.svg', + isBeta: false, + isNative: true, + keywords: ['mongo', 'mongodb', 'database', 'nosql', 'connector'], + name: 'MongoDB', + serviceType: 'mongodb', + }, + { + categories: ['enterprise_search', 'custom', 'elastic_stack', 'connector', 'connector_client'], + description: 'Search over your data', + iconPath: 'custom.svg', + isBeta: true, + isNative: false, + keywords: ['custom', 'connector', 'code'], + name: 'Customized connector', + serviceType: '', + }, +]; +describe('Enterprise Search search provider', () => { const crawlerResult = { - icon: '/kbn/plugins/enterpriseSearch/assets/source_icons/crawler.svg', + icon: 'crawlerIcon.svg', id: 'elastic-crawler', score: 75, title: 'Elastic Web Crawler', @@ -36,7 +61,7 @@ describe('Enterprise Search search provider', () => { }; const mongoResult = { - icon: '/kbn/plugins/enterpriseSearch/assets/source_icons/mongodb.svg', + icon: 'mongodb.svg', id: 'mongodb', score: 75, title: 'MongoDB', @@ -48,7 +73,7 @@ describe('Enterprise Search search provider', () => { }; const nativeMongoResult = { - icon: '/kbn/plugins/enterpriseSearch/assets/source_icons/mongodb.svg', + icon: 'mongodb.svg', id: 'mongodb', score: 75, title: 'MongoDB', @@ -60,7 +85,7 @@ describe('Enterprise Search search provider', () => { }; const customizedConnectorResult = { - icon: '/kbn/plugins/enterpriseSearch/assets/source_icons/custom.svg', + icon: 'custom.svg', id: '', score: 75, title: 'Customized connector', @@ -84,12 +109,13 @@ describe('Enterprise Search search provider', () => { }; const searchResultProvider = getSearchResultProvider( - basePathMock, { hasConnectors: true, hasWebCrawler: true, } as any, - false + connectors, + false, + 'crawlerIcon.svg' ); beforeEach(() => {}); @@ -146,12 +172,13 @@ describe('Enterprise Search search provider', () => { it('omits crawler if config has crawler disabled', () => { const searchProvider = getSearchResultProvider( - basePathMock, { hasConnectors: true, hasWebCrawler: false, } as any, - false + connectors, + false, + 'crawlerIcon.svg' ); getTestScheduler().run(({ expectObservable }) => { expectObservable( @@ -168,12 +195,13 @@ describe('Enterprise Search search provider', () => { it('omits connectors if config has connectors disabled', () => { const searchProvider = getSearchResultProvider( - basePathMock, { hasConnectors: false, hasWebCrawler: true, } as any, - false + connectors, + false, + 'crawlerIcon.svg' ); getTestScheduler().run(({ expectObservable }) => { expectObservable( @@ -242,13 +270,14 @@ describe('Enterprise Search search provider', () => { }); it('returns results for legacy app search', () => { const searchProvider = getSearchResultProvider( - basePathMock, { canDeployEntSearch: true, hasConnectors: false, hasWebCrawler: false, } as any, - false + connectors, + false, + 'crawlerIcon.svg' ); getTestScheduler().run(({ expectObservable }) => { expectObservable( @@ -264,13 +293,14 @@ describe('Enterprise Search search provider', () => { }); it('does not return results for legacy workplace search', () => { const searchProvider = getSearchResultProvider( - basePathMock, { canDeployEntSearch: true, hasConnectors: false, hasWebCrawler: false, } as any, - false + connectors, + false, + 'crawlerIcon.svg' ); getTestScheduler().run(({ expectObservable }) => { expectObservable( @@ -287,12 +317,13 @@ describe('Enterprise Search search provider', () => { it('returns appropriate native flags when on cloud', () => { const searchProvider = getSearchResultProvider( - basePathMock, { hasConnectors: true, hasWebCrawler: true, } as any, - true + connectors, + true, + 'crawlerIcon.svg' ); getTestScheduler().run(({ expectObservable }) => { expectObservable( @@ -303,6 +334,7 @@ describe('Enterprise Search search provider', () => { ) ).toBe('(a|)', { a: expect.arrayContaining([ + { ...crawlerResult, score: 80 }, { ...nativeMongoResult, score: 80 }, { ...customizedConnectorResult, score: 80 }, ]), diff --git a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts index 3f73e3872c850..e7320f21768a5 100644 --- a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts +++ b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts @@ -7,11 +7,10 @@ import { from, takeUntil } from 'rxjs'; -import { IBasePath } from '@kbn/core-http-server'; import { GlobalSearchResultProvider } from '@kbn/global-search-plugin/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTOR_DEFINITIONS, ConnectorServerSideDefinition } from '@kbn/search-connectors'; +import { ConnectorServerSideDefinition } from '@kbn/search-connectors-plugin/server'; import { ConfigType } from '..'; import { @@ -33,7 +32,6 @@ type ServiceDefinition = }; export function toSearchResult({ - basePath, iconPath, isCloud, isNative, @@ -42,7 +40,6 @@ export function toSearchResult({ serviceType, url, }: { - basePath: IBasePath; iconPath?: string; isCloud: boolean; isNative?: boolean; @@ -59,9 +56,7 @@ export function toSearchResult({ : null; return { - icon: iconPath - ? basePath.prepend(`/plugins/enterpriseSearch/assets/source_icons/${iconPath}`) - : 'logoEnterpriseSearch', + icon: iconPath || 'logoEnterpriseSearch', id: serviceType, score, title: name, @@ -82,9 +77,10 @@ export function toSearchResult({ } export function getSearchResultProvider( - basePath: IBasePath, config: ConfigType, - isCloud: boolean + connectorTypes: ConnectorServerSideDefinition[], + isCloud: boolean, + crawlerIconPath: string ): GlobalSearchResultProvider { return { find: ({ term, types, tags }, { aborted$, maxResults }) => { @@ -98,7 +94,7 @@ export function getSearchResultProvider( ...(config.hasWebCrawler ? [ { - iconPath: 'crawler.svg', + iconPath: crawlerIconPath, keywords: ['crawler', 'web', 'website', 'internet', 'google'], name: i18n.translate('xpack.enterpriseSearch.searchProvider.webCrawler.name', { defaultMessage: 'Elastic Web Crawler', @@ -107,7 +103,7 @@ export function getSearchResultProvider( }, ] : []), - ...(config.hasConnectors ? CONNECTOR_DEFINITIONS : []), + ...(config.hasConnectors ? connectorTypes : []), ...(config.canDeployEntSearch ? [ { @@ -150,7 +146,6 @@ export function getSearchResultProvider( score = 50; } return toSearchResult({ - basePath, iconPath, isCloud, isNative, diff --git a/x-pack/plugins/enterprise_search/tsconfig.json b/x-pack/plugins/enterprise_search/tsconfig.json index 678654ed47a40..c9964a61f7834 100644 --- a/x-pack/plugins/enterprise_search/tsconfig.json +++ b/x-pack/plugins/enterprise_search/tsconfig.json @@ -69,7 +69,9 @@ "@kbn/console-plugin", "@kbn/core-notifications-browser", "@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/fleet/server/services/metrics/fetch_agent_metrics.test.ts b/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.test.ts index 565c56695c141..310308e88d407 100644 --- a/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.test.ts +++ b/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.test.ts @@ -30,7 +30,7 @@ describe('fetchAgentMetrics', () => { }); it('should not fetch agent if .fleet-agents is not created', async () => { - esClient.indices.get.mockRejectedValue({ statusCode: 404 }); + esClient.indices.exists.mockResolvedValue(false); const result = await fetchAgentMetrics(mockCore, abortController); diff --git a/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.ts b/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.ts index d753bf1e31888..5662a1a8fa1c8 100644 --- a/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.ts +++ b/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.ts @@ -50,17 +50,9 @@ export const fetchAgentMetrics = async ( return; } - const fleetAgentsIndexExists = await esClient.indices - .get({ - index: AGENTS_INDEX, - }) - .catch((error) => { - if (error.statusCode === 404) { - return; - } - - throw error; - }); + const fleetAgentsIndexExists = await esClient.indices.exists({ + index: AGENTS_INDEX, + }); if (!fleetAgentsIndexExists) { return; diff --git a/x-pack/plugins/fleet/server/services/metrics/fleet_metrics_task.ts b/x-pack/plugins/fleet/server/services/metrics/fleet_metrics_task.ts index c60716f312148..6b58decb4d109 100644 --- a/x-pack/plugins/fleet/server/services/metrics/fleet_metrics_task.ts +++ b/x-pack/plugins/fleet/server/services/metrics/fleet_metrics_task.ts @@ -20,7 +20,7 @@ import { appContextService } from '../app_context'; import type { AgentMetrics } from './fetch_agent_metrics'; export const TYPE = 'Fleet-Metrics-Task'; -export const VERSION = '1.1.0'; +export const VERSION = '1.1.1'; const TITLE = 'Fleet Metrics Task'; const TIMEOUT = '1m'; const SCOPE = ['fleet']; 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 92% 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 d15810c4b8181..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, @@ -314,7 +315,10 @@ export const ChartSwitch = memo(function ChartSwitch({ visualizations // alphabetical order within each group .sort((a, b) => { - return (a.fullLabel || a.label).localeCompare(b.fullLabel || b.label); + return ( + (b.sortOrder ?? 0) - (a.sortOrder ?? 0) || + (a.fullLabel || a.label).localeCompare(b.fullLabel || b.label) + ); }) .map((v): SelectableEntry => { return { @@ -357,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', }), @@ -374,7 +378,6 @@ export const ChartSwitch = memo(function ChartSwitch({ panelPaddingSize="s" button={ { + setFlyoutOpen(false); const chosenType = newOptions.find(({ checked }) => checked === 'on'); if (!chosenType) { return; @@ -445,7 +449,8 @@ function getTopSuggestion( datasourceStates: DatasourceStates, visualization: VisualizationState, newVisualization: Visualization, - subVisualizationId?: string + subVisualizationId?: string, + layerId?: string ): Suggestion | undefined { const mainPalette = visualization.activeId && @@ -483,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 cf8a1eaede8b5..1f189f80c14b2 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -968,10 +968,19 @@ export interface VisualizationType { */ groupLabel: string; /** - * The priority of the visualization in the list (global priority) - * Higher number means higher priority. When omitted defaults to 0 + * Adds to the priority of the group, accumulated from all visualizations within the same group + * Total priority is used to sort groups. Higher number means higher priority (aka top of list). + * + * @default 0 */ sortPriority?: number; + /** + * The sort order of the visualization in the grouping + * Items arranged from highest on top to lowest on bottom. + * + * @default 0 + */ + sortOrder?: number; /** * Indicates if visualization is in the experimental stage. */ @@ -1076,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 */ @@ -1154,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/gauge/constants.ts b/x-pack/plugins/lens/public/visualizations/gauge/constants.ts index bd7dc76d05c5a..5cf7c1e5d66a5 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/constants.ts +++ b/x-pack/plugins/lens/public/visualizations/gauge/constants.ts @@ -5,7 +5,12 @@ * 2.0. */ -import type { GaugeState as GaugeStateOriginal } from '@kbn/expression-gauge-plugin/common'; +import { + GaugeShape, + GaugeShapes, + GaugeState as GaugeStateOriginal, +} from '@kbn/expression-gauge-plugin/common'; +import { i18n } from '@kbn/i18n'; import type { LayerType } from '../../../common/types'; export const LENS_GAUGE_ID = 'lnsGauge'; @@ -33,3 +38,21 @@ export type GaugeExpressionState = GaugeStateOriginal & { layerId: string; layerType: LayerType; }; + +export const gaugeTitlesByType: Record = { + [GaugeShapes.HORIZONTAL_BULLET]: i18n.translate('xpack.lens.gaugeHorizontal.gaugeLabel', { + defaultMessage: 'Horizontal Bullet', + }), + [GaugeShapes.VERTICAL_BULLET]: i18n.translate('xpack.lens.gaugeVertical.gaugeLabel', { + defaultMessage: 'Vertical Bullet', + }), + [GaugeShapes.SEMI_CIRCLE]: i18n.translate('xpack.lens.gaugeSemiCircle.gaugeLabel', { + defaultMessage: 'Semi-circular Gauge', + }), + [GaugeShapes.ARC]: i18n.translate('xpack.lens.gaugeArc.gaugeLabel', { + defaultMessage: 'Arc Gauge', + }), + [GaugeShapes.CIRCLE]: i18n.translate('xpack.lens.gaugeCircle.gaugeLabel', { + defaultMessage: 'Circular Gauge', + }), +}; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/palette_config.tsx b/x-pack/plugins/lens/public/visualizations/gauge/palette_config.tsx index ce4360dc98458..ab60cb9830f97 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/palette_config.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/palette_config.tsx @@ -17,7 +17,7 @@ import chroma from 'chroma-js'; import { defaultPaletteParams as sharedDefaultParams } from '../../shared_components'; export const DEFAULT_PALETTE_NAME = 'gray'; -export const DEFAULT_COLOR_STEPS = 3; +export const DEFAULT_COLOR_STEPS = 4; export const DEFAULT_MIN_STOP = 0; export const DEFAULT_MAX_STOP = 100; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/suggestions.test.ts b/x-pack/plugins/lens/public/visualizations/gauge/suggestions.test.ts index 6e5bb64fa2d3e..44cc2c4b539b9 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/suggestions.test.ts +++ b/x-pack/plugins/lens/public/visualizations/gauge/suggestions.test.ts @@ -6,7 +6,13 @@ */ import { getSuggestions } from './suggestions'; -import { IconChartVerticalBullet, IconChartHorizontalBullet } from '@kbn/chart-icons'; +import { + IconChartVerticalBullet, + IconChartHorizontalBullet, + IconChartGaugeSemiCircle, + IconChartGaugeArc, + IconChartGaugeCircle, +} from '@kbn/chart-icons'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import { GaugeShapes } from '@kbn/expression-gauge-plugin/common'; import { GaugeVisualizationState } from './constants'; @@ -208,10 +214,55 @@ describe('shows suggestions', () => { layerId: 'first', }, previewIcon: IconChartVerticalBullet, - title: 'Gauge', + title: 'Vertical Bullet', hide: false, // shows suggestion when current is gauge incomplete: false, + score: 1, + }, + { + hide: false, + incomplete: false, + previewIcon: IconChartGaugeSemiCircle, + score: 0.1, + state: { + labelMajorMode: 'auto', + layerId: 'first', + layerType: 'data', + metricAccessor: 'metric-column', + shape: 'semiCircle', + ticksPosition: 'auto', + }, + title: 'Semi-circular Gauge', + }, + { + hide: false, + incomplete: false, + previewIcon: IconChartGaugeArc, score: 0.5, + state: { + labelMajorMode: 'auto', + layerId: 'first', + layerType: 'data', + metricAccessor: 'metric-column', + shape: 'arc', + ticksPosition: 'auto', + }, + title: 'Arc Gauge', + }, + { + hide: false, + incomplete: false, + previewIcon: IconChartGaugeCircle, + score: 0.1, + state: { + labelMajorMode: 'auto', + layerId: 'first', + layerType: 'data', + metricAccessor: 'metric-column', + shape: 'circle', + ticksPosition: 'auto', + }, + title: 'Circular Gauge', }, ]); }); diff --git a/x-pack/plugins/lens/public/visualizations/gauge/suggestions.ts b/x-pack/plugins/lens/public/visualizations/gauge/suggestions.ts index c07f006b932d5..b52c678f0b41d 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/suggestions.ts +++ b/x-pack/plugins/lens/public/visualizations/gauge/suggestions.ts @@ -6,16 +6,21 @@ */ import { i18n } from '@kbn/i18n'; -import type { GaugeShape } from '@kbn/expression-gauge-plugin/common'; import { GaugeShapes, GaugeTicksPositions, GaugeLabelMajorModes, } from '@kbn/expression-gauge-plugin/common'; -import { IconChartHorizontalBullet, IconChartVerticalBullet } from '@kbn/chart-icons'; +import { + IconChartGaugeCircle, + IconChartGaugeSemiCircle, + IconChartGaugeArc, + IconChartHorizontalBullet, + IconChartVerticalBullet, +} from '@kbn/chart-icons'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; -import type { TableSuggestion, Visualization } from '../../types'; -import type { GaugeVisualizationState } from './constants'; +import type { TableSuggestion, Visualization, VisualizationSuggestion } from '../../types'; +import { gaugeTitlesByType, GaugeVisualizationState } from './constants'; const isNotNumericMetric = (table: TableSuggestion) => table.columns?.[0]?.operation.dataType !== 'number' || @@ -28,7 +33,6 @@ export const getSuggestions: Visualization['getSuggesti table, state, keptLayerIds, - subVisualizationId, }) => { const isGauge = Boolean( state && (state.minAccessor || state.maxAccessor || state.goalAccessor || state.metricAccessor) @@ -48,15 +52,10 @@ export const getSuggestions: Visualization['getSuggesti return []; } - const shape: GaugeShape = - state?.shape === GaugeShapes.VERTICAL_BULLET - ? GaugeShapes.VERTICAL_BULLET - : GaugeShapes.HORIZONTAL_BULLET; - - const baseSuggestion = { + const baseSuggestion: VisualizationSuggestion = { state: { ...state, - shape, + shape: state?.shape ?? GaugeShapes.HORIZONTAL_BULLET, layerId: table.layerId, layerType: LayerTypes.DATA, ticksPosition: GaugeTicksPositions.AUTO, @@ -65,31 +64,69 @@ export const getSuggestions: Visualization['getSuggesti title: i18n.translate('xpack.lens.gauge.gaugeLabel', { defaultMessage: 'Gauge', }), - previewIcon: - shape === GaugeShapes.VERTICAL_BULLET ? IconChartVerticalBullet : IconChartHorizontalBullet, + previewIcon: IconChartHorizontalBullet, score: 0.5, hide: !isGauge || state?.metricAccessor === undefined, // only display for gauges for beta incomplete: state?.metricAccessor === undefined, }; - const suggestions = isGauge + const suggestions: Array> = isGauge ? [ { ...baseSuggestion, - previewIcon: - state?.shape === GaugeShapes.VERTICAL_BULLET - ? IconChartHorizontalBullet - : IconChartVerticalBullet, + title: gaugeTitlesByType.verticalBullet, + previewIcon: IconChartVerticalBullet, state: { ...baseSuggestion.state, ...state, - shape: - state?.shape === GaugeShapes.VERTICAL_BULLET - ? GaugeShapes.HORIZONTAL_BULLET - : GaugeShapes.VERTICAL_BULLET, + shape: GaugeShapes.VERTICAL_BULLET, + }, + score: 1, + }, + { + ...baseSuggestion, + title: gaugeTitlesByType.horizontalBullet, + previewIcon: IconChartHorizontalBullet, + state: { + ...baseSuggestion.state, + ...state, + shape: GaugeShapes.HORIZONTAL_BULLET, + }, + score: 1, + }, + { + ...baseSuggestion, + title: gaugeTitlesByType.semiCircle, + previewIcon: IconChartGaugeSemiCircle, + state: { + ...baseSuggestion.state, + ...state, + shape: GaugeShapes.SEMI_CIRCLE, + }, + score: 0.1, + }, + { + ...baseSuggestion, + title: gaugeTitlesByType.arc, + previewIcon: IconChartGaugeArc, + state: { + ...baseSuggestion.state, + ...state, + shape: GaugeShapes.ARC, + }, + }, + { + ...baseSuggestion, + title: gaugeTitlesByType.circle, + previewIcon: IconChartGaugeCircle, + state: { + ...baseSuggestion.state, + ...state, + shape: GaugeShapes.CIRCLE, }, + score: 0.1, }, - ] + ].filter((s) => s.state.shape !== state?.shape) : [ { ...baseSuggestion, diff --git a/x-pack/plugins/lens/public/visualizations/gauge/toolbar_component/index.tsx b/x-pack/plugins/lens/public/visualizations/gauge/toolbar_component/index.tsx index 67756002f3e56..7ce2f02a0b140 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/toolbar_component/index.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/toolbar_component/index.tsx @@ -8,7 +8,7 @@ import React, { memo, useState } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import type { GaugeLabelMajorMode } from '@kbn/expression-gauge-plugin/common'; +import { GaugeLabelMajorMode } from '@kbn/expression-gauge-plugin/common'; import { useDebouncedValue } from '@kbn/visualization-ui-components'; import type { VisualizationToolbarProps } from '../../../types'; import { ToolbarPopover, VisLabel } from '../../../shared_components'; @@ -87,7 +87,7 @@ export const GaugeToolbar = memo((props: VisualizationToolbarProps { handleInputChange({ ...inputValue, - labelMinor: value.label, + labelMinor: value.mode === 'none' ? '' : value.label, }); setSubtitleMode(value.mode); }} diff --git a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx index ac78d37ca28e9..cbe425ff3088c 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx @@ -12,7 +12,10 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { Ast } from '@kbn/interpreter'; import { buildExpressionFunction, DatatableRow } from '@kbn/expressions-plugin/common'; import { PaletteRegistry, CustomPaletteParams, CUSTOM_PALETTE } from '@kbn/coloring'; -import type { GaugeExpressionFunctionDefinition } from '@kbn/expression-gauge-plugin/common'; +import type { + GaugeExpressionFunctionDefinition, + GaugeShape, +} from '@kbn/expression-gauge-plugin/common'; import { GaugeShapes } from '@kbn/expression-gauge-plugin/common'; import { getGoalValue, @@ -20,7 +23,13 @@ import { getMinValue, getValueFromAccessor, } from '@kbn/expression-gauge-plugin/public'; -import { IconChartHorizontalBullet, IconChartVerticalBullet } from '@kbn/chart-icons'; +import { + IconChartGaugeSemiCircle, + IconChartGaugeCircle, + IconChartGaugeArc, + IconChartHorizontalBullet, + IconChartVerticalBullet, +} from '@kbn/chart-icons'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import type { FormBasedPersistedState } from '../../datasources/form_based/types'; import type { @@ -30,9 +39,10 @@ import type { Suggestion, UserMessage, Visualization, + VisualizationType, } from '../../types'; import { getSuggestions } from './suggestions'; -import { GROUP_ID, LENS_GAUGE_ID, GaugeVisualizationState } from './constants'; +import { GROUP_ID, LENS_GAUGE_ID, GaugeVisualizationState, gaugeTitlesByType } from './constants'; import { GaugeToolbar } from './toolbar_component'; import { applyPaletteParams } from '../../shared_components'; import { GaugeDimensionEditor } from './dimension_editor'; @@ -54,20 +64,46 @@ export const isNumericMetric = (op: OperationMetadata) => export const isNumericDynamicMetric = (op: OperationMetadata) => isNumericMetric(op) && !op.isStaticValue; -export const CHART_NAMES = { - horizontalBullet: { +export const CHART_NAMES: Record = { + [GaugeShapes.HORIZONTAL_BULLET]: { + id: GaugeShapes.HORIZONTAL_BULLET, icon: IconChartHorizontalBullet, - label: i18n.translate('xpack.lens.gaugeHorizontal.gaugeLabel', { - defaultMessage: 'Gauge horizontal', - }), + label: gaugeTitlesByType.horizontalBullet, groupLabel: groupLabelForGauge, + showExperimentalBadge: true, + sortOrder: 10, }, - verticalBullet: { + [GaugeShapes.VERTICAL_BULLET]: { + id: GaugeShapes.VERTICAL_BULLET, icon: IconChartVerticalBullet, - label: i18n.translate('xpack.lens.gaugeVertical.gaugeLabel', { - defaultMessage: 'Gauge vertical', - }), + label: gaugeTitlesByType.verticalBullet, + groupLabel: groupLabelForGauge, + showExperimentalBadge: true, + sortOrder: 10, + }, + [GaugeShapes.SEMI_CIRCLE]: { + id: GaugeShapes.SEMI_CIRCLE, + icon: IconChartGaugeSemiCircle, + label: gaugeTitlesByType.semiCircle, groupLabel: groupLabelForGauge, + showExperimentalBadge: true, + sortOrder: 9, + }, + [GaugeShapes.ARC]: { + id: GaugeShapes.ARC, + icon: IconChartGaugeArc, + label: gaugeTitlesByType.arc, + groupLabel: groupLabelForGauge, + showExperimentalBadge: true, + sortOrder: 8, + }, + [GaugeShapes.CIRCLE]: { + id: GaugeShapes.CIRCLE, + icon: IconChartGaugeCircle, + label: gaugeTitlesByType.circle, + groupLabel: groupLabelForGauge, + showExperimentalBadge: true, + sortOrder: 7, }, }; @@ -168,21 +204,15 @@ const toExpression = ( export const getGaugeVisualization = ({ paletteService, - theme, }: GaugeVisualizationDeps): Visualization => ({ id: LENS_GAUGE_ID, visualizationTypes: [ - { - ...CHART_NAMES.horizontalBullet, - id: GaugeShapes.HORIZONTAL_BULLET, - showExperimentalBadge: true, - }, - { - ...CHART_NAMES.verticalBullet, - id: GaugeShapes.VERTICAL_BULLET, - showExperimentalBadge: true, - }, + CHART_NAMES[GaugeShapes.HORIZONTAL_BULLET], + CHART_NAMES[GaugeShapes.VERTICAL_BULLET], + CHART_NAMES[GaugeShapes.SEMI_CIRCLE], + CHART_NAMES[GaugeShapes.ARC], + CHART_NAMES[GaugeShapes.CIRCLE], ], getVisualizationTypeId(state) { return state.shape; @@ -202,19 +232,13 @@ export const getGaugeVisualization = ({ }, getDescription(state) { - if (state.shape === GaugeShapes.HORIZONTAL_BULLET) { - return CHART_NAMES.horizontalBullet; - } - return CHART_NAMES.verticalBullet; + return CHART_NAMES[state.shape]; }, switchVisualizationType: (visualizationTypeId, state) => { return { ...state, - shape: - visualizationTypeId === GaugeShapes.HORIZONTAL_BULLET - ? GaugeShapes.HORIZONTAL_BULLET - : GaugeShapes.VERTICAL_BULLET, + shape: visualizationTypeId as GaugeShape, }; }, @@ -356,6 +380,12 @@ export const getGaugeVisualization = ({ }; }, + getDisplayOptions() { + return { + noPadding: true, + }; + }, + setDimension({ prevState, layerId, columnId, groupId, previousColumn }) { const update: Partial = {}; if (groupId === GROUP_ID.MIN) { 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/alerting/ui_components/alert_details_app_section/failed_transaction_chart.tsx b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/failed_transaction_chart.tsx index 6cb3e8232455c..493458b7bbf46 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/failed_transaction_chart.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/failed_transaction_chart.tsx @@ -43,6 +43,7 @@ const INITIAL_STATE_ERROR_RATE: ErrorRate = { function FailedTransactionChart({ transactionType, + transactionName, serviceName, environment, start, @@ -51,6 +52,7 @@ function FailedTransactionChart({ timeZone, }: { transactionType: string; + transactionName?: string; serviceName: string; environment: string; start: string; @@ -66,7 +68,9 @@ function FailedTransactionChart({ end, kuery: '', numBuckets: 100, - type: ApmDocumentType.ServiceTransactionMetric, + type: transactionName + ? ApmDocumentType.TransactionMetric + : ApmDocumentType.ServiceTransactionMetric, }); const { data: dataErrorRate = INITIAL_STATE_ERROR_RATE, status } = useFetcher( @@ -85,7 +89,7 @@ function FailedTransactionChart({ start, end, transactionType, - transactionName: undefined, + transactionName, documentType: preferred.source.documentType, rollupInterval: preferred.source.rollupInterval, bucketSizeInSeconds: preferred.bucketSizeInSeconds, @@ -95,7 +99,15 @@ function FailedTransactionChart({ ); } }, - [environment, serviceName, start, end, transactionType, preferred] + [ + environment, + serviceName, + start, + end, + transactionType, + transactionName, + preferred, + ] ); const timeseriesErrorRate = [ { diff --git a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx index 0296f8dc53d23..f7e3d19694183 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx @@ -35,6 +35,7 @@ import { AlertDetailsAppSectionProps, SERVICE_NAME, TRANSACTION_TYPE, + TRANSACTION_NAME, } from './types'; import { createCallApmApi } from '../../../../services/rest/create_call_apm_api'; @@ -52,6 +53,8 @@ export function AlertDetailsAppSection({ const alertEvaluationThreshold = alert.fields[ALERT_EVALUATION_THRESHOLD]; const environment = alert.fields[SERVICE_ENVIRONMENT]; const serviceName = String(alert.fields[SERVICE_NAME]); + const transactionName = alert.fields[TRANSACTION_NAME]; + const transactionType = alert.fields[TRANSACTION_TYPE]; useEffect(() => { const alertSummaryFields = [ @@ -114,7 +117,6 @@ export function AlertDetailsAppSection({ alert.fields[ALERT_START]!, alert.fields[ALERT_END] ); - const transactionType = alert.fields[TRANSACTION_TYPE]; const comparisonChartTheme = getComparisonChartTheme(); const historicalRange = useMemo(() => { return { @@ -160,6 +162,7 @@ export function AlertDetailsAppSection({ ; timeZone: string; setAlertSummaryFields: React.Dispatch< 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/log_threshold/log_threshold_executor.test.ts b/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.test.ts index 7e948a4bb8799..da21c8aadaaaf 100644 --- a/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.test.ts +++ b/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.test.ts @@ -9,8 +9,7 @@ import { getGroupedESQuery, processUngroupedResults, processGroupByResults, - LogThresholdAlertFactory, - LogThresholdAlertLimit, + LogThresholdAlertReporter, getUngroupedESQuery, } from './log_threshold_executor'; import { @@ -437,10 +436,14 @@ describe('Log threshold executor', () => { describe('Results processors', () => { describe('for ungrouped results', () => { it('handles the ALERT state correctly', () => { - const alertFactoryMock: jest.MockedFunction = jest.fn(); - const alertLimitMock: jest.Mocked = { - getValue: jest.fn().mockReturnValue(10), - setLimitReached: jest.fn(), + const alertReporterMock: jest.MockedFunction = jest.fn(); + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(10), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn(), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), }; const ruleParams = { @@ -455,10 +458,10 @@ describe('Log threshold executor', () => { }, } as UngroupedSearchQueryResponse; - processUngroupedResults(results, ruleParams, alertFactoryMock, alertLimitMock); + processUngroupedResults(results, ruleParams, alertReporterMock, alertsClientMock); // first call, fifth argument - expect(alertFactoryMock.mock.calls[0][4]).toEqual([ + expect(alertReporterMock.mock.calls[0][4]).toEqual([ { actionGroup: 'logs.threshold.fired', context: { @@ -473,10 +476,14 @@ describe('Log threshold executor', () => { }); it('reports reaching a low limit when alerting', () => { - const alertFactoryMock: jest.MockedFunction = jest.fn(); - const alertLimitMock: jest.Mocked = { - getValue: jest.fn().mockReturnValue(1), - setLimitReached: jest.fn(), + const alertReporterMock: jest.MockedFunction = jest.fn(); + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(1), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn(), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), }; const ruleParams = { @@ -491,17 +498,21 @@ describe('Log threshold executor', () => { }, } as UngroupedSearchQueryResponse; - processUngroupedResults(results, ruleParams, alertFactoryMock, alertLimitMock); + processUngroupedResults(results, ruleParams, alertReporterMock, alertsClientMock); - expect(alertFactoryMock).toBeCalledTimes(1); - expect(alertLimitMock.setLimitReached).toHaveBeenCalledWith(true); + expect(alertReporterMock).toBeCalledTimes(1); + expect(alertsClientMock.setAlertLimitReached).toHaveBeenCalledWith(true); }); it('reports not reaching a higher limit when alerting', () => { - const alertFactoryMock: jest.MockedFunction = jest.fn(); - const alertLimitMock: jest.Mocked = { - getValue: jest.fn().mockReturnValue(10), - setLimitReached: jest.fn(), + const alertReporterMock: jest.MockedFunction = jest.fn(); + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(10), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn(), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), }; const ruleParams = { @@ -516,17 +527,21 @@ describe('Log threshold executor', () => { }, } as UngroupedSearchQueryResponse; - processUngroupedResults(results, ruleParams, alertFactoryMock, alertLimitMock); + processUngroupedResults(results, ruleParams, alertReporterMock, alertsClientMock); - expect(alertFactoryMock).toBeCalledTimes(1); - expect(alertLimitMock.setLimitReached).toHaveBeenCalledWith(false); + expect(alertReporterMock).toBeCalledTimes(1); + expect(alertsClientMock.setAlertLimitReached).toHaveBeenCalledWith(false); }); it('reports not reaching the limit without any alerts', () => { - const alertFactoryMock: jest.MockedFunction = jest.fn(); - const alertLimitMock: jest.Mocked = { - getValue: jest.fn().mockReturnValue(0), - setLimitReached: jest.fn(), + const alertReporterMock: jest.MockedFunction = jest.fn(); + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(0), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn(), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), }; const ruleParams = { @@ -541,19 +556,23 @@ describe('Log threshold executor', () => { }, } as UngroupedSearchQueryResponse; - processUngroupedResults(results, ruleParams, alertFactoryMock, alertLimitMock); + processUngroupedResults(results, ruleParams, alertReporterMock, alertsClientMock); - expect(alertFactoryMock).not.toHaveBeenCalled(); - expect(alertLimitMock.setLimitReached).toHaveBeenCalledWith(false); + expect(alertReporterMock).not.toHaveBeenCalled(); + expect(alertsClientMock.setAlertLimitReached).toHaveBeenCalledWith(false); }); }); describe('for grouped results', () => { it('handles the ALERT state correctly', () => { - const alertFactoryMock: jest.MockedFunction = jest.fn(); - const alertLimitMock: jest.Mocked = { - getValue: jest.fn().mockReturnValue(2), - setLimitReached: jest.fn(), + const alertReporterMock: jest.MockedFunction = jest.fn(); + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(2), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn(), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), }; const ruleParams = { @@ -628,11 +647,11 @@ describe('Log threshold executor', () => { }, ] as GroupedSearchQueryResponse['aggregations']['groups']['buckets']; - processGroupByResults(results, ruleParams, alertFactoryMock, alertLimitMock); - expect(alertFactoryMock.mock.calls.length).toBe(2); + processGroupByResults(results, ruleParams, alertReporterMock, alertsClientMock); + expect(alertReporterMock.mock.calls.length).toBe(2); // First call, fifth argument - expect(alertFactoryMock.mock.calls[0][4]).toEqual([ + expect(alertReporterMock.mock.calls[0][4]).toEqual([ { actionGroup: 'logs.threshold.fired', context: { @@ -658,7 +677,7 @@ describe('Log threshold executor', () => { ]); // Second call, fifth argument - expect(alertFactoryMock.mock.calls[1][4]).toEqual([ + expect(alertReporterMock.mock.calls[1][4]).toEqual([ { actionGroup: 'logs.threshold.fired', context: { @@ -685,10 +704,14 @@ describe('Log threshold executor', () => { }); it('respects and reports reaching a low limit when alerting', () => { - const alertFactoryMock: jest.MockedFunction = jest.fn(); - const alertLimitMock: jest.Mocked = { - getValue: jest.fn().mockReturnValue(1), - setLimitReached: jest.fn(), + const alertReporterMock: jest.MockedFunction = jest.fn(); + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(1), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn(), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), }; const ruleParams = { @@ -763,17 +786,21 @@ describe('Log threshold executor', () => { }, ] as GroupedSearchQueryResponse['aggregations']['groups']['buckets']; - processGroupByResults(results, ruleParams, alertFactoryMock, alertLimitMock); + processGroupByResults(results, ruleParams, alertReporterMock, alertsClientMock); - expect(alertFactoryMock).toHaveBeenCalledTimes(1); - expect(alertLimitMock.setLimitReached).toHaveBeenCalledWith(true); + expect(alertReporterMock).toHaveBeenCalledTimes(1); + expect(alertsClientMock.setAlertLimitReached).toHaveBeenCalledWith(true); }); it('reports not reaching a higher limit when alerting', () => { - const alertFactoryMock: jest.MockedFunction = jest.fn(); - const alertLimitMock: jest.Mocked = { - getValue: jest.fn().mockReturnValue(10), - setLimitReached: jest.fn(), + const alertReporterMock: jest.MockedFunction = jest.fn(); + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(10), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn(), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), }; const ruleParams = { @@ -848,10 +875,10 @@ describe('Log threshold executor', () => { }, ] as GroupedSearchQueryResponse['aggregations']['groups']['buckets']; - processGroupByResults(results, ruleParams, alertFactoryMock, alertLimitMock); + processGroupByResults(results, ruleParams, alertReporterMock, alertsClientMock); - expect(alertFactoryMock).toHaveBeenCalledTimes(2); - expect(alertLimitMock.setLimitReached).toHaveBeenCalledWith(false); + expect(alertReporterMock).toHaveBeenCalledTimes(2); + expect(alertsClientMock.setAlertLimitReached).toHaveBeenCalledWith(false); }); }); }); diff --git a/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts b/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts index 517b020eaeace..01eed0023dda8 100644 --- a/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts +++ b/x-pack/plugins/observability_solution/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts @@ -7,7 +7,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { i18n } from '@kbn/i18n'; -import { AlertsLocatorParams, getAlertDetailsUrl } from '@kbn/observability-plugin/common'; +import { getAlertDetailsUrl } from '@kbn/observability-plugin/common'; import { ALERT_CONTEXT, ALERT_EVALUATION_THRESHOLD, @@ -18,18 +18,19 @@ import { ElasticsearchClient, IBasePath } from '@kbn/core/server'; import { ActionGroup, ActionGroupIdsOf, - Alert, AlertInstanceContext as AlertContext, AlertInstanceState as AlertState, - RuleExecutorServices, RuleTypeState, + RuleExecutorOptions, + AlertsClientError, } from '@kbn/alerting-plugin/server'; -import { LocatorPublic } from '@kbn/share-plugin/common'; import { addSpaceIdToPath } from '@kbn/spaces-plugin/common'; -import { asyncForEach } from '@kbn/std'; +import { ObservabilityLogsAlert } from '@kbn/alerts-as-data-utils'; +import { + PublicAlertsClient, + RecoveredAlertData, +} from '@kbn/alerting-plugin/server/alerts_client/types'; -import { ParsedTechnicalFields } from '@kbn/rule-registry-plugin/common'; -import { ParsedExperimentalFields } from '@kbn/rule-registry-plugin/common/parse_experimental_fields'; import { ecsFieldMap } from '@kbn/rule-registry-plugin/common/assets/field_maps/ecs_field_map'; import { getChartGroupNames } from '../../../../common/utils/get_chart_group_names'; import { @@ -81,24 +82,19 @@ export type LogThresholdRuleTypeState = RuleTypeState; // no specific state used export type LogThresholdAlertState = AlertState; // no specific state used export type LogThresholdAlertContext = AlertContext; // no specific instance context used -export type LogThresholdAlert = Alert< - LogThresholdAlertState, - LogThresholdAlertContext, - LogThresholdActionGroups ->; -export type LogThresholdAlertFactory = ( +export type LogThresholdAlert = Omit & { + // Defining a custom type for this because the schema generation script doesn't allow explicit null values + 'kibana.alert.evaluation.values'?: Array; +}; + +export type LogThresholdAlertReporter = ( id: string, reason: string, value: number, threshold: number, actions?: Array<{ actionGroup: LogThresholdActionGroups; context: AlertContext }>, rootLevelContext?: AdditionalContext -) => LogThresholdAlert; -export type LogThresholdAlertLimit = RuleExecutorServices< - LogThresholdAlertState, - LogThresholdAlertContext, - LogThresholdActionGroups ->['alertFactory']['alertLimit']; +) => void; const COMPOSITE_GROUP_SIZE = 2000; @@ -115,26 +111,26 @@ const checkValueAgainstComparatorMap: { // ES Query generation -> fetching of results -> processing of results. // With forks for group_by vs ungrouped, and ratio vs non-ratio. -export const createLogThresholdExecutor = (libs: InfraBackendLibs) => - libs.logsRules.createLifecycleRuleExecutor< - LogThresholdRuleTypeParams, - LogThresholdRuleTypeState, - LogThresholdAlertState, - LogThresholdAlertContext, - LogThresholdActionGroups - >(async ({ services, params, spaceId, startedAt }) => { - const { - alertFactory: { alertLimit }, - alertWithLifecycle, - savedObjectsClient, - scopedClusterClient, - getAlertStartedDate, - getAlertUuid, - getAlertByAlertUuid, - } = services; - const { basePath, alertsLocator } = libs; - - const alertFactory: LogThresholdAlertFactory = ( +export const createLogThresholdExecutor = + (libs: InfraBackendLibs) => + async ( + options: RuleExecutorOptions< + LogThresholdRuleTypeParams, + LogThresholdRuleTypeState, + LogThresholdAlertState, + LogThresholdAlertContext, + LogThresholdActionGroups, + LogThresholdAlert + > + ) => { + const { services, params, spaceId, startedAt } = options; + const { basePath } = libs; + const { alertsClient, savedObjectsClient, scopedClusterClient } = services; + if (!alertsClient) { + throw new AlertsClientError(); + } + + const alertReporter: LogThresholdAlertReporter = async ( id, reason, value, @@ -147,52 +143,47 @@ export const createLogThresholdExecutor = (libs: InfraBackendLibs) => ? actions.reduce((next, action) => Object.assign(next, action.context), {}) : {}; - const alert = alertWithLifecycle({ - id, - fields: { - [ALERT_EVALUATION_THRESHOLD]: threshold, - [ALERT_EVALUATION_VALUE]: value, - [ALERT_REASON]: reason, - [ALERT_CONTEXT]: alertContext, - ...flattenAdditionalContext(rootLevelContext), - }, - }); - if (actions && actions.length > 0) { - const indexedStartedAt = getAlertStartedDate(id) ?? startedAt.toISOString(); - const relativeViewInAppUrl = getLogsAppAlertUrl(new Date(indexedStartedAt).getTime()); - - const viewInAppUrl = addSpaceIdToPath( - basePath.publicBaseUrl, - spaceId, - relativeViewInAppUrl - ); - - const sharedContext = { - timestamp: startedAt.toISOString(), - viewInAppUrl, - }; - - asyncForEach(actions, async (actionSet) => { - const { actionGroup, context } = actionSet; - - const alertInstanceId = (context.group || id) as string; - - const alertUuid = getAlertUuid(alertInstanceId); - - alert.scheduleActions(actionGroup, { - ...sharedContext, - ...context, - alertDetailsUrl: getAlertDetailsUrl(libs.basePath, spaceId, alertUuid), + actions.forEach((actionSet) => { + const { actionGroup, context: actionContext } = actionSet; + const alertInstanceId = (actionContext.group || id) as string; + const { uuid, start } = alertsClient.report({ + id: alertInstanceId, + actionGroup, + state: { + alertState: AlertStates.ALERT, + }, + }); + const indexedStartedAt = start ?? startedAt.toISOString(); + const relativeViewInAppUrl = getLogsAppAlertUrl(new Date(indexedStartedAt).getTime()); + const viewInAppUrl = addSpaceIdToPath( + basePath.publicBaseUrl, + spaceId, + relativeViewInAppUrl + ); + + const context = { + ...actionContext, + timestamp: startedAt.toISOString(), + viewInAppUrl, + alertDetailsUrl: getAlertDetailsUrl(libs.basePath, spaceId, uuid), + }; + + const payload = { + [ALERT_EVALUATION_THRESHOLD]: threshold, + [ALERT_EVALUATION_VALUE]: value, + [ALERT_REASON]: reason, + [ALERT_CONTEXT]: alertContext, + ...flattenAdditionalContext(rootLevelContext), + }; + + alertsClient.setAlertData({ + id: alertInstanceId, + payload, + context, }); }); } - - alert.replaceState({ - alertState: AlertStates.ALERT, - }); - - return alert; }; const [, { logsShared }] = await libs.getStartServices(); @@ -211,8 +202,8 @@ export const createLogThresholdExecutor = (libs: InfraBackendLibs) => indices, runtimeMappings, scopedClusterClient.asCurrentUser, - alertFactory, - alertLimit, + alertReporter, + alertsClient, startedAt.valueOf() ); } else { @@ -222,31 +213,27 @@ export const createLogThresholdExecutor = (libs: InfraBackendLibs) => indices, runtimeMappings, scopedClusterClient.asCurrentUser, - alertFactory, - alertLimit, + alertReporter, + alertsClient, startedAt.valueOf() ); } - const { getRecoveredAlerts } = services.alertFactory.done(); - const recoveredAlerts = getRecoveredAlerts(); - await processRecoveredAlerts({ + const recoveredAlerts = alertsClient.getRecoveredAlerts() ?? []; + processRecoveredAlerts({ + alertsClient, basePath, - getAlertStartedDate, - getAlertUuid, recoveredAlerts, spaceId, startedAt, validatedParams, - getAlertByAlertUuid, - alertsLocator, }); } catch (e) { throw new Error(e); } return { state: {} }; - }); + }; export async function executeAlert( ruleParams: CountRuleParams, @@ -254,8 +241,13 @@ export async function executeAlert( indexPattern: string, runtimeMappings: estypes.MappingRuntimeFields, esClient: ElasticsearchClient, - alertFactory: LogThresholdAlertFactory, - alertLimit: LogThresholdAlertLimit, + alertReporter: LogThresholdAlertReporter, + alertsClient: PublicAlertsClient< + LogThresholdAlert, + AlertState, + AlertContext, + LogThresholdActionGroups + >, executionTimestamp: number ) { const query = getESQuery( @@ -274,15 +266,15 @@ export async function executeAlert( processGroupByResults( await getGroupedResults(query, esClient), ruleParams, - alertFactory, - alertLimit + alertReporter, + alertsClient ); } else { processUngroupedResults( await getUngroupedResults(query, esClient), ruleParams, - alertFactory, - alertLimit + alertReporter, + alertsClient ); } } @@ -293,8 +285,13 @@ export async function executeRatioAlert( indexPattern: string, runtimeMappings: estypes.MappingRuntimeFields, esClient: ElasticsearchClient, - alertFactory: LogThresholdAlertFactory, - alertLimit: LogThresholdAlertLimit, + alertReporter: LogThresholdAlertReporter, + alertsClient: PublicAlertsClient< + LogThresholdAlert, + AlertState, + AlertContext, + LogThresholdActionGroups + >, executionTimestamp: number ) { // Ratio alert params are separated out into two standard sets of alert params @@ -336,8 +333,8 @@ export async function executeRatioAlert( numeratorGroupedResults, denominatorGroupedResults, ruleParams, - alertFactory, - alertLimit + alertReporter, + alertsClient ); } else { const [numeratorUngroupedResults, denominatorUngroupedResults] = await Promise.all([ @@ -348,8 +345,8 @@ export async function executeRatioAlert( numeratorUngroupedResults, denominatorUngroupedResults, ruleParams, - alertFactory, - alertLimit + alertReporter, + alertsClient ); } } @@ -384,8 +381,13 @@ const getESQuery = ( export const processUngroupedResults = ( results: UngroupedSearchQueryResponse, params: CountRuleParams, - alertFactory: LogThresholdAlertFactory, - alertLimit: LogThresholdAlertLimit + alertReporter: LogThresholdAlertReporter, + alertsClient: PublicAlertsClient< + LogThresholdAlert, + AlertState, + AlertContext, + LogThresholdActionGroups + > ) => { const { count, criteria, timeSize, timeUnit } = params; const documentCount = results.hits.total.value; @@ -413,7 +415,7 @@ export const processUngroupedResults = ( }, }, ]; - alertFactory( + alertReporter( UNGROUPED_FACTORY_KEY, reasonMessage, documentCount, @@ -421,9 +423,9 @@ export const processUngroupedResults = ( actions, additionalContext ); - alertLimit.setLimitReached(alertLimit.getValue() <= 1); + alertsClient.setAlertLimitReached(alertsClient.getAlertLimitValue() <= 1); } else { - alertLimit.setLimitReached(false); + alertsClient.setAlertLimitReached(false); } }; @@ -431,8 +433,13 @@ export const processUngroupedRatioResults = ( numeratorResults: UngroupedSearchQueryResponse, denominatorResults: UngroupedSearchQueryResponse, params: RatioRuleParams, - alertFactory: LogThresholdAlertFactory, - alertLimit: LogThresholdAlertLimit + alertReporter: LogThresholdAlertReporter, + alertsClient: PublicAlertsClient< + LogThresholdAlert, + AlertState, + AlertContext, + LogThresholdActionGroups + > ) => { const { count, criteria, timeSize, timeUnit } = params; @@ -464,7 +471,7 @@ export const processUngroupedRatioResults = ( }, }, ]; - alertFactory( + alertReporter( UNGROUPED_FACTORY_KEY, reasonMessage, ratio, @@ -472,9 +479,9 @@ export const processUngroupedRatioResults = ( actions, additionalContext ); - alertLimit.setLimitReached(alertLimit.getValue() <= 1); + alertsClient.setAlertLimitReached(alertsClient.getAlertLimitValue() <= 1); } else { - alertLimit.setLimitReached(false); + alertsClient.setAlertLimitReached(false); } }; @@ -528,14 +535,19 @@ const getReducedGroupByResults = ( export const processGroupByResults = ( results: GroupedSearchQueryResponse['aggregations']['groups']['buckets'], params: CountRuleParams, - alertFactory: LogThresholdAlertFactory, - alertLimit: LogThresholdAlertLimit + alertReporter: LogThresholdAlertReporter, + alertsClient: PublicAlertsClient< + LogThresholdAlert, + AlertState, + AlertContext, + LogThresholdActionGroups + > ) => { const { count, criteria, timeSize, timeUnit } = params; const groupResults = getReducedGroupByResults(results); - let remainingAlertCount = alertLimit.getValue(); + let remainingAlertCount = alertsClient.getAlertLimitValue(); for (const group of groupResults) { if (remainingAlertCount <= 0) { @@ -574,26 +586,31 @@ export const processGroupByResults = ( }, }, ]; - alertFactory(group.name, reasonMessage, documentCount, count.value, actions, group.context); + alertReporter(group.name, reasonMessage, documentCount, count.value, actions, group.context); } } - alertLimit.setLimitReached(remainingAlertCount <= 0); + alertsClient.setAlertLimitReached(remainingAlertCount <= 0); }; export const processGroupByRatioResults = ( numeratorResults: GroupedSearchQueryResponse['aggregations']['groups']['buckets'], denominatorResults: GroupedSearchQueryResponse['aggregations']['groups']['buckets'], params: RatioRuleParams, - alertFactory: LogThresholdAlertFactory, - alertLimit: LogThresholdAlertLimit + alertReporter: LogThresholdAlertReporter, + alertsClient: PublicAlertsClient< + LogThresholdAlert, + AlertState, + AlertContext, + LogThresholdActionGroups + > ) => { const { count, criteria, timeSize, timeUnit } = params; const numeratorGroupResults = getReducedGroupByResults(numeratorResults); const denominatorGroupResults = getReducedGroupByResults(denominatorResults); - let remainingAlertCount = alertLimit.getValue(); + let remainingAlertCount = alertsClient.getAlertLimitValue(); for (const numeratorGroup of numeratorGroupResults) { if (remainingAlertCount <= 0) { @@ -642,7 +659,7 @@ export const processGroupByRatioResults = ( }, }, ]; - alertFactory( + alertReporter( numeratorGroup.name, reasonMessage, ratio, @@ -653,7 +670,7 @@ export const processGroupByRatioResults = ( } } - alertLimit.setLimitReached(remainingAlertCount <= 0); + alertsClient.setAlertLimitReached(remainingAlertCount <= 0); }; export const getGroupedESQuery = ( @@ -839,44 +856,39 @@ const getGroupedResults = async (query: object, esClient: ElasticsearchClient) = return compositeGroupBuckets; }; -type LogThresholdRecoveredAlert = { - getId: () => string; -} & LogThresholdAlert; - -const processRecoveredAlerts = async ({ +const processRecoveredAlerts = ({ + alertsClient, basePath, - getAlertStartedDate, - getAlertUuid, recoveredAlerts, spaceId, startedAt, validatedParams, - getAlertByAlertUuid, - alertsLocator, }: { + alertsClient: PublicAlertsClient< + LogThresholdAlert, + AlertState, + AlertContext, + LogThresholdActionGroups + >; basePath: IBasePath; - getAlertStartedDate: (alertId: string) => string | null; - getAlertUuid: (alertId: string) => string | null; - recoveredAlerts: LogThresholdRecoveredAlert[]; + recoveredAlerts: Array< + RecoveredAlertData + >; spaceId: string; startedAt: Date; validatedParams: RuleParams; - getAlertByAlertUuid: ( - alertUuid: string - ) => Promise | null> | null; - alertsLocator?: LocatorPublic; }) => { const groupByKeysObjectForRecovered = getGroupByObject( validatedParams.groupBy, - new Set(recoveredAlerts.map((recoveredAlert) => recoveredAlert.getId())) + new Set(recoveredAlerts.map((recoveredAlert) => recoveredAlert.alert.getId())) ); - for (const alert of recoveredAlerts) { - const recoveredAlertId = alert.getId(); - const indexedStartedAt = getAlertStartedDate(recoveredAlertId) ?? startedAt.toISOString(); + for (const recoveredAlert of recoveredAlerts) { + const recoveredAlertId = recoveredAlert.alert.getId(); + const indexedStartedAt = recoveredAlert.alert.getStart() ?? startedAt.toISOString(); const relativeViewInAppUrl = getLogsAppAlertUrl(new Date(indexedStartedAt).getTime()); - const alertUuid = getAlertUuid(recoveredAlertId); - const alertHits = alertUuid ? await getAlertByAlertUuid(alertUuid) : undefined; + const alertUuid = recoveredAlert.alert.getUuid(); + const alertHits = recoveredAlert.hit; const additionalContext = getContextForRecoveredAlerts(alertHits); const viewInAppUrl = addSpaceIdToPath(basePath.publicBaseUrl, spaceId, relativeViewInAppUrl); @@ -892,20 +904,22 @@ const processRecoveredAlerts = async ({ if (isRatioRuleParams(validatedParams)) { const { criteria } = validatedParams; - alert.setContext({ + const context = { ...baseContext, numeratorConditions: createConditionsMessageForCriteria(getNumerator(criteria)), denominatorConditions: createConditionsMessageForCriteria(getDenominator(criteria)), isRatio: true, - }); + }; + alertsClient.setAlertData({ id: recoveredAlertId, context }); } else { const { criteria } = validatedParams; - alert.setContext({ + const context = { ...baseContext, conditions: createConditionsMessageForCriteria(criteria), isRatio: false, - }); + }; + alertsClient.setAlertData({ id: recoveredAlertId, context }); } } }; 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 be5fc08549108..c83a5111772f4 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/infra/server/lib/alerting/register_rule_types.ts b/x-pack/plugins/observability_solution/infra/server/lib/alerting/register_rule_types.ts index 40eb1fb5c3e89..61f26348ca53f 100644 --- a/x-pack/plugins/observability_solution/infra/server/lib/alerting/register_rule_types.ts +++ b/x-pack/plugins/observability_solution/infra/server/lib/alerting/register_rule_types.ts @@ -13,14 +13,16 @@ import { registerLogThresholdRuleType } from './log_threshold/register_log_thres import { InfraBackendLibs } from '../infra_types'; import type { InfraConfig } from '../../types'; import { MetricThresholdAlert } from './metric_threshold/metric_threshold_executor'; +import { LogThresholdAlert } from './log_threshold/log_threshold_executor'; export const LOGS_RULES_ALERT_CONTEXT = 'observability.logs'; // Defines which alerts-as-data index logs rules will use -export const LogsRulesTypeAlertDefinition: IRuleTypeAlerts = { +export const LogsRulesTypeAlertDefinition: IRuleTypeAlerts = { context: LOGS_RULES_ALERT_CONTEXT, mappings: { fieldMap: legacyExperimentalFieldMap }, useEcs: true, useLegacyAlerts: true, + shouldWrite: true, }; export const METRICS_RULES_ALERT_CONTEXT = 'observability.metrics'; 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/lib/rules/custom_threshold/custom_threshold_executor.test.ts b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts index 7ec275b130bf3..3ad00a76a8c30 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts @@ -5,19 +5,11 @@ * 2.0. */ -import { AlertInstanceState as AlertState } from '@kbn/alerting-plugin/server'; -import { - AlertInstanceMock, - RuleExecutorServicesMock, - alertsMock, -} from '@kbn/alerting-plugin/server/mocks'; +import { RuleExecutorServicesMock, alertsMock } from '@kbn/alerting-plugin/server/mocks'; import { searchSourceCommonMock } from '@kbn/data-plugin/common/search/search_source/mocks'; import type { ISearchSource } from '@kbn/data-plugin/common'; -import { LifecycleAlertServices } from '@kbn/rule-registry-plugin/server'; -import { ruleRegistryMocks } from '@kbn/rule-registry-plugin/server/mocks'; import { createCustomThresholdExecutor } from './custom_threshold_executor'; import { FIRED_ACTION, NO_DATA_ACTION } from './constants'; -import { CustomThresholdAlertContext } from './types'; import { Evaluation } from './lib/evaluate_rule'; import type { LogMeta, Logger } from '@kbn/logging'; import { DEFAULT_FLAPPING_SETTINGS } from '@kbn/alerting-plugin/common'; @@ -34,14 +26,6 @@ jest.mock('../../../../common/custom_threshold_rule/get_view_in_app_url', () => getViewInAppUrl: jest.fn().mockReturnValue('mockedViewInApp'), })); -interface AlertTestInstance { - instance: AlertInstanceMock; - actionQueue: any[]; - state: any; -} - -const persistAlertInstances = false; - type TestRuleState = Record & { aRuleStateKey: string; groups: string[]; @@ -141,7 +125,110 @@ const setEvaluationResults = (response: Array>) => { jest.requireMock('./lib/evaluate_rule').evaluateRule.mockImplementation(() => response); }; +const mockLibs: any = { + basePath: { + publicBaseUrl: 'http://localhost:5601', + prepend: (path: string) => path, + }, + logger, + config: { + customThresholdRule: { + groupByPageSize: 10_000, + }, + }, + locators: {}, +}; + +const executor = createCustomThresholdExecutor(mockLibs); + +const mockedIndex = { + id: 'c34a7c79-a88b-4b4a-ad19-72f6d24104e4', + title: 'metrics-fake_hosts', + name: 'mockedDataViewName', + fieldFormatMap: {}, + typeMeta: {}, + timeFieldName: '@timestamp', +}; +const mockedDataView = { + getIndexPattern: () => 'mockedIndexPattern', + getName: () => 'mockedDataViewName', + ...mockedIndex, +}; +const mockedSearchSource = { + getField: jest.fn(() => mockedDataView), +} as any as ISearchSource; +let services: RuleExecutorServicesMock; + +interface ReportedAlert { + id: string; + actionGroup: string; + payload: object; + context?: { + group: string; + reason: string; + tags: string[]; + }; +} + +const alerts = new Map(); + +const setup = () => { + const alertsServices = alertsMock.createRuleExecutorServices(); + + services = { + ...alertsServices, + searchSourceClient: { + ...searchSourceCommonMock, + create: jest.fn(() => Promise.resolve(mockedSearchSource)), + }, + }; + + services.alertsClient.report.mockImplementation((params: any) => { + alerts.set(params.id, [ + { + id: params.id, + actionGroup: params.actionGroup, + payload: params.payload, + }, + ]); + + return { + uuid: `uuid-${params.id}`, + start: new Date().toISOString(), + alertDoc: {}, + }; + }); + + services.alertsClient.setAlertData.mockImplementation((params: any) => { + const alertsList = alerts.get(params.id); + if (alertsList && alertsList.length > 0) { + const lastAlert = alertsList[alertsList.length - 1]; + lastAlert.context = params.context; + } + }); + + services.savedObjectsClient.get.mockImplementation(async (type: string, sourceId: string) => { + if (sourceId === 'alternate') + return { + id: 'alternate', + attributes: { metricAlias: 'alternatebeat-*' }, + type, + references: [], + }; + if (sourceId === 'empty-response') + return { + id: 'empty', + attributes: { metricAlias: 'empty-response' }, + type, + references: [], + }; + return { id: 'default', attributes: { metricAlias: 'metricbeat-*' }, type, references: [] }; + }); +}; + describe('The custom threshold alert type', () => { + setup(); + describe('querying the entire infrastructure', () => { afterAll(() => clearInstances()); const instanceID = '*'; @@ -184,63 +271,63 @@ describe('The custom threshold alert type', () => { test('alerts as expected with the > comparator', async () => { setResults(Comparator.GT, [0.75], true); await execute(Comparator.GT, [0.75]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); setResults(Comparator.GT, [1.5], false); await execute(Comparator.GT, [1.5]); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); }); test('alerts as expected with the < comparator', async () => { setResults(Comparator.LT, [1.5], true); await execute(Comparator.LT, [1.5]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); setResults(Comparator.LT, [0.75], false); await execute(Comparator.LT, [0.75]); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); }); test('alerts as expected with the >= comparator', async () => { setResults(Comparator.GT_OR_EQ, [0.75], true); await execute(Comparator.GT_OR_EQ, [0.75]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); setResults(Comparator.GT_OR_EQ, [1.0], true); await execute(Comparator.GT_OR_EQ, [1.0]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); setResults(Comparator.GT_OR_EQ, [1.5], false); await execute(Comparator.GT_OR_EQ, [1.5]); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); }); test('alerts as expected with the <= comparator', async () => { setResults(Comparator.LT_OR_EQ, [1.5], true); await execute(Comparator.LT_OR_EQ, [1.5]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); setResults(Comparator.LT_OR_EQ, [1.0], true); await execute(Comparator.LT_OR_EQ, [1.0]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); setResults(Comparator.LT_OR_EQ, [0.75], false); await execute(Comparator.LT_OR_EQ, [0.75]); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); }); test('alerts as expected with the between comparator', async () => { setResults(Comparator.BETWEEN, [0, 1.5], true); await execute(Comparator.BETWEEN, [0, 1.5]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); setResults(Comparator.BETWEEN, [0, 0.75], false); await execute(Comparator.BETWEEN, [0, 0.75]); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); }); test('alerts as expected with the outside range comparator', async () => { setResults(Comparator.OUTSIDE_RANGE, [0, 0.75], true); await execute(Comparator.OUTSIDE_RANGE, [0, 0.75]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); setResults(Comparator.OUTSIDE_RANGE, [0, 1.5], false); await execute(Comparator.OUTSIDE_RANGE, [0, 1.5]); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); }); test('reports expected values to the action context', async () => { setResults(Comparator.GT, [0.75], true); await execute(Comparator.GT, [0.75]); - const { action } = mostRecentAction(instanceID); - expect(action.group).toBeUndefined(); - expect(action.reason).toBe( + const reportedAlert = getLastReportedAlert(instanceID); + expect(reportedAlert?.context?.group).toBeUndefined(); + expect(reportedAlert?.context?.reason).toBe( 'Average test.metric.1 is 1, above the threshold of 0.75. (duration: 1 min, data view: mockedDataViewName)' ); }); @@ -300,8 +387,8 @@ describe('The custom threshold alert type', () => { }, ]); await execute(Comparator.GT, [0.75]); - expect(mostRecentAction(instanceIdA)).toBeAlertAction(); - expect(mostRecentAction(instanceIdB)).toBeAlertAction(); + expect(getLastReportedAlert(instanceIdA)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdB)).toHaveAlertAction(); }); test('sends an alert when only some groups pass the threshold', async () => { setEvaluationResults([ @@ -329,8 +416,8 @@ describe('The custom threshold alert type', () => { }, ]); await execute(Comparator.LT, [1.5]); - expect(mostRecentAction(instanceIdA)).toBeAlertAction(); - expect(mostRecentAction(instanceIdB)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdB)).toBe(undefined); }); test('sends no alert when no groups pass the threshold', async () => { setEvaluationResults([ @@ -358,8 +445,8 @@ describe('The custom threshold alert type', () => { }, ]); await execute(Comparator.GT, [5]); - expect(mostRecentAction(instanceIdA)).toBe(undefined); - expect(mostRecentAction(instanceIdB)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toBe(undefined); + expect(getLastReportedAlert(instanceIdB)).toBe(undefined); }); test('reports group values to the action context', async () => { setEvaluationResults([ @@ -387,10 +474,10 @@ describe('The custom threshold alert type', () => { }, ]); await execute(Comparator.GT, [0.75]); - expect(mostRecentAction(instanceIdA).action.group).toEqual([ + expect(getLastReportedAlert(instanceIdA)?.context?.group).toEqual([ { field: 'groupByField', value: 'a' }, ]); - expect(mostRecentAction(instanceIdB).action.group).toEqual([ + expect(getLastReportedAlert(instanceIdB)?.context?.group).toEqual([ { field: 'groupByField', value: 'b' }, ]); }); @@ -728,7 +815,7 @@ describe('The custom threshold alert type', () => { ], stateResult2 ); - expect(stateResult3.groups).toEqual(expect.arrayContaining([])); + expect(stateResult3.missingGroups).toEqual(expect.arrayContaining([])); }); }); @@ -797,13 +884,13 @@ describe('The custom threshold alert type', () => { }, ]); await execute(Comparator.GT, [0.75]); - expect(mostRecentAction(instanceIdA).action.tags).toStrictEqual([ + expect(getLastReportedAlert(instanceIdA)?.context?.tags).toStrictEqual([ 'host-01_tag1', 'host-01_tag2', 'ruleTag1', 'ruleTag2', ]); - expect(mostRecentAction(instanceIdB).action.tags).toStrictEqual([ + expect(getLastReportedAlert(instanceIdB)?.context?.tags).toStrictEqual([ 'host-02_tag1', 'host-02_tag2', 'ruleTag1', @@ -861,7 +948,10 @@ describe('The custom threshold alert type', () => { const instanceID = '*'; await execute(Comparator.GT, [0.75]); - expect(mostRecentAction(instanceID).action.tags).toStrictEqual(['ruleTag1', 'ruleTag2']); + expect(getLastReportedAlert(instanceID)?.context?.tags).toStrictEqual([ + 'ruleTag1', + 'ruleTag2', + ]); }); }); @@ -931,7 +1021,7 @@ describe('The custom threshold alert type', () => { ]); const instanceID = '*'; await execute(Comparator.GT_OR_EQ, [1.0], [3.0]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); }); test('sends no alert when some, but not all, criteria cross the threshold', async () => { setEvaluationResults([ @@ -951,7 +1041,7 @@ describe('The custom threshold alert type', () => { ]); const instanceID = '*'; await execute(Comparator.LT_OR_EQ, [1.0], [2.5]); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); }); test('alerts only on groups that meet all criteria when querying with a groupBy parameter', async () => { setEvaluationResults([ @@ -1017,8 +1107,8 @@ describe('The custom threshold alert type', () => { const instanceIdA = 'a'; const instanceIdB = 'b'; await execute(Comparator.GT_OR_EQ, [1.0], [3.0], 'groupByField'); - expect(mostRecentAction(instanceIdA)).toBeAlertAction(); - expect(mostRecentAction(instanceIdB)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdB)).toBe(undefined); }); test('sends all criteria to the action context', async () => { setEvaluationResults([ @@ -1056,8 +1146,8 @@ describe('The custom threshold alert type', () => { ]); const instanceID = '*'; await execute(Comparator.GT_OR_EQ, [1.0], [3.0]); - const { action } = mostRecentAction(instanceID); - const reasons = action.reason; + const reportedAlert = getLastReportedAlert(instanceID); + const reasons = reportedAlert?.context?.reason; expect(reasons).toBe( 'Average test.metric.1 is 1, above or equal the threshold of 1; Average test.metric.2 is 3, above or equal the threshold of 3. (duration: 1 min, data view: mockedDataViewName)' ); @@ -1099,7 +1189,7 @@ describe('The custom threshold alert type', () => { }, ]); await execute(Comparator.GT, [0.9]); - expect(mostRecentAction(instanceID)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toHaveAlertAction(); setEvaluationResults([ { '*': { @@ -1115,7 +1205,7 @@ describe('The custom threshold alert type', () => { }, ]); await execute(Comparator.LT, [0.5]); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); }); describe('with a groupBy parameter', () => { const executeGroupBy = ( @@ -1170,8 +1260,8 @@ describe('The custom threshold alert type', () => { }, ]); const resultState = await executeGroupBy(Comparator.LT_OR_EQ, [0]); - expect(mostRecentAction(instanceIdA)).toBe(undefined); - expect(mostRecentAction(instanceIdB)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toBe(undefined); + expect(getLastReportedAlert(instanceIdB)).toBe(undefined); setEvaluationResults([ { a: { @@ -1197,8 +1287,8 @@ describe('The custom threshold alert type', () => { }, ]); await executeGroupBy(Comparator.LT_OR_EQ, [0], 'empty-response', resultState); - expect(mostRecentAction(instanceIdA)).toBeAlertAction(); - expect(mostRecentAction(instanceIdB)).toBeAlertAction(); + expect(getLastReportedAlert(instanceIdA)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdB)).toHaveAlertAction(); }); }); }); @@ -1315,11 +1405,11 @@ describe('The custom threshold alert type', () => { }, ]); await execute(true); - const recentAction = mostRecentAction(instanceID); - expect(recentAction.action.reason).toEqual( + const reportedAlert = getLastReportedAlert(instanceID); + expect(reportedAlert?.context?.reason).toEqual( 'Average test.metric.3 reported no data in the last 1m' ); - expect(recentAction).toBeNoDataAction(); + expect(reportedAlert).toHaveNoDataAction(); }); test('does not send a No Data alert when not configured to do so', async () => { setEvaluationResults([ @@ -1344,7 +1434,7 @@ describe('The custom threshold alert type', () => { }, ]); await execute(false); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); }); }); @@ -1404,16 +1494,16 @@ describe('The custom threshold alert type', () => { {}, ]); await execute(true); - const recentAction = mostRecentAction(instanceID); - expect(recentAction.action).toEqual({ - alertDetailsUrl: 'http://localhost:5601/app/observability/alerts/mock-alert-uuid', + const recentAlert = getLastReportedAlert(instanceID); + expect(recentAlert?.context).toEqual({ + alertDetailsUrl: 'http://localhost:5601/app/observability/alerts/uuid-*', reason: 'Average test.metric.3 reported no data in the last 1m', timestamp: STARTED_AT_MOCK_DATE.toISOString(), value: ['[NO DATA]', null], tags: [], viewInAppUrl: 'mockedViewInApp', }); - expect(recentAction).toBeNoDataAction(); + expect(recentAlert).toHaveNoDataAction(); }); }); @@ -1477,7 +1567,7 @@ describe('The custom threshold alert type', () => { }, ]); let resultState = await executeEmptyResponse(); - expect(mostRecentAction(instanceID)).toBeNoDataAction(); + expect(getLastReportedAlert(instanceID)).toHaveNoDataAction(); setEvaluationResults([ { '*': { @@ -1500,7 +1590,7 @@ describe('The custom threshold alert type', () => { }, ]); resultState = await executeEmptyResponse(true, resultState); - expect(mostRecentAction(instanceID)).toBeNoDataAction(); + expect(getLastReportedAlert(instanceID)).toHaveNoDataAction(); setEvaluationResults([ { a: { @@ -1526,9 +1616,9 @@ describe('The custom threshold alert type', () => { }, ]); resultState = await execute2GroupsABResponse(true, resultState); - expect(mostRecentAction(instanceID)).toBe(undefined); - expect(mostRecentAction(instanceIdA)).toBeAlertAction(); - expect(mostRecentAction(instanceIdB)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdB)).toHaveAlertAction(); interTestStateStorage.push(resultState); // Hand off resultState to the next test }); test('sends No Data alerts for the previously detected groups when they stop reporting data, but not the * group', async () => { @@ -1574,9 +1664,9 @@ describe('The custom threshold alert type', () => { }, ]); await executeEmptyResponse(true, resultState); - expect(mostRecentAction(instanceID)).toBe(undefined); - expect(mostRecentAction(instanceIdA)).toBeNoDataAction(); - expect(mostRecentAction(instanceIdB)).toBeNoDataAction(); + expect(getLastReportedAlert(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toHaveNoDataAction(); + expect(getLastReportedAlert(instanceIdB)).toHaveNoDataAction(); }); test('does not send individual No Data alerts when groups disappear if alertOnGroupDisappear is disabled', async () => { setEvaluationResults([ @@ -1635,10 +1725,10 @@ describe('The custom threshold alert type', () => { }, ]); const resultState = await execute3GroupsABCResponse(false); - expect(mostRecentAction(instanceID)).toBe(undefined); - expect(mostRecentAction(instanceIdA)).toBeAlertAction(); - expect(mostRecentAction(instanceIdB)).toBeAlertAction(); - expect(mostRecentAction(instanceIdC)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdB)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdC)).toHaveAlertAction(); setEvaluationResults([ { a: { @@ -1664,10 +1754,10 @@ describe('The custom threshold alert type', () => { }, ]); await execute2GroupsABResponse(false, resultState); - expect(mostRecentAction(instanceID)).toBe(undefined); - expect(mostRecentAction(instanceIdA)).toBeAlertAction(); - expect(mostRecentAction(instanceIdB)).toBeAlertAction(); - expect(mostRecentAction(instanceIdC)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdB)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdC)).toBe(undefined); }); describe('if alertOnNoData is disabled but alertOnGroupDisappear is enabled', () => { @@ -1721,7 +1811,7 @@ describe('The custom threshold alert type', () => { }, ]); let resultState = await executeWeirdEmptyResponse(); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); setEvaluationResults([ { '*': { @@ -1744,7 +1834,7 @@ describe('The custom threshold alert type', () => { }, ]); resultState = await executeWeirdEmptyResponse(resultState); - expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceID)).toBe(undefined); setEvaluationResults([ { a: { @@ -1770,9 +1860,9 @@ describe('The custom threshold alert type', () => { }, ]); resultState = await executeWeird2GroupsABResponse(resultState); - expect(mostRecentAction(instanceID)).toBe(undefined); - expect(mostRecentAction(instanceIdA)).toBeAlertAction(); - expect(mostRecentAction(instanceIdB)).toBeAlertAction(); + expect(getLastReportedAlert(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toHaveAlertAction(); + expect(getLastReportedAlert(instanceIdB)).toHaveAlertAction(); interTestStateStorage.push(resultState); // Hand off resultState to the next test }); test('sends No Data alerts for the previously detected groups when they stop reporting data, but not the * group', async () => { @@ -1816,128 +1906,46 @@ describe('The custom threshold alert type', () => { }, ]); await executeWeirdEmptyResponse(resultState); - expect(mostRecentAction(instanceID)).toBe(undefined); - expect(mostRecentAction(instanceIdA)).toBeNoDataAction(); - expect(mostRecentAction(instanceIdB)).toBeNoDataAction(); + expect(getLastReportedAlert(instanceID)).toBe(undefined); + expect(getLastReportedAlert(instanceIdA)).toHaveNoDataAction(); + expect(getLastReportedAlert(instanceIdB)).toHaveNoDataAction(); }); }); }); }); -const mockLibs: any = { - threshold_rule: { - group_by_page_size: 10000, - }, - basePath: { - publicBaseUrl: 'http://localhost:5601', - prepend: (path: string) => path, - }, - logger, - config: { - customThresholdRule: { - groupByPageSize: 10_000, - }, - }, - locators: {}, -}; - -const executor = createCustomThresholdExecutor(mockLibs); - -const alertsServices = alertsMock.createRuleExecutorServices(); -const mockedIndex = { - id: 'c34a7c79-a88b-4b4a-ad19-72f6d24104e4', - title: 'metrics-fake_hosts', - name: 'mockedDataViewName', - fieldFormatMap: {}, - typeMeta: {}, - timeFieldName: '@timestamp', -}; -const mockedDataView = { - getIndexPattern: () => 'mockedIndexPattern', - getName: () => 'mockedDataViewName', - ...mockedIndex, -}; -const mockedSearchSource = { - getField: jest.fn(() => mockedDataView), -} as any as ISearchSource; -const services: RuleExecutorServicesMock & - LifecycleAlertServices = { - ...alertsServices, - ...ruleRegistryMocks.createLifecycleAlertServices(alertsServices), - searchSourceClient: { - ...searchSourceCommonMock, - create: jest.fn(() => Promise.resolve(mockedSearchSource)), - }, -}; -services.savedObjectsClient.get.mockImplementation(async (type: string, sourceId: string) => { - if (sourceId === 'alternate') - return { - id: 'alternate', - attributes: { metricAlias: 'alternatebeat-*' }, - type, - references: [], - }; - if (sourceId === 'empty-response') - return { - id: 'empty', - attributes: { metricAlias: 'empty-response' }, - type, - references: [], - }; - return { id: 'default', attributes: { metricAlias: 'metricbeat-*' }, type, references: [] }; -}); - -const alertInstances = new Map(); -services.alertFactory.create.mockImplementation((instanceID: string) => { - const newAlertInstance: AlertTestInstance = { - instance: alertsMock.createAlertFactory.create(), - actionQueue: [], - state: {}, - }; - const alertInstance: AlertTestInstance = persistAlertInstances - ? alertInstances.get(instanceID) || newAlertInstance - : newAlertInstance; - alertInstances.set(instanceID, alertInstance); - - alertInstance.instance.replaceState.mockImplementation((newState: any) => { - alertInstance.state = newState; - return alertInstance.instance; - }); - (alertInstance.instance.scheduleActions as jest.Mock).mockImplementation( - (id: string, action: any) => { - alertInstance.actionQueue.push({ id, action }); - return alertInstance.instance; - } - ); - return alertInstance.instance; -}); - -function mostRecentAction(id: string) { - const instance = alertInstances.get(id); - if (!instance) return undefined; - return instance.actionQueue.pop(); +function getLastReportedAlert(id: string): ReportedAlert | undefined { + const alert = alerts.get(id); + if (!alert) return undefined; + return alert.pop(); } function clearInstances() { - alertInstances.clear(); + alerts.clear(); } interface Action { - id: string; - action: { reason: string }; + actionGroup: string; + context: { + alertDetailsUrl: string; + reason: string; + timestamp: string; + }; } expect.extend({ - toBeAlertAction(action?: Action) { - const pass = action?.id === FIRED_ACTION.id && !action?.action.reason.includes('no data'); + toHaveAlertAction(action?: Action) { + const pass = + action?.actionGroup === FIRED_ACTION.id && !action?.context?.reason?.includes('no data'); const message = () => `expected ${action} to be an ALERT action`; return { message, pass, }; }, - toBeNoDataAction(action?: Action) { - const pass = action?.id === NO_DATA_ACTION.id && action?.action.reason.includes('no data'); + toHaveNoDataAction(action?: Action) { + const pass = + action?.actionGroup === NO_DATA_ACTION.id && action?.context?.reason?.includes('no data'); const message = () => `expected ${action} to be a NO DATA action`; return { message, @@ -1950,8 +1958,8 @@ declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace jest { interface Matchers { - toBeAlertAction(action?: Action): R; - toBeNoDataAction(action?: Action): R; + toHaveAlertAction(action?: Action): R; + toHaveNoDataAction(action?: Action): R; } } } diff --git a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts index 22a8f8718331b..97c427a973a1a 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts @@ -8,7 +8,6 @@ import { isEqual } from 'lodash'; import { LogsExplorerLocatorParams } from '@kbn/deeplinks-observability'; import { - ALERT_ACTION_GROUP, ALERT_EVALUATION_VALUES, ALERT_EVALUATION_THRESHOLD, ALERT_REASON, @@ -17,7 +16,7 @@ import { import { LocatorPublic } from '@kbn/share-plugin/common'; import { RecoveredActionGroup } from '@kbn/alerting-plugin/common'; import { IBasePath, Logger } from '@kbn/core/server'; -import { LifecycleRuleExecutor } from '@kbn/rule-registry-plugin/server'; +import { AlertsClientError, RuleExecutorOptions } from '@kbn/alerting-plugin/server'; import { Group } from '../../../../common/custom_threshold_rule/types'; import { getEvaluationValues, getThreshold } from './lib/get_values'; import { AlertsLocatorParams, getAlertDetailsUrl } from '../../../../common'; @@ -31,8 +30,8 @@ import { CustomThresholdAlertState, CustomThresholdAlertContext, CustomThresholdSpecificActionGroups, - CustomThresholdAlertFactory, CustomThresholdActionGroup, + CustomThresholdAlert, } from './types'; import { buildFiredAlertReason, @@ -41,11 +40,11 @@ import { } from './messages'; import { createScopedLogger, - getContextForRecoveredAlerts, hasAdditionalContext, validGroupByForContext, flattenAdditionalContext, getFormattedGroupBy, + getContextForRecoveredAlerts, } from './utils'; import { formatAlertResult, getLabel } from './lib/format_alert_result'; @@ -62,20 +61,23 @@ export const createCustomThresholdExecutor = ({ basePath, logger, config, - locators: { alertsLocator, logsExplorerLocator }, + locators: { logsExplorerLocator }, }: { basePath: IBasePath; logger: Logger; config: ObservabilityConfig; locators: CustomThresholdLocators; -}): LifecycleRuleExecutor< - CustomThresholdRuleTypeParams, - CustomThresholdRuleTypeState, - CustomThresholdAlertState, - CustomThresholdAlertContext, - CustomThresholdSpecificActionGroups -> => - async function (options) { +}) => + async function ( + options: RuleExecutorOptions< + CustomThresholdRuleTypeParams, + CustomThresholdRuleTypeState, + CustomThresholdAlertState, + CustomThresholdAlertContext, + CustomThresholdSpecificActionGroups, + CustomThresholdAlert + > + ) { const startTime = Date.now(); const { @@ -96,35 +98,11 @@ export const createCustomThresholdExecutor = ({ executionId, }); - const { - alertWithLifecycle, - getAlertUuid, - getAlertByAlertUuid, - getAlertStartedDate, - searchSourceClient, - alertFactory: baseAlertFactory, - } = services; - - const alertFactory: CustomThresholdAlertFactory = ( - id, - reason, - actionGroup, - additionalContext, - evaluationValues, - threshold, - group - ) => - alertWithLifecycle({ - id, - fields: { - [ALERT_REASON]: reason, - [ALERT_ACTION_GROUP]: actionGroup, - [ALERT_EVALUATION_VALUES]: evaluationValues, - [ALERT_EVALUATION_THRESHOLD]: threshold, - [ALERT_GROUP]: group, - ...flattenAdditionalContext(additionalContext), - }, - }); + const { searchSourceClient, alertsClient } = services; + + if (!alertsClient) { + throw new AlertsClientError(); + } const { alertOnNoData, alertOnGroupDisappear: _alertOnGroupDisappear } = params as { alertOnNoData: boolean; @@ -183,7 +161,7 @@ export const createCustomThresholdExecutor = ({ const hasGroups = !isEqual(groupArray, [UNGROUPED_FACTORY_KEY]); let scheduledActionsCount = 0; - const alertLimit = baseAlertFactory.alertLimit.getValue(); + const alertLimit = alertsClient.getAlertLimitValue(); let hasReachedLimit = false; // The key of `groupArray` is the alert instance ID. @@ -266,64 +244,68 @@ export const createCustomThresholdExecutor = ({ ); const groups: Group[] = groupByKeysObjectMapping[group]; - const alert = alertFactory( - `${group}`, - reason, - actionGroupId, - additionalContext, - evaluationValues, - threshold, - groups - ); - const alertUuid = getAlertUuid(group); - const indexedStartedAt = getAlertStartedDate(group) ?? startedAt.toISOString(); + + const { uuid, start } = alertsClient.report({ + id: `${group}`, + actionGroup: actionGroupId, + payload: { + [ALERT_REASON]: reason, + [ALERT_EVALUATION_VALUES]: evaluationValues, + [ALERT_EVALUATION_THRESHOLD]: threshold, + [ALERT_GROUP]: groups, + ...flattenAdditionalContext(additionalContext), + }, + }); + + const indexedStartedAt = start ?? startedAt.toISOString(); scheduledActionsCount++; - alert.scheduleActions(actionGroupId, { - alertDetailsUrl: getAlertDetailsUrl(basePath, spaceId, alertUuid), - group: groupByKeysObjectMapping[group], - reason, - timestamp, - value: alertResults.map((result) => { - const evaluation = result[group]; - if (!evaluation) { - return null; - } - return formatAlertResult(evaluation).currentValue; - }), - viewInAppUrl: getViewInAppUrl({ - dataViewId: params.searchConfiguration?.index?.title ?? dataViewId, - groups, - logsExplorerLocator, - metrics: alertResults.length === 1 ? alertResults[0][group].metrics : [], - searchConfiguration: params.searchConfiguration, - startedAt: indexedStartedAt, - }), - ...additionalContext, + alertsClient.setAlertData({ + id: `${group}`, + context: { + alertDetailsUrl: getAlertDetailsUrl(basePath, spaceId, uuid), + group: groupByKeysObjectMapping[group], + reason, + timestamp, + value: alertResults.map((result) => { + const evaluation = result[group]; + if (!evaluation) { + return null; + } + return formatAlertResult(evaluation).currentValue; + }), + viewInAppUrl: getViewInAppUrl({ + dataViewId: params.searchConfiguration?.index?.title ?? dataViewId, + groups, + logsExplorerLocator, + metrics: alertResults.length === 1 ? alertResults[0][group].metrics : [], + searchConfiguration: params.searchConfiguration, + startedAt: indexedStartedAt, + }), + ...additionalContext, + }, }); } } - baseAlertFactory.alertLimit.setLimitReached(hasReachedLimit); - const { getRecoveredAlerts } = services.alertFactory.done(); - const recoveredAlerts = getRecoveredAlerts(); + alertsClient.setAlertLimitReached(hasReachedLimit); + const recoveredAlerts = alertsClient.getRecoveredAlerts() ?? []; const groupByKeysObjectForRecovered = getFormattedGroupBy( params.groupBy, - new Set(recoveredAlerts.map((recoveredAlert) => recoveredAlert.getId())) + new Set(recoveredAlerts.map((recoveredAlert) => recoveredAlert.alert.getId())) ); - for (const alert of recoveredAlerts) { - const recoveredAlertId = alert.getId(); - const alertUuid = getAlertUuid(recoveredAlertId); - const timestamp = startedAt.toISOString(); - const indexedStartedAt = getAlertStartedDate(recoveredAlertId) ?? timestamp; + for (const recoveredAlert of recoveredAlerts) { + const recoveredAlertId = recoveredAlert.alert.getId(); + const alertUuid = recoveredAlert.alert.getUuid(); + const indexedStartedAt = recoveredAlert.alert.getStart() ?? startedAt.toISOString(); const group = groupByKeysObjectForRecovered[recoveredAlertId]; - const alertHits = alertUuid ? await getAlertByAlertUuid(alertUuid) : undefined; + const alertHits = recoveredAlert.hit; const additionalContext = getContextForRecoveredAlerts(alertHits); - alert.setContext({ + const context = { alertDetailsUrl: getAlertDetailsUrl(basePath, spaceId, alertUuid), group, timestamp: startedAt.toISOString(), @@ -336,6 +318,11 @@ export const createCustomThresholdExecutor = ({ startedAt: indexedStartedAt, }), ...additionalContext, + }; + + alertsClient.setAlertData({ + id: recoveredAlertId, + context, }); } diff --git a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts index 93286a2988e04..8d3a968d85a64 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts @@ -14,7 +14,6 @@ import { IRuleTypeAlerts, GetViewInAppRelativeUrlFnOpts } from '@kbn/alerting-pl import { IBasePath, Logger } from '@kbn/core/server'; import { legacyExperimentalFieldMap } from '@kbn/alerts-as-data-utils'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; -import { createLifecycleExecutor, IRuleDataClient } from '@kbn/rule-registry-plugin/server'; import { LicenseType } from '@kbn/licensing-plugin/server'; import { EsQueryRuleParamsExtractedParams } from '@kbn/stack-alerts-plugin/server/rule_types/es_query/rule_type_params'; import { observabilityFeatureId, observabilityPaths } from '../../../../common'; @@ -42,12 +41,14 @@ import { } from './custom_threshold_executor'; import { CUSTOM_THRESHOLD_AAD_FIELDS, FIRED_ACTION, NO_DATA_ACTION } from './constants'; import { ObservabilityConfig } from '../../..'; +import { CustomThresholdAlert } from './types'; -export const MetricsRulesTypeAlertDefinition: IRuleTypeAlerts = { +export const MetricsRulesTypeAlertDefinition: IRuleTypeAlerts = { context: THRESHOLD_RULE_REGISTRATION_CONTEXT, mappings: { fieldMap: legacyExperimentalFieldMap }, useEcs: true, useLegacyAlerts: false, + shouldWrite: true, }; export const searchConfigurationSchema = schema.object({ @@ -68,14 +69,10 @@ export const searchConfigurationSchema = schema.object({ ), }); -type CreateLifecycleExecutor = ReturnType; - export function thresholdRuleType( - createLifecycleRuleExecutor: CreateLifecycleExecutor, basePath: IBasePath, config: ObservabilityConfig, logger: Logger, - ruleDataClient: IRuleDataClient, locators: CustomThresholdLocators ) { const baseCriterion = { @@ -145,9 +142,7 @@ export function thresholdRuleType( actionGroups: [FIRED_ACTION, NO_DATA_ACTION], minimumLicenseRequired: 'basic' as LicenseType, isExportable: true, - executor: createLifecycleRuleExecutor( - createCustomThresholdExecutor({ basePath, logger, config, locators }) - ), + executor: createCustomThresholdExecutor({ basePath, logger, config, locators }), doesSetRecoveryContext: true, actionVariables: { context: [ diff --git a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/types.ts b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/types.ts index 5043349c614f2..7f975e3b4489a 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/types.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/types.ts @@ -12,7 +12,12 @@ import { RecoveredActionGroup, RuleTypeState, } from '@kbn/alerting-plugin/common'; -import { Alert } from '@kbn/alerting-plugin/server'; +import { ObservabilityMetricsAlert } from '@kbn/alerts-as-data-utils'; +import { + ALERT_EVALUATION_THRESHOLD, + ALERT_EVALUATION_VALUES, + ALERT_GROUP, +} from '@kbn/rule-data-utils'; import { CustomMetricExpressionParams, Group, @@ -20,7 +25,6 @@ import { } from '../../../../common/custom_threshold_rule/types'; import { FIRED_ACTIONS_ID, NO_DATA_ACTIONS_ID, FIRED_ACTION, NO_DATA_ACTION } from './constants'; import { MissingGroupsRecord } from './lib/check_missing_group'; -import { AdditionalContext } from './utils'; export enum AlertStates { OK, @@ -63,23 +67,17 @@ export type CustomThresholdActionGroup = | typeof NO_DATA_ACTIONS_ID | typeof RecoveredActionGroup.id; -export type CustomThresholdAlertFactory = ( - id: string, - reason: string, - actionGroup: CustomThresholdActionGroup, - additionalContext?: AdditionalContext | null, - evaluationValues?: Array, - threshold?: Array, - group?: Group[] -) => CustomThresholdAlert; - -type CustomThresholdAlert = Alert< - CustomThresholdAlertState, - CustomThresholdAlertContext, - CustomThresholdSpecificActionGroups ->; - export interface AlertExecutionDetails { alertId: string; executionId: string; } + +export type CustomThresholdAlert = Omit< + ObservabilityMetricsAlert, + 'kibana.alert.evaluation.values' | 'kibana.alert.evaluation.threshold' | 'kibana.alert.group' +> & { + // Defining a custom type for this because the schema generation script doesn't allow explicit null values + [ALERT_EVALUATION_VALUES]?: Array; + [ALERT_EVALUATION_THRESHOLD]?: Array; + [ALERT_GROUP]?: Group[]; +}; diff --git a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/utils.ts b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/utils.ts index 09dafe2b50379..2a7a69f591e8c 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/utils.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/utils.ts @@ -16,6 +16,7 @@ import { ES_FIELD_TYPES } from '@kbn/field-types'; import { set } from '@kbn/safer-lodash-set'; import { ParsedExperimentalFields } from '@kbn/rule-registry-plugin/common/parse_experimental_fields'; import { ParsedTechnicalFields } from '@kbn/rule-registry-plugin/common'; +import { Alert } from '@kbn/alerts-as-data-utils'; import type { Group } from '../../../../common/custom_threshold_rule/types'; import { ObservabilityConfig } from '../../..'; import { AlertExecutionDetails } from './types'; @@ -183,8 +184,10 @@ export const flattenAdditionalContext = ( return additionalContext ? flattenObject(additionalContext) : {}; }; -export const getContextForRecoveredAlerts = ( - alertHitSource: Partial | undefined | null +export const getContextForRecoveredAlerts = < + T extends Alert | (ParsedTechnicalFields & ParsedExperimentalFields) +>( + alertHitSource: Partial | undefined | null ): AdditionalContext => { const alert = alertHitSource ? unflattenObject(alertHitSource) : undefined; diff --git a/x-pack/plugins/observability_solution/observability/server/lib/rules/register_rule_types.ts b/x-pack/plugins/observability_solution/observability/server/lib/rules/register_rule_types.ts index bc3611ac216c7..c214939bdec88 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/rules/register_rule_types.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/rules/register_rule_types.ts @@ -7,17 +7,8 @@ import { PluginSetupContract } from '@kbn/alerting-plugin/server'; import { IBasePath, Logger } from '@kbn/core/server'; -import { - createLifecycleExecutor, - Dataset, - IRuleDataService, -} from '@kbn/rule-registry-plugin/server'; -import { mappingFromFieldMap } from '@kbn/alerting-plugin/common'; -import { legacyExperimentalFieldMap } from '@kbn/alerts-as-data-utils'; import { CustomThresholdLocators } from './custom_threshold/custom_threshold_executor'; -import { observabilityFeatureId } from '../../../common'; import { ObservabilityConfig } from '../..'; -import { THRESHOLD_RULE_REGISTRATION_CONTEXT } from '../../common/constants'; import { thresholdRuleType } from './custom_threshold/register_custom_threshold_rule_type'; export function registerRuleTypes( @@ -25,35 +16,7 @@ export function registerRuleTypes( basePath: IBasePath, config: ObservabilityConfig, logger: Logger, - ruleDataService: IRuleDataService, locators: CustomThresholdLocators ) { - const ruleDataClientThreshold = ruleDataService.initializeIndex({ - feature: observabilityFeatureId, - registrationContext: THRESHOLD_RULE_REGISTRATION_CONTEXT, - dataset: Dataset.alerts, - componentTemplateRefs: [], - componentTemplates: [ - { - name: 'mappings', - mappings: mappingFromFieldMap({ ...legacyExperimentalFieldMap }, 'strict'), - }, - ], - }); - - const createLifecycleRuleExecutorThreshold = createLifecycleExecutor( - logger.get('rules'), - ruleDataClientThreshold - ); - - alertingPlugin.registerType( - thresholdRuleType( - createLifecycleRuleExecutorThreshold, - basePath, - config, - logger, - ruleDataClientThreshold, - locators - ) - ); + alertingPlugin.registerType(thresholdRuleType(basePath, config, logger, locators)); } diff --git a/x-pack/plugins/observability_solution/observability/server/plugin.ts b/x-pack/plugins/observability_solution/observability/server/plugin.ts index 805f771a67a02..7b2f36d27fe4a 100644 --- a/x-pack/plugins/observability_solution/observability/server/plugin.ts +++ b/x-pack/plugins/observability_solution/observability/server/plugin.ts @@ -277,7 +277,7 @@ export class ObservabilityPlugin implements Plugin { core.savedObjects.registerType(threshold); - registerRuleTypes(plugins.alerting, core.http.basePath, config, this.logger, ruleDataService, { + registerRuleTypes(plugins.alerting, core.http.basePath, config, this.logger, { alertsLocator, logsExplorerLocator, }); 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/tsconfig.json b/x-pack/plugins/observability_solution/observability/tsconfig.json index 31d4f84f0f9fd..b346dc53f135e 100644 --- a/x-pack/plugins/observability_solution/observability/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability/tsconfig.json @@ -97,7 +97,7 @@ "@kbn/field-formats-plugin", "@kbn/aiops-utils", "@kbn/event-annotation-common", - "@kbn/data-view-field-editor-plugin" + "@kbn/data-view-field-editor-plugin", ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/feedback_buttons.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/feedback_buttons.tsx index ecaa9143b1c5d..92ecc7d945aaa 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/feedback_buttons.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/feedback_buttons.tsx @@ -39,7 +39,7 @@ export function FeedbackButtons({ onClickFeedback }: FeedbackButtonsProps) { }; return ( - + 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 b5e66d9be210e..a12f8822fc9e9 100644 --- a/x-pack/plugins/observability_solution/slo/dev_docs/slo.md +++ b/x-pack/plugins/observability_solution/slo/dev_docs/slo.md @@ -1,6 +1,69 @@ # SLO -Starting in 8.8, SLO is enabled by default. +Starting in 8.8, SLO is enabled by default. SLO is GA since 8.12 + + +## Development & testing + +1. Data generation + +> [!TIP] +> The following commands uses [kbn-data-forge](../../../../packages/kbn-data-forge/README.md) to generate some data for developping or testing SLOs + +Basic command to generate 7 days of data with a couple of services: +```sh +node x-pack/scripts/data_forge.js \ + --events-per-cycle 100 \ + --lookback now-7d \ + --dataset fake_stack \ + --install-kibana-assets \ + --kibana-url http://localhost:5601/kibana +``` + +Command to generate data for 7 days, including some ephemeral project ids. This is useful for working on the groupBy feature: +```sh +node x-pack/scripts/data_forge.js \ + --events-per-cycle 50 \ + --lookback now-7d \ + --ephemeral-project-ids 10 \ + --dataset fake_stack \ + --install-kibana-assets \ + --kibana-url http://localhost:5601/kibana +``` + +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 UI for developping/testing is the simpler approach. + + +Start your kibana instance as usual, and open [kibana](http://localhost:5601/kibana/app/observability/slos). You might need to use the correct base path for your setup. +On this page, you'll be able to create SLOs. + + +> [!WARNING] +> Wait for the data to be fully generated (it can take a few minutes to a couple of hours depending of the settings you use). +> Inspect the created Kibana dashboards to know when the lookback period is generated. + + +With the data generated from the above section, the easiest SLO you can setup would be: + +> **Type**: Custom Query +> +> **Index**: Admin Console +> +> **Good** (query): `http.response.status_code < 500` +> +> **Total** (query): `http.response.status_code : *` +> +> **Group By** (optional): `url.domain` or `host.name` or `none` + + + + ## Supported SLI @@ -8,17 +71,18 @@ 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 -- Custom Histogram +- 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. +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. -The **custom Histogram** SLI requires an index pattern, an optional filter query, and an optional `timestampField`. `good` represents the numerator and `total` represents the denominator, and both require the following fields: +The **Histogram Metric** SLI requires an index pattern, an optional filter query, and an optional `timestampField`. `good` represents the numerator and `total` represents the denominator, and both require the following fields: * field - the histogram field used to aggregate good/total events. * aggregation - type of aggregation to use, limited to `value_count` or `range`. @@ -283,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 @@ -417,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/embeddable/slo/common/slo_overview_details.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/common/slo_overview_details.tsx index dba540a4a22c6..14100474e00b3 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/common/slo_overview_details.tsx +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/common/slo_overview_details.tsx @@ -30,7 +30,6 @@ import { SloDetails, SloTabId, } from '../../../pages/slo_details/components/slo_details'; -import { SLOGroupings } from '../../../pages/slos/components/common/slo_groupings'; export function SloOverviewDetails({ slo, @@ -73,10 +72,9 @@ export function SloOverviewDetails({ })} - - + {tabs.map((tab, index) => ( >; -} - -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 ? ( ; } return ( - {showTitle && ( - <> - {slo.name} - - - )} + { }); }); - 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_details/slo_details.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/slo_details.tsx index d5e2665d4a9cb..0b87a00371aa4 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/slo_details.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/slo_details.tsx @@ -8,7 +8,7 @@ import React, { useEffect, useState } from 'react'; import { useLocation, useParams } from 'react-router-dom'; import { useIsMutating } from '@tanstack/react-query'; -import { EuiLoadingSpinner } from '@elastic/eui'; +import { EuiLoadingSpinner, EuiSkeletonText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { IBasePath } from '@kbn/core-http-browser'; import type { ChromeBreadcrumb } from '@kbn/core-chrome-browser'; @@ -124,7 +124,8 @@ export function SloDetailsPage() { return ( , + pageTitle: slo?.name ?? , + children: , rightSideItems: [ , { ).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/observability_solution/slo/server/lib/rules/register_burn_rate_rule.ts b/x-pack/plugins/observability_solution/slo/server/lib/rules/register_burn_rate_rule.ts index 8ddaffdc05fad..d432dc5c52d34 100644 --- a/x-pack/plugins/observability_solution/slo/server/lib/rules/register_burn_rate_rule.ts +++ b/x-pack/plugins/observability_solution/slo/server/lib/rules/register_burn_rate_rule.ts @@ -7,18 +7,9 @@ import { PluginSetupContract } from '@kbn/alerting-plugin/server'; import { IBasePath, Logger } from '@kbn/core/server'; -import { - createLifecycleExecutor, - Dataset, - IRuleDataService, -} from '@kbn/rule-registry-plugin/server'; -import { mappingFromFieldMap } from '@kbn/alerting-plugin/common'; -import { legacyExperimentalFieldMap } from '@kbn/alerts-as-data-utils'; +import { IRuleDataService } from '@kbn/rule-registry-plugin/server'; import { CustomThresholdLocators } from '@kbn/observability-plugin/server'; -import { sloFeatureId } from '@kbn/observability-plugin/common'; -import { SLO_RULE_REGISTRATION_CONTEXT } from '../../common/constants'; import { sloBurnRateRuleType } from './slo_burn_rate'; -import { sloRuleFieldMap } from './slo_burn_rate/field_map'; export function registerBurnRateRule( alertingPlugin: PluginSetupContract, @@ -28,27 +19,5 @@ export function registerBurnRateRule( locators: CustomThresholdLocators // TODO move this somewhere else, or use only alertsLocator ) { // SLO RULE - const ruleDataClientSLO = ruleDataService.initializeIndex({ - feature: sloFeatureId, - registrationContext: SLO_RULE_REGISTRATION_CONTEXT, - dataset: Dataset.alerts, - componentTemplateRefs: [], - componentTemplates: [ - { - name: 'mappings', - mappings: mappingFromFieldMap( - { ...legacyExperimentalFieldMap, ...sloRuleFieldMap }, - 'strict' - ), - }, - ], - }); - - const createLifecycleRuleExecutorSLO = createLifecycleExecutor( - logger.get('rules'), - ruleDataClientSLO - ); - alertingPlugin.registerType( - sloBurnRateRuleType(createLifecycleRuleExecutorSLO, basePath, locators.alertsLocator) - ); + alertingPlugin.registerType(sloBurnRateRuleType(basePath, locators.alertsLocator)); } diff --git a/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.test.ts b/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.test.ts index 4796a6c976205..7cfa6bc17600e 100644 --- a/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.test.ts @@ -18,12 +18,10 @@ import { loggingSystemMock, savedObjectsClientMock, } from '@kbn/core/server/mocks'; -import { LifecycleAlertService, LifecycleAlertServices } from '@kbn/rule-registry-plugin/server'; -import { PublicAlertFactory } from '@kbn/alerting-plugin/server/alert/create_alert_factory'; import { ISearchStartSearchSource } from '@kbn/data-plugin/public'; import { MockedLogger } from '@kbn/logging-mocks'; import { SanitizedRuleConfig } from '@kbn/alerting-plugin/common'; -import { Alert, RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; import { DEFAULT_FLAPPING_SETTINGS } from '@kbn/alerting-plugin/common/rules_settings'; import { LocatorPublic } from '@kbn/share-plugin/common'; import { AlertsLocatorParams } from '@kbn/observability-plugin/common'; @@ -67,6 +65,8 @@ import { SHORT_WINDOW, } from './lib/build_query'; import { get } from 'lodash'; +import { ObservabilitySloAlert } from '@kbn/alerts-as-data-utils'; +import { publicAlertsClientMock } from '@kbn/alerting-plugin/server/alerts_client/alerts_client.mock'; const commonEsResponse = { took: 100, @@ -106,9 +106,6 @@ describe('BurnRateRuleExecutor', () => { let esClientMock: ElasticsearchClientMock; let soClientMock: jest.Mocked; let loggerMock: jest.Mocked; - let alertUuidMap: Map; - let alertMock: Partial; - const alertUuid = 'mockedAlertUuid'; const basePathMock = { publicBaseUrl: 'https://kibana.dev' } as IBasePath; const alertsLocatorMock = { getLocation: jest.fn().mockImplementation(() => ({ @@ -117,50 +114,35 @@ describe('BurnRateRuleExecutor', () => { } as any as LocatorPublic; const ISO_DATE_REGEX = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)((-(\d{2}):(\d{2})|Z)?)$/; - let alertWithLifecycleMock: jest.MockedFn; - let alertFactoryMock: jest.Mocked< - PublicAlertFactory - >; + let searchSourceClientMock: jest.Mocked; let uiSettingsClientMock: jest.Mocked; - let servicesMock: RuleExecutorServices< - BurnRateAlertState, - BurnRateAlertContext, - BurnRateAllowedActionGroups - > & - LifecycleAlertServices; + let servicesMock: jest.Mocked< + RuleExecutorServices< + BurnRateAlertState, + BurnRateAlertContext, + BurnRateAllowedActionGroups, + ObservabilitySloAlert + > + >; beforeEach(() => { - alertUuidMap = new Map(); - alertMock = { - scheduleActions: jest.fn(), - replaceState: jest.fn(), - }; esClientMock = elasticsearchServiceMock.createElasticsearchClient(); soClientMock = savedObjectsClientMock.create(); - alertWithLifecycleMock = jest.fn().mockImplementation(({ id }) => { - alertUuidMap.set(id, alertUuid); - return alertMock as any; - }); - alertFactoryMock = { - create: jest.fn(), - done: jest.fn(), - alertLimit: { getValue: jest.fn(), setLimitReached: jest.fn() }, - }; loggerMock = loggingSystemMock.createLogger(); servicesMock = { - alertWithLifecycle: alertWithLifecycleMock, savedObjectsClient: soClientMock, scopedClusterClient: { asCurrentUser: esClientMock, asInternalUser: esClientMock }, - alertsClient: null, - alertFactory: alertFactoryMock, + alertsClient: publicAlertsClientMock.create(), + alertFactory: { + create: jest.fn(), + done: jest.fn(), + alertLimit: { getValue: jest.fn(), setLimitReached: jest.fn() }, + }, searchSourceClient: searchSourceClientMock, uiSettingsClient: uiSettingsClientMock, shouldWriteAlerts: jest.fn(), shouldStopExecution: jest.fn(), - getAlertStartedDate: jest.fn(), - getAlertUuid: jest.fn().mockImplementation((id) => alertUuidMap.get(id) || 'bad-uuid'), - getAlertByAlertUuid: jest.fn(), share: {} as SharePluginStart, dataViews: dataViewPluginMocks.createStartContract(), }; @@ -208,8 +190,9 @@ describe('BurnRateRuleExecutor', () => { }); expect(esClientMock.search).not.toHaveBeenCalled(); - expect(alertWithLifecycleMock).not.toHaveBeenCalled(); - expect(alertFactoryMock.done).not.toHaveBeenCalled(); + expect(servicesMock.alertsClient!.report).not.toHaveBeenCalled(); + expect(servicesMock.alertsClient!.setAlertData).not.toHaveBeenCalled(); + expect(servicesMock.alertsClient!.getRecoveredAlerts).not.toHaveBeenCalled(); expect(result).toEqual({ state: {} }); }); @@ -239,7 +222,6 @@ describe('BurnRateRuleExecutor', () => { esClientMock.search.mockResolvedValueOnce( generateEsResponse(ruleParams, [], { instanceId: 'bar' }) ); - alertFactoryMock.done.mockReturnValueOnce({ getRecoveredAlerts: () => [] }); const executor = getRuleExecutor({ basePath: basePathMock }); await executor({ @@ -256,7 +238,8 @@ describe('BurnRateRuleExecutor', () => { getTimeRange, }); - expect(alertWithLifecycleMock).not.toBeCalled(); + expect(servicesMock.alertsClient?.report).not.toBeCalled(); + expect(servicesMock.alertsClient?.setAlertData).not.toBeCalled(); }); it('does not schedule an alert when the short window burn rate is below the threshold', async () => { @@ -285,7 +268,6 @@ describe('BurnRateRuleExecutor', () => { esClientMock.search.mockResolvedValueOnce( generateEsResponse(ruleParams, [], { instanceId: 'bar' }) ); - alertFactoryMock.done.mockReturnValueOnce({ getRecoveredAlerts: () => [] }); const executor = getRuleExecutor({ basePath: basePathMock }); await executor({ @@ -302,7 +284,8 @@ describe('BurnRateRuleExecutor', () => { getTimeRange, }); - expect(alertWithLifecycleMock).not.toBeCalled(); + expect(servicesMock.alertsClient?.report).not.toBeCalled(); + expect(servicesMock.alertsClient?.setAlertData).not.toBeCalled(); }); it('schedules an alert when both windows of first window definition burn rate have reached the threshold', async () => { @@ -331,12 +314,18 @@ describe('BurnRateRuleExecutor', () => { esClientMock.search.mockResolvedValueOnce( generateEsResponse(ruleParams, [], { instanceId: 'bar' }) ); - alertFactoryMock.done.mockReturnValueOnce({ getRecoveredAlerts: () => [] }); + + // @ts-ignore + servicesMock.alertsClient!.report.mockImplementation(({ id }: { id: string }) => ({ + uuid: `uuid-${id}`, + start: new Date().toISOString(), + })); const executor = getRuleExecutor({ basePath: basePathMock, alertsLocator: alertsLocatorMock, }); + await executor({ params: ruleParams, startedAt: new Date(), @@ -351,9 +340,13 @@ describe('BurnRateRuleExecutor', () => { getTimeRange, }); - expect(alertWithLifecycleMock).toBeCalledWith({ + expect(servicesMock.alertsClient?.report).toBeCalledWith({ id: 'foo', - fields: { + actionGroup: ALERT_ACTION.id, + state: { + alertState: AlertStates.ALERT, + }, + payload: { [ALERT_REASON]: 'CRITICAL: The burn rate for the past 1h is 2.3 and for the past 5m is 2.1 for foo. Alert when above 2 for both windows', [ALERT_EVALUATION_THRESHOLD]: 2, @@ -363,9 +356,13 @@ describe('BurnRateRuleExecutor', () => { [SLO_INSTANCE_ID_FIELD]: 'foo', }, }); - expect(alertWithLifecycleMock).toBeCalledWith({ + expect(servicesMock.alertsClient?.report).toBeCalledWith({ id: 'bar', - fields: { + actionGroup: ALERT_ACTION.id, + state: { + alertState: AlertStates.ALERT, + }, + payload: { [ALERT_REASON]: 'CRITICAL: The burn rate for the past 1h is 2.5 and for the past 5m is 2.2 for bar. Alert when above 2 for both windows', [ALERT_EVALUATION_THRESHOLD]: 2, @@ -375,32 +372,32 @@ describe('BurnRateRuleExecutor', () => { [SLO_INSTANCE_ID_FIELD]: 'bar', }, }); - expect(alertMock.scheduleActions).toBeCalledWith( - ALERT_ACTION.id, - expect.objectContaining({ + expect(servicesMock.alertsClient?.setAlertData).toHaveBeenNthCalledWith(1, { + id: 'foo', + context: expect.objectContaining({ longWindow: { burnRate: 2.3, duration: '1h' }, shortWindow: { burnRate: 2.1, duration: '5m' }, burnRateThreshold: 2, reason: 'CRITICAL: The burn rate for the past 1h is 2.3 and for the past 5m is 2.1 for foo. Alert when above 2 for both windows', alertDetailsUrl: 'mockedAlertsLocator > getLocation', - }) - ); - expect(alertMock.scheduleActions).toBeCalledWith( - ALERT_ACTION.id, - expect.objectContaining({ + }), + }); + expect(servicesMock.alertsClient?.setAlertData).toHaveBeenNthCalledWith(2, { + id: 'bar', + context: expect.objectContaining({ longWindow: { burnRate: 2.5, duration: '1h' }, shortWindow: { burnRate: 2.2, duration: '5m' }, burnRateThreshold: 2, reason: 'CRITICAL: The burn rate for the past 1h is 2.5 and for the past 5m is 2.2 for bar. Alert when above 2 for both windows', alertDetailsUrl: 'mockedAlertsLocator > getLocation', - }) - ); - expect(alertMock.replaceState).toBeCalledWith({ alertState: AlertStates.ALERT }); + }), + }); + expect(alertsLocatorMock.getLocation).toBeCalledWith({ baseUrl: 'https://kibana.dev', - kuery: 'kibana.alert.uuid: "mockedAlertUuid"', + kuery: 'kibana.alert.uuid: "uuid-foo"', rangeFrom: expect.stringMatching(ISO_DATE_REGEX), spaceId: 'irrelevant', }); @@ -432,7 +429,12 @@ describe('BurnRateRuleExecutor', () => { esClientMock.search.mockResolvedValueOnce( generateEsResponse(ruleParams, [], { instanceId: 'bar' }) ); - alertFactoryMock.done.mockReturnValueOnce({ getRecoveredAlerts: () => [] }); + + // @ts-ignore + servicesMock.alertsClient!.report.mockImplementation(({ id }: { id: string }) => ({ + uuid: `uuid-${id}`, + start: new Date().toISOString(), + })); const executor = getRuleExecutor({ basePath: basePathMock }); await executor({ @@ -449,9 +451,13 @@ describe('BurnRateRuleExecutor', () => { getTimeRange, }); - expect(alertWithLifecycleMock).toBeCalledWith({ + expect(servicesMock.alertsClient!.report).toBeCalledWith({ id: 'foo', - fields: { + actionGroup: HIGH_PRIORITY_ACTION_ID, + state: { + alertState: AlertStates.ALERT, + }, + payload: { [ALERT_REASON]: 'HIGH: The burn rate for the past 6h is 1.2 and for the past 30m is 1.9 for foo. Alert when above 1 for both windows', [ALERT_EVALUATION_THRESHOLD]: 1, @@ -461,9 +467,13 @@ describe('BurnRateRuleExecutor', () => { [SLO_INSTANCE_ID_FIELD]: 'foo', }, }); - expect(alertWithLifecycleMock).toBeCalledWith({ + expect(servicesMock.alertsClient!.report).toBeCalledWith({ id: 'bar', - fields: { + actionGroup: HIGH_PRIORITY_ACTION_ID, + state: { + alertState: AlertStates.ALERT, + }, + payload: { [ALERT_REASON]: 'HIGH: The burn rate for the past 6h is 1.1 and for the past 30m is 1.5 for bar. Alert when above 1 for both windows', [ALERT_EVALUATION_THRESHOLD]: 1, @@ -473,27 +483,28 @@ describe('BurnRateRuleExecutor', () => { [SLO_INSTANCE_ID_FIELD]: 'bar', }, }); - expect(alertMock.scheduleActions).toBeCalledWith( - HIGH_PRIORITY_ACTION_ID, - expect.objectContaining({ + + expect(servicesMock.alertsClient?.setAlertData).toHaveBeenNthCalledWith(1, { + id: 'foo', + context: expect.objectContaining({ longWindow: { burnRate: 1.2, duration: '6h' }, shortWindow: { burnRate: 1.9, duration: '30m' }, burnRateThreshold: 1, reason: 'HIGH: The burn rate for the past 6h is 1.2 and for the past 30m is 1.9 for foo. Alert when above 1 for both windows', - }) - ); - expect(alertMock.scheduleActions).toBeCalledWith( - HIGH_PRIORITY_ACTION_ID, - expect.objectContaining({ + }), + }); + + expect(servicesMock.alertsClient?.setAlertData).toHaveBeenNthCalledWith(2, { + id: 'bar', + context: expect.objectContaining({ longWindow: { burnRate: 1.1, duration: '6h' }, shortWindow: { burnRate: 1.5, duration: '30m' }, burnRateThreshold: 1, reason: 'HIGH: The burn rate for the past 6h is 1.1 and for the past 30m is 1.5 for bar. Alert when above 1 for both windows', - }) - ); - expect(alertMock.replaceState).toBeCalledWith({ alertState: AlertStates.ALERT }); + }), + }); }); }); }); diff --git a/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.ts b/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.ts index 3a8e153c76663..88d16b5e12db3 100644 --- a/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.ts +++ b/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/executor.ts @@ -12,8 +12,7 @@ import { ALERT_EVALUATION_VALUE, ALERT_REASON, } from '@kbn/rule-data-utils'; -import { LifecycleRuleExecutor } from '@kbn/rule-registry-plugin/server'; -import { ExecutorType } from '@kbn/alerting-plugin/server'; +import { AlertsClientError, RuleExecutorOptions } from '@kbn/alerting-plugin/server'; import { IBasePath } from '@kbn/core/server'; import { LocatorPublic } from '@kbn/share-plugin/common'; @@ -21,6 +20,8 @@ import { upperCase } from 'lodash'; import { addSpaceIdToPath } from '@kbn/spaces-plugin/server'; import { ALL_VALUE } from '@kbn/slo-schema'; import { AlertsLocatorParams, getAlertUrl } from '@kbn/observability-plugin/common'; +import { ObservabilitySloAlert } from '@kbn/alerts-as-data-utils'; +import { ExecutorType } from '@kbn/alerting-plugin/server'; import { SLO_ID_FIELD, SLO_INSTANCE_ID_FIELD, @@ -51,21 +52,17 @@ export const getRuleExecutor = ({ }: { basePath: IBasePath; alertsLocator?: LocatorPublic; -}): LifecycleRuleExecutor< - BurnRateRuleParams, - BurnRateRuleTypeState, - BurnRateAlertState, - BurnRateAlertContext, - BurnRateAllowedActionGroups -> => - async function executor({ - services, - params, - logger, - startedAt, - spaceId, - getTimeRange, - }): ReturnType< +}) => + async function executor( + options: RuleExecutorOptions< + BurnRateRuleParams, + BurnRateRuleTypeState, + BurnRateAlertState, + BurnRateAlertContext, + BurnRateAllowedActionGroups, + ObservabilitySloAlert + > + ): ReturnType< ExecutorType< BurnRateRuleParams, BurnRateRuleTypeState, @@ -74,14 +71,13 @@ export const getRuleExecutor = ({ BurnRateAllowedActionGroups > > { - const { - alertWithLifecycle, - savedObjectsClient: soClient, - scopedClusterClient: esClient, - alertFactory, - getAlertStartedDate, - getAlertUuid, - } = services; + const { services, params, logger, startedAt, spaceId, getTimeRange } = options; + + const { savedObjectsClient: soClient, scopedClusterClient: esClient, alertsClient } = services; + + if (!alertsClient) { + throw new AlertsClientError(); + } const sloRepository = new KibanaSavedObjectsSLORepository(soClient, logger); const slo = await sloRepository.findById(params.sloId); @@ -96,7 +92,7 @@ export const getRuleExecutor = ({ const results = await evaluate(esClient.asCurrentUser, slo, params, new Date(dateEnd)); if (results.length > 0) { - const alertLimit = alertFactory.alertLimit.getValue(); + const alertLimit = alertsClient.getAlertLimitValue(); let hasReachedLimit = false; let scheduledActionsCount = 0; for (const result of results) { @@ -133,9 +129,14 @@ export const getRuleExecutor = ({ ); const alertId = instanceId; - const alert = alertWithLifecycle({ + + const { uuid, start } = alertsClient.report({ id: alertId, - fields: { + actionGroup: windowDef.actionGroup, + state: { + alertState: AlertStates.ALERT, + }, + payload: { [ALERT_REASON]: reason, [ALERT_EVALUATION_THRESHOLD]: windowDef.burnRateThreshold, [ALERT_EVALUATION_VALUE]: Math.min(longWindowBurnRate, shortWindowBurnRate), @@ -144,10 +145,10 @@ export const getRuleExecutor = ({ [SLO_INSTANCE_ID_FIELD]: instanceId, }, }); - const indexedStartedAt = getAlertStartedDate(alertId) ?? startedAt.toISOString(); - const alertUuid = getAlertUuid(alertId); + + const indexedStartedAt = start ?? startedAt.toISOString(); const alertDetailsUrl = await getAlertUrl( - alertUuid, + uuid, spaceId, indexedStartedAt, alertsLocator, @@ -168,20 +169,18 @@ export const getRuleExecutor = ({ slo, }; - alert.scheduleActions(windowDef.actionGroup, context); - alert.replaceState({ alertState: AlertStates.ALERT }); + alertsClient.setAlertData({ id: alertId, context }); scheduledActionsCount++; } } - alertFactory.alertLimit.setLimitReached(hasReachedLimit); + alertsClient.setAlertLimitReached(hasReachedLimit); } - const { getRecoveredAlerts } = alertFactory.done(); - const recoveredAlerts = getRecoveredAlerts(); + const recoveredAlerts = alertsClient.getRecoveredAlerts() ?? []; for (const recoveredAlert of recoveredAlerts) { - const alertId = recoveredAlert.getId(); - const indexedStartedAt = getAlertStartedDate(alertId) ?? startedAt.toISOString(); - const alertUuid = recoveredAlert.getUuid(); + const alertId = recoveredAlert.alert.getId(); + const indexedStartedAt = recoveredAlert.alert.getStart() ?? startedAt.toISOString(); + const alertUuid = recoveredAlert.alert.getUuid(); const alertDetailsUrl = await getAlertUrl( alertUuid, spaceId, @@ -206,7 +205,10 @@ export const getRuleExecutor = ({ sloInstanceId: alertId, }; - recoveredAlert.setContext(context); + alertsClient.setAlertData({ + id: alertId, + context, + }); } return { state: {} }; diff --git a/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/register.ts b/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/register.ts index 8c87d3ee71bbd..c3936de825f32 100644 --- a/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/register.ts +++ b/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/register.ts @@ -10,7 +10,6 @@ import { GetViewInAppRelativeUrlFnOpts } from '@kbn/alerting-plugin/server'; import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; import { LicenseType } from '@kbn/licensing-plugin/server'; -import { createLifecycleExecutor } from '@kbn/rule-registry-plugin/server'; import { legacyExperimentalFieldMap } from '@kbn/alerts-as-data-utils'; import { IBasePath } from '@kbn/core/server'; import { LocatorPublic } from '@kbn/share-plugin/common'; @@ -44,10 +43,7 @@ const windowSchema = schema.object({ actionGroup: schema.string(), }); -type CreateLifecycleExecutor = ReturnType; - export function sloBurnRateRuleType( - createLifecycleRuleExecutor: CreateLifecycleExecutor, basePath: IBasePath, alertsLocator?: LocatorPublic ) { @@ -76,7 +72,7 @@ export function sloBurnRateRuleType( producer: sloFeatureId, minimumLicenseRequired: 'platinum' as LicenseType, isExportable: true, - executor: createLifecycleRuleExecutor(getRuleExecutor({ basePath, alertsLocator })), + executor: getRuleExecutor({ basePath, alertsLocator }), doesSetRecoveryContext: true, actionVariables: { context: [ @@ -97,6 +93,7 @@ export function sloBurnRateRuleType( mappings: { fieldMap: { ...legacyExperimentalFieldMap, ...sloRuleFieldMap } }, useEcs: false, useLegacyAlerts: true, + shouldWrite: true, }, getViewInAppRelativeUrl: ({ rule }: GetViewInAppRelativeUrlFnOpts<{}>) => observabilityPaths.ruleDetails(rule.id), diff --git a/x-pack/plugins/search_connectors/.gitignore b/x-pack/plugins/search_connectors/.gitignore new file mode 100644 index 0000000000000..c3dca1b96fcc2 --- /dev/null +++ b/x-pack/plugins/search_connectors/.gitignore @@ -0,0 +1,2 @@ +/build +/target diff --git a/x-pack/plugins/search_connectors/README.mdx b/x-pack/plugins/search_connectors/README.mdx new file mode 100755 index 0000000000000..6edacc7d84eb2 --- /dev/null +++ b/x-pack/plugins/search_connectors/README.mdx @@ -0,0 +1,3 @@ +# Search Connectors plugin + +This plugin contains common assets and endpoints for the use of connectors in Kibana. Primarily used by the `enterprise_search` and `serverless_search` plugins. diff --git a/packages/kbn-search-connectors/connectors.ts b/x-pack/plugins/search_connectors/common/connectors.ts similarity index 63% rename from packages/kbn-search-connectors/connectors.ts rename to x-pack/plugins/search_connectors/common/connectors.ts index 76270c3a8e94d..9ffb1ee82254a 100644 --- a/packages/kbn-search-connectors/connectors.ts +++ b/x-pack/plugins/search_connectors/common/connectors.ts @@ -1,9 +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 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. + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. */ import { i18n } from '@kbn/i18n'; @@ -27,14 +26,17 @@ export interface ConnectorServerSideDefinition { export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], - description: i18n.translate('searchConnectors.content.nativeConnectors.azureBlob.description', { - defaultMessage: 'Search over your content on Azure Blob Storage.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.azureBlob.description', + { + defaultMessage: 'Search over your content on Azure Blob Storage.', + } + ), iconPath: 'azure_blob_storage.svg', isBeta: false, isNative: true, keywords: ['cloud', 'azure', 'blob', 's3', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.azureBlob.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.azureBlob.name', { defaultMessage: 'Azure Blob Storage', }), serviceType: 'azure_blob_storage', @@ -42,7 +44,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.confluence.description', + 'searchConnectorsPlugin.content.nativeConnectors.confluence.description', { defaultMessage: 'Search over your content on Confluence Cloud.', } @@ -51,7 +53,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['confluence', 'cloud', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.confluence.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.confluence.name', { defaultMessage: 'Confluence Cloud & Server', }), serviceType: 'confluence', @@ -59,7 +61,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.confluenceDataCenter.description', + 'searchConnectorsPlugin.content.nativeConnectors.confluenceDataCenter.description', { defaultMessage: 'Search over your content on Confluence Data Center.', } @@ -69,9 +71,12 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: true, keywords: ['confluence', 'data', 'center', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.confluence_data_center.name', { - defaultMessage: 'Confluence Data Center', - }), + name: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.confluence_data_center.name', + { + defaultMessage: 'Confluence Data Center', + } + ), serviceType: 'confluence', }, { @@ -82,15 +87,18 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector', 'connector_client', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.dropbox.description', { - defaultMessage: 'Search over your files and folders stored on Dropbox.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.dropbox.description', + { + defaultMessage: 'Search over your files and folders stored on Dropbox.', + } + ), iconPath: 'dropbox.svg', isBeta: false, isNative: true, isTechPreview: false, keywords: ['dropbox', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.dropbox.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.dropbox.name', { defaultMessage: 'Dropbox', }), serviceType: 'dropbox', @@ -104,14 +112,17 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector_client', 'jira', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.jira.description', { - defaultMessage: 'Search over your content on Jira Cloud.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.jira.description', + { + defaultMessage: 'Search over your content on Jira Cloud.', + } + ), iconPath: 'jira_cloud.svg', isBeta: false, isNative: true, keywords: ['jira', 'cloud', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.jira.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.jira.name', { defaultMessage: 'Jira Cloud', }), serviceType: 'jira', @@ -126,7 +137,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'jira', ], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.jiraServer.description', + 'searchConnectorsPlugin.content.nativeConnectors.jiraServer.description', { defaultMessage: 'Search over your content on Jira Server.', } @@ -135,7 +146,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: false, keywords: ['jira', 'server', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.jiraServer.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.jiraServer.name', { defaultMessage: 'Jira Server', }), serviceType: 'jira', @@ -143,7 +154,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.jiraDataCenter.description', + 'searchConnectorsPlugin.content.nativeConnectors.jiraDataCenter.description', { defaultMessage: 'Search over your content on Jira Data Center.', } @@ -153,21 +164,24 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isTechPreview: true, isNative: true, keywords: ['jira', 'data', 'center', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.jira_data_center.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.jira_data_center.name', { defaultMessage: 'Jira Data Center', }), serviceType: 'jira', }, { categories: ['enterprise_search', 'elastic_stack', 'connector', 'connector_client'], - description: i18n.translate('searchConnectors.content.nativeConnectors.github.description', { - defaultMessage: 'Search over your projects and repos on GitHub.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.github.description', + { + defaultMessage: 'Search over your projects and repos on GitHub.', + } + ), iconPath: 'github.svg', isBeta: false, isNative: true, keywords: ['github', 'cloud', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.github.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.github.name', { defaultMessage: 'GitHub & GitHub Enterprise Server', }), serviceType: 'github', @@ -175,7 +189,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.googleCloud.description', + 'searchConnectorsPlugin.content.nativeConnectors.googleCloud.description', { defaultMessage: 'Search over your content on Google Cloud Storage.', } @@ -184,7 +198,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['google', 'cloud', 'blob', 's3', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.googleCloud.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.googleCloud.name', { defaultMessage: 'Google Cloud Storage', }), serviceType: 'google_cloud_storage', @@ -192,7 +206,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.googleDrive.description', + 'searchConnectorsPlugin.content.nativeConnectors.googleDrive.description', { defaultMessage: 'Search over your content on Google Drive.', } @@ -201,7 +215,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['google', 'drive', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.googleDrive.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.googleDrive.name', { defaultMessage: 'Google Drive', }), serviceType: 'google_drive', @@ -214,14 +228,17 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector', 'connector_client', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.mongoDB.description', { - defaultMessage: 'Search over your MongoDB content.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.mongoDB.description', + { + defaultMessage: 'Search over your MongoDB content.', + } + ), iconPath: 'mongodb.svg', isBeta: false, isNative: true, keywords: ['mongo', 'mongodb', 'database', 'nosql', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.mongodb.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.mongodb.name', { defaultMessage: 'MongoDB', }), serviceType: 'mongodb', @@ -234,14 +251,17 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector', 'connector_client', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.mysql.description', { - defaultMessage: 'Search over your MySQL content.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.mysql.description', + { + defaultMessage: 'Search over your MySQL content.', + } + ), iconPath: 'mysql.svg', isBeta: false, isNative: true, keywords: ['mysql', 'sql', 'database', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.mysql.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.mysql.name', { defaultMessage: 'MySQL', }), serviceType: 'mysql', @@ -255,21 +275,24 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector', 'connector_client', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.msSql.description', { - defaultMessage: 'Search over your content on Microsoft SQL Server.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.msSql.description', + { + defaultMessage: 'Search over your content on Microsoft SQL Server.', + } + ), iconPath: 'mssql.svg', isBeta: false, isNative: true, keywords: ['mssql', 'microsoft', 'sql', 'database', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.microsoftSQL.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.microsoftSQL.name', { defaultMessage: 'Microsoft SQL', }), serviceType: 'mssql', }, { description: i18n.translate( - 'searchConnectors.content.nativeConnectors.netowkrDrive.description', + 'searchConnectorsPlugin.content.nativeConnectors.netowkrDrive.description', { defaultMessage: 'Search over your Network Drive content.', } @@ -279,28 +302,31 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['network', 'drive', 'file', 'directory', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.networkDrive.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.networkDrive.name', { defaultMessage: 'Network drive', }), serviceType: 'network_drive', }, { categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], - description: i18n.translate('searchConnectors.content.nativeConnectors.notion.description', { - defaultMessage: 'Search over your content on Notion.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.notion.description', + { + defaultMessage: 'Search over your content on Notion.', + } + ), iconPath: 'notion.svg', isBeta: true, isNative: false, keywords: ['notion', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.notion.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.notion.name', { defaultMessage: 'Notion', }), serviceType: 'notion', }, { description: i18n.translate( - 'searchConnectors.content.nativeConnectors.postgreSQL.description', + 'searchConnectorsPlugin.content.nativeConnectors.postgreSQL.description', { defaultMessage: 'Search over your content on PostgreSQL.', } @@ -317,22 +343,25 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['postgresql', 'sql', 'database', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.postgresql.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.postgresql.name', { defaultMessage: 'PostgreSQL', }), serviceType: 'postgresql', }, { categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], - description: i18n.translate('searchConnectors.content.nativeConnectors.redis.description', { - defaultMessage: 'Search over your content on Redis.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.redis.description', + { + defaultMessage: 'Search over your content on Redis.', + } + ), iconPath: 'redis.svg', isBeta: false, isNative: false, isTechPreview: true, keywords: ['redis', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.redis.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.redis.name', { defaultMessage: 'Redis', }), serviceType: 'redis', @@ -340,7 +369,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.salesforce.description', + 'searchConnectorsPlugin.content.nativeConnectors.salesforce.description', { defaultMessage: 'Search over your content on Salesforce.', } @@ -349,7 +378,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['salesforce', 'cloud', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.salesforce.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.salesforce.name', { defaultMessage: 'Salesforce', }), serviceType: 'salesforce', @@ -364,7 +393,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector_client', ], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.salesforceSandbox.description', + 'searchConnectorsPlugin.content.nativeConnectors.salesforceSandbox.description', { defaultMessage: 'Search over your content on Salesforce Sandbox.', } @@ -373,7 +402,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['salesforce', 'cloud', 'connector', 'sandbox'], - name: i18n.translate('searchConnectors.content.nativeConnectors.salesforceBox.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.salesforceBox.name', { defaultMessage: 'Salesforce Sandbox', }), serviceType: 'salesforce', @@ -381,7 +410,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.serviceNow.description', + 'searchConnectorsPlugin.content.nativeConnectors.serviceNow.description', { defaultMessage: 'Search over your content on ServiceNow.', } @@ -391,7 +420,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['servicenow', 'cloud', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.serviceNow.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.serviceNow.name', { defaultMessage: 'ServiceNow', }), serviceType: 'servicenow', @@ -399,7 +428,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.sharepointOnline.description', + 'searchConnectorsPlugin.content.nativeConnectors.sharepointOnline.description', { defaultMessage: 'Search over your content on SharePoint Online.', } @@ -409,21 +438,24 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['sharepoint', 'office365', 'cloud', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.sharepointOnline.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.sharepointOnline.name', { defaultMessage: 'Sharepoint Online', }), serviceType: 'sharepoint_online', }, { categories: ['enterprise_search', 'elastic_stack', 'connector', 'connector_client'], - description: i18n.translate('searchConnectors.content.nativeConnectors.gmail.description', { - defaultMessage: 'Search over your content on Gmail.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.gmail.description', + { + defaultMessage: 'Search over your content on Gmail.', + } + ), iconPath: 'gmail.svg', isBeta: true, isNative: true, keywords: ['gmail', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.gmail.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.gmail.name', { defaultMessage: 'Gmail', }), serviceType: 'gmail', @@ -437,14 +469,17 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector', 'connector_client', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.oracle.description', { - defaultMessage: 'Search over your content on Oracle.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.oracle.description', + { + defaultMessage: 'Search over your content on Oracle.', + } + ), iconPath: 'oracle.svg', isBeta: true, isNative: true, keywords: ['oracle', 'sql', 'database', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.oracle.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.oracle.name', { defaultMessage: 'Oracle', }), serviceType: 'oracle', @@ -458,20 +493,23 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector', 'connector_client', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.oneDrive.description', { - defaultMessage: 'Search over your content on OneDrive.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.oneDrive.description', + { + defaultMessage: 'Search over your content on OneDrive.', + } + ), iconPath: 'onedrive.svg', isBeta: false, isNative: true, keywords: ['network', 'drive', 'file', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.oneDrive.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.oneDrive.name', { defaultMessage: 'OneDrive', }), serviceType: 'onedrive', }, { - description: i18n.translate('searchConnectors.content.nativeConnectors.s3.description', { + description: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.s3.description', { defaultMessage: 'Search over your content on Amazon S3.', }), categories: [ @@ -485,22 +523,25 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['s3', 'cloud', 'amazon', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.s3.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.s3.name', { defaultMessage: 'S3', }), serviceType: 's3', }, { - description: i18n.translate('searchConnectors.content.nativeConnectors.slack.description', { - defaultMessage: 'Search over your content on Slack.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.slack.description', + { + defaultMessage: 'Search over your content on Slack.', + } + ), categories: ['enterprise_search', 'elastic_stack', 'connector', 'connector_client'], iconPath: 'slack.svg', isBeta: false, isNative: false, isTechPreview: true, keywords: ['slack', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.slack.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.slack.name', { defaultMessage: 'Slack', }), serviceType: 'slack', @@ -508,7 +549,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.sharepointServer.description', + 'searchConnectorsPlugin.content.nativeConnectors.sharepointServer.description', { defaultMessage: 'Search over your content on SharePoint Server.', } @@ -518,7 +559,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: false, keywords: ['sharepoint', 'cloud', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.sharepointServer.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.sharepointServer.name', { defaultMessage: 'Sharepoint Server', }), serviceType: 'sharepoint_server', @@ -532,7 +573,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector_client', 'box', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.box.description', { + description: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.box.description', { defaultMessage: 'Search over your content on Box.', }), iconPath: 'box.svg', @@ -540,15 +581,18 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: true, keywords: ['cloud', 'box'], - name: i18n.translate('searchConnectors.content.nativeConnectors.box.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.box.name', { defaultMessage: 'Box', }), serviceType: 'box', }, { - description: i18n.translate('searchConnectors.content.nativeConnectors.outlook.description', { - defaultMessage: 'Search over your content on Outlook.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.outlook.description', + { + defaultMessage: 'Search over your content on Outlook.', + } + ), categories: [ 'enterprise_search', 'elastic_stack', @@ -561,7 +605,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: true, keywords: ['outlook', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.outlook.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.outlook.name', { defaultMessage: 'Outlook', }), serviceType: 'outlook', @@ -575,15 +619,18 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector_client', 'teams', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.teams.description', { - defaultMessage: 'Search over your content on Teams.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.teams.description', + { + defaultMessage: 'Search over your content on Teams.', + } + ), iconPath: 'teams.svg', isBeta: false, isNative: false, isTechPreview: true, keywords: ['teams', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.teams.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.teams.name', { defaultMessage: 'Teams', }), serviceType: 'teams', @@ -597,15 +644,18 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'connector_client', 'zoom', ], - description: i18n.translate('searchConnectors.content.nativeConnectors.zoom.description', { - defaultMessage: 'Search over your content on Zoom.', - }), + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.zoom.description', + { + defaultMessage: 'Search over your content on Zoom.', + } + ), iconPath: 'zoom.svg', isBeta: false, isNative: false, isTechPreview: true, keywords: ['zoom', 'connector'], - name: i18n.translate('searchConnectors.content.nativeConnectors.zoom.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.zoom.name', { defaultMessage: 'Zoom', }), serviceType: 'zoom', @@ -613,7 +663,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { categories: ['enterprise_search', 'custom', 'elastic_stack', 'connector', 'connector_client'], description: i18n.translate( - 'searchConnectors.content.nativeConnectors.customConnector.description', + 'searchConnectorsPlugin.content.nativeConnectors.customConnector.description', { defaultMessage: 'Search over data stored on custom data sources.', } @@ -622,7 +672,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['custom', 'connector', 'code'], - name: i18n.translate('searchConnectors.content.nativeConnectors.customConnector.name', { + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.customConnector.name', { defaultMessage: 'Customized connector', }), serviceType: '', diff --git a/x-pack/plugins/search_connectors/common/constants.ts b/x-pack/plugins/search_connectors/common/constants.ts new file mode 100644 index 0000000000000..1fc64f6837e1d --- /dev/null +++ b/x-pack/plugins/search_connectors/common/constants.ts @@ -0,0 +1,180 @@ +/* + * 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 { ConnectorClientSideDefinition } from './types'; +import { docLinks } from './doc_links'; + +export const CONNECTORS_DICT: Record = { + azure_blob_storage: { + docsUrl: docLinks.connectorsAzureBlobStorage, + externalAuthDocsUrl: 'https://learn.microsoft.com/azure/storage/common/authorize-data-access', + externalDocsUrl: 'https://learn.microsoft.com/azure/storage/blobs/', + platinumOnly: true, + }, + box: { + docsUrl: docLinks.connectorsBox, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + confluence: { + docsUrl: docLinks.connectorsConfluence, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + custom: { + docsUrl: docLinks.connectors, + externalAuthDocsUrl: '', + externalDocsUrl: '', + }, + dropbox: { + docsUrl: docLinks.connectorsDropbox, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + github: { + docsUrl: docLinks.connectorsGithub, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + gmail: { + docsUrl: docLinks.connectorsGmail, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + google_cloud_storage: { + docsUrl: docLinks.connectorsGoogleCloudStorage, + externalAuthDocsUrl: 'https://cloud.google.com/storage/docs/authentication', + externalDocsUrl: 'https://cloud.google.com/storage/docs', + platinumOnly: true, + }, + google_drive: { + docsUrl: docLinks.connectorsGoogleDrive, + externalAuthDocsUrl: 'https://cloud.google.com/iam/docs/service-account-overview', + externalDocsUrl: 'https://developers.google.com/drive', + platinumOnly: true, + }, + jira: { + docsUrl: docLinks.connectorsJira, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + microsoft_teams: { + docsUrl: docLinks.connectorsTeams, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + mongodb: { + docsUrl: docLinks.connectorsMongoDB, + externalAuthDocsUrl: 'https://www.mongodb.com/docs/atlas/app-services/authentication/', + externalDocsUrl: 'https://www.mongodb.com/docs/', + platinumOnly: true, + }, + mssql: { + docsUrl: docLinks.connectorsMicrosoftSQL, + externalAuthDocsUrl: + 'https://learn.microsoft.com/sql/relational-databases/security/authentication-access/getting-started-with-database-engine-permissions', + externalDocsUrl: 'https://learn.microsoft.com/sql/', + platinumOnly: true, + }, + mysql: { + docsUrl: docLinks.connectorsMySQL, + externalDocsUrl: 'https://dev.mysql.com/doc/', + platinumOnly: true, + }, + network_drive: { + docsUrl: docLinks.connectorsNetworkDrive, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + notion: { + docsUrl: docLinks.connectorsNotion, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + onedrive: { + docsUrl: docLinks.connectorsOneDrive, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + oracle: { + docsUrl: docLinks.connectorsOracle, + externalAuthDocsUrl: + 'https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html', + externalDocsUrl: 'https://docs.oracle.com/database/oracle/oracle-database/', + platinumOnly: true, + }, + outlook: { + docsUrl: docLinks.connectorsOutlook, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + postgresql: { + docsUrl: docLinks.connectorsPostgreSQL, + externalAuthDocsUrl: 'https://www.postgresql.org/docs/15/auth-methods.html', + externalDocsUrl: 'https://www.postgresql.org/docs/', + platinumOnly: true, + }, + redis: { + docsUrl: docLinks.connectorsRedis, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + s3: { + docsUrl: docLinks.connectorsS3, + externalAuthDocsUrl: 'https://docs.aws.amazon.com/s3/index.html', + externalDocsUrl: '', + platinumOnly: true, + }, + salesforce: { + docsUrl: docLinks.connectorsSalesforce, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + servicenow: { + docsUrl: docLinks.connectorsServiceNow, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + sharepoint_online: { + docsUrl: docLinks.connectorsSharepointOnline, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + sharepoint_server: { + docsUrl: docLinks.connectorsSharepoint, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + slack: { + docsUrl: docLinks.connectorsSlack, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, + zoom: { + docsUrl: docLinks.connectorsZoom, + externalAuthDocsUrl: '', + externalDocsUrl: '', + platinumOnly: true, + }, +}; diff --git a/x-pack/plugins/search_connectors/common/doc_links.ts b/x-pack/plugins/search_connectors/common/doc_links.ts new file mode 100644 index 0000000000000..0c5edc1a07ca7 --- /dev/null +++ b/x-pack/plugins/search_connectors/common/doc_links.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DocLinks } from '@kbn/doc-links'; + +class ESDocLinks { + public connectors: string = ''; + public connectorsAzureBlobStorage: string = ''; + public connectorsBox: string = ''; + public connectorsClients: string = ''; + public connectorsConfluence: string = ''; + public connectorsDropbox: string = ''; + public connectorsGithub: string = ''; + public connectorsGmail: string = ''; + public connectorsGoogleCloudStorage: string = ''; + public connectorsGoogleDrive: string = ''; + public connectorsJira: string = ''; + public connectorsMicrosoftSQL: string = ''; + public connectorsMongoDB: string = ''; + public connectorsMySQL: string = ''; + public connectorsNative: string = ''; + public connectorsNetworkDrive: string = ''; + public connectorsNotion: string = ''; + public connectorsOneDrive: string = ''; + public connectorsOracle: string = ''; + public connectorsOutlook: string = ''; + public connectorsPostgreSQL: string = ''; + public connectorsRedis: string = ''; + public connectorsS3: string = ''; + public connectorsSalesforce: string = ''; + public connectorsServiceNow: string = ''; + public connectorsSharepoint: string = ''; + public connectorsSharepointOnline: string = ''; + public connectorsSlack: string = ''; + public connectorsTeams: string = ''; + public connectorsZoom: string = ''; + + constructor() {} + + setDocLinks(docLinks: DocLinks) { + this.connectors = docLinks.enterpriseSearch.connectors; + this.connectorsAzureBlobStorage = docLinks.enterpriseSearch.connectorsAzureBlobStorage; + this.connectorsBox = docLinks.enterpriseSearch.connectorsBox; + this.connectorsConfluence = docLinks.enterpriseSearch.connectorsConfluence; + this.connectorsClients = docLinks.enterpriseSearch.connectorsClients; + this.connectorsDropbox = docLinks.enterpriseSearch.connectorsDropbox; + this.connectorsGithub = docLinks.enterpriseSearch.connectorsGithub; + this.connectorsGoogleCloudStorage = docLinks.enterpriseSearch.connectorsGoogleCloudStorage; + this.connectorsGoogleDrive = docLinks.enterpriseSearch.connectorsGoogleDrive; + this.connectorsGmail = docLinks.enterpriseSearch.connectorsGmail; + this.connectorsJira = docLinks.enterpriseSearch.connectorsJira; + this.connectorsMicrosoftSQL = docLinks.enterpriseSearch.connectorsMicrosoftSQL; + this.connectorsMongoDB = docLinks.enterpriseSearch.connectorsMongoDB; + this.connectorsMySQL = docLinks.enterpriseSearch.connectorsMySQL; + this.connectorsNative = docLinks.enterpriseSearch.connectorsNative; + this.connectorsNetworkDrive = docLinks.enterpriseSearch.connectorsNetworkDrive; + this.connectorsNotion = docLinks.enterpriseSearch.connectorsNotion; + this.connectorsOneDrive = docLinks.enterpriseSearch.connectorsOneDrive; + this.connectorsOracle = docLinks.enterpriseSearch.connectorsOracle; + this.connectorsOutlook = docLinks.enterpriseSearch.connectorsOutlook; + this.connectorsPostgreSQL = docLinks.enterpriseSearch.connectorsPostgreSQL; + this.connectorsRedis = docLinks.enterpriseSearch.connectorsRedis; + this.connectorsS3 = docLinks.enterpriseSearch.connectorsS3; + this.connectorsSalesforce = docLinks.enterpriseSearch.connectorsSalesforce; + this.connectorsServiceNow = docLinks.enterpriseSearch.connectorsServiceNow; + this.connectorsSharepoint = docLinks.enterpriseSearch.connectorsSharepoint; + this.connectorsSharepointOnline = docLinks.enterpriseSearch.connectorsSharepointOnline; + this.connectorsSlack = docLinks.enterpriseSearch.connectorsSlack; + this.connectorsTeams = docLinks.enterpriseSearch.connectorsTeams; + this.connectorsZoom = docLinks.enterpriseSearch.connectorsZoom; + } +} + +export const docLinks = new ESDocLinks(); diff --git a/x-pack/plugins/search_connectors/common/lib/connector_types.ts b/x-pack/plugins/search_connectors/common/lib/connector_types.ts new file mode 100644 index 0000000000000..d068ca868edbd --- /dev/null +++ b/x-pack/plugins/search_connectors/common/lib/connector_types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IStaticAssets } from '@kbn/core-http-browser'; +import { ConnectorServerSideDefinition, CONNECTOR_DEFINITIONS } from '../connectors'; +import { CONNECTORS_DICT } from '../constants'; +import { ConnectorDefinition } from '../types'; + +// used on server and in browser before plugin start when we don't have docLinks yet +export function getConnectorTypes(staticAssets: IStaticAssets): ConnectorServerSideDefinition[] { + return CONNECTOR_DEFINITIONS.map((connector) => ({ + ...connector, + iconPath: connector.iconPath + ? staticAssets.getPluginAssetHref(`icons/${connector.iconPath}`) + : 'logoEnterpriseSearch', + })); +} + +// used in browser after pluginStart, when docLinks has been populated +export function getConnectorFullTypes(staticAssets: IStaticAssets): ConnectorDefinition[] { + const CONNECTORS = CONNECTOR_DEFINITIONS.map((connector) => ({ + ...connector, + ...(connector.serviceType && CONNECTORS_DICT[connector.serviceType] + ? CONNECTORS_DICT[connector.serviceType] + : CONNECTORS_DICT.custom), + })); + return CONNECTORS.map((connector) => ({ + ...connector, + iconPath: connector.iconPath + ? staticAssets.getPluginAssetHref(`icons/${connector.iconPath}`) + : 'logoEnterpriseSearch', + })); +} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts b/x-pack/plugins/search_connectors/common/types.ts similarity index 85% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts rename to x-pack/plugins/search_connectors/common/types.ts index bab243892a146..9d5049895b963 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts +++ b/x-pack/plugins/search_connectors/common/types.ts @@ -5,13 +5,12 @@ * 2.0. */ -import { ConnectorServerSideDefinition } from '@kbn/search-connectors'; +import { ConnectorServerSideDefinition } from './connectors'; export interface ConnectorClientSideDefinition { docsUrl?: string; externalAuthDocsUrl?: string; externalDocsUrl: string; - icon: string; platinumOnly?: boolean; } diff --git a/x-pack/plugins/search_connectors/jest.config.js b/x-pack/plugins/search_connectors/jest.config.js new file mode 100644 index 0000000000000..d18c3aab9dd15 --- /dev/null +++ b/x-pack/plugins/search_connectors/jest.config.js @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/x-pack/plugins/search_connectors'], + coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/search_connectors', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/x-pack/plugins/search_connectors/{common,public,server}/**/*.{ts,tsx}', + ], +}; diff --git a/x-pack/plugins/search_connectors/jest.sh b/x-pack/plugins/search_connectors/jest.sh new file mode 100755 index 0000000000000..b51ce6bc18fe9 --- /dev/null +++ b/x-pack/plugins/search_connectors/jest.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +TZ="Etc/UTC" yarn test:jest -c "$(dirname "${BASH_SOURCE[0]}")/jest.config.js" diff --git a/x-pack/plugins/search_connectors/kibana.jsonc b/x-pack/plugins/search_connectors/kibana.jsonc new file mode 100644 index 0000000000000..8b032a55052c5 --- /dev/null +++ b/x-pack/plugins/search_connectors/kibana.jsonc @@ -0,0 +1,19 @@ +{ + "type": "plugin", + "id": "@kbn/search-connectors-plugin", + "owner": "@elastic/enterprise-search-frontend", + "description": "Plugin hosting shared features for connectors", + "plugin": { + "id": "searchConnectors", + "server": true, + "browser": true, + "configPath": [ + "xpack", + "search", + "connectors" + ], + "requiredPlugins": [], + "optionalPlugins": [], + "requiredBundles": [] + } +} diff --git a/x-pack/plugins/search_connectors/package.json b/x-pack/plugins/search_connectors/package.json new file mode 100644 index 0000000000000..0ccff83264c76 --- /dev/null +++ b/x-pack/plugins/search_connectors/package.json @@ -0,0 +1,11 @@ +{ + "name": "@kbn/search-connectors-plugin", + "version": "1.0.0", + "license": "Elastic License 2.0", + "private": true, + "scripts": { + "build": "yarn plugin-helpers build", + "plugin-helpers": "node ../../../scripts/plugin_helpers", + "kbn": "node ../../../scripts/kbn" + } +} diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/azure_blob_storage.svg b/x-pack/plugins/search_connectors/public/assets/icons/azure_blob_storage.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/azure_blob_storage.svg rename to x-pack/plugins/search_connectors/public/assets/icons/azure_blob_storage.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/box.svg b/x-pack/plugins/search_connectors/public/assets/icons/box.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/box.svg rename to x-pack/plugins/search_connectors/public/assets/icons/box.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/confluence_cloud.svg b/x-pack/plugins/search_connectors/public/assets/icons/confluence_cloud.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/confluence_cloud.svg rename to x-pack/plugins/search_connectors/public/assets/icons/confluence_cloud.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/confluence_server.svg b/x-pack/plugins/search_connectors/public/assets/icons/confluence_server.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/confluence_server.svg rename to x-pack/plugins/search_connectors/public/assets/icons/confluence_server.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/connector.svg b/x-pack/plugins/search_connectors/public/assets/icons/connector.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/connector.svg rename to x-pack/plugins/search_connectors/public/assets/icons/connector.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/crawler.svg b/x-pack/plugins/search_connectors/public/assets/icons/crawler.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/crawler.svg rename to x-pack/plugins/search_connectors/public/assets/icons/crawler.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/custom.svg b/x-pack/plugins/search_connectors/public/assets/icons/custom.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/custom.svg rename to x-pack/plugins/search_connectors/public/assets/icons/custom.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/dropbox.svg b/x-pack/plugins/search_connectors/public/assets/icons/dropbox.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/dropbox.svg rename to x-pack/plugins/search_connectors/public/assets/icons/dropbox.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/github.svg b/x-pack/plugins/search_connectors/public/assets/icons/github.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/github.svg rename to x-pack/plugins/search_connectors/public/assets/icons/github.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/github_enterprise_server.svg b/x-pack/plugins/search_connectors/public/assets/icons/github_enterprise_server.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/github_enterprise_server.svg rename to x-pack/plugins/search_connectors/public/assets/icons/github_enterprise_server.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/gmail.svg b/x-pack/plugins/search_connectors/public/assets/icons/gmail.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/gmail.svg rename to x-pack/plugins/search_connectors/public/assets/icons/gmail.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/google_cloud_storage.svg b/x-pack/plugins/search_connectors/public/assets/icons/google_cloud_storage.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/google_cloud_storage.svg rename to x-pack/plugins/search_connectors/public/assets/icons/google_cloud_storage.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/google_drive.svg b/x-pack/plugins/search_connectors/public/assets/icons/google_drive.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/google_drive.svg rename to x-pack/plugins/search_connectors/public/assets/icons/google_drive.svg diff --git a/x-pack/plugins/search_connectors/public/assets/icons/index.svg b/x-pack/plugins/search_connectors/public/assets/icons/index.svg new file mode 100644 index 0000000000000..6af8b7e92afe9 --- /dev/null +++ b/x-pack/plugins/search_connectors/public/assets/icons/index.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/jira_cloud.svg b/x-pack/plugins/search_connectors/public/assets/icons/jira_cloud.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/jira_cloud.svg rename to x-pack/plugins/search_connectors/public/assets/icons/jira_cloud.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/jira_server.svg b/x-pack/plugins/search_connectors/public/assets/icons/jira_server.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/jira_server.svg rename to x-pack/plugins/search_connectors/public/assets/icons/jira_server.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/mongodb.svg b/x-pack/plugins/search_connectors/public/assets/icons/mongodb.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/mongodb.svg rename to x-pack/plugins/search_connectors/public/assets/icons/mongodb.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/mssql.svg b/x-pack/plugins/search_connectors/public/assets/icons/mssql.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/mssql.svg rename to x-pack/plugins/search_connectors/public/assets/icons/mssql.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/mysql.svg b/x-pack/plugins/search_connectors/public/assets/icons/mysql.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/mysql.svg rename to x-pack/plugins/search_connectors/public/assets/icons/mysql.svg diff --git a/x-pack/plugins/search_connectors/public/assets/icons/network_drive.svg b/x-pack/plugins/search_connectors/public/assets/icons/network_drive.svg new file mode 100644 index 0000000000000..82628b3e58517 --- /dev/null +++ b/x-pack/plugins/search_connectors/public/assets/icons/network_drive.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/notion.svg b/x-pack/plugins/search_connectors/public/assets/icons/notion.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/notion.svg rename to x-pack/plugins/search_connectors/public/assets/icons/notion.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/onedrive.svg b/x-pack/plugins/search_connectors/public/assets/icons/onedrive.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/onedrive.svg rename to x-pack/plugins/search_connectors/public/assets/icons/onedrive.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/oracle.svg b/x-pack/plugins/search_connectors/public/assets/icons/oracle.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/oracle.svg rename to x-pack/plugins/search_connectors/public/assets/icons/oracle.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/outlook.svg b/x-pack/plugins/search_connectors/public/assets/icons/outlook.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/outlook.svg rename to x-pack/plugins/search_connectors/public/assets/icons/outlook.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/postgresql.svg b/x-pack/plugins/search_connectors/public/assets/icons/postgresql.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/postgresql.svg rename to x-pack/plugins/search_connectors/public/assets/icons/postgresql.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/redis.svg b/x-pack/plugins/search_connectors/public/assets/icons/redis.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/redis.svg rename to x-pack/plugins/search_connectors/public/assets/icons/redis.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/s3.svg b/x-pack/plugins/search_connectors/public/assets/icons/s3.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/s3.svg rename to x-pack/plugins/search_connectors/public/assets/icons/s3.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/salesforce.svg b/x-pack/plugins/search_connectors/public/assets/icons/salesforce.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/salesforce.svg rename to x-pack/plugins/search_connectors/public/assets/icons/salesforce.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/salesforce_sandbox.svg b/x-pack/plugins/search_connectors/public/assets/icons/salesforce_sandbox.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/salesforce_sandbox.svg rename to x-pack/plugins/search_connectors/public/assets/icons/salesforce_sandbox.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/servicenow.svg b/x-pack/plugins/search_connectors/public/assets/icons/servicenow.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/servicenow.svg rename to x-pack/plugins/search_connectors/public/assets/icons/servicenow.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint.svg b/x-pack/plugins/search_connectors/public/assets/icons/sharepoint.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint.svg rename to x-pack/plugins/search_connectors/public/assets/icons/sharepoint.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint_online.svg b/x-pack/plugins/search_connectors/public/assets/icons/sharepoint_online.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint_online.svg rename to x-pack/plugins/search_connectors/public/assets/icons/sharepoint_online.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint_server.svg b/x-pack/plugins/search_connectors/public/assets/icons/sharepoint_server.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint_server.svg rename to x-pack/plugins/search_connectors/public/assets/icons/sharepoint_server.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/slack.svg b/x-pack/plugins/search_connectors/public/assets/icons/slack.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/slack.svg rename to x-pack/plugins/search_connectors/public/assets/icons/slack.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/teams.svg b/x-pack/plugins/search_connectors/public/assets/icons/teams.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/teams.svg rename to x-pack/plugins/search_connectors/public/assets/icons/teams.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/zendesk.svg b/x-pack/plugins/search_connectors/public/assets/icons/zendesk.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/zendesk.svg rename to x-pack/plugins/search_connectors/public/assets/icons/zendesk.svg diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/zoom.svg b/x-pack/plugins/search_connectors/public/assets/icons/zoom.svg similarity index 100% rename from x-pack/plugins/enterprise_search/public/assets/source_icons/zoom.svg rename to x-pack/plugins/search_connectors/public/assets/icons/zoom.svg diff --git a/x-pack/plugins/search_connectors/public/index.ts b/x-pack/plugins/search_connectors/public/index.ts new file mode 100644 index 0000000000000..77afb7b9f82d8 --- /dev/null +++ b/x-pack/plugins/search_connectors/public/index.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { SearchConnectorsPlugin } from './plugin'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. +export function plugin() { + return new SearchConnectorsPlugin(); +} + +export type { SearchConnectorsPluginSetup, SearchConnectorsPluginStart } from './types'; +export type { ConnectorDefinition } from '../common/types'; diff --git a/x-pack/plugins/search_connectors/public/plugin.mock.ts b/x-pack/plugins/search_connectors/public/plugin.mock.ts new file mode 100644 index 0000000000000..b1e0f37bdbb14 --- /dev/null +++ b/x-pack/plugins/search_connectors/public/plugin.mock.ts @@ -0,0 +1,22 @@ +/* + * 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 { IStaticAssets } from '@kbn/core-http-browser'; +import { getConnectorFullTypes } from '../common/lib/connector_types'; +import type { SearchConnectorsPluginStart } from './types'; + +const createStartMock = (): jest.Mocked => ({ + getConnectorTypes: jest.fn(() => + getConnectorFullTypes({ + getPluginAssetHref: (val: string) => val, + } as any as IStaticAssets) + ), +}); + +export const searchConnectorsMock = { + createStart: createStartMock, +}; diff --git a/x-pack/plugins/search_connectors/public/plugin.ts b/x-pack/plugins/search_connectors/public/plugin.ts new file mode 100644 index 0000000000000..830d9d3e94c1e --- /dev/null +++ b/x-pack/plugins/search_connectors/public/plugin.ts @@ -0,0 +1,50 @@ +/* + * 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 { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; +import { docLinks } from '../common/doc_links'; +import { getConnectorFullTypes, getConnectorTypes } from '../common/lib/connector_types'; +import { + SearchConnectorsPluginSetup, + SearchConnectorsPluginSetupDependencies, + SearchConnectorsPluginStart, + SearchConnectorsPluginStartDependencies, +} from './types'; + +export class SearchConnectorsPlugin + implements + Plugin< + SearchConnectorsPluginSetup, + SearchConnectorsPluginStart, + SearchConnectorsPluginSetupDependencies, + SearchConnectorsPluginStartDependencies + > +{ + public setup( + core: CoreSetup, + setupDeps: SearchConnectorsPluginSetupDependencies + ): SearchConnectorsPluginSetup { + const connectorTypes = getConnectorTypes(core.http.staticAssets); + return { + getConnectorTypes: () => connectorTypes, + }; + } + + public start( + core: CoreStart, + services: SearchConnectorsPluginStartDependencies + ): SearchConnectorsPluginStart { + const { http } = core; + docLinks.setDocLinks(core.docLinks.links); + const connectorTypes = getConnectorFullTypes(http.staticAssets); + return { + getConnectorTypes: () => connectorTypes, + }; + } + + public stop() {} +} diff --git a/x-pack/plugins/search_connectors/public/types.ts b/x-pack/plugins/search_connectors/public/types.ts new file mode 100644 index 0000000000000..a86ca30170fce --- /dev/null +++ b/x-pack/plugins/search_connectors/public/types.ts @@ -0,0 +1,24 @@ +/* + * 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 { ConnectorServerSideDefinition } from '../common/connectors'; +import { ConnectorDefinition } from '../common/types'; + +/* eslint-disable @typescript-eslint/no-empty-interface */ + +export interface SearchConnectorsPluginSetup { + // we don't have docLinks here yet + getConnectorTypes: () => ConnectorServerSideDefinition[]; +} + +export interface SearchConnectorsPluginStart { + getConnectorTypes: () => ConnectorDefinition[]; +} + +export interface SearchConnectorsPluginSetupDependencies {} + +export interface SearchConnectorsPluginStartDependencies {} diff --git a/x-pack/plugins/search_connectors/server/config.ts b/x-pack/plugins/search_connectors/server/config.ts new file mode 100644 index 0000000000000..e9b0f1f8eeb31 --- /dev/null +++ b/x-pack/plugins/search_connectors/server/config.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; +import { PluginConfigDescriptor } from '@kbn/core/server'; + +export * from './types'; + +const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: true }), +}); + +type ConfigType = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; + +export type SearchConnectorsConfig = TypeOf; diff --git a/x-pack/plugins/search_connectors/server/index.ts b/x-pack/plugins/search_connectors/server/index.ts new file mode 100644 index 0000000000000..304eb460ca7d6 --- /dev/null +++ b/x-pack/plugins/search_connectors/server/index.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PluginInitializerContext } from '@kbn/core/server'; + +import { SearchConnectorsPlugin } from './plugin'; +export { config } from './config'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. + +export function plugin(initializerContext: PluginInitializerContext) { + return new SearchConnectorsPlugin(initializerContext); +} + +export type { SearchConnectorsPluginSetup, SearchConnectorsPluginStart } from './types'; +export type { CONNECTOR_DEFINITIONS, ConnectorServerSideDefinition } from '../common/connectors'; diff --git a/x-pack/plugins/search_connectors/server/plugin.ts b/x-pack/plugins/search_connectors/server/plugin.ts new file mode 100644 index 0000000000000..56f78638da2d7 --- /dev/null +++ b/x-pack/plugins/search_connectors/server/plugin.ts @@ -0,0 +1,48 @@ +/* + * 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 { PluginInitializerContext, Plugin, CoreSetup } from '@kbn/core/server'; +import { ConnectorServerSideDefinition } from '../common/connectors'; +import { getConnectorTypes } from '../common/lib/connector_types'; +import type { + SearchConnectorsPluginSetup as SearchConnectorsPluginSetup, + SearchConnectorsPluginStart as SearchConnectorsPluginStart, + SetupDependencies, + StartDependencies, +} from './types'; + +export class SearchConnectorsPlugin + implements + Plugin< + SearchConnectorsPluginSetup, + SearchConnectorsPluginStart, + SetupDependencies, + StartDependencies + > +{ + private connectors: ConnectorServerSideDefinition[]; + + constructor(initializerContext: PluginInitializerContext) { + this.connectors = []; + } + + public setup({ getStartServices, http }: CoreSetup) { + this.connectors = getConnectorTypes(http.staticAssets); + + return { + getConnectorTypes: () => this.connectors, + }; + } + + public start() { + return { + getConnectors: () => this.connectors, + }; + } + + public stop() {} +} diff --git a/x-pack/plugins/search_connectors/server/types.ts b/x-pack/plugins/search_connectors/server/types.ts new file mode 100644 index 0000000000000..c08b562ec8a5f --- /dev/null +++ b/x-pack/plugins/search_connectors/server/types.ts @@ -0,0 +1,19 @@ +/* + * 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 { ConnectorServerSideDefinition } from '../common/connectors'; + +/* eslint-disable @typescript-eslint/no-empty-interface */ + +export interface SearchConnectorsPluginSetup { + getConnectorTypes: () => ConnectorServerSideDefinition[]; +} + +export interface SearchConnectorsPluginStart {} + +export interface StartDependencies {} +export interface SetupDependencies {} diff --git a/x-pack/plugins/search_connectors/tsconfig.json b/x-pack/plugins/search_connectors/tsconfig.json new file mode 100644 index 0000000000000..9da933a758aec --- /dev/null +++ b/x-pack/plugins/search_connectors/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "common/**/*.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../typings/**/*", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core", + "@kbn/config-schema", + "@kbn/doc-links", + "@kbn/core-http-browser", + "@kbn/i18n", + ] +} 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 5db1dbdf1a5f1..a09d49723d75a 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -74,7 +74,7 @@ export const allowedExperimentalValues = Object.freeze({ /** * Enables Automated Endpoint Process actions */ - automatedProcessActionsEnabled: false, + automatedProcessActionsEnabled: true, /** * Enables the ability to send Response actions to SentinelOne and persist the results @@ -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 @@ -178,7 +178,7 @@ export const allowedExperimentalValues = Object.freeze({ /** * Enables experimental Experimental S1 integration data to be available in Analyzer */ - sentinelOneDataInAnalyzerEnabled: false, + sentinelOneDataInAnalyzerEnabled: true, /** * Enables SentinelOne manual host manipulation actions 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/automated_response_actions/automated_response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts index 38261547f8d27..adaaf9c99059a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts @@ -73,7 +73,8 @@ describe( login(); }); - describe('From alerts', () => { + // FLAKY: https://github.com/elastic/kibana/issues/169828 + describe.skip('From alerts', () => { let ruleId: string; let ruleName: string; 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/public/threat_intelligence/routes.tsx b/x-pack/plugins/security_solution/public/threat_intelligence/routes.tsx index 5bec532b016b6..23eb66c345fda 100644 --- a/x-pack/plugins/security_solution/public/threat_intelligence/routes.tsx +++ b/x-pack/plugins/security_solution/public/threat_intelligence/routes.tsx @@ -8,9 +8,9 @@ import React, { memo } from 'react'; import type { SecuritySolutionPluginContext } from '@kbn/threat-intelligence-plugin/public'; import { THREAT_INTELLIGENCE_BASE_PATH } from '@kbn/threat-intelligence-plugin/public'; -import type { SourcererDataView } from '@kbn/threat-intelligence-plugin/public/types'; import type { Store } from 'redux'; import { useSelector } from 'react-redux'; +import type { SelectedDataView } from '@kbn/threat-intelligence-plugin/public/types'; import { useUserPrivileges } from '../common/components/user_privileges'; import { useSetUrlParams } from '../management/components/artifact_list_page/hooks/use_set_url_params'; import { BlockListForm } from '../management/pages/blocklist/view/components/blocklist_form'; @@ -46,7 +46,7 @@ const ThreatIntelligence = memo(() => { getFiltersGlobalComponent: () => FiltersGlobal, getPageWrapper: () => SecuritySolutionPageWrapper, licenseService, - sourcererDataView: sourcererDataView as unknown as SourcererDataView, + sourcererDataView: sourcererDataView as unknown as SelectedDataView, getUseInvestigateInTimeline: useInvestigateInTimeline, blockList: { 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/serverless_search/jest.config.js b/x-pack/plugins/serverless_search/jest.config.js index 4638eb4b13476..4e3b703ffa8df 100644 --- a/x-pack/plugins/serverless_search/jest.config.js +++ b/x-pack/plugins/serverless_search/jest.config.js @@ -12,6 +12,6 @@ module.exports = { coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/serverless_search', coverageReporters: ['text', 'html'], collectCoverageFrom: [ - '/x-pack/plugins/serverless_search/{common,public,server}/**/*.{ts,tsx}', + '/x-pack/plugins/search_connectors/{common,public,server}/**/*.{ts,tsx}', ], }; diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc index cc81622911a9a..4e7fe08efba7b 100644 --- a/x-pack/plugins/serverless_search/kibana.jsonc +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -28,7 +28,8 @@ ], "optionalPlugins": [ "indexManagement", - "usageCollection", + "searchConnectors", + "usageCollection" ], "requiredBundles": [ "kibanaReact" diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx index 4850bdf8b86e3..5efbb9dfb5b9c 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx @@ -54,7 +54,7 @@ export const ConnectorsTable: React.FC = () => { const [query, setQuery] = useState(''); const { data, isError, isLoading } = useConnectors(); - const { data: connectorTypes } = useConnectorTypes(); + const connectorTypes = useConnectorTypes(); const { application: { navigateToUrl }, } = useKibanaServices(); @@ -128,7 +128,7 @@ export const ConnectorsTable: React.FC = () => { field: 'service_type', name: typeLabel, render: (serviceType: string | null) => { - const typeData = (connectorTypes?.connectors || []).find( + const typeData = connectorTypes.find( (connector) => connector.serviceType === (serviceType ?? '') ); if (!typeData) { diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_service_type.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_service_type.tsx index e00cda1e20956..0c7cfab2eca42 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_service_type.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_service_type.tsx @@ -27,12 +27,12 @@ interface EditServiceTypeProps { export const EditServiceType: React.FC = ({ connector }) => { const { http } = useKibanaServices(); - const { data: connectorTypes } = useConnectorTypes(); + const connectorTypes = useConnectorTypes(); const queryClient = useQueryClient(); const { queryKey } = useConnector(connector.id); const options = - connectorTypes?.connectors.map((connectorType) => ({ + connectorTypes.map((connectorType) => ({ inputDisplay: ( { - const { data: connectorTypes } = useConnectorTypes(); + const connectorTypes = useConnectorTypes(); const { createConnector, isLoading } = useCreateConnector(); const assetBasePath = useAssetBasePath(); @@ -191,7 +191,7 @@ export const EmptyConnectorsPrompt: React.FC = () => { - {connectorTypes?.connectors.map((connectorType) => ( + {connectorTypes.map((connectorType) => ( { - const { data } = useConnectorTypes(); const { createConnector, isLoading } = useCreateConnector(); - - const allConnectorTypes = data?.connectors; - const connectorTypes = allConnectorTypes - ? CONNECTOR_TYPES_DISPLAY.map( - (type) => allConnectorTypes.find((connType) => connType.serviceType === type)! - ) - : undefined; - const showConnectors = connectorTypes && connectorTypes.length; return (

- + createConnector()} isLoading={isLoading} @@ -67,30 +41,6 @@ export const ConnectorsCallout = () => { })} - - {showConnectors && - connectorTypes.map((connectorType) => ( - - - - - - ))} - {showConnectors && ( - - - - - - )}
); diff --git a/x-pack/plugins/serverless_search/public/application/components/file_upload_callout.tsx b/x-pack/plugins/serverless_search/public/application/components/file_upload_callout.tsx new file mode 100644 index 0000000000000..8ca85d2f14fa2 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/file_upload_callout.tsx @@ -0,0 +1,50 @@ +/* + * 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 { EuiButton, EuiCallOut, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { useKibanaServices } from '../hooks/use_kibana'; +import { FILE_UPLOAD_PATH } from '../constants'; + +export const FileUploadCallout = () => { + const { + application: { navigateToUrl }, + http, + } = useKibanaServices(); + return ( + +

+ +

+ + + navigateToUrl(http.basePath.prepend(FILE_UPLOAD_PATH))} + > + {i18n.translate('xpack.serverlessSearch.selectClient.fileUploadCallout.cta', { + defaultMessage: 'Upload a file', + })} + + + +
+ ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/index_management/connector_setup_prompt.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/connector_setup_prompt.tsx index 888a5f11385a5..fedc85e39b78f 100644 --- a/x-pack/plugins/serverless_search/public/application/components/index_management/connector_setup_prompt.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/index_management/connector_setup_prompt.tsx @@ -30,11 +30,11 @@ interface ConnectorSetupEmptyPromptProps { export const ConnectorSetupEmptyPrompt = ({ connector }: ConnectorSetupEmptyPromptProps) => { const { http } = useKibanaServices(); const assetBasePath = useAssetBasePath(); - const { data: connectorTypes } = useConnectorTypes(); + const connectorTypes = useConnectorTypes(); const connectorsIconPath = assetBasePath + '/connectors.svg'; const connectorPath = http.basePath.prepend(`/app/connectors/${connector.id}`); - const connectorType = connectorTypes?.connectors?.find( + const connectorType = connectorTypes.find( (cType) => cType.serviceType === connector.service_type ); return ( diff --git a/x-pack/plugins/serverless_search/public/application/components/overview.tsx b/x-pack/plugins/serverless_search/public/application/components/overview.tsx index 494f7a2c5c15d..6607607ad0c84 100644 --- a/x-pack/plugins/serverless_search/public/application/components/overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/overview.tsx @@ -50,9 +50,9 @@ import { languageDefinitions } from './languages/languages'; import { LanguageGrid } from './languages/language_grid'; import './overview.scss'; import { ApiKeyPanel } from './api_key/api_key'; -import { ConnectorsCallout } from './connectors_callout'; import { ConnectorIngestionPanel } from './connectors_ingestion'; import { PipelineButtonOverview } from './pipeline_button_overview'; +import { SelectClientCallouts } from './select_client_callouts'; export const ElasticsearchOverview = () => { const [selectedLanguage, setSelectedLanguage] = useState(javaDefinition); @@ -100,7 +100,7 @@ export const ElasticsearchOverview = () => { > } + callout={} application={application} consolePlugin={consolePlugin} sharePlugin={share} diff --git a/x-pack/plugins/serverless_search/public/application/components/select_client_callouts.tsx b/x-pack/plugins/serverless_search/public/application/components/select_client_callouts.tsx new file mode 100644 index 0000000000000..aa18e2b19452a --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/select_client_callouts.tsx @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { ConnectorsCallout } from './connectors_callout'; +import { FileUploadCallout } from './file_upload_callout'; + +export const SelectClientCallouts: React.FC = () => ( + + + + + + + + +); diff --git a/x-pack/plugins/serverless_search/public/application/constants.ts b/x-pack/plugins/serverless_search/public/application/constants.ts index df8d2fb1ebbc7..8e8c15638a860 100644 --- a/x-pack/plugins/serverless_search/public/application/constants.ts +++ b/x-pack/plugins/serverless_search/public/application/constants.ts @@ -13,3 +13,4 @@ export const INDEX_NAME_PLACEHOLDER = 'index_name'; // Paths export const BASE_CONNECTORS_PATH = 'connectors'; export const EDIT_CONNECTOR_PATH = `${BASE_CONNECTORS_PATH}/:id`; +export const FILE_UPLOAD_PATH = '/app/ml/filedatavisualizer'; diff --git a/x-pack/plugins/serverless_search/public/application/hooks/api/use_connector_types.tsx b/x-pack/plugins/serverless_search/public/application/hooks/api/use_connector_types.tsx index 22cff4f411bff..bdb777724565e 100644 --- a/x-pack/plugins/serverless_search/public/application/hooks/api/use_connector_types.tsx +++ b/x-pack/plugins/serverless_search/public/application/hooks/api/use_connector_types.tsx @@ -5,18 +5,10 @@ * 2.0. */ -import { ConnectorServerSideDefinition } from '@kbn/search-connectors'; -import { useQuery } from '@tanstack/react-query'; import { useKibanaServices } from '../use_kibana'; export const useConnectorTypes = () => { - const { http } = useKibanaServices(); + const { searchConnectors } = useKibanaServices(); - return useQuery({ - queryKey: ['fetchConnectorTypes'], - queryFn: () => - http.fetch<{ connectors: ConnectorServerSideDefinition[] }>( - '/internal/serverless_search/connector_types' - ), - }); + return searchConnectors?.getConnectorTypes() || []; }; diff --git a/x-pack/plugins/serverless_search/public/application/hooks/use_kibana.tsx b/x-pack/plugins/serverless_search/public/application/hooks/use_kibana.tsx index 21ff4c0fff505..df73a27f9097d 100644 --- a/x-pack/plugins/serverless_search/public/application/hooks/use_kibana.tsx +++ b/x-pack/plugins/serverless_search/public/application/hooks/use_kibana.tsx @@ -11,11 +11,13 @@ import type { AppMountParameters, CoreStart } from '@kbn/core/public'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import { useKibana as useKibanaBase } from '@kbn/kibana-react-plugin/public'; import { AuthenticatedUser } from '@kbn/security-plugin/common'; +import { SearchConnectorsPluginStart } from '@kbn/search-connectors-plugin/public'; export interface ServerlessSearchContext { cloud: CloudStart; console: ConsolePluginStart; history: AppMountParameters['history']; + searchConnectors?: SearchConnectorsPluginStart; share: SharePluginStart; user?: AuthenticatedUser; } diff --git a/x-pack/plugins/serverless_search/public/test/test_utils.tsx b/x-pack/plugins/serverless_search/public/test/test_utils.tsx index 9139180015e2d..ffc81b0b6daf6 100644 --- a/x-pack/plugins/serverless_search/public/test/test_utils.tsx +++ b/x-pack/plugins/serverless_search/public/test/test_utils.tsx @@ -15,10 +15,12 @@ import { coreMock } from '@kbn/core/public/mocks'; import { cloudMock } from '@kbn/cloud-plugin/public/mocks'; import { sharePluginMock } from '@kbn/share-plugin/public/mocks'; import { userProfileMock } from '@kbn/security-plugin/common/model/user_profile.mock'; +import { searchConnectorsMock } from '@kbn/search-connectors-plugin/public/plugin.mock'; export const core = coreMock.createStart(); export const services = { cloud: cloudMock.createStart(), + searchConnectors: searchConnectorsMock.createStart(), share: sharePluginMock.createStartContract(), userProfile: userProfileMock.createWithSecurity(), }; diff --git a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts index 767387d85e325..af54d4ccb6d56 100644 --- a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts +++ b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts @@ -7,7 +7,6 @@ import { schema } from '@kbn/config-schema'; import { - CONNECTOR_DEFINITIONS, createConnector, deleteConnectorById, fetchConnectorById, @@ -65,30 +64,6 @@ export const registerConnectorsRoutes = ({ http, router }: RouteDependencies) => } ); - router.get( - { - path: '/internal/serverless_search/connector_types', - validate: {}, - }, - async (context, request, response) => { - const connectors = CONNECTOR_DEFINITIONS.map((connector) => ({ - ...connector, - iconPath: connector.iconPath - ? http.basePath.prepend( - `/plugins/enterpriseSearch/assets/source_icons/${connector.iconPath}` - ) - : 'logoEnterpriseSearch', - })); - - return response.ok({ - body: { - connectors, - }, - headers: { 'content-type': 'application/json' }, - }); - } - ); - router.post( { path: '/internal/serverless_search/connectors', diff --git a/x-pack/plugins/serverless_search/tsconfig.json b/x-pack/plugins/serverless_search/tsconfig.json index 4221eef1a4caa..673d7dcb99148 100644 --- a/x-pack/plugins/serverless_search/tsconfig.json +++ b/x-pack/plugins/serverless_search/tsconfig.json @@ -45,5 +45,6 @@ "@kbn/core-chrome-browser", "@kbn/core-logging-server-mocks", "@kbn/discover-plugin", + "@kbn/search-connectors-plugin", ] } 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/threat_intelligence/public/mocks/mock_security_context.tsx b/x-pack/plugins/threat_intelligence/public/mocks/mock_security_context.tsx index 9f0a9d5bb79c0..6cd464a35d352 100644 --- a/x-pack/plugins/threat_intelligence/public/mocks/mock_security_context.tsx +++ b/x-pack/plugins/threat_intelligence/public/mocks/mock_security_context.tsx @@ -6,7 +6,7 @@ */ import React, { NamedExoticComponent } from 'react'; -import { BlockListFlyoutProps, BlockListFormProps } from '../types'; +import { BlockListFlyoutProps, BlockListFormProps, SelectedDataView } from '../types'; import { SecuritySolutionPluginContext } from '..'; export const getSecuritySolutionContextMock = (): SecuritySolutionPluginContext => ({ @@ -31,7 +31,7 @@ export const getSecuritySolutionContextMock = (): SecuritySolutionPluginContext selectedPatterns: [], indexPattern: { fields: [], title: '' }, loading: false, - }, + } as unknown as SelectedDataView, securitySolutionStore: { // @ts-ignore dispatch: () => jest.fn(), diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts index 5ee03382c665f..f25d01a4de552 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts @@ -79,11 +79,7 @@ export const useAggregatedIndicators = ({ } = useKibana(); const userTimeZone = useTimeZone(); const userFormat = useDateFormat(); - - const { - sourcererDataView: { selectedPatterns }, - } = useSourcererDataView(); - + const { selectedPatterns } = useSourcererDataView(); const { inspectorAdapters } = useInspector(); const [field, setField] = useState>({ diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.ts index 335150d3c19dc..dd8c83fd4f249 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.ts @@ -64,10 +64,7 @@ export const useIndicators = ({ data: { search: searchService }, }, } = useKibana(); - const { - sourcererDataView: { selectedPatterns }, - } = useSourcererDataView(); - + const { selectedPatterns } = useSourcererDataView(); const { inspectorAdapters } = useInspector(); const onChangeItemsPerPage = useCallback( diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts index 947ac663a59cd..d2e12d545036c 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts @@ -54,7 +54,7 @@ export const useSourcererDataView = () => { return useMemo( () => ({ - sourcererDataView, + ...sourcererDataView, indexPatterns, indexPattern: updatedPattern, browserFields, diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_total_count.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_total_count.tsx index 2e98154e620bd..d9b7c22f83354 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_total_count.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_total_count.tsx @@ -24,9 +24,7 @@ export const useIndicatorsTotalCount = () => { const [count, setCount] = useState(0); const [isLoading, setIsLoading] = useState(true); - const { - sourcererDataView: { selectedPatterns, loading: loadingDataView }, - } = useSourcererDataView(); + const { selectedPatterns, loading: loadingDataView } = useSourcererDataView(); useEffect(() => { const query = { diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx index 45f356ff455f2..4edbb8e22f7d6 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx @@ -83,7 +83,6 @@ const IndicatorsPageContent: VFC = () => { diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar.tsx index 784a25d597959..8b36c7ddc6a02 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar.tsx @@ -6,17 +6,16 @@ */ import React, { useEffect, VFC } from 'react'; +import type { DataViewSpec } from '@kbn/data-views-plugin/common'; import { useSecurityContext } from '../../../hooks/use_security_context'; -import { SecuritySolutionDataViewBase, SourcererDataView } from '../../../types'; interface QueryBarProps { - indexPattern: SecuritySolutionDataViewBase; queries: Array<{ id: string; refetch: VoidFunction; loading: boolean; }>; - sourcererDataView: SourcererDataView | undefined; + sourcererDataView: DataViewSpec | undefined; } export const QueryBar: VFC = ({ queries, sourcererDataView }) => { diff --git a/x-pack/plugins/threat_intelligence/public/types.ts b/x-pack/plugins/threat_intelligence/public/types.ts index 7d8c4d2de0793..39e26c50486b4 100644 --- a/x-pack/plugins/threat_intelligence/public/types.ts +++ b/x-pack/plugins/threat_intelligence/public/types.ts @@ -10,6 +10,7 @@ import { CoreStart } from '@kbn/core/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { DataViewField, + type DataViewSpec, DataViewsPublicPluginStart, FieldSpec, } from '@kbn/data-views-plugin/public'; @@ -64,7 +65,8 @@ export interface LicenseAware { export type BrowserFields = Readonly>>; -export interface SourcererDataView { +export interface SelectedDataView { + sourcererDataView: DataViewSpec | undefined; indexPattern: SecuritySolutionDataViewBase; browserFields: BrowserFields; selectedPatterns: string[]; @@ -112,7 +114,7 @@ export interface SecuritySolutionPluginContext { /** * Gets Security Solution shared information like browerFields, indexPattern and selectedPatterns in DataView. */ - sourcererDataView: SourcererDataView; + sourcererDataView: SelectedDataView; /** * Security Solution store diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 149343d7a5f53..2e8ffba6e1d79 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -76,7 +76,35 @@ } }, "messages": { - "autocomplete.conflictIndicesWarning.index.description": "{name} ({count} index)", + "alertsUIShared.maintenanceWindowCallout.maintenanceWindowActive": "{activeWindowCount, plural, one {Une fenêtre de maintenance est} other {Des fenêtres de maintenance sont}} en cours d'exécution pour des règles de {categories}", + "alertsUIShared.maintenanceWindowCallout.maintenanceWindowMultipleCategoryNames": "{commaSeparatedList} et {last}", + "alertsUIShared.maintenanceWindowCallout.maintenanceWindowTwoCategoryNames": "{first} et {second}", + "alertsUIShared.alertFieldsTable.field": "Champ", + "alertsUIShared.alertFieldsTable.filter.placeholder": "Filtre par Champ, Valeur ou Description...", + "alertsUIShared.alertFieldsTable.value": "Valeur", + "alertsUIShared.component.alertsSearchBar.placeholder": "Alertes de recherche (par exemple, kibana.alert.evaluation.threshold > 75)", + "alertsUIShared.components.addMessageVariables.addRuleVariableTitle": "Ajouter une variable", + "alertsUIShared.components.addMessageVariables.addVariablePopoverButton": "Ajouter une variable", + "alertsUIShared.components.addMessageVariables.deprecatedVariablesAreHidden": "Les variables déclassées sont masquées", + "alertsUIShared.components.addMessageVariables.deprecatedVariablesAreShown": "Les variables déclassées sont affichées", + "alertsUIShared.components.addMessageVariables.hideDeprecatedVariables": "Masquer", + "alertsUIShared.components.addMessageVariables.loadingMessage": "Chargement des variables", + "alertsUIShared.components.addMessageVariables.noVariablesAvailable": "Aucune variable disponible", + "alertsUIShared.components.addMessageVariables.noVariablesFound": "Aucune variable trouvée", + "alertsUIShared.components.addMessageVariables.showAllDeprecatedVariables": "Afficher tout", + "alertsUIShared.components.alertLifecycleStatusBadge.activeLabel": "Actif", + "alertsUIShared.components.alertLifecycleStatusBadge.flappingLabel": "Bagotement", + "alertsUIShared.components.alertLifecycleStatusBadge.recoveredLabel": "Récupéré", + "alertsUIShared.components.alertLifecycleStatusBadge.untrackedLabel": "Non suivi", + "alertsUIShared.hooks.useAlertDataView.useAlertDataMessage": "Impossible de charger la vue des données de l'alerte", + "alertsUIShared.hooks.useLoadRuleTypesQuery.unableToLoadRuleTypesMessage": "Impossible de charger les types de règles", + "alertsUIShared.hooks.useRuleAADFields.errorMessage": "Impossible de charger les champs d'alerte par type de règle", + "alertsUIShared.maintenanceWindowCallout.fetchError": "La vérification visant à déterminer si les fenêtres de maintenance sont actives a échoué", + "alertsUIShared.maintenanceWindowCallout.fetchErrorDescription": "Les notifications de règle sont arrêtées lorsque les fenêtres de maintenance sont en cours d'exécution.", + "alertsUIShared.maintenanceWindowCallout.maintenanceWindowActiveDescription": "Les notifications de règle sont arrêtées lorsque les fenêtres de maintenance sont en cours d'exécution.", + "alertsUIShared.maintenanceWindowCallout.maintenanceWindowActiveNoCategories": "Une ou plusieurs fenêtres de maintenance sont en cours d'exécution", + "alertsUIShared.maintenanceWindowCallout.managementCategoryLabel": "Suite", + "autocomplete.conflictIndicesWarning.index.description": "{name} ({count} index)", "autocomplete.customOptionText": "Ajouter {searchValuePlaceholder} comme champ personnalisé", "autocomplete.conflictIndicesWarning.description": "Ce champ est défini avec différents types dans les index suivants ou il n'est pas mappé, ce qui peut entraîner des résultats inattendus lors des requêtes.", "autocomplete.conflictIndicesWarning.title": "Conflit de mapping", @@ -89,6 +117,8 @@ "autocomplete.loadingDescription": "Chargement...", "autocomplete.seeDocumentation": "Consultez la documentation", "autocomplete.selectField": "Veuillez d'abord sélectionner un champ...", + "bfetchError.networkErrorWithStatus": "Vérifiez votre connexion réseau et réessayez. Code {code}", + "bfetchError.networkError": "Vérifiez votre connexion réseau et réessayez.", "cellActions.youAreInADialogContainingOptionsScreenReaderOnly": "Vous êtes dans une boîte de dialogue contenant des options pour le champ {fieldName}. Appuyez sur Tab pour naviguer entre les options. Appuyez sur Échap pour quitter.", "cellActions.actions.copyToClipboard.displayName": "Copier dans le Presse-papiers", "cellActions.actions.copyToClipboard.successMessage": "Copié dans le presse-papiers", @@ -100,8 +130,8 @@ "cellActions.showMoreActionsLabel": "Plus d'actions", "charts.advancedSettings.visualization.colorMappingText": "Mappe des valeurs à des couleurs spécifiques dans les graphiques avec la palette Compatibilité.", "charts.colorPicker.setColor.screenReaderDescription": "Définir la couleur pour la valeur {legendDataLabel}", - "charts.functions.palette.args.colorHelpText": "Les couleurs de la palette. Accepte un nom de couleur {html}, {hex}, {hsl}, {hsla}, {rgb} ou {rgba}.", - "charts.warning.warningLabel": "{numberWarnings, number} {numberWarnings, plural, one {avertissement} many {avertissements} other {avertissements}}", + "charts.functions.palette.args.colorHelpText": "Les couleurs de la palette. Accepte un nom de couleur {html}, {hex}, {hsl}, {hsla}, {rgb} ou {rgba}.", + "charts.warning.warningLabel": "{numberWarnings, number} {numberWarnings, plural, one {avertissement} other {avertissements}}", "charts.advancedSettings.visualization.colorMappingTextDeprecation": "Ce paramètre est déclassé et ne sera plus compatible avec les futures versions.", "charts.advancedSettings.visualization.colorMappingTitle": "Mapping des couleurs", "charts.advancedSettings.visualization.useLegacyTimeAxis.deprecation": "Ce paramètre est déclassé et ne sera plus compatible avec les futures versions.", @@ -124,7 +154,7 @@ "charts.legend.toggleLegendButtonAriaLabel": "Afficher/Masquer la légende", "charts.legend.toggleLegendButtonTitle": "Afficher/Masquer la légende", "charts.noDataLabel": "Résultat introuvable", - "charts.palettes.complementaryLabel": "Gratuite", + "charts.palettes.complementaryLabel": "Complémentaire", "charts.palettes.coolLabel": "Froide", "charts.palettes.customLabel": "Personnalisée", "charts.palettes.defaultPaletteLabel": "Par défaut", @@ -136,32 +166,60 @@ "charts.palettes.temperatureLabel": "Température", "charts.palettes.warmLabel": "Chaude", "charts.partialData.bucketTooltipText": "La plage temporelle sélectionnée n'inclut pas ce compartiment en entier. Il se peut qu'elle contienne des données partielles.", - "coloring.dynamicColoring.customPalette.rangeAriaLabel": "Plage {index}", + "cloud.deploymentDetails.cloudIDLabelToolip": "Lancez-vous avec Elastic Agent ou Logstash. Le Cloud ID simplifie l'envoi de données à Elastic. {link}", + "cloud.deploymentDetails.cloudIDLabel": "Identifiant du cloud", + "cloud.deploymentDetails.cloudIDLabelToolip.learnMoreLink": "En savoir plus", + "cloud.deploymentDetails.createManageApiKeysButtonLabel": "Créer et gérer des clés d'API", + "cloud.deploymentDetails.elasticEndpointLabel": "Point de terminaison Elasticsearch", + "cloud.deploymentDetails.helpMenuLinks.connectionDetails": "Informations de connexion", + "cloud.deploymentDetails.learnMoreButtonLabel": "En savoir plus", + "cloud.deploymentDetails.modal.closeButtonLabel": "Fermer", + "cloud.deploymentDetails.modal.learnMoreButtonLabel": "En savoir plus", + "coloring.colorMapping.colorPicker.lowContrastColor": "La couleur est peu contrastée dans {themes} {errorModes, plural, one {mode} other {# modes}}", + "coloring.dynamicColoring.customPalette.rangeAriaLabel": "Gamme {index}", "coloring.colorMapping.assignments.autoAssignedTermAriaLabel": "Cette couleur sera automatiquement affectée au premier terme qui ne correspond pas à toutes les autres affectations", "coloring.colorMapping.assignments.autoAssignedTermPlaceholder": "Affecté automatiquement", "coloring.colorMapping.assignments.deleteAssignmentButtonLabel": "Supprimer cette affectation", + "coloring.colorMapping.assignments.duplicateCategoryWarning": "Une autre couleur a déjà été affectée à cette catégorie. Seule la première affectation correspondante sera utilisée.", "coloring.colorMapping.colorChangesModal.categoricalModeDescription": "Basculer en mode de catégorie conduira à l'abandon de toutes vos modifications de couleurs personnalisées", "coloring.colorMapping.colorChangesModal.discardButton": "Abandonner les modifications", "coloring.colorMapping.colorChangesModal.discardButtonLabel": "Abandonner les modifications", "coloring.colorMapping.colorChangesModal.goBackButtonLabel": "Retour", "coloring.colorMapping.colorChangesModal.modalTitle": "Modifications de couleurs détectées", "coloring.colorMapping.colorChangesModal.preserveButton": "Conserver les modifications", - "coloring.colorMapping.colorChangesModal.sequentialModeDescription": "Passer en mode séquentiel conduira à l'abandon de toutes vos modifications de couleurs personnalisées", + "coloring.colorMapping.colorChangesModal.sequentialModeDescription": "Le fait de passer à un mode dégradé conduira à l'abandon de toutes vos modifications de couleurs personnalisées", "coloring.colorMapping.colorChangesModal.switchPaletteDescription": "Changer de palette conduira à l'abandon de toutes vos modifications de couleurs personnalisées", "coloring.colorMapping.colorChangesModal.title": "Modifications de couleurs détectées", "coloring.colorMapping.colorPicker.customTabLabel": "Personnalisé", + "coloring.colorMapping.colorPicker.hexColorinputAriaLabel": "Entrée de couleur hex", + "coloring.colorMapping.colorPicker.invalidColorHex": "Veuillez utiliser un code de couleur hex valide", "coloring.colorMapping.colorPicker.newColorAriaLabel": "Sélectionner une nouvelle couleur", "coloring.colorMapping.colorPicker.paletteColorsLabel": "Couleurs de la palette", "coloring.colorMapping.colorPicker.paletteTabLabel": "Couleurs", "coloring.colorMapping.colorPicker.pickAColorAriaLabel": "Sélectionner une couleur", - "coloring.colorMapping.colorPicker.removeGradientColorButtonLabel": "Supprimer l'étape couleur", + "coloring.colorMapping.colorPicker.removeGradientColorButtonLabel": "Supprimer l'arrêt de couleur", "coloring.colorMapping.colorPicker.themeAwareColorsLabel": "Couleurs neutres", - "coloring.colorMapping.colorPicker.themeAwareColorsTooltip": "Les couleurs neutres fournies se conforment au thème et s'adapteront en fonction du basculement entre les thèmes clair et sombre", + "coloring.colorMapping.colorPicker.themeAwareColorsTooltip": "Les couleurs neutres fournies dépendent du thème et s'adapteront en cas de basculement entre les thèmes clair et sombre.", + "coloring.colorMapping.container.AddAssignmentButtonLabel": "Ajouter une affectation", + "coloring.colorMapping.container.addGradientStopButtonLabel": "Ajouter un arrêt de dégradé", + "coloring.colorMapping.container.clearAllAssignmentsButtonLabel": "Effacer toutes les affectations", + "coloring.colorMapping.container.gradientHeader": "Gradient", "coloring.colorMapping.container.invertGradientButtonLabel": "Inverser le gradient", - "coloring.colorMapping.container.mappingAssignmentHeader": "Mapping des affectations", + "coloring.colorMapping.container.mapCurrentValuesButtonLabel": "Ajouter tous les termes non affectés", + "coloring.colorMapping.container.mappingAssignmentHeader": "Affectations de couleurs", + "coloring.colorMapping.container.mapValueButtonLabel": "Ajouter tous les termes non affectés", + "coloring.colorMapping.container.mapValuesPromptDescription.mapValuesPromptDetail": "Ajoutez de nouvelles affectations pour commencer à associer des termes de vos données à des couleurs spécifiques.", + "coloring.colorMapping.container.OpenAdditionalActionsButtonLabel": "Ouvrir les actions d'affectation supplémentaires", + "coloring.colorMapping.container.unassignedTermsMode.ReuseColorsLabel": "Palette de couleurs", + "coloring.colorMapping.container.unassignedTermsMode.ReuseGradientLabel": "Gradient", + "coloring.colorMapping.container.unassignedTermsMode.SingleColorLabel": "Une seule couleur", + "coloring.colorMapping.container.unassignedTermsModeHeader": "Couleur des termes non affectés", "coloring.colorMapping.paletteSelector.categoricalLabel": "De catégorie", + "coloring.colorMapping.paletteSelector.gradientLabel": "Gradient", "coloring.colorMapping.paletteSelector.paletteLabel": "Palette de couleurs", - "coloring.colorMapping.paletteSelector.scaleLabel": "Scaling", + "coloring.colorMapping.paletteSelector.scaleLabel": "Mode", + "coloring.colorMapping.terms.emptyLabel": "(vide)", + "coloring.colorMapping.terms.otherBucketLabel": "Autre", "coloring.dynamicColoring.customPalette.addColor": "Ajouter une couleur", "coloring.dynamicColoring.customPalette.addColorAriaLabel": "Ajouter une couleur", "coloring.dynamicColoring.customPalette.colorStopsHelpPercentage": "Les types de valeurs en pourcentage sont relatifs à la plage complète des valeurs de données disponibles.", @@ -192,14 +250,15 @@ "coloring.dynamicColoring.rangeType.label": "Type de valeur", "coloring.dynamicColoring.rangeType.number": "Numéro", "coloring.dynamicColoring.rangeType.percent": "Pourcent", - "console.helpPage.learnAboutConsoleAndQueryDslText": "En savoir plus sur {console} et {queryDsl}", + "console.embeddableConsole.customScreenReaderAnnouncement": "Il y a un nouveau repère de région nommé {landmarkHeading} avec des commandes de niveau de page à la fin du document.", + "console.helpPage.learnAboutConsoleAndQueryDslText": "Découvrez plus d'informations sur {console} et {queryDsl}", "console.historyPage.itemOfRequestListAriaLabel": "Requête : {historyItem}", - "console.settingsPage.refreshInterval.everyNMinutesTimeInterval": "Toutes les {value} {value, plural, one {minute} many {minutes} other {minutes}}", - "console.variablesPage.descriptionText": "Définissez les variables et utilisez-les dans vos requêtes sous la forme {variable}.", + "console.settingsPage.refreshInterval.everyNMinutesTimeInterval": "Toutes les {value} {value, plural, one {minute} other {minutes}}", + "console.variablesPage.descriptionText": "Définir les variables et les utiliser dans vos requêtes sous la forme {variable}.", "console.variablesPage.descriptionText.variableNameText": "{variableName}", - "console.welcomePage.addCommentsDescription": "Pour utiliser un commentaire d'une seule ligne, utilisez {hash} ou {doubleSlash}. Pour un commentaire de plusieurs lignes, marquez le début avec {slashAsterisk} et la fin avec {asteriskSlash}.", - "console.welcomePage.kibanaAPIsDescription": "Pour envoyer une requête à l'API Kibana, faites précéder le chemin de {kibanaApiPrefix}.", - "console.welcomePage.useVariables.step1": "Cliquez sur {variableText}, puis saisissez le nom de la variable et la valeur.", + "console.welcomePage.addCommentsDescription": "Pour ajouter un commentaire d'une seule ligne, utilisez {hash} ou {doubleSlash}. Pour un commentaire de plusieurs lignes, marquez le début avec {slashAsterisk} et la fin avec {asteriskSlash}.", + "console.welcomePage.kibanaAPIsDescription": "Pour envoyer une requête à l'API Kibana, faites précéder le chemin de {kibanaApiPrefix}.", + "console.welcomePage.useVariables.step1": "Cliquez sur {variableText}, puis saisissez le nom et la valeur de la variable.", "console.welcomePage.useVariablesDescription": "Définissez les variables dans la Console, puis utilisez-les dans vos requêtes sous la forme {variableName}.", "console.autocomplete.addMethodMetaText": "méthode", "console.autocomplete.fieldsFetchingAnnotation": "La récupération des champs est en cours", @@ -222,6 +281,8 @@ "console.deprecations.proxyFilterTitle": "Le paramètre \"console.proxyFilter\" est déclassé", "console.devToolsDescription": "Plutôt que l’interface cURL, utilisez une interface JSON pour exploiter vos données dans la console.", "console.devToolsTitle": "Interagir avec l'API Elasticsearch", + "console.embeddableConsole.landmarkHeading": "Console développeur", + "console.embeddableConsole.title": "Console", "console.exampleOutputTextarea": "Outils de développement de la console - Exemple d’éditeur", "console.helpPage.keyboardCommands.autoIndentDescription": "Appliquer un retrait automatique à la requête en cours", "console.helpPage.keyboardCommands.closeAutoCompleteMenuDescription": "Fermer le menu de saisie semi-automatique", @@ -317,17 +378,15 @@ "contentManagement.contentEditor.saveButtonLabel": "Mettre à jour {entityName}", "contentManagement.inspector.metadataForm.unableToSaveDangerMessage": "Impossible d'enregistrer {entityName}", "contentManagement.tableList.listing.createNewItemButtonLabel": "Créer {entityName}", - "contentManagement.tableList.listing.deleteButtonMessage": "Supprimer {itemCount} {entityName}", - "contentManagement.tableList.listing.deleteConfirmModalDescription": "Vous ne pouvez pas récupérer des {entityNamePlural} supprimés.", - "contentManagement.tableList.listing.deleteSelectedConfirmModal.title": "Supprimer {itemCount} {entityName} ?", - "contentManagement.tableList.listing.fetchErrorDescription": "Impossible de récupérer la liste {entityName} : {message}.", - "contentManagement.tableList.listing.listingLimitExceededDescription": "Vous avez {totalItems} {entityNamePlural}, mais votre paramètre {listingLimitText} empêche le tableau ci-dessous d'afficher plus de {listingLimitValue}.", + "contentManagement.tableList.listing.deleteButtonMessage": "Supprimer {itemCount} {entityName}", + "contentManagement.tableList.listing.deleteConfirmModalDescription": "Vous ne pourrez pas récupérer les {entityNamePlural} supprimés.", + "contentManagement.tableList.listing.deleteSelectedConfirmModal.title": "Supprimer {itemCount} {entityName} ?", + "contentManagement.tableList.listing.fetchErrorDescription": "Le listing {entityName} n'a pas pu être récupéré : {message}.", + "contentManagement.tableList.listing.listingLimitExceededDescription": "Vous avez {totalItems} {entityNamePlural}, mais votre paramètre {listingLimitText} empêche le tableau ci-dessous d'en afficher plus de {listingLimitValue}.", "contentManagement.tableList.listing.listingLimitExceededDescriptionPermissions": "Vous pouvez modifier ce paramètre sous {advancedSettingsLink}.", - "contentManagement.tableList.listing.noAvailableItemsMessage": "Pas de {entityNamePlural} à disposition.", - "contentManagement.tableList.listing.noMatchedItemsMessage": "Pas de {entityNamePlural} correspondant à votre recherche.", "contentManagement.tableList.listing.table.editActionName": "Modifier {itemDescription}", - "contentManagement.tableList.listing.table.viewDetailsActionName": "Afficher les détails de {itemTitle}", - "contentManagement.tableList.listing.unableToDeleteDangerMessage": "Impossible de supprimer {entityName}(s)", + "contentManagement.tableList.listing.table.viewDetailsActionName": "Voir les détails de {itemTitle}", + "contentManagement.tableList.listing.unableToDeleteDangerMessage": "Impossible de supprimer la/le/les {entityName}(s)", "contentManagement.tableList.tagBadge.buttonLabel": "Bouton de balise {tagName}.", "contentManagement.tableList.tagFilterPanel.modifierKeyHelpText": "{modifierKeyPrefix} + cliquer sur Exclure", "contentManagement.contentEditor.cancelButtonLabel": "Annuler", @@ -355,29 +414,33 @@ "contentManagement.tableList.listing.tableSortSelect.updatedAtAscLabel": "Mise à jour la moins récente", "contentManagement.tableList.listing.tableSortSelect.updatedAtDescLabel": "Mise à jour récente", "contentManagement.tableList.mainColumnName": "Nom, description, balises", + "contentManagement.tableList.managedItemNoEdit": "Cet élément est géré par Elastic. Clonez-le avant d'effectuer des modifications.", "contentManagement.tableList.tagFilterPanel.clearSelectionButtonLabelLabel": "Effacer la sélection", "contentManagement.tableList.tagFilterPanel.doneButtonLabel": "Terminé", "contentManagement.tableList.tagFilterPanel.manageAllTagsLinkLabel": "Gérer les balises", "contentManagement.tableList.updatedDateUnknownLabel": "Dernière mise à jour inconnue", "controls.controlGroup.ariaActions.moveControlButtonAction": "Déplacer le contrôle {controlTitle}", "controls.controlGroup.manageControl.controlTypeSettings.formGroupDescription": "Paramètres personnalisés pour votre contrôle {controlType}.", - "controls.controlGroup.manageControl.controlTypeSettings.formGroupTitle": "Paramètres de {controlType}", - "controls.optionsList.controlAndPopover.exists": "{negate, plural, one {Existe} many {Existent} other {Existent}}", + "controls.controlGroup.manageControl.controlTypeSettings.formGroupTitle": "Paramètres {controlType}", + "controls.optionsList.controlAndPopover.exists": "{negate, plural, one {Existe} other {Existent}}", "controls.optionsList.errors.fieldNotFound": "Impossible de localiser le champ : {fieldName}", "controls.optionsList.popover.ariaLabel": "Fenêtre contextuelle pour le contrôle {fieldName}", - "controls.optionsList.popover.cardinalityLabel": "{totalOptions, number} {totalOptions, plural, one {option} many {options disponibles} other {options}}", - "controls.optionsList.popover.documentCountScreenReaderText": "Apparaît dans {documentCount, number} {documentCount, plural, one {document} many {documents} other {documents}}", - "controls.optionsList.popover.documentCountTooltip": "Cette valeur apparaît dans {documentCount, number} {documentCount, plural, one {document} many {documents} other {documents}}", - "controls.optionsList.popover.invalidSelectionsAriaLabel": "{invalidSelectionCount, plural, one {Sélection ignorée} many {Sélections ignorées} other {Sélections ignorées}} pour {fieldName}", - "controls.optionsList.popover.invalidSelectionsLabel": "{selectedOptions} {selectedOptions, plural, one {sélection ignorée} many {Sélections ignorées} other {sélections ignorées}}", - "controls.optionsList.popover.invalidSelectionsSectionTitle": "{invalidSelectionCount, plural, one {Sélection ignorée} many {Sélections ignorées} other {Sélections ignorées}}", - "controls.optionsList.popover.suggestionsAriaLabel": "{optionCount, plural, one {option disponible} many {options disponibles} other {options disponibles}} pour {fieldName}", + "controls.optionsList.popover.cardinalityLabel": "{totalOptions, number} {totalOptions, plural, one {option} other {options}}", + "controls.optionsList.popover.documentCountScreenReaderText": "Apparaît dans {documentCount, number} {documentCount, plural, one {document} other {documents}}", + "controls.optionsList.popover.documentCountTooltip": "Cette valeur apparaît dans {documentCount, number} {documentCount, plural, one {document} other {documents}}", + "controls.optionsList.popover.invalidSelectionsAriaLabel": "{invalidSelectionCount, plural, one {Sélection ignorée} other {Sélections ignorées}} pour {fieldName}", + "controls.optionsList.popover.invalidSelectionsLabel": "{selectedOptions} {selectedOptions, plural, one {sélection ignorée} other {sélections ignorées}}", + "controls.optionsList.popover.invalidSelectionsSectionTitle": "{invalidSelectionCount, plural, one {Sélection ignorée} other {Sélections ignorées}}", + "controls.optionsList.popover.suggestionsAriaLabel": "{optionCount, plural, one {option disponible} other {options disponibles}} pour {fieldName}", "controls.rangeSlider.errors.fieldNotFound": "Impossible de localiser le champ : {fieldName}", "controls.controlGroup.floatingActions.clearTitle": "Effacer", "controls.controlGroup.floatingActions.editTitle": "Modifier", "controls.controlGroup.floatingActions.removeTitle": "Supprimer", "controls.controlGroup.manageControl.cancelTitle": "Annuler", "controls.controlGroup.manageControl.createFlyoutTitle": "Créer un contrôle", + "controls.controlGroup.manageControl.dataSource.controlTypeErrorMessage.default": "Sélectionnez un type de contrôle compatible.", + "controls.controlGroup.manageControl.dataSource.controlTypeErrorMessage.rangeSlider": "Les curseurs ne sont compatibles qu'avec les champs de numéros.", + "controls.controlGroup.manageControl.dataSource.controlTypErrorMessage.noField": "Sélectionnez d'abord un champ.", "controls.controlGroup.manageControl.dataSource.controlTypesTitle": "Type de contrôle", "controls.controlGroup.manageControl.dataSource.dataViewTitle": "Vue de données", "controls.controlGroup.manageControl.dataSource.fieldTitle": "Champ", @@ -407,8 +470,10 @@ "controls.controlGroup.management.discard.confirm": "Abandonner les modifications", "controls.controlGroup.management.discard.sub": "Les modifications apportées à ce contrôle seront ignorées. Voulez-vous vraiment continuer ?", "controls.controlGroup.management.discard.title": "Abandonner les modifications ?", + "controls.controlGroup.management.filtering.useGlobalFilters": "Appliquer les filtres globaux aux contrôles", + "controls.controlGroup.management.filtering.useGlobalTimeRange": "Appliquer la plage temporelle globale aux contrôles", + "controls.controlGroup.management.filteringSettings": "Filtrage", "controls.controlGroup.management.flyoutTitle": "Paramètres du contrôle", - "controls.controlGroup.management.hierarchy.tooltip": "Les sélections dans un contrôle diminuent les options disponibles dans le suivant. Les contrôles se suivent de gauche à droite.", "controls.controlGroup.management.hierarchy.title": "Contrôles à la suite", "controls.controlGroup.management.labelPosition.above": "Au-dessus", "controls.controlGroup.management.labelPosition.designSwitchLegend": "Modifier la position de l'étiquette entre Aligné et Au-dessus", @@ -419,7 +484,7 @@ "controls.controlGroup.management.layout.large": "Large", "controls.controlGroup.management.layout.medium": "Moyenne", "controls.controlGroup.management.layout.small": "Petite", - "controls.controlGroup.management.validate.tooltip": "Ignorez automatiquement toutes les sélections de contrôle qui ne donneraient aucune donnée.", + "controls.controlGroup.management.selectionSettings": "Sélections", "controls.controlGroup.management.validate.title": "Valider les sélections utilisateur", "controls.controlGroup.timeSlider.title": "Curseur temporel", "controls.controlGroup.title": "Groupe de contrôle", @@ -432,6 +497,8 @@ "controls.optionsList.description": "Ajoutez un menu pour la sélection de valeurs de champ.", "controls.optionsList.displayName": "Liste des options", "controls.optionsList.editor.additionalSettingsTitle": "Paramètres supplémentaires", + "controls.optionsList.editor.exactSearchLabel": "Exact", + "controls.optionsList.editor.exactSearchTooltip": "Correspond aux valeurs qui sont égales à la chaîne de recherche donnée. Renvoie les résultats rapidement.", "controls.optionsList.editor.multiSelectLabel": "Permettre des sélections multiples", "controls.optionsList.editor.prefixSearchLabel": "Préfixe", "controls.optionsList.editor.prefixSearchTooltip": "Correspond aux valeurs qui commencent avec la chaîne de recherche donnée.", @@ -446,9 +513,13 @@ "controls.optionsList.popover.allowExpensiveQueriesWarning": "Le paramètre de cluster permettant d'autoriser les requêtes lourdes est désactivé, impliquant la désactivation d'autres fonctionnalités.", "controls.optionsList.popover.empty": "Aucune option trouvée", "controls.optionsList.popover.endOfOptions": "Les 1 000 premières options disponibles sont affichées. Affichez davantage d'options en recherchant le nom.", + "controls.optionsList.popover.exactSearchPlaceholder": "Égal à…", "controls.optionsList.popover.excludeLabel": "Exclure", "controls.optionsList.popover.excludeOptionsLegend": "Inclure ou exclure les sélections", "controls.optionsList.popover.includeLabel": "Inclure", + "controls.optionsList.popover.invalidSearch.invalidCharacters": "Votre recherche contient des caractères non valides.", + "controls.optionsList.popover.invalidSearch.ip": "Votre recherche n'est pas une adresse IP valide.", + "controls.optionsList.popover.invalidSearch.number": "Votre recherche n'est pas un numéro valide.", "controls.optionsList.popover.invalidSelectionScreenReaderText": "Sélection non valide.", "controls.optionsList.popover.loadingMore": "Chargement d'options supplémentaires...", "controls.optionsList.popover.prefixSearchPlaceholder": "Commence par...", @@ -457,6 +528,7 @@ "controls.optionsList.popover.sortBy.alphabetical": "Par ordre alphabétique", "controls.optionsList.popover.sortBy.date": "Par date", "controls.optionsList.popover.sortBy.docCount": "Par compte du document", + "controls.optionsList.popover.sortBy.numeric": "Numériquement", "controls.optionsList.popover.sortDescription": "Définir l'ordre de tri", "controls.optionsList.popover.sortDirections": "Sens de tri", "controls.optionsList.popover.sortDisabledTooltip": "Le tri est ignoré lorsque \"Afficher uniquement les options sélectionnées\" est vrai", @@ -466,6 +538,7 @@ "controls.optionsList.popover.wildcardSearchPlaceholder": "Contient...", "controls.rangeSlider.description": "Ajoutez un contrôle pour la sélection d'une plage de valeurs de champ.", "controls.rangeSlider.displayName": "Curseur de plage", + "controls.rangeSlider.editor.stepSizeTitle": "Taille de l'étape", "controls.rangeSlider.popover.noAvailableDataHelpText": "Il n'y a aucune donnée à afficher. Ajustez la plage temporelle et les filtres.", "controls.timeSlider.description": "Ajouter un curseur pour la sélection d'une plage temporelle", "controls.timeSlider.displayName": "Curseur temporel", @@ -475,53 +548,54 @@ "controls.timeSlider.previousLabel": "Fenêtre temporelle précédente", "controls.timeSlider.settings.pinStart": "Épingler le début", "controls.timeSlider.settings.unpinStart": "Désépingler le début", - "core.chrome.browserDeprecationWarning": "La prise en charge d'Internet Explorer sera abandonnée dans les futures versions de ce logiciel. Veuillez consulter {link}.", + "core.chrome.browserDeprecationWarning": "La prise en charge d'Internet Explorer sera abandonnée dans les futures versions de ce logiciel. Veuillez consulter le site {link}.", "core.deprecations.deprecations.fetchFailedMessage": "Impossible d'extraire les informations de déclassement pour le plug-in {domainId}.", "core.deprecations.deprecations.fetchFailedTitle": "Impossible d'extraire les déclassements pour {domainId}", - "core.deprecations.elasticsearchSSL.manualSteps1": "Ajoutez le paramètre \"{missingSetting}\" au fichier kibana.yml.", - "core.deprecations.elasticsearchSSL.manualSteps2": "Si vous ne souhaitez pas utiliser l'authentification TLS mutuelle, vous pouvez aussi supprimer \"{existingSetting}\" du fichier kibana.yml.", - "core.deprecations.elasticsearchSSL.message": "Utilisez à la fois \"{existingSetting}\" et \"{missingSetting}\"afin d'activer Kibana pour utiliser l'authentification TLS mutuelle avec Elasticsearch.", + "core.deprecations.elasticsearchSSL.manualSteps1": "Ajoutez le paramètre \"{missingSetting}\" à kibana.yml.", + "core.deprecations.elasticsearchSSL.manualSteps2": "Si vous ne souhaitez pas utiliser l'authentification TLS mutuelle, vous pouvez aussi supprimer \"{existingSetting}\" dans kibana.yml.", + "core.deprecations.elasticsearchSSL.message": "Utilisez à la fois \"{existingSetting}\" et \"{missingSetting}\" afin d'activer Kibana pour utiliser l'authentification TLS mutuelle avec Elasticsearch.", "core.deprecations.elasticsearchSSL.title": "L'utilisation de \"{existingSetting}\" sans \"{missingSetting}\" n'a pas d'effet", "core.deprecations.elasticsearchUsername.message": "Kibana est configuré pour l'authentification sur Elasticsearch avec l'utilisateur \"{username}\". Utilisez plutôt un jeton de compte de service.", "core.deprecations.elasticsearchUsername.title": "L'utilisation de \"elasticsearch.username: {username}\" est déclassée", - "core.euiAbsoluteTab.dateFormatError": "Format attendu : {dateFormat}", + "core.euiAbsoluteTab.dateFormatError": "Formats autorisés : {dateFormat}, ISO 8601, RFC 2822 ou horodatage Unix.", "core.euiAutoRefresh.buttonLabelOn": "L'actualisation automatique est activée et définie sur {prettyInterval}", - "core.euiBasicTable.tableAutoCaptionWithoutPagination": "Ce tableau contient {itemCount} lignes.", - "core.euiBasicTable.tableAutoCaptionWithPagination": "Ce tableau contient {itemCount} lignes sur {totalItemCount} ; page {page} sur {pageCount}.", - "core.euiBasicTable.tableCaptionWithPagination": "{tableCaption} ; page {page} sur {pageCount}.", + "core.euiBasicTable.tableAutoCaptionWithoutPagination": "Ce tableau contient {itemCount} lignes.", + "core.euiBasicTable.tableAutoCaptionWithPagination": "Ce tableau contient {itemCount} lignes sur {totalItemCount} lignes au total ; page {page} sur {pageCount}.", + "core.euiBasicTable.tableCaptionWithPagination": "{tableCaption} ; page {page} sur {pageCount}.", "core.euiBasicTable.tablePagination": "Pagination pour le tableau : {tableCaption}", - "core.euiBasicTable.tableSimpleAutoCaptionWithPagination": "Ce tableau contient {itemCount} lignes ; page {page} sur {pageCount}.", - "core.euiBottomBar.customScreenReaderAnnouncement": "Il y a un nouveau repère de région appelé {landmarkHeading} avec des commandes de niveau de page à la fin du document.", + "core.euiBasicTable.tableSimpleAutoCaptionWithPagination": "Ce tableau contient {itemCount} lignes ; page {page} sur {pageCount}.", + "core.euiBottomBar.customScreenReaderAnnouncement": "Il y a un nouveau repère de région nommé {landmarkHeading} avec des commandes de niveau de page à la fin du document.", "core.euiCodeBlockAnnotations.ariaLabel": "Cliquez pour afficher une annotation de code pour la ligne {lineNumber}", - "core.euiColorPickerSwatch.ariaLabel": "Sélectionner {color} comme couleur", + "core.euiColorPickerSwatch.ariaLabel": "Sélection de la couleur {color}", "core.euiColumnActions.sort": "Trier {schemaLabel}", "core.euiColumnSortingDraggable.activeSortLabel": "{display} trie cette grille de données", "core.euiColumnSortingDraggable.removeSortLabel": "Retirer {display} du tri de la grille de données", "core.euiColumnSortingDraggable.toggleLegend": "Sélectionner la méthode de tri pour {display}", - "core.euiComboBoxOptionsList.alreadyAdded": "{label} a déjà été ajouté", - "core.euiComboBoxOptionsList.createCustomOption": "Ajouter {searchValue} comme option personnalisée", - "core.euiComboBoxOptionsList.delimiterMessage": "Ajouter les éléments en les séparant par {delimiter}", - "core.euiComboBoxOptionsList.noMatchingOptions": "{searchValue} ne correspond à aucune option", - "core.euiComboBoxPill.removeSelection": "Retirer {children} de la sélection de ce groupe", - "core.euiDataGrid.ariaLabel": "{label} ; page {page} sur {pageCount}.", - "core.euiDataGrid.ariaLabelledBy": "Page {page} sur {pageCount}.", + "core.euiComboBoxOptionsList.alreadyAdded": "{label} a déjà été ajouté.", + "core.euiComboBoxOptionsList.createCustomOption": "Ajouter {searchValue} en tant qu'option personnalisée", + "core.euiComboBoxOptionsList.delimiterMessage": "Ajouter chaque élément en séparant par {delimiter}", + "core.euiComboBoxOptionsList.noMatchingOptions": "{searchValue} ne correspond à aucune option.", + "core.euiComboBoxPill.removeSelection": "Supprimer {children} de la sélection de ce groupe", + "core.euiDataGrid.ariaLabel": "{label} ; page {page} sur {pageCount}.", + "core.euiDataGrid.ariaLabelledBy": "Page {page} sur {pageCount}.", "core.euiDataGridCell.position": "{columnId}, colonne {col}, ligne {row}", "core.euiDataGridHeaderCell.sortedByAscendingFirst": "Trié par {columnId}, ordre croissant", - "core.euiDataGridHeaderCell.sortedByAscendingMultiple": ", puis trié par {columnId}, ordre croissant", + "core.euiDataGridHeaderCell.sortedByAscendingMultiple": ", puis par {columnId}, ordre croissant", "core.euiDataGridHeaderCell.sortedByDescendingFirst": "Trié par {columnId}, ordre décroissant", - "core.euiDataGridHeaderCell.sortedByDescendingMultiple": ", puis trié par {columnId}, ordre décroissant", + "core.euiDataGridHeaderCell.sortedByDescendingMultiple": ", puis par {columnId}, ordre décroissant", "core.euiDataGridPagination.detailedPaginationLabel": "Pagination pour la grille précédente : {label}", + "core.euiDataGridToolbarControl.badgeAriaLabel": "Actif : {count}", "core.euiDatePopoverButton.invalidTitle": "Date non valide : {title}", "core.euiDatePopoverButton.outdatedTitle": "Mise à jour requise : {title}", - "core.euiFilePicker.filesSelected": "{fileCount} fichiers sélectionnés", - "core.euiFilterButton.filterBadgeActiveAriaLabel": "{count} filtres actifs", - "core.euiFilterButton.filterBadgeAvailableAriaLabel": "{count} filtres disponibles", + "core.euiFilePicker.filesSelected": "{fileCount} fichiers sélectionnés", + "core.euiFilterButton.filterBadgeActiveAriaLabel": "{count} filtres actifs", + "core.euiFilterButton.filterBadgeAvailableAriaLabel": "{count} filtres disponibles", "core.euiMarkdownEditorFooter.supportedFileTypes": "Fichiers pris en charge : {supportedFileTypes}", - "core.euiPagination.firstRangeAriaLabel": "Ignorer les pages 2 à {lastPage}", - "core.euiPagination.lastRangeAriaLabel": "Ignorer les pages {firstPage} à {lastPage}", - "core.euiPagination.pageOfTotalCompressed": "{page} de {total}", - "core.euiPaginationButton.longPageString": "Page {page} sur {totalPages}", - "core.euiPaginationButton.shortPageString": "Page {page}", + "core.euiPagination.firstRangeAriaLabel": "Ignorer les pages 2 à {lastPage}", + "core.euiPagination.lastRangeAriaLabel": "Ignorer les pages {firstPage} à {lastPage}", + "core.euiPagination.pageOfTotalCompressed": "{page} sur {total}", + "core.euiPaginationButton.longPageString": "Page {page} sur {totalPages}", + "core.euiPaginationButton.shortPageString": "Page {page}", "core.euiPrettyDuration.durationRoundedToDay": "{prettyDuration} arrondie au jour", "core.euiPrettyDuration.durationRoundedToHour": "{prettyDuration} arrondie à l'heure", "core.euiPrettyDuration.durationRoundedToMinute": "{prettyDuration} arrondie à la minute", @@ -530,60 +604,74 @@ "core.euiPrettyDuration.durationRoundedToWeek": "{prettyDuration} arrondie à la semaine", "core.euiPrettyDuration.durationRoundedToYear": "{prettyDuration} arrondie à l'année", "core.euiPrettyDuration.fallbackDuration": "{displayFrom} à {displayTo}", - "core.euiPrettyInterval.days": "{interval, plural, one {# jour} many {# jours} other {# jours}}", - "core.euiPrettyInterval.daysShorthand": "{interval} j", - "core.euiPrettyInterval.hours": "{interval, plural, one {# heure} many {# heures} other {# heures}}", + "core.euiPrettyDuration.lastDurationDays": "{duration, plural, one {Dernier jour} other {# derniers jours}}", + "core.euiPrettyDuration.lastDurationHours": "{duration, plural, one {Dernière heure} other {# dernières heures}}", + "core.euiPrettyDuration.lastDurationMinutes": "{duration, plural, one {Dernière minute} other {# dernières minutes}}", + "core.euiPrettyDuration.lastDurationMonths": "{duration, plural, one {Dernier mois} other {# derniers mois}}", + "core.euiPrettyDuration.lastDurationSeconds": "{duration, plural, one {Dernière seconde} other {# dernières secondes}}", + "core.euiPrettyDuration.lastDurationWeeks": "{duration, plural, one {Dernière semaine} other {# dernières semaines}}", + "core.euiPrettyDuration.lastDurationYears": "{duration, plural, one {Dernière année} other {# dernières années}}", + "core.euiPrettyDuration.nextDurationHours": "{duration, plural, one {Prochaine heure} other {# prochaines heures}}", + "core.euiPrettyDuration.nextDurationMinutes": "{duration, plural, one {Prochaine minute} other {# prochaines minutes}}", + "core.euiPrettyDuration.nextDurationMonths": "{duration, plural, one {Prochain mois} other {# prochains mois}}", + "core.euiPrettyDuration.nextDurationSeconds": "{duration, plural, one {Prochaine seconde} other {# prochaines secondes}}", + "core.euiPrettyDuration.nextDurationWeeks": "{duration, plural, one {Prochaine semaine} other {# prochaines semaines}}", + "core.euiPrettyDuration.nextDurationYears": "{duration, plural, one {Prochaine année} other {# prochaines années}}", + "core.euiPrettyDuration.nexttDurationDays": "{duration, plural, one {Prochain jour} other {# prochains jours}}", + "core.euiPrettyInterval.days": "{interval, plural, one {# jour} other {# jours}}", + "core.euiPrettyInterval.daysShorthand": "{interval} d", + "core.euiPrettyInterval.hours": "{interval, plural, one {# heure} other {# heures}}", "core.euiPrettyInterval.hoursShorthand": "{interval} h", - "core.euiPrettyInterval.minutes": "{interval, plural, one {# minute} many {# minutes} other {# minutes}}", + "core.euiPrettyInterval.minutes": "{interval, plural, one {# minute} other {# minutes}}", "core.euiPrettyInterval.minutesShorthand": "{interval} m", - "core.euiPrettyInterval.seconds": "{interval, plural, one {# seconde} many {# secondes} other {# secondes}}", + "core.euiPrettyInterval.seconds": "{interval, plural, one {# seconde} other {# secondes}}", "core.euiPrettyInterval.secondsShorthand": "{interval} s", "core.euiProgress.valueText": "{value} %", - "core.euiQuickSelect.fullDescription": "Elle est actuellement définie sur {timeTense} {timeValue} {timeUnit}.", + "core.euiQuickSelect.fullDescription": "Actuellement défini sur {timeTense} {timeValue} {timeUnit}.", "core.euiRefreshInterval.fullDescriptionOff": "L'actualisation est désactivée, intervalle défini sur {optionValue} {optionText}.", "core.euiRefreshInterval.fullDescriptionOn": "L'actualisation est activée, intervalle défini sur {optionValue} {optionText}.", "core.euiRelativeTab.fullDescription": "L'unité peut être modifiée. Elle est actuellement définie sur {unit}.", - "core.euiSelectable.noMatchingOptions": "{searchValue} ne correspond à aucune option", - "core.euiSelectable.searchResults": "{resultsLength, plural, one {# résultat disponible} many {# résultats disponibles} other {# résultats disponibles}}", - "core.euiSkeletonLoading.loadedAriaText": "{contentAriaLabel} a été chargé", - "core.euiSkeletonLoading.loadingAriaText": "{contentAriaLabel} est en cours de chargement", - "core.euiStepStrings.complete": "L'étape {number} : {title} est terminée", - "core.euiStepStrings.current": "Étape actuelle {number} : {title}", - "core.euiStepStrings.disabled": "L'étape {number} : {title} est désactivée", - "core.euiStepStrings.errors": "L'étape {number} : {title} comporte des erreurs", - "core.euiStepStrings.incomplete": "L'étape {number} : {title} est incomplète", - "core.euiStepStrings.loading": "L'étape {number} : {title} est en cours de chargement", - "core.euiStepStrings.simpleComplete": "L'étape {number} est terminée", - "core.euiStepStrings.simpleCurrent": "L'étape actuelle est {number}", - "core.euiStepStrings.simpleDisabled": "L'étape {number} est désactivée", - "core.euiStepStrings.simpleErrors": "L'étape {number} comporte des erreurs", - "core.euiStepStrings.simpleIncomplete": "L'étape {number} est incomplète", - "core.euiStepStrings.simpleLoading": "L'étape {number} est en cours de chargement", - "core.euiStepStrings.simpleStep": "Étape {number}", - "core.euiStepStrings.simpleWarning": "L'étape {number} comporte des avertissements", - "core.euiStepStrings.step": "Étape {number} : {title}", - "core.euiStepStrings.warning": "L'étape {number} : {title} comporte des avertissements", - "core.euiTableHeaderCell.titleTextWithDesc": "{innerText}; {description}", - "core.euiTablePagination.rowsPerPageOption": "{rowsPerPage} lignes", - "core.euiTourStepIndicator.ariaLabel": "Étape {number} {status}", - "core.savedObjects.deprecations.unknownTypes.message": "{objectCount, plural, one {# objet} many {# objets} other {# objets}} avec des types inconnus {objectCount, plural, one {a été trouvé} many {sont introuvables} other {ont été trouvés}} dans les index système Kibana. La mise à niveau avec des types savedObject inconnus n'est plus compatible. Pour assurer la réussite des mises à niveau à l'avenir, réactivez les plug-ins ou supprimez ces documents dans les indices de Kibana", - "core.statusPage.loadStatus.serverStatusCodeErrorMessage": "Échec de requête du statut du serveur avec le code de statut {responseStatus}", + "core.euiSelectable.noMatchingOptions": "{searchValue} ne correspond à aucune option.", + "core.euiSelectable.searchResults": "{resultsLength, plural, one {# résultat disponible} other {#résultats disponibles}}", + "core.euiSkeletonLoading.loadedAriaText": "{contentAriaLabel} chargé", + "core.euiSkeletonLoading.loadingAriaText": "{contentAriaLabel} en cours de chargement", + "core.euiStepStrings.complete": "L'étape {number} : {title} est terminée.", + "core.euiStepStrings.current": "L’étape {number} : {title} est en cours.", + "core.euiStepStrings.disabled": "L'étape {number} : {title} est désactivée.", + "core.euiStepStrings.errors": "L'étape {number} : {title} contient des erreurs.", + "core.euiStepStrings.incomplete": "L'étape {number} : {title} est incomplète.", + "core.euiStepStrings.loading": "L'étape {number} : {title} est en cours de chargement.", + "core.euiStepStrings.simpleComplete": "L'étape {number} est terminée.", + "core.euiStepStrings.simpleCurrent": "L’étape {number} est en cours.", + "core.euiStepStrings.simpleDisabled": "L'étape {number} est désactivée.", + "core.euiStepStrings.simpleErrors": "L'étape {number} contient des erreurs.", + "core.euiStepStrings.simpleIncomplete": "L'étape {number} est incomplète.", + "core.euiStepStrings.simpleLoading": "L'étape {number} est en cours de chargement.", + "core.euiStepStrings.simpleStep": "Étape {number}", + "core.euiStepStrings.simpleWarning": "L'étape {number} contient des avertissements.", + "core.euiStepStrings.step": "Étape {number} : {title}", + "core.euiStepStrings.warning": "L'étape {number} : {title} contient des avertissements.", + "core.euiTableHeaderCell.titleTextWithDesc": "{innerText} ; {description}", + "core.euiTablePagination.rowsPerPageOption": "{rowsPerPage} lignes", + "core.euiTourStepIndicator.ariaLabel": "Étape {number} {status}", + "core.savedObjects.deprecations.unknownTypes.message": "{objectCount, plural, one {# objet} other {# objets}} de type inconnu {objectCount, plural, one {a été trouvé} other {ont été trouvés}} dans les indices du système Kibana. La mise à niveau avec des types savedObject inconnus n'est plus compatible. Pour assurer la réussite des mises à niveau à l'avenir, réactivez les plug-ins ou supprimez ces documents dans les indices de Kibana", + "core.statusPage.loadStatus.serverStatusCodeErrorMessage": "Échec de requête du statut du serveur avec le code de statut {responseStatus}.", "core.statusPage.metricsTiles.columns.heapUsedHeader": "Tas utilisé sur {heapTotal}", "core.statusPage.metricsTiles.columns.utilizationHeader": "Utilisation (actif : {active} / inactif : {idle})", - "core.statusPage.serverStatus.statusTitle": "Le statut Kibana est {kibanaStatus}", + "core.statusPage.serverStatus.statusTitle": "Statut Kibana : {kibanaStatus}", "core.statusPage.statusApp.statusActions.buildText": "BUILD : {buildNum}", - "core.statusPage.statusApp.statusActions.commitText": "VALIDATION : {buildSha}", + "core.statusPage.statusApp.statusActions.commitText": "COMMIT : {buildSha}", "core.statusPage.statusApp.statusActions.versionText": "VERSION : {versionNum}", "core.ui_settings.params.dateFormat.scaledText": "Les valeurs qui définissent le format utilisé lorsque les données temporelles sont rendues dans l'ordre, et lorsque les horodatages formatés doivent s'adapter à l'intervalle entre les mesures. Les clés sont {intervalsLink}.", "core.ui_settings.params.dateFormat.timezone.invalidValidationMessage": "Fuseau horaire non valide : {timezone}", - "core.ui_settings.params.dateFormatText": "{formatLink} pour des dates joliment formatées.", - "core.ui_settings.params.dateNanosFormatText": "Format pour les données {dateNanosLink}.", + "core.ui_settings.params.dateFormatText": "Le {formatLink} pour des dates joliment formatées.", + "core.ui_settings.params.dateNanosFormatText": "Le format pour les données {dateNanosLink}.", "core.ui_settings.params.dayOfWeekText.invalidValidationMessage": "Jour de la semaine non valide : {dayOfWeek}", - "core.ui_settings.params.notifications.bannerText": "Une bannière personnalisée à des fins de notification temporaire pour l'ensemble des utilisateurs. {markdownLink}.", - "core.ui.chrome.headerGlobalNav.helpMenuGiveFeedbackOnApp": "Fournir des commentaires sur {appName}", - "core.ui.chrome.headerGlobalNav.helpMenuVersion": "v {version}", - "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage": "Activez l'option {storeInSessionStorageParam} dans {advancedSettingsLink} ou simplifiez les visuels à l'écran.", - "core.ui.errorUrlOverflow.optionsToFixError.enableOptionText": "Activez l'option {storeInSessionStorageConfig} dans {kibanaSettingsLink}.", + "core.ui_settings.params.notifications.bannerText": "Une bannière personnalisée à des fins de notification temporaire de l’ensemble des utilisateurs. {markdownLink}.", + "core.ui.chrome.headerGlobalNav.helpMenuGiveFeedbackOnApp": "Donner un retour sur {appName}", + "core.ui.chrome.headerGlobalNav.helpMenuVersion": "v {version}", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage": "Activez l'option {storeInSessionStorageParam} dans les {advancedSettingsLink} ou simplifiez les visuels à l'écran.", + "core.ui.errorUrlOverflow.optionsToFixError.enableOptionText": "Activez l'option {storeInSessionStorageConfig} sous {kibanaSettingsLink}.", "core.ui.primaryNavSection.screenReaderLabel": "Liens de navigation principale, {category}", "core.ui.publicBaseUrlWarning.configRecommendedDescription": "Dans un environnement de production, il est recommandé de configurer {configKey}.", "core.ui.recentLinks.linkItem.screenReaderLabel": "{recentlyAccessedItemLinklabel}, type : {pageType}", @@ -598,6 +686,7 @@ "core.deprecations.elasticsearchUsername.manualSteps2": "Ajoutez le paramètre \"elasticsearch.serviceAccountToken\" à kibana.yml.", "core.deprecations.elasticsearchUsername.manualSteps3": "Supprimez \"elasticsearch.username\" et \"elasticsearch.password\" de kibana.yml.", "core.deprecations.noCorrectiveAction": "Ce déclassement ne peut pas être résolu automatiquement.", + "core.euiAbsoluteTab.dateFormatHint": "Appuyez sur la touche Entrée pour analyser l'élément en tant que date.", "core.euiAccordionChildrenLoading.message": "Chargement", "core.euiAutoRefresh.autoRefreshLabel": "Actualisation automatique", "core.euiAutoRefresh.buttonLabelOff": "L'actualisation automatique est désactivée", @@ -617,9 +706,12 @@ "core.euiCodeBlockFullScreen.fullscreenCollapse": "Réduire", "core.euiCodeBlockFullScreen.fullscreenExpand": "Développer", "core.euiCollapsedItemActions.allActions": "Toutes les actions", + "core.euiCollapsedItemActions.allActionsDisabled": "Les actions individuelles sont désactivées lorsque plusieurs lignes sont sélectionnées.", "core.euiCollapsibleNavBeta.ariaLabel": "Menu du site", - "core.euiCollapsibleNavButton.ariaLabelClose": "Activer/Désactiver la fermeture de la navigation", - "core.euiCollapsibleNavButton.ariaLabelOpen": "Activer/Désactiver l'ouverture de la navigation", + "core.euiCollapsibleNavButton.ariaLabelClose": "Fermer la navigation", + "core.euiCollapsibleNavButton.ariaLabelCollapse": "Réduire la navigation", + "core.euiCollapsibleNavButton.ariaLabelExpand": "Développer la navigation", + "core.euiCollapsibleNavButton.ariaLabelOpen": "Ouvrir la navigation", "core.euiColorPicker.alphaLabel": "Valeur (opacité) du canal Alpha", "core.euiColorPicker.closeLabel": "Appuyez sur la flèche du bas pour ouvrir la fenêtre contextuelle des options de couleur.", "core.euiColorPicker.colorErrorMessage": "Valeur de couleur non valide", @@ -650,6 +742,8 @@ "core.euiComboBoxOptionsList.noAvailableOptions": "Aucune option n’est disponible.", "core.euiCommonlyUsedTimeRanges.legend": "Couramment utilisées", "core.euiDataGrid.screenReaderNotice": "Cette cellule contient du contenu interactif.", + "core.euiDataGridCell.expansionEnterPrompt": "Appuyez sur Entrée pour développer cette cellule.", + "core.euiDataGridCell.focusTrapEnterPrompt": "Appuyez sur Entrée pour interagir avec le contenu de cette cellule.", "core.euiDataGridCellActions.expandButtonTitle": "Cliquez ou appuyez sur Entrée pour interagir avec le contenu de la cellule.", "core.euiDataGridHeaderCell.actionsPopoverScreenReaderText": "Pour naviguer dans la liste des actions de la colonne, appuyez sur la touche Tab ou sur les flèches vers le haut et vers le bas.", "core.euiDataGridHeaderCell.headerActions": "Cliquez pour afficher les actions d'en-tête de colonne", @@ -687,6 +781,8 @@ "core.euiDisplaySelector.rowHeightLabel": "Hauteur de la ligne", "core.euiDualRange.sliderScreenReaderInstructions": "Vous êtes dans un curseur de plage personnalisé. Utilisez les flèches vers le haut et vers le bas pour modifier la valeur minimale. Appuyez sur Tabulation pour interagir avec la valeur maximale.", "core.euiErrorBoundary.error": "Erreur", + "core.euiExternalLinkIcon.ariaLabel": "Lien externe", + "core.euiExternalLinkIcon.newTarget.screenReaderOnlyText": "(s’ouvre dans un nouvel onglet ou une nouvelle fenêtre)", "core.euiFieldPassword.maskPassword": "Masquer le mot de passe", "core.euiFieldPassword.showPassword": "Afficher le mot de passe en texte brut. Remarque : votre mot de passe sera visible à l'écran.", "core.euiFilePicker.clearSelectedFiles": "Effacer les fichiers sélectionnés", @@ -944,6 +1040,10 @@ "core.ui.chrome.headerGlobalNav.helpMenuOpenGitHubIssueTitle": "Ouvrir un ticket dans GitHub", "core.ui.chrome.headerGlobalNav.helpMenuTitle": "Aide", "core.ui.chrome.headerGlobalNav.logoAriaLabel": "Logo Elastic", + "core.ui.chrome.sideNavigation.cloudLinks.billingLinkText": "Facturation et abonnement", + "core.ui.chrome.sideNavigation.cloudLinks.deploymentLinkText": "Projet", + "core.ui.chrome.sideNavigation.cloudLinks.performanceLinkText": "Performances", + "core.ui.chrome.sideNavigation.cloudLinks.usersAndRolesLinkText": "Utilisateurs et rôles", "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "paramètres avancés", "core.ui.errorUrlOverflow.bigUrlWarningNotificationTitle": "L'URL est longue et Kibana pourrait cesser de fonctionner.", "core.ui.errorUrlOverflow.errorTitle": "L'URL pour cet objet est trop longue, et nous ne pouvons pas l'afficher.", @@ -960,6 +1060,9 @@ "core.ui.overlays.banner.attentionTitle": "Attention", "core.ui.overlays.banner.closeButtonLabel": "Fermer", "core.ui.primaryNav.addData": "Ajouter des intégrations", + "core.ui.primaryNav.cloud.linkToAllProjects": "Afficher tous les projets", + "core.ui.primaryNav.cloud.linkToProject": "Gérer le projet", + "core.ui.primaryNav.cloud.projectLabel": "Projet", "core.ui.primaryNav.goToHome.ariaLabel": "Accéder à la page d’accueil", "core.ui.primaryNav.pinnedLinksAriaLabel": "Liens épinglés", "core.ui.primaryNav.screenReaderLabel": "Principale", @@ -979,11 +1082,11 @@ "customIntegrations.languageClients.GoElasticsearch.readme.addPackage": "Ajoutez le pack à votre fichier {go_file} :", "customIntegrations.languageClients.GoElasticsearch.readme.connectingText": "Vous pouvez vous connecter à Elastic Cloud à l'aide d'une {api_key} et d'un {cloud_id} :", "customIntegrations.languageClients.JavaElasticsearch.readme.installMavenMsg": "Dans le {pom} de votre projet, ajoutez la définition de référentiel et les dépendances suivantes :", - "customIntegrations.languageClients.JavascriptElasticsearch.readme.configureText": "Créez un fichier {filename} à la racine de votre projet et ajoutez les options suivantes.", + "customIntegrations.languageClients.JavascriptElasticsearch.readme.configureText": "Créez un fichier {filename} à la racine de votre projet, et ajoutez les options suivantes.", "customIntegrations.languageClients.PhpElasticsearch.readme.connectingText": "Vous pouvez vous connecter à Elastic Cloud à l'aide d'une {api_key} et d'un {cloud_id}. Où {api_key} et {cloud_id} peuvent être récupérés à l'aide de l'interface utilisateur web d'Elastic Cloud.", "customIntegrations.languageClients.PythonElasticsearch.readme.connectingText": "Vous pouvez vous connecter à Elastic Cloud à l'aide d'une {api_key} et d'un {cloud_id} :", "customIntegrations.languageClients.RubyElasticsearch.readme.connectingText": "Vous pouvez vous connecter à Elastic Cloud à l'aide d'une {api_key} et d'un {cloud_id}. Où {api_key} et {cloud_id} peuvent être récupérés à l'aide de l'interface utilisateur web d'Elastic Cloud. L'Elastic Cloud ID se trouve sur la page \"Gérer ce déploiement\", et la clé d'API peut être générée à partir de la page \"Gestion\" sous la section \"Sécurité\".", - "customIntegrations.languageClients.sample.readme.configureText": "Créez un fichier {filename} à la racine de votre projet et ajoutez les options suivantes.", + "customIntegrations.languageClients.sample.readme.configureText": "Créez un fichier {filename} à la racine de votre projet, et ajoutez les options suivantes.", "customIntegrations.components.replacementAccordion.comparisonPageLinkLabel": "page de comparaison", "customIntegrations.components.replacementAccordionLabel": "Également disponible dans Beats", "customIntegrations.languageclients.DotNetDescription": "Indexez les données dans Elasticsearch avec le client .NET.", @@ -1047,7 +1150,7 @@ "customIntegrations.placeholders.EscTitle": "Confluent Cloud", "customIntegrations.placeholders.EsfDescription": "Collectez les logs à l'aide de l'application AWS Lambda disponible dans AWS Serverless Application Repository.", "customIntegrations.placeholders.EsfTitle": "AWS Serverless Application Repository", - "customIntegrationsPackage.create.dataset.name.tooltipPrefixMessage": "Ce nom sera précédé du préfixe {prefixValue}, p. ex. {prefixedDatasetName}", + "customIntegrationsPackage.create.dataset.name.tooltipPrefixMessage": "Ce nom aura pour préfixe {prefixValue}, par ex. {prefixedDatasetName}", "customIntegrationsPackage.create.button.continue": "Continuer", "customIntegrationsPackage.create.button.submitting": "Création de l'intégration...", "customIntegrationsPackage.create.configureIntegrationDescription": "Configurer l'intégration", @@ -1071,21 +1174,25 @@ "customIntegrationsPackage.validations.integrationName.characterLimitError": "Le nom d'une intégration ne doit pas excéder 100 caractères.", "customIntegrationsPackage.validations.integrationName.lowerCaseError": "Le nom d'une intégration doit être en minuscules.", "customIntegrationsPackage.validations.integrationName.requiredError": "Une intégration doit obligatoirement porter un nom.", - "dashboard.addPanel.newEmbeddableAddedSuccessMessageTitle": "{savedObjectName} a été ajouté", - "dashboard.addPanel.savedObjectAddedToContainerSuccessMessageTitle": "{savedObjectName} a été ajouté", - "dashboard.dashboardListingEditErrorTitle.duplicateWarning": "L'enregistrement de \"{value}\" crée un doublon de titre.", + "dashboard.addPanel.newEmbeddableAddedSuccessMessageTitle": "{savedObjectName} a été ajouté.", + "dashboard.addPanel.savedObjectAddedToContainerSuccessMessageTitle": "{savedObjectName} a été ajouté.", + "dashboard.dashboardListingEditErrorTitle.duplicateWarning": "L'enregistrement de \"{value}\" crée un doublon de titre", + "dashboard.dashboardWasNotSavedDangerMessage": "Le tableau de bord \"{dashTitle}\" n'a pas été enregistré. Erreur : {errorMessage}.", "dashboard.listing.createNewDashboard.newToKibanaDescription": "Vous êtes nouveau sur Kibana ? {sampleDataInstallLink} pour découvrir l'application.", - "dashboard.listing.unsaved.editAria": "Continuer à modifier {title}", + "dashboard.listing.unsaved.editAria": "Poursuivre les modifications apportées à {title}", "dashboard.listing.unsaved.resetAria": "Réinitialiser les modifications apportées à {title}", "dashboard.listing.unsaved.unsavedChangesTitle": "Vous avez des modifications non enregistrées dans le {dash} suivant :", "dashboard.loadingError.dashboardGridErrorMessage": "Impossible de charger le tableau de bord : {message}", - "dashboard.noMatchRoute.bannerText": "L'application de tableau de bord ne reconnaît pas cet itinéraire : {route}.", + "dashboard.noMatchRoute.bannerText": "L'application de tableau de bord ne reconnaît pas ce chemin : {route}.", + "dashboard.panel.addToLibrary.errorMessage": "Une erreur s'est produite lors de l'ajout du panneau {panelTitle} à la bibliothèque", "dashboard.panel.addToLibrary.successMessage": "Le panneau {panelTitle} a été ajouté à la bibliothèque", - "dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage": "Impossible de migrer les données du panneau pour une rétrocompatibilité avec \"6.3.0\". Le panneau ne contient pas le champ attendu : {key}", - "dashboard.panel.unlinkFromLibrary.successMessage": "Le panneau {panelTitle} n'est plus connecté à la bibliothèque", - "dashboard.panelStorageError.clearError": "Une erreur s'est produite lors de la suppression des modifications non enregistrées : {message}", - "dashboard.panelStorageError.getError": "Une erreur s'est produite lors de la récupération des modifications non enregistrées : {message}", - "dashboard.panelStorageError.setError": "Une erreur s'est produite lors de la définition des modifications non enregistrées : {message}", + "dashboard.panel.replacePanel.flyoutHeader": "Remplacer le panneau {panelName} par :", + "dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage": "Impossible de migrer les données du panneau pour une rétro-compatibilité \"6.3.0\". Le panneau ne contient pas le champ attendu : {key}.", + "dashboard.panel.unlinkFromLibrary.failureMessage": "Une erreur s'est produite lors de la dissociation du panneau {panelTitle} de la bibliothèque.", + "dashboard.panel.unlinkFromLibrary.successMessage": "Le panneau {panelTitle} n'est plus connecté à la bibliothèque.", + "dashboard.panelStorageError.clearError": "Une erreur s'est produite lors de la suppression des modifications non enregistrées : {message}.", + "dashboard.panelStorageError.getError": "Une erreur s'est produite lors de la récupération des modifications non enregistrées : {message}.", + "dashboard.panelStorageError.setError": "Une erreur s'est produite lors de la définition des modifications non enregistrées : {message}.", "dashboard.share.defaultDashboardTitle": "Tableau de bord [{date}]", "dashboard.strings.dashboardEditTitle": "Modification de {title}", "dashboard.viewmodeBackup.error": "Une erreur s'est produite lors de la sauvegarde du mode d'affichage : {message}", @@ -1095,8 +1202,10 @@ "dashboard.actions.toggleExpandPanelMenuItem.notExpandedDisplayName": "Maximiser le panneau", "dashboard.addPanel.noMatchingObjectsMessage": "Aucun objet correspondant trouvé.", "dashboard.addPanel.panelAddedToContainerSuccessMessageTitle": "Un panneau a été ajouté", + "dashboard.addPanelMenuTrigger.description": "Une nouvelle action apparaîtra dans le menu Ajouter un panneau du tableau de bord", + "dashboard.addPanelMenuTrigger.title": "Menu Ajouter un panneau", "dashboard.appLeaveConfirmModal.cancelButtonLabel": "Annuler", - "dashboard.appLeaveConfirmModal.unsavedChangesSubtitle": "Quitter le tableau de bord sans enregistrer ?", + "dashboard.appLeaveConfirmModal.unsavedChangesSubtitle": "Quitter Dashboard sans enregistrer ?", "dashboard.appLeaveConfirmModal.unsavedChangesTitle": "Modifications non enregistrées", "dashboard.badge.managed.tooltip": "Ce tableau de bord est géré par le système. Cloner ce tableau de bord pour effectuer des modifications.", "dashboard.badge.readOnly.text": "Lecture seule", @@ -1106,7 +1215,7 @@ "dashboard.createConfirmModal.continueButtonLabel": "Poursuivre les modifications", "dashboard.createConfirmModal.unsavedChangesSubtitle": "Poursuivez les modifications ou utilisez un tableau de bord vierge.", "dashboard.createConfirmModal.unsavedChangesTitle": "Nouveau tableau de bord déjà en cours", - "dashboard.dashboardAppBreadcrumbsTitle": "Tableau de bord", + "dashboard.dashboardAppBreadcrumbsTitle": "Tableaux de bord", "dashboard.dashboardPageTitle": "Tableaux de bord", "dashboard.dashboardWasSavedSuccessMessage": "Le tableau de bord \"{dashTitle}\" a été enregistré.", "dashboard.deleteError.toastDescription": "Erreur rencontrée lors de la suppression du tableau de bord", @@ -1150,10 +1259,11 @@ "dashboard.emptyScreen.noPermissionsTitle": "Ce tableau de bord est vide.", "dashboard.emptyScreen.viewModeSubtitle": "Accédez au mode de modification, puis commencez à ajouter vos visualisations.", "dashboard.emptyScreen.viewModeTitle": "Ajouter des visualisations à votre tableau de bord", - "dashboard.factory.displayName": "Tableau de bord", + "dashboard.factory.displayName": "Dashboard", + "dashboard.factory.displayNameLowercase": "tableau de bord", "dashboard.featureCatalogue.dashboardDescription": "Affichez et partagez une collection de visualisations et de recherches enregistrées.", "dashboard.featureCatalogue.dashboardSubtitle": "Analysez des données à l’aide de tableaux de bord.", - "dashboard.featureCatalogue.dashboardTitle": "Tableau de bord", + "dashboard.featureCatalogue.dashboardTitle": "Dashboard", "dashboard.hasRunMigrationsBadge": "Enregistrement recommandé", "dashboard.hasRunMigrationsBadgeToolTipContent": "Un ou plusieurs panneaux de ce tableau de bord ont été mis à jour vers une nouvelle version. Enregistrez le tableau de bord pour qu'il charge plus rapidement la prochaine fois.", "dashboard.labs.enableLabsDescription": "Cet indicateur détermine si l'utilisateur a accès au bouton Ateliers, moyen rapide d'activer et de désactiver les fonctionnalités de la version d'évaluation technique dans le tableau de bord.", @@ -1230,21 +1340,22 @@ "dashboard.topNave.viewConfigDescription": "Basculer en mode Affichage uniquement", "dashboard.unsavedChangesBadge": "Modifications non enregistrées", "dashboard.unsavedChangesBadgeToolTipContent": " Vous avez des modifications non enregistrées dans ce tableau de bord. Pour supprimer cette étiquette, enregistrez le tableau de bord.", - "data.advancedSettings.autocompleteIgnoreTimerangeText": "Désactivez cette propriété pour obtenir des suggestions de saisie semi-automatique depuis l'intégralité de l'ensemble de données plutôt que depuis la plage temporelle définie. {learnMoreLink}", + "data.advancedSettings.autocompleteIgnoreTimerangeText": "Désactivez cette propriété pour obtenir des suggestions de saisie semi-automatique depuis l’intégralité de l’ensemble de données plutôt que depuis la plage temporelle définie. {learnMoreLink}", "data.advancedSettings.autocompleteValueSuggestionMethodText": "La méthode utilisée pour générer des suggestions de valeur pour la saisie semi-automatique KQL. Sélectionnez terms_enum pour utiliser l'API d'énumération de termes d'Elasticsearch afin d’améliorer les performances de suggestion de saisie semi-automatique. (Notez que terms_enum est incompatible avec la sécurité au niveau du document.) Sélectionnez terms_agg pour utiliser l'agrégation de termes d'Elasticsearch. (Notez que terms_agg est incompatible avec les champs de type IP.) {learnMoreLink}", - "data.advancedSettings.courier.customRequestPreferenceText": "{requestPreferenceLink} utilisé quand {setRequestReferenceSetting} est défini sur {customSettingValue}.", + "data.advancedSettings.courier.customRequestPreferenceText": "{requestPreferenceLink} utilisé lorsque {setRequestReferenceSetting} est défini sur {customSettingValue}.", "data.advancedSettings.courier.maxRequestsText": "Contrôle le paramètre {maxRequestsLink} utilisé pour les requêtes _msearch envoyées par Kibana. Définir ce paramètre sur 0 permet d’utiliser la valeur Elasticsearch par défaut.", - "data.advancedSettings.query.allowWildcardsText": "Lorsque ce paramètre est activé, le caractère \"*\" est autorisé en tant que premier caractère dans une clause de requête. Pour interdire l'utilisation de caractères génériques au début des requêtes Lucene de base, utilisez {queryStringOptionsPattern}.", - "data.advancedSettings.query.queryStringOptionsText": "{optionsLink} pour l'analyseur de chaînes de requête Lucene. Uniquement utilisé lorsque\"{queryLanguage}\" est défini sur {luceneLanguage}.", + "data.advancedSettings.query.allowWildcardsText": "Lorsque ce paramètre est activé, le caractère \"*\" est autorisé en tant que premier caractère dans une clause de requête. Pour ne plus autoriser l’utilisation de caractères génériques au début des requêtes Lucene de base, utilisez {queryStringOptionsPattern}.", + "data.advancedSettings.query.queryStringOptionsText": "{optionsLink} pour l'analyseur de chaînes de requête Lucene. Uniquement utilisé lorsque \"{queryLanguage}\" est défini sur {luceneLanguage}.", "data.advancedSettings.sortOptionsText": "{optionsLink} pour le paramètre de tri Elasticsearch", - "data.advancedSettings.timepicker.quickRangesText": "La liste des plages à afficher dans la section rapide du filtre temporel. Il s'agit d’un tableau d'objets, avec chaque objet contenant \"from\", \"to\" (voir {acceptedFormatsLink}) et \"display\" (le titre à afficher).", + "data.advancedSettings.timepicker.quickRangesText": "La liste des plages à afficher dans la section rapide du filtre temporel. Il s’agit d’un tableau d'objets, avec chaque objet contenant \"de\", \"à\" (voir {acceptedFormatsLink}) et \"afficher\" (le titre à afficher).", "data.advancedSettings.timepicker.timeDefaultsDescription": "L'option de filtre temporel à utiliser lorsque Kibana est démarré sans filtre. Doit être un objet contenant \"from\" et \"to\" (voir {acceptedFormatsLink}).", "data.aggTypes.buckets.ranges.rangesFormatMessage": "{gte} {from} et {lt} {to}", "data.aggTypes.buckets.ranges.rangesFormatMessageArrowRight": "{from} → {to}", - "data.filter.filterBar.fieldNotFound": "Champ {key} introuvable dans la vue de données {dataView}", + "data.filter.filterBar.fieldNotFound": "Champ {key} non trouvé dans la vue de données {dataView}", "data.inspector.table.tableLabel": "Tableau {index}", - "data.inspector.table.tablesDescription": "Il y a {tablesCount, plural, one {# tableau} many {# tableaux} other {# tableaux}} au total", - "data.mgmt.searchSessions.api.fetchTimeout": "La récupération des informations de la session de recherche a expiré après {timeout} secondes", + "data.inspector.table.tablesDescription": "Il y a {tablesCount, plural, one {# tableau} other {# tableaux} } au total.", + "data.mgmt.searchSessions.api.fetchTimeout": "La récupération des informations de la session de recherche a expiré après {timeout} secondes", + "data.mgmt.searchSessions.extendModal.extendMessage": "L'expiration de la session de recherche \"{name}\" sera étendue jusqu'à {newExpires}.", "data.mgmt.searchSessions.status.expiresOn": "Expire le {expireDate}", "data.mgmt.searchSessions.status.expiresSoonInDays": "Expire dans {numDays} jours", "data.mgmt.searchSessions.status.expiresSoonInDaysTooltip": "{numDays} jours", @@ -1252,57 +1363,58 @@ "data.mgmt.searchSessions.status.expiresSoonInHoursTooltip": "{numHours} heures", "data.mgmt.searchSessions.status.message.createdOn": "Expire le {expireDate}", "data.mgmt.searchSessions.status.message.expiredOn": "Expiré le {expireDate}", - "data.parseEsInterval.invalidEsCalendarIntervalErrorMessage": "Intervalle de calendrier non valide : {interval}, la valeur doit être 1", + "data.parseEsInterval.invalidEsCalendarIntervalErrorMessage": "Intervalle de calendrier non valide : {interval} ; la valeur doit être 1.", "data.parseEsInterval.invalidEsIntervalFormatErrorMessage": "Format d'intervalle non valide : {interval}", - "data.search.aggs.aggTypesLabel": "Plages {fieldName}", + "data.search.aggs.aggTypesLabel": "plages {fieldName}", "data.search.aggs.buckets.dateHistogramLabel": "{fieldName} par {intervalDescription}", - "data.search.aggs.buckets.intervalOptions.milliseconds": "{n} millisecondes", - "data.search.aggs.buckets.intervalOptions.seconds": "{n} secondes", - "data.search.aggs.buckets.ipRangeLabel": "Plages d'IP {fieldName}", - "data.search.aggs.buckets.significantTermsLabel": "Top {size} des termes inhabituels dans {fieldName}", - "data.search.aggs.buckets.significantTextLabel": "Top {size} des termes inhabituels pour le texte \"{fieldName}\"", + "data.search.aggs.buckets.intervalOptions.milliseconds": "{n} millisecondes", + "data.search.aggs.buckets.intervalOptions.seconds": "{n} secondes", + "data.search.aggs.buckets.ipPrefixLabel": "Préfixes IP de {fieldName}", + "data.search.aggs.buckets.ipRangeLabel": "Plages d'IP de {fieldName}", + "data.search.aggs.buckets.significantTermsLabel": "Top {size} des termes les plus inhabituels pour {fieldName}", + "data.search.aggs.buckets.significantTextLabel": "Top {size} des termes les plus inhabituels pour \"{fieldName}\"", "data.search.aggs.error.aggNotFound": "Aucun type d'agrégation enregistré pour \"{type}\".", "data.search.aggs.metrics.averageLabel": "Moyenne {field}", - "data.search.aggs.metrics.maxLabel": "Max {field}", + "data.search.aggs.metrics.maxLabel": "Max. {field}", "data.search.aggs.metrics.medianLabel": "Médiane {field}", - "data.search.aggs.metrics.minLabel": "Min {field}", + "data.search.aggs.metrics.minLabel": "Min. {field}", "data.search.aggs.metrics.percentileRanks.valuePropsLabel": "Rang centile {format} de \"{label}\"", "data.search.aggs.metrics.percentileRanksLabel": "Rangs centiles de {field}", - "data.search.aggs.metrics.percentiles.valuePropsLabel": "{percentile} centile de {label}", + "data.search.aggs.metrics.percentiles.valuePropsLabel": "{percentile} centile de {label}", "data.search.aggs.metrics.percentilesLabel": "Centiles de {field}", "data.search.aggs.metrics.rateLabel": "Taux de {field} par {unit}", "data.search.aggs.metrics.singlePercentileLabel": "Centile {field}", "data.search.aggs.metrics.singlePercentileRankLabel": "Rang centile de {field}", "data.search.aggs.metrics.standardDeviation.keyDetailsLabel": "Écart-type de {fieldDisplayName}", - "data.search.aggs.metrics.standardDeviation.lowerKeyDetailsTitle": "{label} supérieur", - "data.search.aggs.metrics.standardDeviation.upperKeyDetailsTitle": "{label} inférieur", + "data.search.aggs.metrics.standardDeviation.lowerKeyDetailsTitle": "{label} inférieur", + "data.search.aggs.metrics.standardDeviation.upperKeyDetailsTitle": "{label} supérieur", "data.search.aggs.metrics.standardDeviationLabel": "Écart-type de {field}", "data.search.aggs.metrics.sumLabel": "Somme de {field}", "data.search.aggs.metrics.topMetrics.ascNoSizeLabel": "Première valeur \"{fieldName}\" par \"{sortField}\"", - "data.search.aggs.metrics.topMetrics.ascWithSizeLabel": "{size} premières valeurs \"{fieldName}\" par \"{sortField}\"", + "data.search.aggs.metrics.topMetrics.ascWithSizeLabel": "{size} premières valeurs \"{fieldName}\" par \"{sortField}\"", "data.search.aggs.metrics.topMetrics.descNoSizeLabel": "Dernière valeur \"{fieldName}\" par \"{sortField}\"", - "data.search.aggs.metrics.topMetrics.descWithSizeLabel": "{size} dernières valeurs \"{fieldName}\" par \"{sortField}\"", - "data.search.aggs.metrics.uniqueCountLabel": "Compte unique de {field}", - "data.search.aggs.metrics.valueCountLabel": "Nombre de valeurs de {field}", - "data.search.aggs.paramTypes.field.invalidSavedFieldParameterErrorMessage": "Le champ enregistré \"{fieldParameter}\" de la vue de données \"{indexPatternTitle}\" n'est pas valide pour être utilisé avec l'agrégation \"{aggType}\". Veuillez sélectionner un nouveau champ.", - "data.search.aggs.paramTypes.field.requiredFieldParameterErrorMessage": "{fieldParameter} est un paramètre requis", + "data.search.aggs.metrics.topMetrics.descWithSizeLabel": "{size} dernières valeurs \"{fieldName}\" par \"{sortField}\"", + "data.search.aggs.metrics.uniqueCountLabel": "Décompte unique de {field}", + "data.search.aggs.metrics.valueCountLabel": "Décompte de la valeur de {field}", + "data.search.aggs.paramTypes.field.invalidSavedFieldParameterErrorMessage": "Le champ enregistré \"{fieldParameter}\" de la vue de données \"{indexPatternTitle}\" n'est pas valide pour une utilisation avec l'agrégation \"{aggType}\". Veuillez sélectionner un nouveau champ.", + "data.search.aggs.paramTypes.field.requiredFieldParameterErrorMessage": "{fieldParameter} est un paramètre requis.", "data.search.aggs.percentageOfLabel": "Pourcentage de {label}", "data.search.aggs.rareTerms.aggTypesLabel": "Termes rares de {fieldName}", "data.search.es_search.queryTimeValue": "{queryTime} ms", "data.search.functions.geoBoundingBox.arguments.error": "Au moins un des groupes de paramètres suivants doit être fourni : {parameters}.", - "data.search.searchSource.indexPatternIdDescription": "ID dans l'index {kibanaIndexPattern}.", + "data.search.searchSource.indexPatternIdDescription": "L'ID dans l'index {kibanaIndexPattern}.", "data.search.searchSource.queryTimeValue": "{queryTime} ms", "data.search.searchSource.requestTimeValue": "{requestTime} ms", "data.search.statusError": "Recherche {searchId} terminée avec un statut {errorCode}", - "data.search.statusThrow": "Le statut de la recherche avec l'ID {searchId} a généré une erreur {message} (statusCode : {errorCode})", - "data.search.timeBuckets.dayLabel": "{amount, plural, one {un jour} many {# jours} other {# jours}}", - "data.search.timeBuckets.hourLabel": "{amount, plural, one {une heure} many {# heures} other {# heures}}", - "data.search.timeBuckets.millisecondLabel": "{amount, plural, one {une milliseconde} many {# millisecondes} other {# millisecondes}}", - "data.search.timeBuckets.minuteLabel": "{amount, plural, one {une minute} many {# minutes} other {# minutes}}", - "data.search.timeBuckets.secondLabel": "{amount, plural, one {une seconde} many {# secondes} other {# secondes}}", - "data.searchSessionIndicator.canceledWhenText": "Arrêté {when}", - "data.searchSessionIndicator.loadingInTheBackgroundWhenText": "Démarré {when}", - "data.searchSessionIndicator.loadingResultsWhenText": "Démarré {when}", + "data.search.statusThrow": "Le statut de la recherche avec l'ID {searchId} a généré un {message} d'erreur (statusCode : {errorCode})", + "data.search.timeBuckets.dayLabel": "{amount, plural, one {un jour} other {# jours}}", + "data.search.timeBuckets.hourLabel": "{amount, plural, one {une heure} other {# heures}}", + "data.search.timeBuckets.millisecondLabel": "{amount, plural, one {une milliseconde} other {# millisecondes}}", + "data.search.timeBuckets.minuteLabel": "{amount, plural, one {une minute} other {# minutes}}", + "data.search.timeBuckets.secondLabel": "{amount, plural, one {une seconde} other {# secondes}}", + "data.searchSessionIndicator.canceledWhenText": "Arrêtée {when}", + "data.searchSessionIndicator.loadingInTheBackgroundWhenText": "Débuté {when}", + "data.searchSessionIndicator.loadingResultsWhenText": "Débuté {when}", "data.searchSessionIndicator.restoredWhenText": "Terminé {when}", "data.searchSessionIndicator.resultLoadedInTheBackgroundWhenText": "Terminé {when}", "data.searchSessionIndicator.resultsLoadedWhenText": "Terminé {when}", @@ -1350,6 +1462,7 @@ "data.advancedSettings.suggestFilterValuesTitle": "Suggestions de l'éditeur de filtres", "data.advancedSettings.timepicker.last15Minutes": "Dernières 15 minutes", "data.advancedSettings.timepicker.last1Hour": "Dernière heure", + "data.advancedSettings.timepicker.last1Minute": "Dernière minute", "data.advancedSettings.timepicker.last1Year": "Dernière année", "data.advancedSettings.timepicker.last24Hours": "Dernières 24 heures", "data.advancedSettings.timepicker.last30Days": "30 derniers jours", @@ -1521,6 +1634,14 @@ "data.search.aggs.buckets.intervalOptions.weeklyDisplayName": "Semaine", "data.search.aggs.buckets.intervalOptions.yearly": "an", "data.search.aggs.buckets.intervalOptions.yearlyDisplayName": "An", + "data.search.aggs.buckets.ipPrefix.customLabel.help": "Représente une étiquette personnalisée pour cette agrégation", + "data.search.aggs.buckets.ipPrefix.enabled.help": "Spécifie si cette agrégation doit être activée.", + "data.search.aggs.buckets.ipPrefix.field.help": "Champ à utiliser pour cette agrégation", + "data.search.aggs.buckets.ipPrefix.help": "La longueur du préfixe réseau, et s'il correspond à une adresse IPv4 ou IPv6", + "data.search.aggs.buckets.ipPrefix.id.help": "ID pour cette agrégation", + "data.search.aggs.buckets.ipPrefix.json.help": "Json avancé à inclure lorsque l'agrégation est envoyée vers Elasticsearch", + "data.search.aggs.buckets.ipPrefix.schema.help": "Schéma à utiliser pour cette agrégation", + "data.search.aggs.buckets.ipPrefixTitle": "Préfixe IP", "data.search.aggs.buckets.ipRange.customLabel.help": "Représente une étiquette personnalisée pour cette agrégation", "data.search.aggs.buckets.ipRange.enabled.help": "Spécifie si cette agrégation doit être activée.", "data.search.aggs.buckets.ipRange.field.help": "Champ à utiliser pour cette agrégation", @@ -1636,6 +1757,7 @@ "data.search.aggs.function.buckets.filters.help": "Génère une configuration d'agrégation en série pour une agrégation Filtre.", "data.search.aggs.function.buckets.geoTile.help": "Génère une configuration d'agrégation en série pour une agrégation Geotile.", "data.search.aggs.function.buckets.histogram.help": "Génère une configuration d'agrégation en série pour une agrégation Histogramme.", + "data.search.aggs.function.buckets.ipPrefix.help": "Génère une configuration d'agrégation en série pour une agrégation Préfixe IP", "data.search.aggs.function.buckets.ipRange.help": "Génère une configuration d'agrégation en série pour une agrégation Plage d'IP.", "data.search.aggs.function.buckets.multiTerms.help": "Génère une configuration d'agrégation en série pour une agrégation Termes multiples.", "data.search.aggs.function.buckets.range.help": "Génère une configuration d'agrégation en série pour une agrégation Plage.", @@ -1969,7 +2091,7 @@ "data.search.functions.esaggs.probability.help": "Probabilité qu'un document soit inclus dans les données agrégées. Utilise l'échantillonnage aléatoire.", "data.search.functions.esaggs.samplerSeed.help": "Valeur initiale permettant de générer l'échantillonnage aléatoire de documents. Utilise l'échantillonnage aléatoire.", "data.search.functions.esaggs.timeFields.help": "Spécifiez des champs temporels afin d’obtenir les plages temporelles résolues pour la requête.", - "data.search.functions.existsFilter.field.help": "Spécifiez le champ que vous souhaitez filtrer. Utilisez la fonction ''field''.", + "data.search.functions.existsFilter.field.help": "Spécifiez le champ que vous souhaitez filtrer. Utilisez la fonction `field`.", "data.search.functions.existsFilter.help": "Créer un filtre Kibana existant", "data.search.functions.existsFilter.negate.help": "Si le filtre doit être inversé.", "data.search.functions.extendedBounds.help": "Créer des limites étendues", @@ -1995,6 +2117,9 @@ "data.search.functions.geoPoint.lon.help": "Spécifier la longitude", "data.search.functions.geoPoint.point.error": "Le paramètre du point doit être une chaîne ou deux valeurs numériques.", "data.search.functions.geoPoint.point.help": "Spécifiez le point sous la forme d’une chaîne de coordonnées séparées par des virgules ou sous la forme de deux valeurs numériques.", + "data.search.functions.ipPrefix.help": "Créer un préfixe IP", + "data.search.functions.ipPrefix.isIpv6.help": "Préciser si le préfixe s'applique à des adresses IPv6", + "data.search.functions.ipPrefix.prefixLength.help": "Préciser la longueur du préfixe réseau", "data.search.functions.ipRange.from.help": "Spécifier l'adresse de début", "data.search.functions.ipRange.help": "Créer une plage d'IP", "data.search.functions.ipRange.to.help": "Spécifier l'adresse de fin", @@ -2011,7 +2136,7 @@ "data.search.functions.numericalRange.help": "Créer une plage numérique", "data.search.functions.numericalRange.label.help": "Spécifier l'étiquette de la plage", "data.search.functions.numericalRange.to.help": "Spécifier la valeur de fin", - "data.search.functions.phraseFilter.field.help": "Spécifiez le champ que vous souhaitez filtrer. Utilisez la fonction ''field''.", + "data.search.functions.phraseFilter.field.help": "Spécifiez le champ que vous souhaitez filtrer. Utilisez la fonction `field`.", "data.search.functions.phraseFilter.help": "Créer un filtre d’expression Kibana", "data.search.functions.phraseFilter.negate.help": "Si le filtre doit être inversé", "data.search.functions.phraseFilter.phrase.help": "Spécifier l'expression", @@ -2023,10 +2148,10 @@ "data.search.functions.range.help": "Créer un filtre de plage Kibana", "data.search.functions.range.lt.help": "Inférieur à", "data.search.functions.range.lte.help": "Inférieur ou égal à", - "data.search.functions.rangeFilter.field.help": "Spécifiez le champ que vous souhaitez filtrer. Utilisez la fonction ''field''.", + "data.search.functions.rangeFilter.field.help": "Spécifiez le champ que vous souhaitez filtrer. Utilisez la fonction `field`.", "data.search.functions.rangeFilter.help": "Créer un filtre de plage Kibana", "data.search.functions.rangeFilter.negate.help": "Si le filtre doit être inversé", - "data.search.functions.rangeFilter.range.help": "Spécifiez la plage à l’aide de la fonction ''range''.", + "data.search.functions.rangeFilter.range.help": "Spécifiez la plage à l’aide de la fonction `range`.", "data.search.functions.removeFilter.from.help": "Supprime uniquement les filtres appartenant à l'ID fourni", "data.search.functions.removeFilter.group.help": "Supprime uniquement les filtres appartenant au groupe fourni", "data.search.functions.removeFilter.help": "Supprime les filtres du contexte", @@ -2058,6 +2183,7 @@ "data.search.timeoutContactAdmin": "Votre requête a expiré. Contactez l'administrateur système pour accroître le temps d'exécution.", "data.search.timeoutIncreaseSetting": "Votre requête a expiré. Augmentez le temps d'exécution en utilisant le paramètre avancé de délai d'expiration de la recherche.", "data.search.timeoutIncreaseSettingActionText": "Modifier le paramètre", + "data.searchService.anonymousRequestTitle": "Requête", "data.searchSession.warning.readDocs": "En savoir plus", "data.searchSessionIndicator.cancelButtonText": "Arrêter la session", "data.searchSessionIndicator.canceledDescriptionText": "Vous visualisez des données incomplètes", @@ -2100,8 +2226,12 @@ "data.sessions.management.flyoutTitle": "Inspecter la session de recherche", "data.triggers.applyFilterDescription": "Lorsque le filtre Kibana est appliqué. Peut être un filtre simple ou un filtre de plage.", "data.triggers.applyFilterTitle": "Appliquer le filtre", - "dataViews.deprecations.scriptedFieldsMessage": "Vous avez {numberOfIndexPatternsWithScriptedFields} vues de données ({titlesPreview}…) qui utilisent des champs scriptés. Les champs scriptés sont déclassés et seront supprimés à l'avenir. Utilisez plutôt des champs d'exécution.", + "dataViews.deprecations.scriptedFieldsMessage": "Vous avez {numberOfIndexPatternsWithScriptedFields} vues de données ({titlesPreview}...) qui utilisent des champs scriptés. Les champs scriptés sont déclassés et seront supprimés à l'avenir. Utilisez plutôt des champs d'exécution.", "dataViews.fetchFieldErrorTitle": "Erreur lors de l'extraction des champs pour la vue de données {title} (ID : {id})", + "dataViews.advancedSettings.cacheMaxAgeText": "Définit la durée de mise en cache, en secondes, des requêtes API de champs de vues de données. La valeur 0 désactive la mise en cache. Les modifications de cette valeur peuvent ne pas prendre effet immédiatement. Les utilisateurs doivent vider le cache de leur navigateur ou attendre l'expiration du cache actuel. Pour que les modifications soient visibles immédiatement, effectuez une actualisation matérielle de Kibana.", + "dataViews.advancedSettings.cacheMaxAgeTitle": "Âge maximal du cache de champ (en secondes)", + "dataViews.advancedSettings.dataTiersName": "Niveaux de données exclus des requêtes de champs", + "dataViews.advancedSettings.dataTiersText": "Pour des performances plus rapides, excluez des champs de niveaux spécifiques (p. ex. data_frozen). Séparez les différents niveaux par une virgule, comme ceci : data_warm,data_cold", "dataViews.aliasLabel": "Alias", "dataViews.contentManagementType": "Vue de données", "dataViews.dataStreamLabel": "Flux de données", @@ -2117,43 +2247,47 @@ "dataViews.unableWriteLabel": "Impossible d'écrire la vue de données ! Actualisez la page pour obtenir la dernière version de cette vue de données.", "discover.advancedSettings.disableDocumentExplorerDescription": "Désactivez cette option pour utiliser le nouveau {documentExplorerDocs} au lieu de la vue classique. l'explorateur de documents offre un meilleur tri des données, des colonnes redimensionnables et une vue en plein écran.", "discover.advancedSettings.discover.showFieldStatisticsDescription": "Activez le {fieldStatisticsDocs} pour afficher des détails tels que les valeurs minimale et maximale d'un champ numérique ou une carte d'un champ géographique. Cette fonctionnalité est en version bêta et susceptible d'être modifiée.", - "discover.advancedSettings.discover.showMultifieldsDescription": "Détermine si les {multiFields} doivent s'afficher dans la fenêtre de document étendue. Dans la plupart des cas, les champs multiples sont les mêmes que les champs d'origine. Cette option est uniquement disponible lorsque le paramètre ''searchFieldsFromSource'' est désactivé.", + "discover.advancedSettings.discover.showMultifieldsDescription": "Détermine si les {multiFields} doivent s'afficher dans la fenêtre de document étendue. Dans la plupart des cas, les champs multiples sont les mêmes que les champs d'origine. Cette option est uniquement disponible lorsque le paramètre `searchFieldsFromSource` est désactivé.", "discover.advancedSettings.enableESQLDescription": "{technicalPreviewLabel} Cette fonctionnalité en préversion technique est à un stade hautement expérimental ; ne pas s'y fier pour les recherches enregistrées, ni pour les visualisations ou les tableaux de bord en production. Ce paramètre active ES|QL dans Discover. Si vous avez des commentaires sur cette expérience, contactez-nous via {link}", - "discover.context.contextOfTitle": "Documents relatifs à #{anchorId}", - "discover.context.newerDocumentsWarning": "Seuls {docCount} documents plus récents que le document ancré ont été trouvés.", - "discover.context.olderDocumentsWarning": "Seuls {docCount} documents plus anciens que le document ancré ont été trouvés.", - "discover.context.pageTitle": "Documents relatifs à #{anchorId}", - "discover.contextViewRoute.errorMessage": "Aucune vue de données correspondante pour l'ID {dataViewId}", + "discover.context.contextOfTitle": "Les documents relatifs à #{anchorId}", + "discover.context.newerDocumentsWarning": "Seuls {docCount} documents plus récents que le document ancré ont été trouvés.", + "discover.context.olderDocumentsWarning": "Seuls {docCount} documents plus anciens que le document ancré ont été trouvés.", + "discover.context.pageTitle": "Les documents relatifs à #{anchorId}", + "discover.contextViewRoute.errorMessage": "Aucune donnée correspondante pour l'ID {dataViewId}", "discover.doc.failedToLocateDataView": "Aucune vue de données ne correspond à l'ID {dataViewId}.", - "discover.doc.pageTitle": "Document unique – #{id}", - "discover.doc.somethingWentWrongDescription": "{indexName} manquant.", - "discover.docExplorerCallout.bodyMessage": "Triez, sélectionnez et comparez rapidement les données, redimensionnez les colonnes et affichez les documents en plein écran grâce à {documentExplorer}.", - "discover.docTable.limitedSearchResultLabel": "Limité à {resultCount} résultats. Veuillez affiner votre recherche.", + "discover.doc.pageTitle": "Document unique - #{id}", + "discover.doc.somethingWentWrongDescription": "Index {indexName} manquant.", + "discover.docExplorerCallout.bodyMessage": "Triez, sélectionnez et comparez rapidement les données, redimensionnez les colonnes et affichez les documents en plein écran grâce à l'{documentExplorer}.", + "discover.docTable.limitedSearchResultLabel": "Limité à {resultCount} résultats. Veuillez affiner votre recherche.", "discover.docTable.rowsPerPage": "Lignes par page : {pageSize}", - "discover.docTable.tableHeader.moveColumnLeftButtonAriaLabel": "Déplacer la colonne {columnName} vers la gauche", - "discover.docTable.tableHeader.moveColumnRightButtonAriaLabel": "Déplacer la colonne {columnName} vers la droite", - "discover.docTable.tableHeader.removeColumnButtonAriaLabel": "Supprimer la colonne {columnName}", - "discover.docTable.tableHeader.sortByColumnAscendingAriaLabel": "Trier {columnName} dans l'ordre croissant", - "discover.docTable.tableHeader.sortByColumnDescendingAriaLabel": "Trier {columnName} dans l'ordre décroissant", - "discover.docTable.tableHeader.sortByColumnUnsortedAriaLabel": "Arrêter le tri sur {columnName}", - "discover.docTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} – Ce champ représente l'heure à laquelle les événements se sont produits.", - "discover.docTable.totalDocuments": "{totalDocuments} documents", + "discover.docTable.tableHeader.moveColumnLeftButtonAriaLabel": "Déplacer la colonne {columnName} vers la gauche", + "discover.docTable.tableHeader.moveColumnRightButtonAriaLabel": "Déplacer la colonne {columnName} vers la droite", + "discover.docTable.tableHeader.removeColumnButtonAriaLabel": "Supprimer la colonne {columnName}", + "discover.docTable.tableHeader.sortByColumnAscendingAriaLabel": "Trier la colonne {columnName} par ordre croissant", + "discover.docTable.tableHeader.sortByColumnDescendingAriaLabel": "Trier la colonne {columnName} par ordre décroissant", + "discover.docTable.tableHeader.sortByColumnUnsortedAriaLabel": "Arrêter de trier la colonne {columnName}", + "discover.docTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} : ce champ représente l'heure à laquelle les événements se sont produits.", + "discover.docTable.totalDocuments": "{totalDocuments} documents", "discover.dscTour.stepAddFields.description": "Cliquez sur {plusIcon} pour ajouter les champs qui vous intéressent.", - "discover.dscTour.stepExpand.description": "Cliquez sur {expandIcon} pour afficher, comparer et filtrer les documents.", - "discover.formatHit.moreFields": "et {count} autre(s) {count, plural, one {champ} many {champs} other {champs}}", - "discover.howToSeeOtherMatchingDocumentsDescription": "Voici les {sampleSize} premiers documents correspondant à votre recherche. Veuillez affiner cette dernière pour en voir davantage.", + "discover.dscTour.stepExpand.description": "Cliquez sur l'{expandIcon} pour afficher, comparer et filtrer les documents.", + "discover.formatHit.moreFields": "et {count} {count, plural, one {autre champ} other {autres champs}}", + "discover.hitsCounter.hitsPluralTitle": "{formattedHits} {hits, plural, one {résultat} other {résultats}}", + "discover.hitsCounter.partialHits": "≥{formattedHits}", + "discover.hitsCounter.partialHitsPluralTitle": "≥{formattedHits} {hits, plural, one {résultat} other {résultats}}", + "discover.howToSeeOtherMatchingDocumentsDescription": "Voici les {sampleSize} premiers documents correspondant à votre recherche. Veuillez affiner celle-ci pour en voir plus.", "discover.noMatchRoute.bannerText": "L'application Discover ne reconnaît pas cet itinéraire : {route}", "discover.noResults.kqlExamples.kqlDescription": "En savoir plus sur {kqlLink}", "discover.noResults.luceneExamples.footerDescription": "En savoir plus sur {luceneLink}", - "discover.noResults.noDocumentsOrCheckIndicesAndPermissionsDescription": "Vérifiez que la vue de données {dataViewName} avec le modèle d'indexation {dataViewPattern} a des index et documents correspondants et que vous avez l'autorisation requise pour les afficher.", - "discover.noResults.suggestion.removeOrDisableFiltersText": "Retirer ou {disableFiltersLink}", - "discover.pageTitleWithSavedSearch": "Discover –{savedSearchTitle}", + "discover.noResults.noDocumentsOrCheckIndicesAndPermissionsDescription": "Vérifiez que la vue de données {dataViewName} avec le modèle d'indexation {dataViewPattern} a des index et documents correspondants, et que vous avez l'autorisation de les afficher.", + "discover.noResults.suggestion.removeOrDisableFiltersText": "Supprimer ou {disableFiltersLink}", + "discover.pageTitleWithSavedSearch": "Discover - {savedSearchTitle}", "discover.savedSearchAliasMatchRedirect.objectNoun": "Recherche {savedSearch}", "discover.savedSearchURLConflictCallout.objectNoun": "Recherche {savedSearch}", "discover.showingDefaultDataViewWarningDescription": "Affichage de la vue de données par défaut : \"{loadedDataViewTitle}\" ({loadedDataViewId})", "discover.showingSavedDataViewWarningDescription": "Affichage de la vue de données enregistrée : \"{ownDataViewTitle}\" ({ownDataViewId})", - "discover.singleDocRoute.errorMessage": "Aucune vue de données correspondante pour l'ID {dataViewId}", - "discover.textBasedMode.selectedColumnsCallout": "Affichage de {selectedColumnsNumber} champ(s) sur {textBasedQueryColumnsNumber}. Ajoutez-en d’autres depuis la liste des champs disponibles.", + "discover.singleDocRoute.errorMessage": "Aucune donnée correspondante pour l'ID {dataViewId}", + "discover.textBasedMode.selectedColumnsCallout": "Affichage de {selectedColumnsNumber} champs sur {textBasedQueryColumnsNumber}. Ajoutez-en d’autres depuis la liste des champs disponibles.", + "discover.textBasedMode.techPreviewCalloutMessage": "ES|QL est actuellement en version d'évaluation technique. Pour en savoir plus, consultez {link}.", "discover.valueIsNotConfiguredDataViewIDWarningTitle": "{stateVal} n'est pas un ID de vue de données configuré", "discover.viewAlert.dataViewErrorText": "Échec de la vue des données de la règle d'alerte avec l'ID {alertId}.", "discover.advancedSettings.context.defaultSizeText": "Le nombre d'entrées connexes à afficher dans la vue contextuelle", @@ -2170,7 +2304,7 @@ "discover.advancedSettings.discover.modifyColumnsOnSwitchTitle": "Modifier les colonnes en cas de changement des vues de données", "discover.advancedSettings.discover.multiFieldsLinkText": "champs multiples", "discover.advancedSettings.discover.readFieldsFromSource": "Lire les champs depuis _source", - "discover.advancedSettings.discover.readFieldsFromSourceDescription": "Lorsque cette option est activée, les documents sont chargés directement depuis ''_source''. Elle sera bientôt déclassée. Lorsqu'elle est désactivée, les champs sont extraits via la nouvelle API de champ du service de recherche de haut niveau.", + "discover.advancedSettings.discover.readFieldsFromSourceDescription": "Lorsque cette option est activée, les documents sont chargés directement depuis `_source`. Elle sera bientôt déclassée. Lorsqu'elle est désactivée, les champs sont extraits via la nouvelle API de champ du service de recherche de haut niveau.", "discover.advancedSettings.discover.showFieldStatistics": "Afficher les statistiques de champ", "discover.advancedSettings.discover.showMultifields": "Afficher les champs multiples", "discover.advancedSettings.docTableHideTimeColumnText": "Permet de masquer la colonne ''Time'' dans Discover et dans toutes les recherches enregistrées des tableaux de bord.", @@ -2223,7 +2357,7 @@ "discover.context.unableToLoadAnchorDocumentDescription": "Impossible de charger le document ancré", "discover.context.unableToLoadDocumentDescription": "Impossible de charger les documents", "discover.contextViewRoute.errorTitle": "Une erreur s'est produite", - "discover.discoverBreadcrumbTitle": "Découverte", + "discover.discoverBreadcrumbTitle": "Discover", "discover.discoverDefaultSearchSessionName": "Discover", "discover.discoverDescription": "Explorez vos données de manière interactive en interrogeant et en filtrant des documents bruts.", "discover.discoverError.missingIdParamError": "Aucun ID de document fourni. Revenez à Discover pour sélectionner un autre document.", @@ -2290,9 +2424,17 @@ "discover.grid.flyout.documentNavigation": "Navigation dans le document", "discover.grid.flyout.toastColumnAdded": "La colonne \"{columnName}\" a été ajoutée.", "discover.grid.flyout.toastColumnRemoved": "La colonne \"{columnName}\" a été supprimée.", + "discover.grid.tableRow.actionsLabel": "Actions", + "discover.grid.tableRow.docViewerDetailHeading": "Document", + "discover.grid.tableRow.docViewerTextBasedDetailHeading": "Ligne", + "discover.grid.tableRow.mobileFlyoutActionsButton": "Actions", + "discover.grid.tableRow.moreFlyoutActionsButton": "Plus d'actions", "discover.grid.tableRow.textBasedDetailHeading": "Ligne développée", + "discover.grid.tableRow.viewSingleDocumentLinkLabel": "Afficher un seul document", "discover.grid.tableRow.viewSurroundingDocumentsHover": "Inspectez des documents qui ont été créés avant et après ce document. Seuls les filtres épinglés restent actifs dans la vue Documents relatifs.", - "discover.helpMenu.appName": "Découverte", + "discover.grid.tableRow.viewSurroundingDocumentsLinkLabel": "Afficher les documents alentour", + "discover.helpMenu.appName": "Discover", + "discover.hitsCounter.hitCountSpinnerAriaLabel": "Nombre final de résultats toujours en chargement", "discover.inspectorRequestDataTitleDocuments": "Documents", "discover.inspectorRequestDataTitleMoreDocuments": "Plus de documents", "discover.inspectorRequestDescriptionDocument": "Cette requête interroge Elasticsearch afin de récupérer les documents.", @@ -2305,6 +2447,7 @@ "discover.localMenu.inspectTitle": "Inspecter", "discover.localMenu.localMenu.alertsTitle": "Alertes", "discover.localMenu.localMenu.newSearchTitle": "Nouveauté", + "discover.localMenu.mustCopyOnSave": "Cette recherche enregistrée est gérée par Elastic. Les modifications effectuées ici doivent être enregistrées dans une nouvelle recherche sauvegardée.", "discover.localMenu.newSearchDescription": "Nouvelle recherche", "discover.localMenu.openInspectorForSearchDescription": "Ouvrir l'inspecteur de recherche", "discover.localMenu.openSavedSearchDescription": "Ouvrir une recherche enregistrée", @@ -2314,6 +2457,8 @@ "discover.localMenu.saveTitle": "Enregistrer", "discover.localMenu.shareSearchDescription": "Partager la recherche", "discover.localMenu.shareTitle": "Partager", + "discover.logsExplorerTabs.discover": "Discover", + "discover.logsExplorerTabs.logsExplorer": "Explorateur de logs", "discover.noMatchRoute.bannerTitleText": "Page introuvable", "discover.noResults.kqlExamples.combineMultipleText": "Combinaison de plusieurs requêtes avec AND/OR", "discover.noResults.kqlExamples.filterForDocsThatMatchValueText": "Filtrer sur les documents qui correspondent à une valeur", @@ -2347,14 +2492,20 @@ "discover.notifications.notSavedSearchTitle": "La recherche \"{savedSearchTitle}\" n'a pas été enregistrée.", "discover.notifications.savedSearchTitle": "La recherche \"{savedSearchTitle}\" a été enregistrée.", "discover.pageTitleWithoutSavedSearch": "Discover - Recherche non encore enregistrée", - "discover.rootBreadcrumb": "Découverte", - "discover.sampleData.viewLinkLabel": "Découverte", + "discover.panelsToggle.hideChartButton": "Masquer le graphique", + "discover.panelsToggle.panelsVisibilityLegend": "Visibilité des panneaux", + "discover.panelsToggle.showChartButton": "Afficher le graphique", + "discover.panelsToggle.showSidebarButton": "Afficher la barre latérale", + "discover.rootBreadcrumb": "Discover", + "discover.sampleData.viewLinkLabel": "Discover", "discover.savedSearch.savedObjectName": "Recherche enregistrée", "discover.savedSearchEmbeddable.action.viewSavedSearch.displayName": "Ouvrir dans Discover", "discover.searchingTitle": "Recherche", "discover.serverLocatorExtension.titleFromLocatorUnknown": "Recherche inconnue", "discover.singleDocRoute.errorTitle": "Une erreur s'est produite", "discover.skipToBottomButtonLabel": "Atteindre la fin du tableau", + "discover.textBasedMode.techPreviewCalloutLink": "documentation", + "discover.topNav.managedContentLabel": "Cette recherche sauvegardée est gérée par Elastic. Les modifications effectuées ici doivent être enregistrées dans une nouvelle recherche sauvegardée.", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "Gérer les recherches", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "Aucune recherche correspondante trouvée.", "discover.topNav.openSearchPanel.openSearchTitle": "Ouvrir une recherche", @@ -2372,46 +2523,46 @@ "discover.viewModes.fieldStatistics.label": "Statistiques de champ", "domDragDrop.announce.cancelled": "Mouvement annulé. {label} revenu à sa position initiale", "domDragDrop.announce.cancelledItem": "Mouvement annulé. {label} revenu au groupe {groupLabel} à la position {position}", - "domDragDrop.announce.dropped.combineCompatible": "{label} combiné dans le groupe {groupLabel} en {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", - "domDragDrop.announce.dropped.combineIncompatible": "{label} converti en {nextLabel} dans le groupe {groupLabel} à la position {position} et combiné à {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.combineCompatible": "Combinaisons de {label} dans le {groupLabel} vers {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.combineIncompatible": "Conversion de {label} en {nextLabel} dans le groupe {groupLabel} à la position {position} et combinaison avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", "domDragDrop.announce.dropped.duplicated": "{label} dupliqué dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber}", "domDragDrop.announce.dropped.duplicateIncompatible": "Copie de {label} convertie en {nextLabel} et ajoutée au groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", - "domDragDrop.announce.dropped.moveCompatible": "{label} déplacé dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", - "domDragDrop.announce.dropped.moveIncompatible": "{label} converti en {nextLabel} et déplacé dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.moveCompatible": "Déplacement de {label} dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.moveIncompatible": "Conversion de {label} en {nextLabel} et déplacé dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", "domDragDrop.announce.dropped.reordered": "{label} réorganisé dans le groupe {groupLabel} de la position {prevPosition} à la position {position}", - "domDragDrop.announce.dropped.replaceDuplicateIncompatible": "Copie de {label} convertie en {nextLabel} et {dropLabel} remplacé dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", - "domDragDrop.announce.dropped.replaceIncompatible": "{label} converti en {nextLabel} et {dropLabel} remplacé dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", - "domDragDrop.announce.dropped.swapCompatible": "{label} déplacé vers {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber} et {dropLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber}", - "domDragDrop.announce.dropped.swapIncompatible": "{label} converti en {nextLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} et permuté avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", - "domDragDrop.announce.droppedDefault": "{label} ajouté dans le groupe {dropGroupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.replaceDuplicateIncompatible": "Conversion de la copie de {label} en {nextLabel} et remplacement de {dropLabel} dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.replaceIncompatible": "Conversion de {label} en {nextLabel} et remplacement de {dropLabel} dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.swapCompatible": "Déplacement de {label} vers {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber} et de {dropLabel} vers {groupLabel} à la position {position} dans le calque {layerNumber}", + "domDragDrop.announce.dropped.swapIncompatible": "Conversion de {label} en {nextLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} et permuté avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", + "domDragDrop.announce.droppedDefault": "Ajout de {label} dans le groupe {dropGroupLabel} à la position {position} dans le calque {dropLayerNumber}", "domDragDrop.announce.droppedNoPosition": "{label} ajouté à {dropLabel}", - "domDragDrop.announce.duplicated.combine": "Combiner {dropLabel} avec {label} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}", - "domDragDrop.announce.duplicated.replace": "{dropLabel} remplacé par {label} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}", - "domDragDrop.announce.duplicated.replaceDuplicateCompatible": "{dropLabel} remplacé par une copie de {label} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.duplicated.combine": "Combinaison de {dropLabel} avec {label} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.duplicated.replace": "Remplacement de {dropLabel} par {label} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.duplicated.replaceDuplicateCompatible": "Remplacement de {dropLabel} par une copie de {label} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}", "domDragDrop.announce.lifted": "{label} levé", - "domDragDrop.announce.selectedTarget.combine": "Combinez {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber} avec {label}. Appuyez sur la barre d’espace ou sur Entrée pour combiner.", - "domDragDrop.announce.selectedTarget.combineCompatible": "Combinez {label} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenez la touche Contrôle enfoncée et appuyez sur la barre d’espace ou sur Entrée pour combiner.", - "domDragDrop.announce.selectedTarget.combineIncompatible": "Convertissez {label} en {nextLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} combinez-le à {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenez la touche Contrôle enfoncée et appuyez sur la barre d’espace ou sur Entrée pour combiner.", - "domDragDrop.announce.selectedTarget.combineMain": "Vous faites glisser {label} de {groupLabel} à la position {position} dans le calque {layerNumber} sur {dropLabel} à partir du groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyez sur la barre d'espace ou sur Entrée pour combiner {dropLabel} à {label}.{duplicateCopy}{swapCopy}{combineCopy}.", - "domDragDrop.announce.selectedTarget.default": "Ajoutez {label} au groupe {dropGroupLabel} à la position {position} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour ajouter", + "domDragDrop.announce.selectedTarget.combine": "Combinaison de {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber} avec {label}. Appuyez sur la barre d’espace ou sur Entrée pour combiner.", + "domDragDrop.announce.selectedTarget.combineCompatible": "Combinaison de {label} en dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenez la touche Contrôle enfoncée et appuyez sur la barre d’espace ou sur Entrée pour combiner.", + "domDragDrop.announce.selectedTarget.combineIncompatible": "Conversion de {label} en {nextLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} et combinaison avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenez la touche Contrôle enfoncée et appuyez sur la barre d’espace ou sur Entrée pour combiner.", + "domDragDrop.announce.selectedTarget.combineMain": "Vous faites glisser {label} à partir de {groupLabel} à la position {position} dans le calque {layerNumber} sur {dropLabel} à partir du groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d’espace ou sur Entrée pour combiner {dropLabel} avec {label}.{duplicateCopy}{swapCopy}{combineCopy}", + "domDragDrop.announce.selectedTarget.default": "Ajout de {label} dans le groupe {dropGroupLabel} à la position {position} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour ajouter", "domDragDrop.announce.selectedTarget.defaultNoPosition": "Ajoutez {label} à {dropLabel}. Appuyer sur la barre d'espace ou sur Entrée pour ajouter", - "domDragDrop.announce.selectedTarget.duplicated": "Dupliquez {label} dans le groupe {dropGroupLabel} à la position {position} dans le calque {layerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer", - "domDragDrop.announce.selectedTarget.duplicatedInGroup": "Dupliquez {label} dans le groupe {dropGroupLabel} à la position {position} dans le calque {layerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour dupliquer", - "domDragDrop.announce.selectedTarget.duplicateIncompatible": "Convertissez la copie de {label} en {nextLabel} et ajoutez-la au groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer", - "domDragDrop.announce.selectedTarget.moveCompatible": "Déplacez {label} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour déplacer", - "domDragDrop.announce.selectedTarget.moveCompatibleMain": "Vous faites glisser {label} de {groupLabel} à la position {position} sur la position {dropPosition} dans le groupe {dropGroupLabel} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour déplacer.{duplicateCopy}", - "domDragDrop.announce.selectedTarget.moveIncompatible": "Convertissez {label} en {nextLabel} et déplacez-le dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour déplacer", - "domDragDrop.announce.selectedTarget.moveIncompatibleMain": "Vous faites glisser {label} de {groupLabel} à la position {position} dans le calque {layerNumber} sur la position {dropPosition} dans le groupe {dropGroupLabel} dans le calque {dropLayerNumber}. Appuyez sur la barre d'espace ou sur Entrée pour convertir {label} en {nextLabel} et le déplacer.{duplicateCopy}", + "domDragDrop.announce.selectedTarget.duplicated": "Duplication de {label} dans le groupe {dropGroupLabel} à la position {position} dans le calque {layerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer", + "domDragDrop.announce.selectedTarget.duplicatedInGroup": "Duplication de {label} dans le groupe {dropGroupLabel} à la position {position} dans le calque {layerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour dupliquer", + "domDragDrop.announce.selectedTarget.duplicateIncompatible": "Conversion de la copie de {label} en {nextLabel} et ajout au groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer", + "domDragDrop.announce.selectedTarget.moveCompatible": "Déplacement de {label} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour déplacer", + "domDragDrop.announce.selectedTarget.moveCompatibleMain": "Vous faites glisser {label} de {groupLabel} à la position {position} vers la position {dropPosition} dans le groupe {dropGroupLabel} dans le calque {dropLayerNumber}. Appuyez sur la barre d'espace ou sur Entrée pour déplacer.{duplicateCopy}", + "domDragDrop.announce.selectedTarget.moveIncompatible": "Conversion de {label} en {nextLabel} et déplacement dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour déplacer", + "domDragDrop.announce.selectedTarget.moveIncompatibleMain": "Vous faites glisser {label} de {groupLabel} à la position {position} dans le calque {layerNumber} vers la position {dropPosition} dans le groupe {dropGroupLabel} dans le calque {dropLayerNumber}. Appuyez sur la barre d'espace ou sur Entrée pour convertir {label} en {nextLabel} et déplacer.{duplicateCopy}", "domDragDrop.announce.selectedTarget.reordered": "Réorganisez {label} dans le groupe {groupLabel} de la position {prevPosition} à la position {position}. Appuyer sur la barre d'espace ou sur Entrée pour réorganiser", "domDragDrop.announce.selectedTarget.reorderedBack": "{label} revenu à sa position initiale {prevPosition}", - "domDragDrop.announce.selectedTarget.replace": "Remplacez {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber} par {label}. Appuyez sur la barre d'espace ou sur Entrée pour remplacer.", - "domDragDrop.announce.selectedTarget.replaceDuplicateCompatible": "Dupliquez {label} et remplacez {dropLabel} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer et remplacer", - "domDragDrop.announce.selectedTarget.replaceDuplicateIncompatible": "Convertissez la copie de {label} en {nextLabel} et remplacez {dropLabel} dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer et remplacer", - "domDragDrop.announce.selectedTarget.replaceIncompatible": "Convertissez {label} en {nextLabel} et remplacez {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour remplacer", - "domDragDrop.announce.selectedTarget.replaceIncompatibleMain": "Vous faites glisser {label} de {groupLabel} à la position {position} dans le calque {layerNumber} sur {dropLabel} à partir du groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyez sur la barre d'espace ou sur Entrée pour convertir {label} en {nextLabel} et remplacer {dropLabel}.{duplicateCopy}{swapCopy}{combineCopy}", - "domDragDrop.announce.selectedTarget.replaceMain": "Vous faites glisser {label} de {groupLabel} à la position {position} dans le calque {layerNumber} sur {dropLabel} à partir du groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour remplacer {dropLabel} par {label}.{duplicateCopy}{swapCopy}{combineCopy}", - "domDragDrop.announce.selectedTarget.swapCompatible": "Permutez {label} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenir la touche Maj enfoncée tout en appuyant sur la barre d'espace ou sur Entrée pour permuter", - "domDragDrop.announce.selectedTarget.swapIncompatible": "Convertissez {label} en {nextLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} permutez-le avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenir la touche Maj enfoncée tout en appuyant sur la barre d'espace ou sur Entrée pour permuter", + "domDragDrop.announce.selectedTarget.replace": "Remplacement de {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber} par {label}. Appuyez sur la barre d'espace ou sur Entrée pour remplacer.", + "domDragDrop.announce.selectedTarget.replaceDuplicateCompatible": "Duplication de {label} et remplacement de {dropLabel} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer et remplacer", + "domDragDrop.announce.selectedTarget.replaceDuplicateIncompatible": "Conversion de la copie de {label} en {nextLabel} et remplacement de {dropLabel} dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer et remplacer", + "domDragDrop.announce.selectedTarget.replaceIncompatible": "Conversion de {label} en {nextLabel} et remplacement de {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour remplacer", + "domDragDrop.announce.selectedTarget.replaceIncompatibleMain": "Vous faites glisser {label} à partir de {groupLabel} à la position {position} dans le calque {layerNumber} sur {dropLabel} à partir du groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour convertir {label} en {nextLabel} et remplacer {dropLabel}.{duplicateCopy}{swapCopy}{combineCopy}", + "domDragDrop.announce.selectedTarget.replaceMain": "Vous faites glisser {label} à partir de {groupLabel} à la position {position} dans le calque {layerNumber} sur {dropLabel} à partir du groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyez sur la barre d'espace ou sur Entrée pour remplacer {dropLabel} par {label}.{duplicateCopy}{swapCopy}{combineCopy}", + "domDragDrop.announce.selectedTarget.swapCompatible": "Permutation de {label} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} et de {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenir la touche Maj enfoncée tout en appuyant sur la barre d'espace ou sur Entrée pour permuter", + "domDragDrop.announce.selectedTarget.swapIncompatible": "Conversion de {label} en {nextLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} et permutation avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenir la touche Maj enfoncée tout en appuyant sur la barre d'espace ou sur Entrée pour permuter", "domDragDrop.announce.combine.short": " Maintenir la touche Contrôle enfoncée pour combiner", "domDragDrop.announce.duplicate.short": " Maintenez la touche Alt ou Option enfoncée pour dupliquer.", "domDragDrop.announce.selectedTarget.noSelected": "Aucune cible sélectionnée. Utiliser les touches fléchées pour sélectionner une cible", @@ -2424,13 +2575,17 @@ "domDragDrop.dropTargets.swap": "Permuter", "domDragDrop.keyboardInstructions": "Appuyez sur la barre d'espace ou sur Entrée pour commencer à faire glisser. Lors du glissement, utilisez les touches fléchées gauche/droite pour vous déplacer entre les cibles de dépôt. Appuyez à nouveau sur la barre d'espace ou sur Entrée pour terminer.", "domDragDrop.keyboardInstructionsReorder": "Appuyez sur la barre d'espace ou sur Entrée pour commencer à faire glisser. Lors du glissement, utilisez les touches fléchées haut/bas pour réorganiser les éléments dans le groupe et les touches gauche/droite pour choisir les cibles de dépôt à l'extérieur du groupe. Appuyez à nouveau sur la barre d'espace ou sur Entrée pour terminer.", - "embeddableApi.addPanel.savedObjectAddedToContainerSuccessMessageTitle": "{savedObjectName} a été ajouté", - "embeddableApi.attributeService.saveToLibraryError": "Une erreur s'est produite lors de l'enregistrement. Erreur : {errorMessage}", + "embeddableApi.addPanel.savedObjectAddedToContainerSuccessMessageTitle": "{savedObjectName} a été ajouté.", + "embeddableApi.attributeService.saveToLibraryError": "Une erreur s'est produite lors de l'enregistrement. Erreur : {errorMessage}.", "embeddableApi.errors.embeddableFactoryNotFound": "Impossible de charger {type}. Veuillez effectuer une mise à niveau vers la distribution par défaut d'Elasticsearch et de Kibana avec la licence appropriée.", + "embeddableApi.reactEmbeddable.factoryAlreadyExistsError": "Une usine incorporable pour le type {key} est déjà enregistrée.", + "embeddableApi.reactEmbeddable.factoryNotFoundError": "Aucune usine incorporable n'a été trouvée pour le type : {key}", + "embeddableApi.addPanel.managedPanelTooltip": "Ce panneau est géré par Elastic. Il peut être ajouté, mais il sera dissocié de la bibliothèque.", "embeddableApi.addPanel.noMatchingObjectsMessage": "Aucun objet correspondant trouvé.", "embeddableApi.addPanel.Title": "Ajouter depuis la bibliothèque", "embeddableApi.cellValueTrigger.description": "Les actions apparaissent dans les options de valeur de cellule dans la visualisation", "embeddableApi.cellValueTrigger.title": "Valeur de cellule", + "embeddableApi.compatibility.defaultTypeDisplayName": "graphique", "embeddableApi.contextMenuTrigger.description": "Une nouvelle action sera ajoutée au menu contextuel du panneau", "embeddableApi.contextMenuTrigger.title": "Menu contextuel", "embeddableApi.errors.paneldoesNotExist": "Panneau introuvable", @@ -2456,8 +2611,8 @@ "esQuery.kql.errors.literalText": "littéral", "esQuery.kql.errors.valueText": "valeur", "esQuery.kql.errors.whitespaceText": "espace", - "esUi.forms.fieldValidation.indexNameInvalidCharactersError": "Le nom de l'index contient {characterListLength, plural, one {le caractère non valide suivant} many {les caractères} other {les caractères non valides suivants}} : {characterList}.", - "esUi.forms.fieldValidation.indexPatternInvalidCharactersError": "Le modèle d'indexation contient {characterListLength, plural, one {le caractère non valide suivant} many {les caractères} other {les caractères}} {characterList}.", + "esUi.forms.fieldValidation.indexNameInvalidCharactersError": "Le nom de l'index contient {characterListLength, plural, one {le caractère non valide} other {les caractères non valides}} {characterList}.", + "esUi.forms.fieldValidation.indexPatternInvalidCharactersError": "Le modèle d'indexation contient {characterListLength, plural, one {le caractère non valide} other {les caractères non valides}} {characterList}.", "esUi.cronEditor.cronDaily.fieldHour.textAtLabel": "À", "esUi.cronEditor.cronDaily.fieldTimeLabel": "Heure", "esUi.cronEditor.cronDaily.hourSelectLabel": "Heure", @@ -2484,26 +2639,26 @@ "esUi.cronEditor.cronYearly.fieldTimeLabel": "Heure", "esUi.cronEditor.cronYearly.hourSelectLabel": "Heure", "esUi.cronEditor.cronYearly.minuteSelectLabel": "Minute", - "esUi.cronEditor.day.friday": "vendredi", - "esUi.cronEditor.day.monday": "lundi", - "esUi.cronEditor.day.saturday": "samedi", - "esUi.cronEditor.day.sunday": "dimanche", - "esUi.cronEditor.day.thursday": "jeudi", - "esUi.cronEditor.day.tuesday": "mardi", - "esUi.cronEditor.day.wednesday": "mercredi", + "esUi.cronEditor.day.friday": "Vendredi", + "esUi.cronEditor.day.monday": "Lundi", + "esUi.cronEditor.day.saturday": "Samedi", + "esUi.cronEditor.day.sunday": "Dimanche", + "esUi.cronEditor.day.thursday": "Jeudi", + "esUi.cronEditor.day.tuesday": "Mardi", + "esUi.cronEditor.day.wednesday": "Mercredi", "esUi.cronEditor.fieldFrequencyLabel": "Fréquence", - "esUi.cronEditor.month.april": "avril", - "esUi.cronEditor.month.august": "août", - "esUi.cronEditor.month.december": "décembre", - "esUi.cronEditor.month.february": "février", - "esUi.cronEditor.month.january": "janvier", - "esUi.cronEditor.month.july": "juillet", - "esUi.cronEditor.month.june": "juin", - "esUi.cronEditor.month.march": "mars", - "esUi.cronEditor.month.may": "mai", - "esUi.cronEditor.month.november": "novembre", - "esUi.cronEditor.month.october": "octobre", - "esUi.cronEditor.month.september": "septembre", + "esUi.cronEditor.month.april": "Avril", + "esUi.cronEditor.month.august": "Août", + "esUi.cronEditor.month.december": "Décembre", + "esUi.cronEditor.month.february": "Février", + "esUi.cronEditor.month.january": "Janvier", + "esUi.cronEditor.month.july": "Juillet", + "esUi.cronEditor.month.june": "Juin", + "esUi.cronEditor.month.march": "Mars", + "esUi.cronEditor.month.may": "Mai", + "esUi.cronEditor.month.november": "Novembre", + "esUi.cronEditor.month.october": "Octobre", + "esUi.cronEditor.month.september": "Septembre", "esUi.cronEditor.textEveryLabel": "Chaque", "esUi.forms.comboBoxField.placeHolderText": "Saisir, puis appuyer sur \"ENTRÉE\"", "esUi.forms.fieldValidation.indexNameSpacesError": "Le nom de l'index ne peut pas contenir d'espaces.", @@ -2517,7 +2672,7 @@ "esUi.viewApiRequest.closeButtonLabel": "Fermer", "esUi.viewApiRequest.copyToClipboardButton": "Copier dans le presse-papiers", "esUi.viewApiRequest.openInConsoleButton": "Ouvrir dans la console", - "eventAnnotationListing.tableList.dataView.missing": "{errorIcon} N'existe plus", + "eventAnnotationListing.tableList.dataView.missing": "{errorIcon} n'existe plus", "eventAnnotationListing.annotationList.add": "Ajouter une annotation", "eventAnnotationListing.edit.back": "Retour", "eventAnnotationListing.edit.cancel": "Annuler", @@ -2548,11 +2703,12 @@ "eventAnnotationListing.timeField": "Champ temporel", "exceptionList-components.empty.viewer.state.empty.viewer_button": "Créer une exception {exceptionType}", "exceptionList-components.exception_list_header_edit_modal_name": "Modifier {listName}", - "exceptionList-components.exception_list_header_linked_rules": "Associé à {noOfRules} règles", - "exceptionList-components.exceptions.card.exceptionItem.affectedRules": "Affecte {numRules} {numRules, plural, =1 {règle} one {règles} many {règles} other {règles}}", + "exceptionList-components.exception_list_header_linked_rules": "Lié à {noOfRules} règles", + "exceptionList-components.exceptions.card.exceptionItem.affectedRules": "Affecte {numRules} {numRules, plural, =1 {règle} other {règles}}", "exceptionList-components.exceptions.exceptionItem.card.deleteItemButton": "Supprimer l'exception {listType}", "exceptionList-components.exceptions.exceptionItem.card.editItemButton": "Modifier l'exception {listType}", - "exceptionList-components.exceptions.exceptionItem.card.showCommentsLabel": "Afficher {comments, plural, =1 {commentaire} one {commentaires} many {commentaires} other {les commentaires}} ({comments})", + "exceptionList-components.exceptions.exceptionItem.card.showCommentsLabel": "Afficher {comments, plural, =1 {commentaire} other {commentaires}} ({comments})", + "exceptionList-components.wildcardWithWrongOperatorCallout.body": "L'utilisation de '*' ou de '?' dans la valeur avec l'opérateur 'IS' peut rendre l'entrée inefficace. Remplacer {operator} par '{matches}' pour que les caractères génériques s'exécutent correctement.", "exceptionList-components.empty.viewer.state.empty_search.body": "Essayez de modifier votre recherche", "exceptionList-components.empty.viewer.state.empty_search.search.title": "Aucun résultat ne correspond à vos critères de recherche.", "exceptionList-components.empty.viewer.state.empty.body": "Aucune exception ne figure dans votre liste. Créez votre première exception.", @@ -2582,24 +2738,26 @@ "exceptionList-components.exceptions.exceptionItem.card.conditions.matchAnyOperator": "est l'une des options suivantes", "exceptionList-components.exceptions.exceptionItem.card.conditions.matchAnyOperator.not": "n'est pas l'une des options suivantes", "exceptionList-components.exceptions.exceptionItem.card.conditions.matchOperator": "IS", - "exceptionList-components.exceptions.exceptionItem.card.conditions.matchOperator.not": "N'EST PAS", + "exceptionList-components.exceptions.exceptionItem.card.conditions.matchOperator.not": "IS NOT", "exceptionList-components.exceptions.exceptionItem.card.conditions.nestedOperator": "a", "exceptionList-components.exceptions.exceptionItem.card.conditions.os": "Système d'exploitation", - "exceptionList-components.exceptions.exceptionItem.card.conditions.wildcardDoesNotMatchOperator": "NE CORRESPOND PAS À", - "exceptionList-components.exceptions.exceptionItem.card.conditions.wildcardMatchesOperator": "CORRESPONDANCES", + "exceptionList-components.exceptions.exceptionItem.card.conditions.wildcardDoesNotMatchOperator": "DOES NOT MATCH", + "exceptionList-components.exceptions.exceptionItem.card.conditions.wildcardMatchesOperator": "MATCHES", "exceptionList-components.exceptions.exceptionItem.card.conditions.windows": "Windows", "exceptionList-components.exceptions.exceptionItem.card.createdLabel": "Créé", "exceptionList-components.exceptions.exceptionItem.card.expiredLabel": "Expiré à", "exceptionList-components.exceptions.exceptionItem.card.expiresLabel": "Expire à", "exceptionList-components.exceptions.exceptionItem.card.metaDetailsBy": "par", "exceptionList-components.exceptions.exceptionItem.card.updatedLabel": "Mis à jour", + "exceptionList-components.wildcardWithWrongOperatorCallout.changeTheOperator": "Changer d'opérateur", + "exceptionList-components.wildcardWithWrongOperatorCallout.matches": "correspond à", + "exceptionList-components.wildcardWithWrongOperatorCallout.title": "Veuillez examiner vos entrées", "expressionError.renderer.debug.helpDescription": "Générer un rendu de sortie de débogage au format {JSON}", "expressionError.errorComponent.description": "Échec de l'expression avec le message :", "expressionError.errorComponent.title": "Oups ! Échec de l'expression", "expressionError.renderer.debug.displayName": "Déboguer", "expressionError.renderer.error.displayName": "Informations sur l'erreur", "expressionError.renderer.error.helpDescription": "Présenter les données de l'erreur d'une manière utile pour les utilisateurs", - "expressionGauge.functions.gauge.errors.centralMajorNotSupportedForShapeError": "Les champs \"centralMajor\" et \"centralMajorMode\" ne sont pas pris en charge par la forme \"{shape}\"", "expressionGauge.functions.gauge.args.centralMajor.help": "Spécifie la valeur centralMajor du graphique de jauge affiché dans le graphique.", "expressionGauge.functions.gauge.args.centralMajorMode.help": "Spécifie le mode de centralMajor", "expressionGauge.functions.gauge.args.colorMode.help": "Si la valeur est définie sur palette, les couleurs de celles-ci seront appliquées aux bandes", @@ -2645,9 +2803,9 @@ "expressionHeatmap.function.args.legendSize.help": "Spécifie la taille de la légende.", "expressionHeatmap.function.args.splitColumnAccessorHelpText": "L'identifiant de la colonne fractionnée ou la dimension correspondante", "expressionHeatmap.function.args.splitRowAccessorHelpText": "L'identifiant de la ligne fractionnée ou la dimension correspondante", - "expressionHeatmap.function.args.valueAccessorHelpText": "l'identifiant de la colonne de valeurs ou la dimension correspondante", - "expressionHeatmap.function.args.xAccessorHelpText": "l'identifiant de la colonne de l'axe X ou la dimension correspondante", - "expressionHeatmap.function.args.yAccessorHelpText": "l'identifiant de la colonne de l'axe Y ou la dimension correspondante", + "expressionHeatmap.function.args.valueAccessorHelpText": "L'identifiant de la colonne de valeurs ou la dimension correspondante", + "expressionHeatmap.function.args.xAccessorHelpText": "L'identifiant de la colonne de l'axe X ou la dimension correspondante", + "expressionHeatmap.function.args.yAccessorHelpText": "L'identifiant de la colonne de l'axe Y ou la dimension correspondante", "expressionHeatmap.function.dimension.metric": "Indicateur", "expressionHeatmap.function.dimension.splitColumn": "Diviser par colonne", "expressionHeatmap.function.dimension.splitRow": "Diviser par ligne", @@ -2661,15 +2819,15 @@ "expressionHeatmap.functions.args.ariaLabelHelpText": "Spécifie l'attribut aria-label de la carte thermique.", "expressionHeatmap.tooltipActions.emptyFilterSelection": "Sélectionner au moins une série à filtrer", "expressionHeatmap.visualizationName": "Carte thermique", - "expressionImage.functions.image.args.dataurlHelpText": "{URL} {https} ou {URL} de données {BASE64} d'une image.", - "expressionImage.functions.image.args.modeHelpText": "{contain} affiche l'image entière, mise à l'échelle. {cover} remplit le conteneur avec l'image, en rognant les côtés ou le bas si besoin. {stretch} redimensionne la hauteur et la largeur de l'image pour correspondre à 100 % du conteneur.", - "expressionImage.functions.image.invalidImageModeErrorMessage": "\"mode\" doit être \"{contain}\", \"{cover}\" ou \"{stretch}\"", + "expressionImage.functions.image.args.dataurlHelpText": "L'{URL} {https} ou l'{URL} de données {BASE64} d'une image.", + "expressionImage.functions.image.args.modeHelpText": "{contain} affiche l'image entière, mise à l’échelle. {cover} remplit le conteneur avec l'image, en rognant les côtés ou le bas si besoin. {stretch} redimensionne la hauteur et la largeur de l'image pour correspondre à 100 % du conteneur.", + "expressionImage.functions.image.invalidImageModeErrorMessage": "\"mode\" doit être défini sur \"{contain}\", \"{cover}\" ou \"{stretch}\".", "expressionImage.functions.imageHelpText": "Affiche une image. Spécifiez une ressource d'image sous la forme d'une {URL} de données {BASE64}, ou saisissez une sous-expression.", "expressionImage.renderer.image.displayName": "Image", "expressionImage.renderer.image.helpDescription": "Présenter une image", - "expressionMetric.functions.metric.args.labelFontHelpText": "Propriétés de la police {CSS} de l'étiquette. Par exemple, {FONT_FAMILY} ou {FONT_WEIGHT}.", - "expressionMetric.functions.metric.args.metricFontHelpText": "Propriétés de la police {CSS} de l'indicateur. Par exemple, {FONT_FAMILY} ou {FONT_WEIGHT}.", - "expressionMetric.functions.metric.args.metricFormatHelpText": "Chaîne de format {NUMERALJS}. Par exemple, {example1} ou {example2}.", + "expressionMetric.functions.metric.args.labelFontHelpText": "Les propriétés de la police {CSS} pour l'étiquette. Par exemple, {FONT_FAMILY} ou {FONT_WEIGHT}.", + "expressionMetric.functions.metric.args.metricFontHelpText": "Les propriétés de la police {CSS} pour l'indicateur. Par exemple, {FONT_FAMILY} ou {FONT_WEIGHT}.", + "expressionMetric.functions.metric.args.metricFormatHelpText": "Une chaîne de format {NUMERALJS}. Par exemple, {example1} ou {example2}.", "expressionMetric.functions.metric.args.labelHelpText": "Le texte décrivant l'indicateur.", "expressionMetric.functions.metricHelpText": "Affiche un nombre sur une étiquette.", "expressionMetric.renderer.metric.displayName": "Indicateur", @@ -2690,7 +2848,7 @@ "expressionMetricVis.function.minTiles.help": "Spécifie le nombre minimum de tuiles dans la grille d’indicateur, quelles que soient les données d'entrée.", "expressionMetricVis.function.numCols.help": "Spécifie le nombre maximum de colonnes dans la grille d’indicateur.", "expressionMetricVis.function.palette.help": "Fournit des couleurs pour les valeurs, basées sur les limites.", - "expressionMetricVis.function.progressDirection.help": "La direction dans laquelle la barre de progression doit croître.", + "expressionMetricVis.function.progressDirection.help": "La direction dans laquelle la barre de progression doit croître. Doit être fourni pour générer une barre de progression.", "expressionMetricVis.function.secondaryMetric.help": "L’indicateur secondaire (affiché au-dessus de l’indicateur principal).", "expressionMetricVis.function.secondaryPrefix.help": "Texte facultatif à afficher avant secondaryMetric.", "expressionMetricVis.function.subtitle.help": "Le sous-titre pour un indicateur unique. Remplacé si breakdownBy est spécifié.", @@ -2751,15 +2909,15 @@ "expressionPartitionVis.tooltipActions.emptyFilterSelection": "Sélectionner au moins une série à filtrer", "expressionPartitionVis.waffle.function.args.bucketHelpText": "Configuration des dimensions de compartiment", "expressionPartitionVis.waffle.function.args.showValuesInLegendHelpText": "Afficher les valeurs dans la légende", - "expressionRepeatImage.error.repeatImage.missingMaxArgument": "{maxArgument} doit être défini si un {emptyImageArgument} est fourni", - "expressionRepeatImage.functions.repeatImage.args.emptyImageHelpText": "Comble la différence entre les paramètres {CONTEXT} et {maxArg}pour l'élément avec cette image. Spécifiez une ressource d'image sous la forme d'une {URL} de données {BASE64}, ou saisissez une sous-expression.", + "expressionRepeatImage.error.repeatImage.missingMaxArgument": "{maxArgument} doit être défini si un {emptyImageArgument} est fourni.", + "expressionRepeatImage.functions.repeatImage.args.emptyImageHelpText": "Comble la différence entre les paramètres {CONTEXT} et {maxArg} pour l'élément avec cette image. Spécifiez une ressource d'image sous la forme d'une {URL} de données {BASE64}, ou saisissez une sous-expression.", "expressionRepeatImage.functions.repeatImage.args.imageHelpText": "L'image à répéter. Spécifiez une ressource d'image sous la forme d'une {URL} de données {BASE64}, ou saisissez une sous-expression.", "expressionRepeatImage.functions.repeatImage.args.maxHelpText": "Le nombre maximal de fois que l'image peut être répétée.", "expressionRepeatImage.functions.repeatImage.args.sizeHelpText": "La hauteur ou largeur maximale de l'image, en pixels. Lorsque l'image est plus haute que large, cette fonction limite la hauteur.", "expressionRepeatImage.functions.repeatImageHelpText": "Configure un élément de répétition d’image.", "expressionRepeatImage.renderer.repeatImage.displayName": "Répétition d’image", "expressionRepeatImage.renderer.repeatImage.helpDescription": "Présenter une répétition d’image basique", - "expressionRevealImage.functions.revealImage.args.emptyImageHelpText": "Une image d'arrière-plan facultative à révéler. Spécifiez une ressource d'image sous la forme d'une {URL} de données \"{BASE64}\", ou saisissez une sous-expression.", + "expressionRevealImage.functions.revealImage.args.emptyImageHelpText": "Une image d'arrière-plan facultative à révéler. Spécifiez une ressource d'image sous la forme d’une {URL} de données `{BASE64}`, ou saisissez une sous-expression.", "expressionRevealImage.functions.revealImage.args.imageHelpText": "L'image à révéler. Spécifiez une ressource d'image sous la forme d'une {URL} de données {BASE64}, ou saisissez une sous-expression.", "expressionRevealImage.functions.revealImage.args.originHelpText": "La position à laquelle démarrer le remplissage de l'image. Par exemple, {list} ou {end}.", "expressionRevealImage.functions.revealImage.invalidImageUrl": "URL d'image non valide : \"{imageUrl}\".", @@ -2767,20 +2925,20 @@ "expressionRevealImage.functions.revealImageHelpText": "Configure un élément de révélation d'image.", "expressionRevealImage.renderer.revealImage.displayName": "Révélation d'image", "expressionRevealImage.renderer.revealImage.helpDescription": "Révèle un pourcentage d'une image pour concevoir un graphique à jauge personnalisé.", - "expressions.execution.functionDisabled": "La fonction {fnName} est désactivée.", - "expressions.execution.functionNotFound": "La fonction {fnName} est introuvable.", - "expressions.functions.createTableHelpText": "Crée une table de données avec une liste de colonnes, et une ou plusieurs lignes vides. Pour renseigner les lignes, utilisez {mapColumnFn} ou {mathColumnFn}.", - "expressions.functions.font.args.familyHelpText": "Une chaîne de police Web {css} acceptable", + "expressions.execution.functionDisabled": "Fonction {fnName} désactivée.", + "expressions.execution.functionNotFound": "Fonction {fnName} introuvable.", + "expressions.functions.createTableHelpText": "Crée une table de données avec une liste de colonnes, et une ou plusieurs lignes vides. Pour générer les lignes, utilisez {mapColumnFn} ou {mathColumnFn}.", + "expressions.functions.font.args.familyHelpText": "Une chaîne de police Internet {css} acceptable", "expressions.functions.font.args.weightHelpText": "L’épaisseur de la police. Par exemple, {list} ou {end}.", - "expressions.functions.mapColumn.args.expressionHelpText": "Une expression qui est exécutée sur chaque ligne, fournie avec un contexte {DATATABLE} de ligne unique et renvoyant la valeur de la cellule.", - "expressions.functions.mapColumnHelpText": "Ajoute une colonne calculée comme le résultat d'autres colonnes. Des modifications ne sont apportées que si des arguments sont fournis. Voir aussi {alterColumnFn} et {staticColumnFn}.", - "expressions.functions.math.args.expressionHelpText": "Expression {TINYMATH} évaluée. Voir {TINYMATH_URL}.", - "expressions.functions.math.args.onErrorHelpText": "Si l'évaluation {TINYMATH} échoue ou renvoie NaN, la valeur de retour est spécifiée par onError. Lors de la ''génération'', une exception est levée, terminant l'exécution de l'expression (par défaut).", - "expressions.functions.math.tooManyResultsErrorMessage": "Les expressions doivent retourner un nombre unique. Essayez d'englober votre expression dans {mean} ou {sum}", + "expressions.functions.mapColumn.args.expressionHelpText": "Une expression qui est exécutée sur chaque ligne, fournie avec un contexte {DATATABLE} de ligne unique et retournant la valeur de la cellule.", + "expressions.functions.mapColumnHelpText": "Ajoute une colonne calculée comme le résultat d'autres colonnes. Des modifications ne sont apportées que si des arguments sont fournis. Voir également {alterColumnFn} et {staticColumnFn}.", + "expressions.functions.math.args.expressionHelpText": "Une expression {TINYMATH} évaluée. Voir {TINYMATH_URL}.", + "expressions.functions.math.args.onErrorHelpText": "Si l’évaluation {TINYMATH} échoue ou renvoie NaN, la valeur de retour est spécifiée par onError. Avec `'throw'`, une exception est levée, terminant l'exécution de l'expression (par défaut).", + "expressions.functions.math.tooManyResultsErrorMessage": "Les expressions doivent renvoyer un nombre unique. Essayez d'englober votre expression dans {mean} ou {sum}.", "expressions.functions.mathColumn.arrayValueError": "Impossible de réaliser le calcul sur les valeurs du tableau à {name}", - "expressions.functions.mathColumnHelpText": "Ajoute une colonne en évaluant {tinymath} sur chaque ligne. Cette fonction est optimisée pour les mathématiques et offre de meilleures performances par rapport à l'utilisation d'une expression mathématique dans {mapColumnFn}.", - "expressions.functions.mathHelpText": "Interprète une expression mathématique {TINYMATH} à l'aide d'un {TYPE_NUMBER} ou d'une {DATATABLE} en tant que {CONTEXT}. Les colonnes {DATATABLE} peuvent être recherchées d'après leur nom. Si {CONTEXT} est un nombre, il est disponible en tant que {value}.", - "expressions.functions.seriesCalculations.columnConflictMessage": "L'ID de colonne de sortie (outputColumnId) {columnId} existe déjà. Veuillez choisir un autre ID de colonne.", + "expressions.functions.mathColumnHelpText": "Ajoute une colonne en évaluant {tinymath} sur chaque ligne. Cette fonction est optimisée pour les mathématiques et livre de meilleures performances par rapport à l'utilisation d'une expression mathématique dans {mapColumnFn}.", + "expressions.functions.mathHelpText": "Interprète une expression mathématique {TINYMATH} à l'aide d'un {TYPE_NUMBER} ou d'une {DATATABLE} en tant que {CONTEXT}. Les colonnes {DATATABLE} peuvent être recherchées d’après leur nom. Si {CONTEXT} est un nombre, il est disponible en tant que {value}.", + "expressions.functions.seriesCalculations.columnConflictMessage": "L'ID de colonne de sortie {columnId} existe déjà. Veuillez choisir un autre ID de colonne.", "expressions.functions.uiSetting.error.parameter": "Paramètre \"{parameter}\" non valide.", "expressions.types.number.fromStringConversionErrorMessage": "Impossible de cataloguer la chaîne \"{string}\" en nombre", "expressions.defaultErrorRenderer.errorTitle": "Erreur dans la visualisation", @@ -2843,11 +3001,13 @@ "expressions.functions.varset.help": "Met à jour le contexte général de Kibana.", "expressions.functions.varset.name.help": "Spécifiez le nom de la variable.", "expressions.functions.varset.val.help": "Spécifiez la valeur de la variable. Sinon, le contexte d'entrée est utilisé.", - "expressionShape.functions.progress.args.fontHelpText": "Propriétés de la police {CSS} de l'étiquette. Par exemple, {FONT_FAMILY} ou {FONT_WEIGHT}.", + "expressionShape.functions.progress.args.fontHelpText": "Les propriétés de la police {CSS} pour l'étiquette. Par exemple, {FONT_FAMILY} ou {FONT_WEIGHT}.", "expressionShape.functions.progress.args.labelHelpText": "Pour afficher ou masquer l'étiquette, utilisez {BOOLEAN_TRUE} ou {BOOLEAN_FALSE}. Vous pouvez également spécifier une chaîne à afficher en tant qu'étiquette.", "expressionShape.functions.progress.args.shapeHelpText": "Sélectionnez {list} ou {end}.", + "expressionShape.functions.progress.invalidMaxValueErrorMessage": "Valeur {arg} non valide : \"{max, number}\" ; \"{arg}\" doit être supérieur à 0.", + "expressionShape.functions.progress.invalidValueErrorMessage": "Valeur non valide : \"{value, number}\". La valeur doit être comprise entre 0 et {max, number}.", "expressionShape.functions.shape.args.borderHelpText": "Une couleur {SVG} pour la bordure de la forme.", - "expressionShape.functions.shape.args.fillHelpText": "Une couleur {SVG} pour le remplissage de la forme.", + "expressionShape.functions.shape.args.fillHelpText": "Une couleur {SVG} de remplissage de la forme.", "expressionShape.functions.progress.args.barColorHelpText": "La couleur de la barre d'arrière-plan.", "expressionShape.functions.progress.args.barWeightHelpText": "L'épaisseur de la barre d'arrière-plan.", "expressionShape.functions.progress.args.maxHelpText": "La valeur maximale de l'élément de progression.", @@ -2866,7 +3026,7 @@ "expressionXY.annotations.skippedCount": "+{value} de plus…", "expressionXY.legend.filterOptionsLegend": "{legendDataLabel}, options de filtre", "expressionXY.tooltipActions.filterForXSeries": "Filtrer sur {value}", - "expressionXY.tooltipActions.filterValues": "Filtrer {seriesNumber} séries sélectionnées", + "expressionXY.tooltipActions.filterValues": "Filtrer l{seriesNumber} séries sélectionnées", "expressionXY.annotation.label": "Étiquette", "expressionXY.annotation.time": "Heure", "expressionXY.annotationLayer.annotations.help": "Annotations", @@ -2951,27 +3111,28 @@ "expressionXY.referenceLineLayer.decorationConfig.help": "Décoration supplémentaire de la ligne de référence", "expressionXY.referenceLineLayer.help": "Configurer une ligne de référence dans le graphique xy", "expressionXY.reusable.function.axisExtentConfig.errors.emptyUpperBound": "La limite supérieure doit être supérieure à la limite inférieure, si le mode personnalisé est activé.", - "expressionXY.reusable.function.dataLayer.errors.markSizeAccessorForNonLineOrAreaChartsError": "Impossible d'utiliser \"markSizeAccessor\". Les points sont appliqués uniquement pour les graphiques linéaires ou les graphiques en aires", - "expressionXY.reusable.function.legendConfig.errors.alignmentUsageWithFalsyIsInsideError": "Les arguments \"horizontalAlignment\" et \"verticalAlignment\" ne sont pas appliqués si \"isInside = false\". Veuillez utiliser l'argument \"position\" à la place.", - "expressionXY.reusable.function.legendConfig.errors.floatingColumnsWithFalsyIsInsideError": "Les arguments \"floatingColumns\" ne sont pas appliqués si \"isInside = false\".", - "expressionXY.reusable.function.legendConfig.errors.legendSizeWithFalsyIsInsideError": "L'argument \"legendSize\" n'est pas appliqué si \"isInside = false\".", - "expressionXY.reusable.function.legendConfig.errors.positionUsageWithIsInsideError": "L'argument \"position\" n'est pas appliqué si \"isInside = true\". Veuillez utiliser les arguments \"horizontalAlignment\" et \"verticalAlignment\" à la place.", + "expressionXY.reusable.function.dataLayer.errors.markSizeAccessorForNonLineOrAreaChartsError": "Impossible d'utiliser `markSizeAccessor`. Les points sont appliqués uniquement pour les graphiques linéaires ou les graphiques en aires", + "expressionXY.reusable.function.legendConfig.errors.alignmentUsageWithFalsyIsInsideError": "Les arguments `horizontalAlignment` et `verticalAlignment` ne sont pas appliqués si `isInside = false`. Veuillez utiliser l'argument `position` à la place.", + "expressionXY.reusable.function.legendConfig.errors.floatingColumnsWithFalsyIsInsideError": "Les arguments `floatingColumns` ne sont pas appliqués si `isInside = false`.", + "expressionXY.reusable.function.legendConfig.errors.legendSizeWithFalsyIsInsideError": "L'argument `legendSize` n'est pas appliqué si `isInside = false`.", + "expressionXY.reusable.function.legendConfig.errors.positionUsageWithIsInsideError": "L'argument `position` n'est pas appliqué si `isInside = true`. Veuillez utiliser les arguments `horizontalAlignment` et `verticalAlignment` à la place.", "expressionXY.reusable.function.xyVis.errors.axisIsNotAssignedError": "L'axe avec l'ID : \"{axisId}\" n'est assigné à aucun accesseur. Veuillez attribuer un axe en utilisant la construction suivante : `decorations=\\{dataDecorationConfig forAccessor=\"your-accessor\" axisId=\"{axisId}\"\\}`", "expressionXY.reusable.function.xyVis.errors.dataBoundsForNotLineChartError": "Seuls les graphiques linéaires peuvent être adaptés aux limites de données", "expressionXY.reusable.function.xyVis.errors.extendBoundsAreInvalidError": "Pour les modes de graphiques en aires et à barres, et le mode d'extension personnalisée, la limite inférieure doit être inférieure ou supérieure à 0, et la limite supérieure doit être supérieure ou égale à 0", "expressionXY.reusable.function.xyVis.errors.extentFullModeIsInvalid": "Pour la portée de l'axe x, le mode complet n'est pas pris en charge.", "expressionXY.reusable.function.xyVis.errors.extentModeNotSupportedError": "La portée de l'axe x n'est prise en charge que pour les histogrammes numériques.", + "expressionXY.reusable.function.xyVis.errors.invalidMinBarHeightError": "La hauteur minimale de la barre de progression doit être un chiffre entier positif, représentant la hauteur en pixel de la barre.", "expressionXY.reusable.function.xyVis.errors.isInvalidIntervalError": "L'intervalle de l'axe X fourni n'est pas valide. L'intervalle doit inclure une quantité et des noms d'unité. Exemples : 1d, 24h, 1w.", "expressionXY.reusable.function.xyVis.errors.linesVisibilityForNonLineChartError": "La visibilité des lignes ne peut être contrôlée que sur les graphiques linéaires.", - "expressionXY.reusable.function.xyVis.errors.lineWidthForNonLineOrAreaChartError": "\"lineWidth\" peut être appliqué uniquement aux graphiques linéaires ou aux graphiques en aires", + "expressionXY.reusable.function.xyVis.errors.lineWidthForNonLineOrAreaChartError": "`lineWidth` peut être appliqué uniquement aux graphiques linéaires ou aux graphiques en aires", "expressionXY.reusable.function.xyVis.errors.markSizeLimitsError": "Le rapport de taille de marque doit être supérieur ou égal à 1 et inférieur ou égal à 100", - "expressionXY.reusable.function.xyVis.errors.markSizeRatioWithoutAccessor": "Le rapport de taille de marque peut être appliqué uniquement avec \"markSizeAccessor\"", - "expressionXY.reusable.function.xyVis.errors.minTimeBarIntervalNotForTimeBarChartError": "L'argument \"minTimeBarInterval\" s'applique uniquement aux graphiques temporels à barres.", - "expressionXY.reusable.function.xyVis.errors.notUsedFillOpacityError": "L'argument \"fillOpacity\" s'applique uniquement aux graphiques en aires.", - "expressionXY.reusable.function.xyVis.errors.pointsRadiusForNonLineOrAreaChartError": "\"pointsRadius\" peut être appliqué uniquement aux graphiques linéaires ou aux graphiques en aires", - "expressionXY.reusable.function.xyVis.errors.showPointsForNonLineOrAreaChartError": "\"showPoints\" peut être appliqué uniquement aux graphiques linéaires ou aux graphiques en aires", + "expressionXY.reusable.function.xyVis.errors.markSizeRatioWithoutAccessor": "Le rapport de taille de marque peut être appliqué uniquement avec `markSizeAccessor`", + "expressionXY.reusable.function.xyVis.errors.minTimeBarIntervalNotForTimeBarChartError": "L'argument `minTimeBarInterval` s'applique uniquement aux graphiques temporels à barres.", + "expressionXY.reusable.function.xyVis.errors.notUsedFillOpacityError": "L'argument `fillOpacity` s'applique uniquement aux graphiques en aires.", + "expressionXY.reusable.function.xyVis.errors.pointsRadiusForNonLineOrAreaChartError": "`pointsRadius` peut être appliqué uniquement aux graphiques linéaires ou aux graphiques en aires", + "expressionXY.reusable.function.xyVis.errors.showPointsForNonLineOrAreaChartError": "`showPoints` peut être appliqué uniquement aux graphiques linéaires ou aux graphiques en aires", "expressionXY.reusable.function.xyVis.errors.timeMarkerForNotTimeChartsError": "Seuls les graphiques temporels peuvent avoir un repère de temps actuel", - "expressionXY.reusable.function.xyVis.errors.valueLabelsForNotBarChartsError": "L'argument \"valueLabels\" s'applique uniquement aux graphiques à barres.", + "expressionXY.reusable.function.xyVis.errors.valueLabelsForNotBarChartsError": "L'argument `valueLabels` s'applique uniquement aux graphiques à barres.", "expressionXY.tooltipActions.emptyFilterSelection": "Sélectionner au moins une série à filtrer", "expressionXY.tooltipActions.filterByTime": "Filtrer temporellement", "expressionXY.xAxisConfigFn.help": "Configurer la config de l'axe x du graphique xy", @@ -3010,6 +3171,7 @@ "expressionXY.xyVis.logDatatable.splitRow": "Diviser les lignes par", "expressionXY.xyVis.logDatatable.x": "Axe horizontal", "expressionXY.xyVis.markSizeRatio.help": "Spécifie le rapport des points pour les graphiques linéaires et les graphiques en aires", + "expressionXY.xyVis.minBarHeight.help": "Spécifie la hauteur minimale des barres en pixels pour le graphique à barres", "expressionXY.xyVis.orderBucketsBySum.help": "Classer les groupes par somme", "expressionXY.xyVis.referenceLines.help": "Ligne de référence", "expressionXY.xyVis.renderer.help": "Outil de rendu de graphique X/Y", @@ -3024,11 +3186,11 @@ "expressionXY.yAxisConfigFn.help": "Configurer la config de l'axe y du graphique xy", "fieldFormats.advancedSettings.format.bytesFormatText": "{numeralFormatLink} par défaut pour le format \"octets\"", "fieldFormats.advancedSettings.format.currencyFormatText": "{numeralFormatLink} par défaut pour le format \"devise\"", - "fieldFormats.advancedSettings.format.defaultTypeMapText": "Mapping du nom du format à utiliser par défaut pour chaque type de champ. {defaultFormat} est utilisé lorsque le type de champ n'est pas mentionné explicitement.", + "fieldFormats.advancedSettings.format.defaultTypeMapText": "Mapping du nom du format à utiliser par défaut pour chaque type de champ. Le format {defaultFormat} est utilisé lorsque le type de champ n'est pas mentionné explicitement.", "fieldFormats.advancedSettings.format.formattingLocaleText": "Paramètre régional {numeralLanguageLink}", "fieldFormats.advancedSettings.format.numberFormatText": "{numeralFormatLink} par défaut pour le format \"nombre\"", "fieldFormats.advancedSettings.format.percentFormatText": "{numeralFormatLink} par défaut pour le format \"pourcentage\"", - "fieldFormats.geoUtils.outOfRangeErrorMsg": "Doit être compris entre {min} et {max}", + "fieldFormats.geoUtils.outOfRangeErrorMsg": "Doit être compris entre {min} et {max}", "fieldFormats.advancedSettings.format.bytesFormat.numeralFormatLinkText": "Format numérique", "fieldFormats.advancedSettings.format.bytesFormatTitle": "Format octets", "fieldFormats.advancedSettings.format.currencyFormat.numeralFormatLinkText": "Format numérique", @@ -3108,13 +3270,15 @@ "fieldFormats.url.types.img": "Image", "fieldFormats.url.types.link": "Lien", "generateCsv.esErrorMessage": "Réponse {statusCode} reçue d'Elasticsearch : {message}", - "generateCsv.incorrectRowCount": "Une erreur a été rencontrée avec le nombre de lignes CSV générées à partir de la recherche : {expected} prévues, {received} reçues.", + "generateCsv.incorrectRowCount": "Une erreur a été rencontrée avec le nombre de lignes CSV générées de la recherche : {expected} prévues, {received} reçues.", + "generateCsv.indeterminableRowCount": "Une erreur a été rencontrée avec le nombre de lignes CSV générées à partir de la recherche : les lignes attendues étaient indéterminables, {received} reçues.", "generateCsv.unknownErrorMessage": "Une erreur inconnue est survenue : {message}", "generateCsv.authenticationExpired.partialResultsMessage": "Ce rapport contient des résultats CSV partiels, car le token d'authentification a expiré. Exportez une quantité moindre de données ou augmentez le délai d'expiration du token d'authentification.", "generateCsv.csvUnableToClosePit": "Impossible de fermer le point temporel utilisé pour la recherche. Vérifiez les logs de serveur Kibana.", + "generateCsv.csvUnableToCloseScroll": "Impossible de fermer le contexte de défilement utilisé pour la recherche. Vérifiez les logs de serveur Kibana.", "generateCsv.escapedFormulaValues": "Le CSV peut contenir des formules dont les valeurs sont précédées d'un caractère d'échappement", - "grouping.eventsTab.unit": "{totalCount, plural, =1 {événement} one {événements} many {événements} other {événements}}", - "grouping.groupByPanelTitle": "Sélectionner jusqu'à {groupingLevelsCount} regroupements", + "grouping.eventsTab.unit": "{totalCount, plural, =1 {événement} other {événements}}", + "grouping.groupByPanelTitle": "Sélectionnez jusqu'à {groupingLevelsCount} regroupements", "grouping.nullGroup.title": "Le groupe par champ sélectionné, {selectedGroup}, a une valeur manquante de {unit} pour ce groupe.", "grouping.additionalActions.takeAction": "Entreprendre des actions", "grouping.alerts.label": "Regrouper les alertes par", @@ -3122,14 +3286,15 @@ "grouping.customGroupByPanelTitle": "Champ personnalisé Regrouper par", "grouping.empty.description": "Essayer de rechercher sur une période plus longue ou de modifier votre champ d'alertes de groupe", "grouping.empty.title": "Aucun résultat de regroupement ne correspond à votre champ d'alertes de groupe sélectionné", + "grouping.groupBySingleField": "Sélectionner un groupe", "grouping.groupSelector.customGroupByDropdownPlacehoder": "Effectuez une sélection", "grouping.groupSelector.customGroupByFieldLabel": "Champ", "grouping.groupSelector.customGroupByHelpText": "Il s'agit du champ utilisé pour l'agrégation de termes", "grouping.noneGroupByOptionName": "Aucun", "grouping.selector.grouping.label.add": "Ajouter", "guidedOnboarding.dropdownPanel.completeGuideFlyoutDescription": "Vous avez terminé le guide Elastic {guideName}. N'hésitez pas à consulter à nouveau les guides pour obtenir une assistance supplémentaire sur l'intégration ou pour un petit rappel.", - "guidedOnboarding.dropdownPanel.progressValueLabel": "{stepCount} étapes", - "guidedOnboarding.guidedSetupStepButtonLabel": "Guide de configuration : étape {stepNumber}", + "guidedOnboarding.dropdownPanel.progressValueLabel": "{stepCount} étapes", + "guidedOnboarding.guidedSetupStepButtonLabel": "Guide de configuration : étape {stepNumber}", "guidedOnboarding.dropdownPanel.backToGuidesLink": "Retour aux guides", "guidedOnboarding.dropdownPanel.closeButton.ariaLabel": "Fermer la boîte de dialogue modale", "guidedOnboarding.dropdownPanel.completedLabel": "Terminé", @@ -3156,15 +3321,16 @@ "guidedOnboarding.quitGuideModal.modalDescription": "Vous pouvez redémarrer le guide de configuration à tout moment à partir du menu Aide.", "guidedOnboarding.quitGuideModal.modalTitle": "Quitter ce guide ?", "guidedOnboarding.quitGuideModal.quitButtonLabel": "Quitter le guide", - "guidedOnboardingPackage.gettingStarted.cards.apmObservability.title": "Monitorer les performances de {lineBreak} mon application (APM / traçage)", + "guidedOnboardingPackage.gettingStarted.cards.apmObservability.title": "Surveiller les performances {lineBreak} de mon application (APM / traçage)", "guidedOnboardingPackage.gettingStarted.cards.appSearch.title": "Développer une application {lineBreak} au-dessus d'Elasticsearch", "guidedOnboardingPackage.gettingStarted.cards.cloudSecurity.title": "Sécuriser mes ressources cloud {lineBreak} grâce à la gestion du niveau de sécurité du cloud (CSPM)", - "guidedOnboardingPackage.gettingStarted.cards.databaseSearch.title": "Rechercher dans les bases de données {lineBreak} et les systèmes d’entreprise", + "guidedOnboardingPackage.gettingStarted.cards.databaseSearch.title": "Rechercher dans les bases de données {lineBreak} et les systèmes d'entreprise", "guidedOnboardingPackage.gettingStarted.cards.hostsSecurity.title": "Sécuriser mes hôtes {lineBreak} avec Endpoint Security", - "guidedOnboardingPackage.gettingStarted.cards.progressLabel": "{numberCompleteSteps} étape(s) terminée(s) sur {numberSteps}", - "guidedOnboardingPackage.gettingStarted.cards.siemSecurity.title": "Détecter les menaces dans {lineBreak} mes données avec SIEM", + "guidedOnboardingPackage.gettingStarted.cards.progressLabel": "{numberCompleteSteps} étapes terminées sur {numberSteps}", + "guidedOnboardingPackage.gettingStarted.cards.siemSecurity.title": "Détecter les menaces dans mes {lineBreak} données avec SIEM", "guidedOnboardingPackage.gettingStarted.cards.aiSearch.title": "Développer une expérience de recherche optimisée par l'IA", "guidedOnboardingPackage.gettingStarted.cards.completeLabel": "Guide terminé", + "guidedOnboardingPackage.gettingStarted.cards.elasticsearchApi.title": "Se connecter à l'API Elasticsearch", "guidedOnboardingPackage.gettingStarted.cards.hostsObservability.title": "Monitorer mes indicateurs d'hôte", "guidedOnboardingPackage.gettingStarted.cards.kubernetesObservability.title": "Monitorer les clusters Kubernetes", "guidedOnboardingPackage.gettingStarted.cards.logsObservability.title": "Collecter et analyser mes logs", @@ -3178,43 +3344,43 @@ "guidedOnboardingPackage.gettingStarted.guideFilter.security.buttonLabel": "Sécurité", "home.loadTutorials.requestFailedErrorMessage": "Échec de la requête avec le code de statut : {status}", "home.tutorial.addDataToKibanaDescription": "En plus d'ajouter {integrationsLink}, vous pouvez essayer l'exemple de données ou charger vos propres données.", - "home.tutorial.noTutorialLabel": "Tutoriel {tutorialId} introuvable", - "home.tutorial.savedObject.addedLabel": "{savedObjectsLength} objets enregistrés ont bien été ajoutés", - "home.tutorial.savedObject.installStatusLabel": "Il existe déjà {overwriteErrorsLength} objet(s) sur {savedObjectsLength}. Cliquez sur \"Confirmer l'écrasement\" pour importer et écraser les objets existants. Toute modification apportée aux objets sera perdue.", - "home.tutorial.savedObject.requestFailedErrorMessage": "Échec de la requête. Erreur : {message}", - "home.tutorial.savedObject.unableToAddErrorMessage": "Impossible d'ajouter {errorsLength} objet(s) Kibana sur {savedObjectsLength}, erreur : {errorMessage}", - "home.tutorial.unexpectedStatusCheckStateErrorDescription": "État de vérification du statut {statusCheckState} inattendu", - "home.tutorial.unhandledInstructionTypeErrorDescription": "Type d'instruction {visibleInstructions} non géré", + "home.tutorial.noTutorialLabel": "Tutoriel {tutorialId} introuvable", + "home.tutorial.savedObject.addedLabel": "{savedObjectsLength} objets enregistrés ont bien été ajoutés.", + "home.tutorial.savedObject.installStatusLabel": "{overwriteErrorsLength} objets sur {savedObjectsLength} existent déjà. Cliquez sur \"Confirmer l'écrasement\" pour importer et écraser les objets existants. Toute modification apportée aux objets sera perdue.", + "home.tutorial.savedObject.requestFailedErrorMessage": "Échec de la requête. Erreur : {message}.", + "home.tutorial.savedObject.unableToAddErrorMessage": "Impossible d'ajouter {errorsLength} objets Kibana sur {savedObjectsLength} . Erreur : {errorMessage}.", + "home.tutorial.unexpectedStatusCheckStateErrorDescription": "État de vérification du statut {statusCheckState} inattendu", + "home.tutorial.unhandledInstructionTypeErrorDescription": "Type d'instructions {visibleInstructions} non pris en charge", "home.tutorials.activemqLogs.longDescription": "Collectez les logs ActiveMQ avec Filebeat. [En savoir plus]({learnMoreLink}).", - "home.tutorials.activemqMetrics.longDescription": "Le module Metricbeat ''activemq'' récupère les indicateurs depuis les instances ActiveMQ. [En savoir plus]({learnMoreLink}).", - "home.tutorials.aerospikeMetrics.longDescription": "Le module Metricbeat ''aerospike'' récupère les indicateurs d'Aerospike. [En savoir plus]({learnMoreLink}).", + "home.tutorials.activemqMetrics.longDescription": "Le module Metricbeat `activemq` récupère les indicateurs depuis les instances ActiveMQ. [En savoir plus]({learnMoreLink}).", + "home.tutorials.aerospikeMetrics.longDescription": "Le module Metricbeat `aerospike` récupère les indicateurs d'Aerospike. [En savoir plus]({learnMoreLink}).", "home.tutorials.apacheLogs.longDescription": "Le module Filebeat ''apache'' analyse les logs d'accès et d'erreurs créés par le serveur HTTP Apache. [En savoir plus]({learnMoreLink}).", - "home.tutorials.apacheMetrics.longDescription": "Le module Metricbeat ''apache'' récupère les indicateurs depuis le serveur HTTP Apache 2. [En savoir plus]({learnMoreLink}).", + "home.tutorials.apacheMetrics.longDescription": "Le module Metricbeat `apache ` récupère les indicateurs depuis le serveur HTTP Apache 2. [En savoir plus]({learnMoreLink}).", "home.tutorials.auditbeat.longDescription": "Utilisez Auditbeat pour collecter les données d'audit de vos hôtes. Ces données incluent les processus, utilisateurs, connexions, informations de socket, accès aux fichiers et bien plus encore. [En savoir plus]({learnMoreLink}).", - "home.tutorials.auditdLogs.longDescription": "Le module collecte et analyse les logs du démon d'audit (''auditd'') [En savoir plus]({learnMoreLink}).", + "home.tutorials.auditdLogs.longDescription": "Le module collecte et analyse les logs du démon d'audit (`auditd`) [En savoir plus]({learnMoreLink}).", "home.tutorials.awsLogs.longDescription": "Collectez des logs AWS en les exportant vers un compartiment S3 configuré avec la notification SQS [En savoir plus]({learnMoreLink}).", - "home.tutorials.awsMetrics.longDescription": "Le module Metricbeat ''aws'' récupère les indicateurs depuis les API AWS et Cloudwatch. [En savoir plus]({learnMoreLink}).", - "home.tutorials.azureLogs.longDescription": "Le module Filebeat ''azure'' collecte les logs d'activité et d'audit Azure. [En savoir plus]({learnMoreLink}).", - "home.tutorials.azureMetrics.longDescription": "Le module Metricbeat ''azure'' récupère les indicateurs de monitoring Azure. [En savoir plus]({learnMoreLink}).", - "home.tutorials.barracudaLogs.longDescription": "Ce module permet de recevoir les logs Barracuda Web Application Firewall par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", - "home.tutorials.bluecoatLogs.longDescription": "Ce module permet de recevoir les logs Blue Coat Director par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", - "home.tutorials.cefLogs.longDescription": "Ce module permet de recevoir des données Common Event Format (CEF) par le biais de Syslog. Lorsque des messages sont reçus par le biais du protocole Syslog, l'entrée Syslog analyse l'en-tête et définit la valeur d'horodatage. Puis le processeur est appliqué pour analyser les données CEF. Les données décodées sont alors écrites dans un champ objet ''cef''. Enfin, tous les champs Elastic Common Schema (ECS) pouvant être renseignés avec les données CEF sont renseignés. [En savoir plus]({learnMoreLink}).", - "home.tutorials.cephMetrics.longDescription": "Le module Metricbeat ''ceph'' récupère les indicateurs depuis Ceph. [En savoir plus]({learnMoreLink}).", - "home.tutorials.checkpointLogs.longDescription": "Il s'agit d'un module pour les logs de pare-feu Check Point. Il prend en charge les logs de l'exportateur de logs au format Syslog. [En savoir plus]({learnMoreLink}).", - "home.tutorials.ciscoLogs.longDescription": "Il s'agit d'un module pour les logs de dispositifs réseau Cisco (ASA, FTD, IOS, Nexus). Il inclut les ensembles de fichiers suivants pour la réception des logs par le biais de Syslog ou d'un ficher : [En savoir plus]({learnMoreLink}).", + "home.tutorials.awsMetrics.longDescription": "Le module Metricbeat `aws` récupère les indicateurs depuis les API AWS et Cloudwatch. [En savoir plus]({learnMoreLink}).", + "home.tutorials.azureLogs.longDescription": "Le module Filebeat `azure` collecte les logs d’activité et d’audit Azure. [Learn more]({learnMoreLink}).", + "home.tutorials.azureMetrics.longDescription": "Le module Metricbeat `azure` récupère les indicateurs de monitoring Azure. [En savoir plus]({learnMoreLink}).", + "home.tutorials.barracudaLogs.longDescription": "Ce module permet de recevoir les logs Barracuda Web Application Firewall par le biais de Syslog ou d’un fichier. [Learn more]({learnMoreLink}).", + "home.tutorials.bluecoatLogs.longDescription": "Ce module permet de recevoir les logs Blue Coat Director par le biais de Syslog ou d’un fichier. [Learn more]({learnMoreLink}).", + "home.tutorials.cefLogs.longDescription": "Ce module permet de recevoir des données Common Event Format (CEF) par le biais de Syslog. Lorsque des messages sont reçus par le biais du protocole Syslog, l'entrée Syslog analyse l'en-tête et définit la valeur d'horodatage. Le processeur est ensuite appliqué pour analyser les données CEF. Les données décodées sont alors écrites dans un champ objet `cef`. Enfin, tous les champs Elastic Common Schema (ECS) ayant des correspondances CEF sont remplis. [En savoir plus]({learnMoreLink}).", + "home.tutorials.cephMetrics.longDescription": "Le module Metricbeat `ceph` récupère les indicateurs depuis Ceph. [En savoir plus]({learnMoreLink}).", + "home.tutorials.checkpointLogs.longDescription": "Il s'agit d'un module pour les logs de pare-feu Check Point. Il prend en charge les logs de l’exportateur de journaux au format Syslog. [Learn more]({learnMoreLink}).", + "home.tutorials.ciscoLogs.longDescription": "Il s'agit d'un module pour les logs de dispositifs réseau Cisco (ASA, FTD, IOS, Nexus). Il inclut les ensembles de fichiers suivants pour la réception des logs par le biais de Syslog ou d'un ficher. [En savoir plus]({learnMoreLink}).", "home.tutorials.cloudwatchLogs.longDescription": "Collectez les logs Cloudwatch en déployant Functionbeat à des fins d'exécution en tant que fonction AWS Lambda. [En savoir plus]({learnMoreLink}).", - "home.tutorials.cockroachdbMetrics.longDescription": "Le module Metricbeat ''cockroachbd'' récupère les indicateurs depuis CockroachDB. [En savoir plus]({learnMoreLink}).", + "home.tutorials.cockroachdbMetrics.longDescription": "Le module Metricbeat `cockroachbd` récupère les indicateurs depuis CockroachDB. [En savoir plus]({learnMoreLink}).", "home.tutorials.common.auditbeatCloudInstructions.config.debTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.auditbeatCloudInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.auditbeatCloudInstructions.config.rpmTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.auditbeatCloudInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", - "home.tutorials.common.auditbeatInstructions.config.debTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana . Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.auditbeatInstructions.config.debTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.auditbeatInstructions.config.debTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.auditbeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana . Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.auditbeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.auditbeatInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.auditbeatInstructions.config.rpmTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana . Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.auditbeatInstructions.config.rpmTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.auditbeatInstructions.config.rpmTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.auditbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.auditbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.auditbeatInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion :", "home.tutorials.common.auditbeatInstructions.install.debTextPost": "Vous cherchez les packages 32 bits ? Consultez la [page de téléchargement]({linkUrl}).", "home.tutorials.common.auditbeatInstructions.install.debTextPre": "Vous utilisez Auditbeat pour la première fois ? Consultez le [guide de démarrage rapide]({linkUrl}).", @@ -3222,27 +3388,27 @@ "home.tutorials.common.auditbeatInstructions.install.rpmTextPost": "Vous cherchez les packages 32 bits ? Consultez la [page de téléchargement]({linkUrl}).", "home.tutorials.common.auditbeatInstructions.install.rpmTextPre": "Vous utilisez Auditbeat pour la première fois ? Consultez le [guide de démarrage rapide]({linkUrl}).", "home.tutorials.common.auditbeatInstructions.install.windowsTextPost": "Modifiez les paramètres sous {propertyName} dans le fichier {auditbeatPath} afin de pointer vers votre installation Elasticsearch.", - "home.tutorials.common.auditbeatInstructions.install.windowsTextPre": "Vous utilisez Auditbeat pour la première fois ? Consultez le [guide de démarrage rapide]({guideLinkUrl}).\n 1. Téléchargez le fichier .zip Auditbeat pour Windows via la page [Télécharger]({auditbeatLinkUrl}).\n 2. Extrayez le contenu du fichier compressé (ZIP) dans {folderPath}.\n 3. Renommez le répertoire \"{directoryName}\" en \"Auditbeat\".\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Auditbeat en tant que service Windows.", + "home.tutorials.common.auditbeatInstructions.install.windowsTextPre": "Vous utilisez Auditbeat pour la première fois ? Consultez le [guide de démarrage rapide]({guideLinkUrl}).\n 1. Téléchargez le fichier .zip Auditbeat pour Windows via la page [Télécharger]({auditbeatLinkUrl}).\n 2. Extrayez le contenu du fichier compressé sous {folderPath}.\n 3. Renommez le répertoire `{directoryName}` en `Auditbeat`.\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Auditbeat en tant que service Windows.", "home.tutorials.common.filebeatCloudInstructions.config.debTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.filebeatCloudInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.filebeatCloudInstructions.config.rpmTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.filebeatCloudInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", - "home.tutorials.common.filebeatEnableInstructions.debTextPost": "Modifiez les paramètres dans le fichier \"/etc/filebeat/modules.d/{moduleName}.yml\". Vous devez activer au moins un ensemble de fichiers.", + "home.tutorials.common.filebeatEnableInstructions.debTextPost": "Modifiez les paramètres dans le fichier `/etc/filebeat/modules.d/{moduleName}.yml`. Vous devez activer au moins un ensemble de fichiers.", "home.tutorials.common.filebeatEnableInstructions.debTitle": "Activer et configurer le module {moduleName}", - "home.tutorials.common.filebeatEnableInstructions.osxTextPost": "Modifiez les paramètres dans le fichier \"modules.d/{moduleName}.yml\". Vous devez activer au moins un ensemble de fichiers.", + "home.tutorials.common.filebeatEnableInstructions.osxTextPost": "Modifiez les paramètres dans le fichier `modules.d/{moduleName}.yml`. Vous devez activer au moins un ensemble de fichiers.", "home.tutorials.common.filebeatEnableInstructions.osxTitle": "Activer et configurer le module {moduleName}", - "home.tutorials.common.filebeatEnableInstructions.rpmTextPost": "Modifiez les paramètres dans le fichier \"/etc/filebeat/modules.d/{moduleName}.yml\". Vous devez activer au moins un ensemble de fichiers.", + "home.tutorials.common.filebeatEnableInstructions.rpmTextPost": "Modifiez les paramètres dans le fichier `/etc/filebeat/modules.d/{moduleName}.yml`. Vous devez activer au moins un ensemble de fichiers.", "home.tutorials.common.filebeatEnableInstructions.rpmTitle": "Activer et configurer le module {moduleName}", - "home.tutorials.common.filebeatEnableInstructions.windowsTextPost": "Modifiez les paramètres dans le fichier \"modules.d/{moduleName}.yml\". Vous devez activer au moins un ensemble de fichiers.", - "home.tutorials.common.filebeatEnableInstructions.windowsTextPre": "Dans le dossier {path}, exécutez :", + "home.tutorials.common.filebeatEnableInstructions.windowsTextPost": "Modifiez les paramètres dans le fichier `modules.d/{moduleName}.yml`. Vous devez activer au moins un ensemble de fichiers.", + "home.tutorials.common.filebeatEnableInstructions.windowsTextPre": "Dans le dossier {path}, exécutez la commande suivante :", "home.tutorials.common.filebeatEnableInstructions.windowsTitle": "Activer et configurer le module {moduleName}", - "home.tutorials.common.filebeatInstructions.config.debTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana . Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.filebeatInstructions.config.debTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.filebeatInstructions.config.debTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.filebeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.filebeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.filebeatInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.filebeatInstructions.config.rpmTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana . Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.filebeatInstructions.config.rpmTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.filebeatInstructions.config.rpmTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.filebeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana . Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.filebeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.filebeatInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion :", "home.tutorials.common.filebeatInstructions.install.debTextPost": "Vous cherchez les packages 32 bits ? Consultez la [page de téléchargement]({linkUrl}).", "home.tutorials.common.filebeatInstructions.install.debTextPre": "Vous utilisez Filebeat pour la première fois ? Consultez le [guide de démarrage rapide]({linkUrl}).", @@ -3250,37 +3416,37 @@ "home.tutorials.common.filebeatInstructions.install.rpmTextPost": "Vous cherchez les packages 32 bits ? Consultez la [page de téléchargement]({linkUrl}).", "home.tutorials.common.filebeatInstructions.install.rpmTextPre": "Vous utilisez Filebeat pour la première fois ? Consultez le [guide de démarrage rapide]({linkUrl}).", "home.tutorials.common.filebeatInstructions.install.windowsTextPost": "Modifiez les paramètres sous {propertyName} dans le fichier {filebeatPath} afin de pointer vers votre installation Elasticsearch.", - "home.tutorials.common.filebeatInstructions.install.windowsTextPre": "Vous utilisez Filebeat pour la première fois ? Consultez le [guide de démarrage rapide]({guideLinkUrl}).\n 1. Téléchargez le fichier .zip Filebeat pour Windows via la page [Télécharger]({filebeatLinkUrl}).\n 2. Extrayez le contenu du fichier compressé (ZIP) dans {folderPath}.\n 3. Renommez le répertoire \"{directoryName}\" en \"Filebeat\".\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Filebeat en tant que service Windows.", - "home.tutorials.common.filebeatStatusCheck.text": "Vérifier que des données sont reçues du module Filebeat \"{moduleName}\"", + "home.tutorials.common.filebeatInstructions.install.windowsTextPre": "Vous utilisez Filebeat pour la première fois ? Consultez le [guide de démarrage rapide]({guideLinkUrl}).\n 1. Téléchargez le fichier .zip Filebeat pour Windows via la page [Télécharger]({filebeatLinkUrl}).\n 2. Extrayez le contenu du fichier compressé sous {folderPath}.\n 3. Renommez le répertoire `{directoryName}` en `Filebeat`.\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Filebeat en tant que service Windows.", + "home.tutorials.common.filebeatStatusCheck.text": "Vérifier que des données sont reçues du module Filebeat `{moduleName}`", "home.tutorials.common.functionbeatCloudInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.functionbeatCloudInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.functionbeatEnableOnPremInstructionsWindows.textPre": "Modifiez les paramètres dans le fichier {path}.", - "home.tutorials.common.functionbeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.functionbeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.functionbeatInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.functionbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.functionbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.functionbeatInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion :", "home.tutorials.common.functionbeatInstructions.install.linuxTextPre": "Vous utilisez Functionbeat pour la première fois ? Consultez le [guide de démarrage rapide]({link}).", "home.tutorials.common.functionbeatInstructions.install.osxTextPre": "Vous utilisez Functionbeat pour la première fois ? Consultez le [guide de démarrage rapide]({link}).", - "home.tutorials.common.functionbeatInstructions.install.windowsTextPre": "Vous utilisez Functionbeat pour la première fois ? Consultez le [guide de démarrage rapide]({functionbeatLink}).\n 1. Téléchargez le fichier .zip Functionbeat pour Windows via la page [Télécharger]({elasticLink}).\n 2. Extrayez le contenu du fichier compressé (ZIP) dans {folderPath}.\n 3. Renommez le répertoire {directoryName} en \"Functionbeat\".\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Depuis l'invite PowerShell, accédez au répertoire Functionbeat :", + "home.tutorials.common.functionbeatInstructions.install.windowsTextPre": "Vous utilisez Functionbeat pour la première fois ? Consultez le [guide de démarrage rapide]({functionbeatLink}).\n 1. Téléchargez le fichier .zip Functionbeat pour Windows via la page [Télécharger]({elasticLink}).\n 2. Extrayez le contenu du fichier compressé sous {folderPath}.\n 3. Renommez le répertoire `{directoryName}` en `Functionbeat`.\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Depuis l'invite PowerShell, accédez au répertoire Functionbeat :", "home.tutorials.common.heartbeatCloudInstructions.config.debTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.heartbeatCloudInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.heartbeatCloudInstructions.config.rpmTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.heartbeatCloudInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", - "home.tutorials.common.heartbeatEnableCloudInstructions.defaultTextPost": "Pour plus d'informations sur comment configurer des moniteurs dans Heartbeat, consultez les [documents de configuration de Heartbeat].({configureLink})", - "home.tutorials.common.heartbeatEnableOnPremInstructions.defaultTextPost": "Où {hostTemplate} est l'URL monitorée. Pour plus d'informations sur comment configurer des moniteurs dans Heartbeat, consultez les [documents de configuration de Heartbeat].({configureLink})", - "home.tutorials.common.heartbeatInstructions.config.debTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana . Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.heartbeatEnableCloudInstructions.defaultTextPost": "Pour plus d’informations sur comment configurer des moniteurs dans Heartbeat, consultez les [documents de configuration de Heartbeat.]({configureLink})", + "home.tutorials.common.heartbeatEnableOnPremInstructions.defaultTextPost": "Où {hostTemplate} est l’URL monitorée. Pour plus d’informations sur comment configurer des moniteurs dans Heartbeat, consultez les [documents de configuration de Heartbeat.]({configureLink})", + "home.tutorials.common.heartbeatInstructions.config.debTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.heartbeatInstructions.config.debTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.heartbeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana . Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.heartbeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.heartbeatInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.heartbeatInstructions.config.rpmTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana . Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.heartbeatInstructions.config.rpmTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.heartbeatInstructions.config.rpmTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.heartbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.heartbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.heartbeatInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion :", "home.tutorials.common.heartbeatInstructions.install.debTextPost": "Vous cherchez les packages 32 bits ? Consultez la [page de téléchargement]({link}).", "home.tutorials.common.heartbeatInstructions.install.debTextPre": "Vous utilisez Heartbeat pour la première fois ? Consultez le [guide de démarrage rapide]({link}).", "home.tutorials.common.heartbeatInstructions.install.osxTextPre": "Vous utilisez Heartbeat pour la première fois ? Consultez le [guide de démarrage rapide]({link}).", "home.tutorials.common.heartbeatInstructions.install.rpmTextPre": "Vous utilisez Heartbeat pour la première fois ? Consultez le [guide de démarrage rapide]({link}).", - "home.tutorials.common.heartbeatInstructions.install.windowsTextPre": "Vous utilisez Heartbeat pour la première fois ? Consultez le [guide de démarrage rapide]({heartbeatLink}).\n 1. Téléchargez le fichier .zip Heartbeat pour Windows via la page [Télécharger]({elasticLink}).\n 2. Extrayez le contenu du fichier compressé (ZIP) dans {folderPath}.\n 3. Renommez le répertoire {directoryName} en \"Heartbeat\".\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Heartbeat en tant que service Windows.", + "home.tutorials.common.heartbeatInstructions.install.windowsTextPre": "Vous utilisez Heartbeat pour la première fois ? Consultez le [guide de démarrage rapide]({heartbeatLink}).\n 1. Téléchargez le fichier .zip Heartbeat pour Windows via la page [Télécharger]({elasticLink}).\n 2. Extrayez le contenu du fichier compressé sous {folderPath}.\n 3. Renommez le répertoire `{directoryName}` en `Heartbeat`.\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Heartbeat en tant que service Windows.", "home.tutorials.common.logstashInstructions.install.java.osxTextPre": "Suivez les instructions d'installation [ici]({link}).", "home.tutorials.common.logstashInstructions.install.java.windowsTextPre": "Suivez les instructions d'installation [ici]({link}).", "home.tutorials.common.logstashInstructions.install.logstash.osxTextPre": "Vous utilisez Logstash pour la première fois ? Consultez le [guide de démarrage rapide]({link}).", @@ -3289,126 +3455,126 @@ "home.tutorials.common.metricbeatCloudInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.metricbeatCloudInstructions.config.rpmTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", "home.tutorials.common.metricbeatCloudInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", - "home.tutorials.common.metricbeatEnableInstructions.debTextPost": "Modifiez les paramètres dans le fichier \"/etc/metricbeat/modules.d/{moduleName}.yml\".", + "home.tutorials.common.metricbeatEnableInstructions.debTextPost": "Modifiez les paramètres dans le fichier `/etc/metricbeat/modules.d/{moduleName}.yml`.", "home.tutorials.common.metricbeatEnableInstructions.debTitle": "Activer et configurer le module {moduleName}", - "home.tutorials.common.metricbeatEnableInstructions.osxTextPost": "Modifiez les paramètres dans le fichier \"modules.d/{moduleName}.yml\".", + "home.tutorials.common.metricbeatEnableInstructions.osxTextPost": "Modifiez les paramètres dans le fichier `modules.d/{moduleName}.yml`.", "home.tutorials.common.metricbeatEnableInstructions.osxTitle": "Activer et configurer le module {moduleName}", - "home.tutorials.common.metricbeatEnableInstructions.rpmTextPost": "Modifiez les paramètres dans le fichier \"/etc/metricbeat/modules.d/{moduleName}.yml\".", + "home.tutorials.common.metricbeatEnableInstructions.rpmTextPost": "Modifiez les paramètres dans le fichier `/etc/metricbeat/modules.d/{moduleName}.yml`.", "home.tutorials.common.metricbeatEnableInstructions.rpmTitle": "Activer et configurer le module {moduleName}", - "home.tutorials.common.metricbeatEnableInstructions.windowsTextPost": "Modifiez les paramètres dans le fichier \"modules.d/{moduleName}.yml\".", - "home.tutorials.common.metricbeatEnableInstructions.windowsTextPre": "Dans le dossier {path}, exécutez :", + "home.tutorials.common.metricbeatEnableInstructions.windowsTextPost": "Modifiez les paramètres dans le fichier `modules.d/{moduleName}.yml`.", + "home.tutorials.common.metricbeatEnableInstructions.windowsTextPre": "Dans le dossier {path}, exécutez la commande suivante :", "home.tutorials.common.metricbeatEnableInstructions.windowsTitle": "Activer et configurer le module {moduleName}", - "home.tutorials.common.metricbeatInstructions.config.debTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.metricbeatInstructions.config.debTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.metricbeatInstructions.config.debTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.metricbeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.metricbeatInstructions.config.osxTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.metricbeatInstructions.config.osxTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.metricbeatInstructions.config.rpmTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.metricbeatInstructions.config.rpmTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.metricbeatInstructions.config.rpmTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.metricbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.metricbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.metricbeatInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion :", "home.tutorials.common.metricbeatInstructions.install.debTextPost": "Vous cherchez les packages 32 bits ? Consultez la [page de téléchargement]({link}).", "home.tutorials.common.metricbeatInstructions.install.debTextPre": "Vous utilisez Metricbeat pour la première fois ? Consultez le [guide de démarrage rapide]({link}).", "home.tutorials.common.metricbeatInstructions.install.osxTextPre": "Vous utilisez Metricbeat pour la première fois ? Consultez le [guide de démarrage rapide]({link}).", "home.tutorials.common.metricbeatInstructions.install.rpmTextPre": "Vous utilisez Metricbeat pour la première fois ? Consultez le [guide de démarrage rapide]({link}).", - "home.tutorials.common.metricbeatInstructions.install.windowsTextPost": "Modifiez les paramètres sous \"output.elasticsearch\" dans le fichier {path} afin de pointer vers votre installation Elasticsearch.", - "home.tutorials.common.metricbeatInstructions.install.windowsTextPre": "Vous utilisez Metricbeat pour la première fois ? Consultez le [guide de démarrage rapide]({metricbeatLink}).\n 1. Téléchargez le fichier .zip Metricbeat pour Windows via la page [Télécharger]({elasticLink}).\n 2. Extrayez le contenu du fichier compressé (ZIP) dans {folderPath}.\n 3. Renommez le répertoire {directoryName} en \"Metricbeat\".\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Metricbeat en tant que service Windows.", - "home.tutorials.common.metricbeatStatusCheck.text": "Vérifier que des données sont reçues du module Metricbeat \"{moduleName}\"", - "home.tutorials.common.premCloudInstructions.option1.textPre": "Accédez à [Elastic Cloud]({link}). Enregistrez-vous si vous n'avez pas encore de compte. Un essai gratuit de 14 jours est disponible.\n\nConnectez-vous à la console Elastic Cloud.\n\nPour créer un cluster, dans la console Elastic Cloud :\n 1. Sélectionnez **Créer un déploiement** et spécifiez le **Nom du déploiement**.\n 2. Modifiez les autres options de déploiement selon les besoins (sinon, les valeurs par défaut sont très bien pour commencer).\n 3. Cliquer sur **Créer un déploiement**\n 4. Attendre la fin de la création du déploiement\n 5. Accéder à la nouvelle instance cloud Kibana et suivre les instructions de la page d'accueil de Kibana", - "home.tutorials.common.premCloudInstructions.option2.textPre": "Si vous exécutez cette instance Kibana sur une instance Elasticsearch hébergée, passez à la configuration manuelle.\n\nEnregistrez le point de terminaison **Elasticsearch** en tant que {urlTemplate} et le cluster **Mot de passe** en tant que {passwordTemplate} pour les conserver", + "home.tutorials.common.metricbeatInstructions.install.windowsTextPost": "Modifiez les paramètres sous `output.elasticsearch` dans le fichier {path} afin de pointer vers votre installation Elasticsearch.", + "home.tutorials.common.metricbeatInstructions.install.windowsTextPre": "Vous utilisez Metricbeat pour la première fois ? Consultez le [guide de démarrage rapide]({metricbeatLink}).\n 1. Téléchargez le fichier .zip Metricbeat pour Windows via la page [Télécharger]({elasticLink}).\n 2. Extrayez le contenu du fichier compressé sous {folderPath}.\n 3. Renommez le répertoire `{directoryName}` en `Metricbeat`.\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Metricbeat en tant que service Windows.", + "home.tutorials.common.metricbeatStatusCheck.text": "Vérifier que des données sont reçues du module Metricbeat `{moduleName}`", + "home.tutorials.common.premCloudInstructions.option1.textPre": "Rendez-vous sur [Elastic Cloud]({link}). Enregistrez-vous si vous n'avez pas encore de compte. Un essai gratuit de 14 jours est disponible.\n\nConnectez-vous à la console Elastic Cloud.\n\nPour créer un cluster, dans la console Elastic Cloud :\n 1. Sélectionnez **Créer un déploiement** et spécifiez le **Nom du déploiement**.\n 2. Modifiez les autres options de déploiement selon les besoins (sinon, les valeurs par défaut sont très bien pour commencer).\n 3. Cliquer sur **Créer un déploiement**\n 4. Attendre la fin de la création du déploiement\n 5. Accéder à la nouvelle instance cloud Kibana et suivre les instructions de la page d'accueil de Kibana", + "home.tutorials.common.premCloudInstructions.option2.textPre": "Si vous exécutez cette instance Kibana sur une instance Elasticsearch hébergée, passez à la configuration manuelle.\n\nEnregistrez le point de terminaison **Elasticsearch** en tant que {urlTemplate} et le cluster **Mot de passe** en tant que {passwordTemplate} pour les conserver.", "home.tutorials.common.winlogbeatCloudInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion pour Elastic Cloud :", - "home.tutorials.common.winlogbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur \"elastic\", {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte numérique dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [En savoir plus]({linkUrl}).", + "home.tutorials.common.winlogbeatInstructions.config.windowsTextPostMarkdown": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`, {esUrlTemplate} est l'URL d'Elasticsearch et {kibanaUrlTemplate} est l'URL de Kibana. Pour [configurer le SSL]({configureSslUrl}) avec le certificat par défaut généré par Elasticsearch, ajoutez son empreinte digitale dans {esCertFingerprintTemplate}.\n\n > **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration. [Learn more]({linkUrl}).", "home.tutorials.common.winlogbeatInstructions.config.windowsTextPre": "Modifiez {path} afin de définir les informations de connexion :", - "home.tutorials.common.winlogbeatInstructions.install.windowsTextPost": "Modifiez les paramètres sous \"output.elasticsearch\" dans le fichier {path} afin de pointer vers votre installation Elasticsearch.", - "home.tutorials.common.winlogbeatInstructions.install.windowsTextPre": "Vous utilisez Winlogbeat pour la première fois ? Consultez le [guide de démarrage rapide]({winlogbeatLink}).\n 1. Téléchargez le fichier .zip Winlogbeat pour Windows via la page [Télécharger]({elasticLink}).\n 2. Extrayez le contenu du fichier compressé (ZIP) dans {folderPath}.\n 3. Renommez le répertoire {directoryName} en \"Winlogbeat\".\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Winlogbeat en tant que service Windows.", - "home.tutorials.consulMetrics.longDescription": "Le module Metricbeat \"consul\" récupère des indicateurs depuis Consul. [En savoir plus]({learnMoreLink}).", + "home.tutorials.common.winlogbeatInstructions.install.windowsTextPost": "Modifiez les paramètres sous `output.elasticsearch` dans le fichier {path} afin de pointer vers votre installation Elasticsearch.", + "home.tutorials.common.winlogbeatInstructions.install.windowsTextPre": "Vous utilisez Winlogbeat pour la première fois ? Consultez le [guide de démarrage rapide]({winlogbeatLink}).\n 1. Téléchargez le fichier .zip Winlogbeat pour Windows via la page [Télécharger]({elasticLink}).\n 2. Extrayez le contenu du fichier compressé sous {folderPath}.\n 3. Renommez le répertoire `{directoryName}` en `Winlogbeat`.\n 4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n 5. Dans l'invite PowerShell, exécutez les commandes suivantes afin d'installer Winlogbeat en tant que service Windows.", + "home.tutorials.consulMetrics.longDescription": "Le module Metricbeat `consul` récupère des indicateurs depuis Consul. [En savoir plus]({learnMoreLink}).", "home.tutorials.corednsLogs.longDescription": "Il s'agit d'un module Filebeat pour CoreDNS. Celui-ci prend en charge les déploiements CoreDNS autonomes et les déploiements CoreDNS dans Kubernetes. [En savoir plus]({learnMoreLink}).", - "home.tutorials.corednsMetrics.longDescription": "Le module Metricbeat \"coredns\" récupère des indicateurs depuis CoreDNS. [En savoir plus]({learnMoreLink}).", + "home.tutorials.corednsMetrics.longDescription": "Le module Metricbeat `coredns` récupère des indicateurs depuis CoreDNS. [En savoir plus]({learnMoreLink}).", "home.tutorials.couchbaseMetrics.longDescription": "Le module Metricbeat \"couchbase\" récupère des indicateurs depuis Couchbase. [En savoir plus]({learnMoreLink}).", - "home.tutorials.couchdbMetrics.longDescription": "Le module Metricbeat \"couchdb\" récupère des indicateurs depuis CouchDB. [En savoir plus]({learnMoreLink}).", + "home.tutorials.couchdbMetrics.longDescription": "Le module Metricbeat `couchdb` récupère des indicateurs depuis CouchDB. [En savoir plus]({learnMoreLink}).", "home.tutorials.crowdstrikeLogs.longDescription": "Il s'agit du module Filebeat pour CrowdStrike Falcon utilisant le [connecteur SIEM](https://www.crowdstrike.com/blog/tech-center/integrate-with-your-siem) Falcon. Ce module collecte ces données, les convertit en ECS et les ingère pour les afficher dans le SIEM. Par défaut, le connecteur SIEM Falcon génère les données d'événement de l'API de streaming Falcon au format JSON. [En savoir plus]({learnMoreLink}).", "home.tutorials.cylanceLogs.longDescription": "Ce module permet de recevoir des logs CylancePROTECT par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", - "home.tutorials.dockerMetrics.longDescription": "Le module Metricbeat \"docker\" récupère des indicateurs depuis le serveur Docker. [En savoir plus]({learnMoreLink}).", - "home.tutorials.dropwizardMetrics.longDescription": "Le module Metricbeat \"dropwizard\" récupère des indicateurs depuis l'application Java Dropwizard. [En savoir plus]({learnMoreLink}).", - "home.tutorials.elasticsearchLogs.longDescription": "Le module Filebeat \"elasticsearch\" analyse les logs créés par Elasticsearch. [En savoir plus]({learnMoreLink}).", - "home.tutorials.elasticsearchMetrics.longDescription": "Le module Metricbeat \"elasticsearch\" récupère des indicateurs depuis Elasticsearch. [En savoir plus]({learnMoreLink}).", - "home.tutorials.envoyproxyLogs.longDescription": "Il s'agit d'un module Filebeat pour le log d'accès à Envoy Proxy (https://www.envoyproxy.io/docs/envoy/v1.10.0/configuration/access_log). Celui-ci prend en charge les déploiements autonomes et les déploiements Envoy Proxy dans Kubernetes. [En savoir plus]({learnMoreLink}).", - "home.tutorials.envoyproxyMetrics.longDescription": "Le module Metricbeat \"envoyproxy\" récupère des indicateurs depuis Envoy Proxy. [En savoir plus]({learnMoreLink}).", - "home.tutorials.etcdMetrics.longDescription": "Le module Metricbeat \"etcd\" récupère des indicateurs depuis Etcd. [En savoir plus]({learnMoreLink}).", + "home.tutorials.dockerMetrics.longDescription": "Le module Metricbeat `docker` récupère des indicateurs depuis le serveur Docker. [En savoir plus]({learnMoreLink}).", + "home.tutorials.dropwizardMetrics.longDescription": "Le module Metricbeat `dropwizard` récupère des indicateurs depuis l'application Java Dropwizard. [En savoir plus]({learnMoreLink}).", + "home.tutorials.elasticsearchLogs.longDescription": "Le module Filebeat `elasticsearch` analyse les logs créés par Elasticsearch. [En savoir plus]({learnMoreLink}).", + "home.tutorials.elasticsearchMetrics.longDescription": "Le module Metricbeat `elasticsearch` récupère des indicateurs depuis Elasticsearch. [En savoir plus]({learnMoreLink}).", + "home.tutorials.envoyproxyLogs.longDescription": "Il s'agit d'un module Filebeat pour le log d'accès à Envoy Proxy (https://www.envoyproxy.io/docs/envoy/v1.10.0/configuration/access_log). Celui-ci prend en charge les déploiements autonomes et les déploiements Envoy Proxy dans Kubernetes. [Learn more]({learnMoreLink}).", + "home.tutorials.envoyproxyMetrics.longDescription": "Le module Metricbeat `envoyproxy` récupère des indicateurs depuis Envoy Proxy. [En savoir plus]({learnMoreLink}).", + "home.tutorials.etcdMetrics.longDescription": "Le module Metricbeat `etcd` récupère des indicateurs depuis Etcd. [En savoir plus]({learnMoreLink}).", "home.tutorials.f5Logs.longDescription": "Ce module permet de recevoir des logs Big-IP Access Policy Manager par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", "home.tutorials.fortinetLogs.longDescription": "Il s'agit d'un module pour les logs Fortinet FortiOS envoyés au format Syslog. [En savoir plus]({learnMoreLink}).", - "home.tutorials.gcpLogs.longDescription": "Il s'agit d'un module pour les logs Google Cloud. Il prend en charge la lecture des logs d'audit, de flux VPC et de pare-feu qui ont été exportés depuis Stackdriver vers un récepteur de rubriques Google Pub/Sub. [En savoir plus]({learnMoreLink}).", - "home.tutorials.gcpMetrics.longDescription": "Le module Metricbeat \"gcp\" récupère des indicateurs depuis Google Cloud Platform à l'aide de l'API de monitoring Stackdriver. [En savoir plus]({learnMoreLink}).", - "home.tutorials.golangMetrics.longDescription": "Le module Metricbeat \"{moduleName}\" récupère des indicateurs depuis une application Golang. [En savoir plus]({learnMoreLink}).", + "home.tutorials.gcpLogs.longDescription": "Il s'agit d'un module pour les logs Google Cloud. Il prend en charge la lecture des logs d'audit, de flux VPC et de pare-feu qui ont été exportés depuis Stackdriver dans un récepteur de rubriques Google Pub/Sub. [En savoir plus]({learnMoreLink}).", + "home.tutorials.gcpMetrics.longDescription": "Le module Metricbeat `gcp` récupère des indicateurs depuis Google Cloud Platform à l'aide de l'API de monitoring Stackdriver. [En savoir plus]({learnMoreLink}).", + "home.tutorials.golangMetrics.longDescription": "Le module Metricbeat `{moduleName}` récupère des indicateurs depuis une application Golang. [En savoir plus]({learnMoreLink}).", "home.tutorials.gsuiteLogs.longDescription": "Il s'agit d'un module pour l'ingestion de données depuis les différentes API de rapports d'audit GSuite. [En savoir plus]({learnMoreLink}).", - "home.tutorials.haproxyLogs.longDescription": "Le module collecte et analyse les logs d'un processus (\"haproxy\") [En savoir plus]({learnMoreLink}).", - "home.tutorials.haproxyMetrics.longDescription": "Le module Metricbeat \"haproxy\" récupère des indicateurs depuis HAProxy. [En savoir plus]({learnMoreLink}).", + "home.tutorials.haproxyLogs.longDescription": "Le module collecte et analyse les logs d'un processus (`haproxy`) [En savoir plus]({learnMoreLink}).", + "home.tutorials.haproxyMetrics.longDescription": "Le module Metricbeat `haproxy` récupère des indicateurs depuis HAProxy. [En savoir plus]({learnMoreLink}).", "home.tutorials.ibmmqLogs.longDescription": "Collectez des logs IBM MQ avec Filebeat. [En savoir plus]({learnMoreLink}).", - "home.tutorials.ibmmqMetrics.longDescription": "Le module Metricbeat \"ibmmq\" récupère des indicateurs depuis les instances IBM MQ. [En savoir plus]({learnMoreLink}).", - "home.tutorials.icingaLogs.longDescription": "Le module analyse le log principal, et les logs de débogage et de démarrage depuis [Icinga](https://www.icinga.com/products/icinga-2/). [En savoir plus]({learnMoreLink}).", - "home.tutorials.iisLogs.longDescription": "Le module Filebeat \"iis\" analyse les logs d'accès et d'erreurs créés par le serveur HTTP IIS. [En savoir plus]({learnMoreLink}).", - "home.tutorials.iisMetrics.longDescription": "Le module Metricbeat \"iis\" collecte les indicateurs du serveur IIS ainsi que des sites web et des pools d'applications en cours d'exécution. [En savoir plus]({learnMoreLink}).", + "home.tutorials.ibmmqMetrics.longDescription": "Le module Metricbeat `ibmmq` récupère des indicateurs depuis les instances IBM MQ. [En savoir plus]({learnMoreLink}).", + "home.tutorials.icingaLogs.longDescription": "Le module analyse le log principal et les logs de débogage et de démarrage d'[Icinga](https://www.icinga.com/products/icinga-2/). [En savoir plus]({learnMoreLink}).", + "home.tutorials.iisLogs.longDescription": "Le module Filebeat `iis` analyse les logs d'accès et d'erreurs créés par le serveur HTTP IIS. [En savoir plus]({learnMoreLink}).", + "home.tutorials.iisMetrics.longDescription": "Le module Metricbeat `iis` collecte les indicateurs du serveur IIS ainsi que des sites web et des pools d'applications en cours d'exécution. [En savoir plus]({learnMoreLink}).", "home.tutorials.impervaLogs.longDescription": "Ce module permet de recevoir des logs Imperva SecureSphere par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", "home.tutorials.infobloxLogs.longDescription": "Ce module permet de recevoir des logs Infoblox NIOS par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", "home.tutorials.iptablesLogs.longDescription": "Il s'agit d'un module pour les logs iptables et ip6tables. Il analyse les logs reçus via le réseau par le biais de Syslog ou d’un fichier. En outre, il comprend le préfixe ajouté par certains pare-feux Ubiquiti qui contient le nom de l'ensemble de règles, le numéro de règle et l'action effectuée sur le trafic (autoriser/refuser). [En savoir plus]({learnMoreLink}).", "home.tutorials.juniperLogs.longDescription": "Ce module permet de recevoir des logs Juniper JUNOS par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", - "home.tutorials.kafkaLogs.longDescription": "Le module Filebeat \"kafka\" analyse les logs créés par Kafka. [En savoir plus]({learnMoreLink}).", - "home.tutorials.kafkaMetrics.longDescription": "Le module Metricbeat \"kafka\" récupère des indicateurs depuis Kafka. [En savoir plus]({learnMoreLink}).", + "home.tutorials.kafkaLogs.longDescription": "Le module Filebeat `kafka` analyse les logs créés par Kafka. [En savoir plus]({learnMoreLink}).", + "home.tutorials.kafkaMetrics.longDescription": "Le module Metricbeat `kafka` récupère des indicateurs depuis Kafka. [En savoir plus]({learnMoreLink}).", "home.tutorials.kibanaLogs.longDescription": "Il s'agit du module Kibana. [En savoir plus]({learnMoreLink}).", - "home.tutorials.kibanaMetrics.longDescription": "Le module Metricbeat \"kibana\" récupère des indicateurs depuis Kibana. [En savoir plus]({learnMoreLink}).", - "home.tutorials.kubernetesMetrics.longDescription": "Le module Metricbeat \"kubernetes\" récupère des indicateurs depuis les API Kubernetes. [En savoir plus]({learnMoreLink}).", - "home.tutorials.logstashLogs.longDescription": "Le module analyse les logs standard et le log de requêtes lentes Logstash. Il prend en charge les formats \"texte brut\" et JSON. [En savoir plus]({learnMoreLink}).", - "home.tutorials.logstashMetrics.longDescription": "Le module Metricbeat \"{moduleName}\" récupère des indicateurs depuis un serveur Logstash. [En savoir plus]({learnMoreLink}).", - "home.tutorials.memcachedMetrics.longDescription": "Le module Metricbeat \"memcached\" récupère des indicateurs depuis Memcached. [En savoir plus]({learnMoreLink}).", + "home.tutorials.kibanaMetrics.longDescription": "Le module Metricbeat `kibana` récupère des indicateurs depuis Kibana. [En savoir plus]({learnMoreLink}).", + "home.tutorials.kubernetesMetrics.longDescription": "Le module Metricbeat `kubernetes` récupère des indicateurs depuis les API Kubernetes. [En savoir plus]({learnMoreLink}).", + "home.tutorials.logstashLogs.longDescription": "Le module analyse les logs standard et le log de requêtes lentes Logstash. Il prend en charge les formats texte brut et JSON. [En savoir plus]({learnMoreLink}).", + "home.tutorials.logstashMetrics.longDescription": "Le module Metricbeat `{moduleName}` récupère des indicateurs depuis un serveur Logstash. [En savoir plus]({learnMoreLink}).", + "home.tutorials.memcachedMetrics.longDescription": "Le module Metricbeat `memcached` récupère des indicateurs depuis Memcached. [En savoir plus]({learnMoreLink}).", "home.tutorials.microsoftLogs.longDescription": "Collectez des alertes Microsoft Defender ATP pour les utiliser avec Elastic Security [En savoir plus]({learnMoreLink}).", "home.tutorials.mispLogs.longDescription": "Il s'agit d'un module Filebeat pour la lecture des informations de Threat Intelligence depuis la plateforme MISP (https://www.circl.lu/doc/misp/). Il utilise l'entrée httpjson pour accéder à l'interface d'API REST MISP. [En savoir plus]({learnMoreLink}).", "home.tutorials.mongodbLogs.longDescription": "Le module collecte et analyse les logs créés par [MongoDB](https://www.mongodb.com/). [En savoir plus]({learnMoreLink}).", - "home.tutorials.mongodbMetrics.longDescription": "Le module Metricbeat \"mongodb\" récupère des indicateurs depuis le serveur MongoDB. [En savoir plus]({learnMoreLink}).", + "home.tutorials.mongodbMetrics.longDescription": "Le module Metricbeat `mongodb` récupère des indicateurs depuis le serveur MongoDB. [En savoir plus]({learnMoreLink}).", "home.tutorials.mssqlLogs.longDescription": "Le module analyse les logs d'erreurs créés par MSSQL. [En savoir plus]({learnMoreLink}).", - "home.tutorials.mssqlMetrics.longDescription": "Le module Metricbeat \"mssql\" récupère des indicateurs de monitoring, de logs et de performances depuis une instance Microsoft SQL Server. [En savoir plus]({learnMoreLink}).", - "home.tutorials.muninMetrics.longDescription": "Le module Metricbeat \"munin\" récupère des indicateurs depuis Munin. [En savoir plus]({learnMoreLink}).", - "home.tutorials.mysqlLogs.longDescription": "Le module Filebeat \"mysql\" analyse les logs d'erreurs et de requêtes lentes créés par MySQL. [En savoir plus]({learnMoreLink}).", - "home.tutorials.mysqlMetrics.longDescription": "Le module Metricbeat \"mysql\" récupère des indicateurs depuis le serveur MySQL. [En savoir plus]({learnMoreLink}).", - "home.tutorials.natsLogs.longDescription": "Le module Filebeat \"nats\" analyse les logs créés par Nats. [En savoir plus]({learnMoreLink}).", - "home.tutorials.natsMetrics.longDescription": "Le module Metricbeat \"nats\" récupère des indicateurs depuis Nats. [En savoir plus]({learnMoreLink}).", - "home.tutorials.netflowLogs.longDescription": "Ce module permet de recevoir des enregistrements de flux NetFlow et IPFIX via UDP. Cette entrée prend en charge les versions 1, 5, 6, 7, 8 et 9 de NetFlow ainsi qu'IPFIX. Pour les versions de NetFlow antérieures à la version 9, les champs sont automatiquement mappés vers NetFlow v9. [En savoir plus]({learnMoreLink}).", + "home.tutorials.mssqlMetrics.longDescription": "Le module Metricbeat `mssql` récupère des indicateurs de monitoring, de logs et de performances depuis une instance Microsoft SQL Server. [En savoir plus]({learnMoreLink}).", + "home.tutorials.muninMetrics.longDescription": "Le module Metricbeat `munin` récupère des indicateurs depuis Munin. [En savoir plus]({learnMoreLink}).", + "home.tutorials.mysqlLogs.longDescription": "Le module Filebeat `mysql` analyse les logs d'erreurs et de requêtes lentes créés par MySQL. [En savoir plus]({learnMoreLink}).", + "home.tutorials.mysqlMetrics.longDescription": "Le module Metricbeat `mysql` récupère des indicateurs depuis le serveur MySQL. [En savoir plus]({learnMoreLink}).", + "home.tutorials.natsLogs.longDescription": "Le module Filebeat `nats` analyse les logs créés par NATS. [En savoir plus]({learnMoreLink}).", + "home.tutorials.natsMetrics.longDescription": "Le module Metricbeat `nats` récupère des indicateurs depuis NATS. [En savoir plus]({learnMoreLink}).", + "home.tutorials.netflowLogs.longDescription": "Ce module permet de recevoir des enregistrements de flux NetFlow et IPFIX via UDP. Cette entrée prend en charge les versions 1, 5, 6, 7, 8 et 9 de NetFlow ainsi qu'IPFIX. Pour les versions de NetFlow antérieures à la version 9, les champs sont automatiquement mappés vers NetFlow v9. [En savoir plus]({learnMoreLink})", "home.tutorials.netscoutLogs.longDescription": "Ce module permet de recevoir des logs Arbor Peakflow SP par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", - "home.tutorials.nginxLogs.longDescription": "Le module Filebeat \"nginx\" analyse les logs d'accès et d'erreurs créés par le serveur HTTP Nginx. [En savoir plus]({learnMoreLink}).", - "home.tutorials.nginxMetrics.longDescription": "Le module Metricbeat \"nginx\" récupère des indicateurs depuis le serveur HTTP Nginx. Le module récupère les données de statut du serveur depuis la page web générée par {statusModuleLink}, qui doit être activé dans votre installation Nginx. [En savoir plus]({learnMoreLink}).", - "home.tutorials.o365Logs.longDescription": "Il s'agit d'un module pour les logs Office 365 reçus via l'un des points de terminaison d'API Office 365. Actuellement, il prend en charge les actions et les événements utilisateur, administrateur, système et de politique depuis les logs d'activité Office 365 et Azure AD exposés par l'API Activité de gestion Office 365. [En savoir plus]({learnMoreLink}).", + "home.tutorials.nginxLogs.longDescription": "Le module Filebeat `nginx` analyse les logs d'accès et d'erreurs créés par le serveur HTTP Nginx. [En savoir plus]({learnMoreLink}).", + "home.tutorials.nginxMetrics.longDescription": "Le module Metricbeat `nginx` récupère des indicateurs depuis le serveur HTTP Nginx. Le module récupère les données de statut du serveur depuis la page web générée par {statusModuleLink}, qui doit être activé dans votre installation Nginx. [En savoir plus]({learnMoreLink}).", + "home.tutorials.o365Logs.longDescription": "Il s'agit d'un module pour les logs Office 365 reçus via l'un des points de terminaison d'API Office 365. Actuellement, il prend en charge les actions et les événements utilisateur, administrateur, système et de politique depuis les logs d’activité Office 365 et Azure AD exposés par l'API d’activité de gestion Office 365. [En savoir plus]({learnMoreLink}).", "home.tutorials.oktaLogs.longDescription": "Le module Okta collecte les événements de l'[API Okta](https://developer.okta.com/docs/reference/). Plus précisément, il prend en charge la lecture depuis l'[API de log système Okta](https://developer.okta.com/docs/reference/api/system-log/). [En savoir plus]({learnMoreLink}).", - "home.tutorials.openmetricsMetrics.longDescription": "Le module Metricbeat \"openmetrics\" récupère des indicateurs depuis un point de terminaison fournissant des indicateurs au format OpenMetrics. [En savoir plus]({learnMoreLink}).", - "home.tutorials.oracleMetrics.longDescription": "Le module Metricbeat \"{moduleName}\" récupère des indicateurs depuis un serveur Oracle. [En savoir plus]({learnMoreLink}).", - "home.tutorials.osqueryLogs.longDescription": "Le module collecte et décode les logs de résultats écrits par [osqueryd](https://osquery.readthedocs.io/en/latest/introduction/using-osqueryd/) au format JSON. Pour configurer \"osqueryd\", suivez les instructions d'installation d'osquery pour votre système d'exploitation et configurez le pilote de logging \"filesystem\" (celui par défaut). Assurez-vous que les horodatages UTC sont activés. [En savoir plus]({learnMoreLink}).", + "home.tutorials.openmetricsMetrics.longDescription": "Le module Metricbeat `openmetrics` récupère des indicateurs depuis un point de terminaison fournissant des indicateurs au format OpenMetrics. [En savoir plus]({learnMoreLink}).", + "home.tutorials.oracleMetrics.longDescription": "Le module Metricbeat `{moduleName}` récupère des indicateurs depuis un serveur Oracle. [En savoir plus]({learnMoreLink}).", + "home.tutorials.osqueryLogs.longDescription": "Le module collecte et décode les logs de résultats écrits par [osqueryd](https://osquery.readthedocs.io/en/latest/introduction/using-osqueryd/) au format JSON. Pour configurer `osqueryd`, suivez les instructions d'installation d'osquery pour votre système d'exploitation et configurez le pilote de logging `filesystem` (celui par défaut). Assurez-vous que les horodatages UTC sont activés. [En savoir plus]({learnMoreLink}).", "home.tutorials.panwLogs.longDescription": "Il s'agit d'un module pour les logs de monitoring des pare-feux Palo Alto Networks PAN-OS reçus par le biais de Syslog ou lus depuis un fichier. Actuellement, il prend en charge les messages de type Trafic et Menaces. [En savoir plus]({learnMoreLink}).", - "home.tutorials.phpFpmMetrics.longDescription": "Le module Metricbeat \"php_fpm\" récupère des indicateurs depuis le serveur PHP-FPM. [En savoir plus]({learnMoreLink}).", - "home.tutorials.postgresqlLogs.longDescription": "Le module Filebeat \"postgresql\" analyse les logs d'erreurs et de requêtes lentes créés par PostgreSQL. [En savoir plus]({learnMoreLink}).", - "home.tutorials.postgresqlMetrics.longDescription": "Le module Metricbeat \"postgresql\" récupère des indicateurs depuis le serveur PostgreSQL. [En savoir plus]({learnMoreLink}).", - "home.tutorials.prometheusMetrics.longDescription": "Le module Metricbeat \"{moduleName}\" récupère des indicateurs depuis le point de terminaison Prometheus. [En savoir plus]({learnMoreLink}).", + "home.tutorials.phpFpmMetrics.longDescription": "Le module Metricbeat `php_fpm` récupère des indicateurs depuis le serveur PHP-FPM. [En savoir plus]({learnMoreLink}).", + "home.tutorials.postgresqlLogs.longDescription": "Le module Filebeat `postgresql` analyse les logs d'erreurs et de requêtes lentes créés par PostgreSQL. [En savoir plus]({learnMoreLink}).", + "home.tutorials.postgresqlMetrics.longDescription": "Le module Metricbeat `postgresql` récupère des indicateurs depuis le serveur PostgreSQL. [En savoir plus]({learnMoreLink}).", + "home.tutorials.prometheusMetrics.longDescription": "Le module Metricbeat `{moduleName}` récupère des indicateurs depuis le point de terminaison Prometheus. [En savoir plus]({learnMoreLink}).", "home.tutorials.rabbitmqLogs.longDescription": "Ce module permet d'analyser les [fichiers log RabbitMQ](https://www.rabbitmq.com/logging.html). [En savoir plus]({learnMoreLink}).", - "home.tutorials.rabbitmqMetrics.longDescription": "Le module Metricbeat \"rabbitmq\" récupère des indicateurs depuis le serveur RabbitMQ. [En savoir plus]({learnMoreLink}).", + "home.tutorials.rabbitmqMetrics.longDescription": "Le module Metricbeat `rabbitmq` récupère des indicateurs depuis le serveur RabbitMQ. [En savoir plus]({learnMoreLink}).", "home.tutorials.radwareLogs.longDescription": "Ce module permet de recevoir des logs Radware DefensePro par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", - "home.tutorials.redisenterpriseMetrics.longDescription": "Le module Metricbeat \"redisenterprise\" récupère des indicateurs depuis le serveur Redis Enterprise. [En savoir plus]({learnMoreLink}).", - "home.tutorials.redisLogs.longDescription": "Le module Filebeat \"redis\" analyse les logs d'erreurs et de requêtes lentes créés par Redis. Pour que Redis écrive des logs d'erreurs, assurez-vous que l'option \"logfile\" est définie sur \"redis-server.log\" dans le fichier de configuration Redis. Les logs de requêtes lentes sont lus directement depuis Redis via la commande \"SLOWLOG\". Pour que Redis enregistre des logs de requêtes lentes, assurez-vous que l'option \"slowlog-log-slower-than\" est activée. Notez que l'ensemble de fichiers \"slowlog\" est expérimental. [En savoir plus]({learnMoreLink}).", - "home.tutorials.redisMetrics.longDescription": "Le module Metricbeat \"redis\" récupère des indicateurs depuis le serveur Redis. [En savoir plus]({learnMoreLink}).", + "home.tutorials.redisenterpriseMetrics.longDescription": "Le module Metricbeat `redisenterprise` récupère des indicateurs depuis le serveur Redis Enterprise. [En savoir plus]({learnMoreLink}).", + "home.tutorials.redisLogs.longDescription": "Le module Filebeat `redis` analyse les logs d'erreurs et de requêtes lentes créés par Redis. Pour que Redis écrive des logs d'erreurs, assurez-vous que l'option `logfile` est définie sur `redis-server.log` dans le fichier de configuration Redis. Les logs de requêtes lentes sont lus directement depuis Redis via la commande `SLOWLOG`. Pour que Redis enregistre des logs de requêtes lentes, assurez-vous que l'option `slowlog-log-slower-than` est activée. Notez que l'ensemble de fichiers `slowlog` est expérimental. [En savoir plus]({learnMoreLink}).", + "home.tutorials.redisMetrics.longDescription": "Le module Metricbeat `redis` récupère des indicateurs depuis le serveur Redis. [En savoir plus]({learnMoreLink}).", "home.tutorials.santaLogs.longDescription": "Le module collecte et analyse les logs de [Google Santa](https://github.com/google/santa), un outil de sécurité pour macOS qui monitore les exécutions de processus et est capable de mettre en liste noire/blanche des fichiers binaires. [En savoir plus]({learnMoreLink}).", "home.tutorials.sonicwallLogs.longDescription": "Ce module permet de recevoir des logs Sonicwall FW par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", "home.tutorials.sophosLogs.longDescription": "Il s'agit d'un module pour les produits Sophos. Actuellement, il prend en charge les logs XG SFOS envoyés au format Syslog. [En savoir plus]({learnMoreLink}).", "home.tutorials.squidLogs.longDescription": "Ce module permet de recevoir des logs Squid par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", - "home.tutorials.stanMetrics.longDescription": "Le module Metricbeat \"stan\" récupère des indicateurs depuis STAN. [En savoir plus]({learnMoreLink}).", - "home.tutorials.statsdMetrics.longDescription": "Le module Metricbeat \"statsd\" récupère des indicateurs depuis statsd. [En savoir plus]({learnMoreLink}).", + "home.tutorials.stanMetrics.longDescription": "Le module Metricbeat `stan` récupère des indicateurs depuis STAN. [En savoir plus]({learnMoreLink}).", + "home.tutorials.statsdMetrics.longDescription": "Le module Metricbeat `statsd` récupère des indicateurs depuis statsd. [En savoir plus]({learnMoreLink}).", "home.tutorials.suricataLogs.longDescription": "Il s'agit d'un module pour le log IDS/IPS/NSM Suricata. Il analyse les logs qui sont au [format JSON Suricata Eve](https://suricata.readthedocs.io/en/latest/output/eve/eve-json-format.html). [En savoir plus]({learnMoreLink}).", - "home.tutorials.systemLogs.longDescription": "Le module collecte et analyse les logs créés par le service de logging système des distributions courantes basées sur Unix/Linux. [En savoir plus]({learnMoreLink}).", - "home.tutorials.systemMetrics.longDescription": "Le module Metricbeat \"system\" collecte des statistiques relatives au CPU, à la mémoire, au réseau et au disque depuis l'hôte. Il collecte des statistiques au niveau du système et des statistiques par processus et système de fichiers. [En savoir plus]({learnMoreLink}).", + "home.tutorials.systemLogs.longDescription": "Le module collecte et analyse les logs créés par le service de logging système des distributions basées sur Unix/Linux communes. [En savoir plus]({learnMoreLink}).", + "home.tutorials.systemMetrics.longDescription": "Le module Metricbeat `system` collecte des statistiques relatives au CPU, à la mémoire, au réseau et au disque depuis l'hôte. Il collecte des statistiques au niveau du système et des statistiques par processus et système de fichiers. [En savoir plus]({learnMoreLink}).", "home.tutorials.tomcatLogs.longDescription": "Ce module permet de recevoir des logs Apache Tomcat par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", "home.tutorials.traefikLogs.longDescription": "Le module analyse les logs d'accès créés par [Traefik](https://traefik.io/). [En savoir plus]({learnMoreLink}).", - "home.tutorials.traefikMetrics.longDescription": "Le module Metricbeat \"traefik\" récupère des indicateurs depuis Traefik. [En savoir plus]({learnMoreLink}).", - "home.tutorials.uptimeMonitors.longDescription": "Monitorez la disponibilité des services grâce à une détection active. À partir d'une liste d'URL, Heartbeat pose cette question toute simple : Êtes-vous actif ? [En savoir plus]({learnMoreLink}).", - "home.tutorials.uwsgiMetrics.longDescription": "Le module Metricbeat \"uwsgi\" récupère des indicateurs depuis le serveur uWSGI. [En savoir plus]({learnMoreLink}).", - "home.tutorials.vsphereMetrics.longDescription": "Le module Metricbeat \"vsphere\" récupère des indicateurs depuis un cluster vSphere. [En savoir plus]({learnMoreLink}).", - "home.tutorials.windowsEventLogs.longDescription": "Utilisez Winlogbeat pour collecter les logs depuis les logs des événements Windows. [En savoir plus]({learnMoreLink}).", - "home.tutorials.windowsMetrics.longDescription": "Le module Metricbeat \"windows\" récupère des indicateurs depuis Windows. [En savoir plus]({learnMoreLink}).", + "home.tutorials.traefikMetrics.longDescription": "Le module Metricbeat `traefik` récupère des indicateurs depuis Traefik. [En savoir plus]({learnMoreLink}).", + "home.tutorials.uptimeMonitors.longDescription": "Monitorez la disponibilité des services grâce à une détection active. À partir d'une liste d'URL, Heartbeat pose cette question toute simple : Êtes-vous actif ? [En savoir plus]({learnMoreLink}).", + "home.tutorials.uwsgiMetrics.longDescription": "Le module Metricbeat `uwsgi` récupère des indicateurs depuis le serveur uWSGI. [En savoir plus]({learnMoreLink}).", + "home.tutorials.vsphereMetrics.longDescription": "Le module Metricbeat `vsphere` récupère des indicateurs depuis un cluster vSphere. [En savoir plus]({learnMoreLink}).", + "home.tutorials.windowsEventLogs.longDescription": "Utilisez Winlogbeat pour collecter des logs depuis le log des événements Windows. [En savoir plus]({learnMoreLink}).", + "home.tutorials.windowsMetrics.longDescription": "Le module Metricbeat `windows` récupère des indicateurs depuis Windows. [En savoir plus]({learnMoreLink}).", "home.tutorials.zeekLogs.longDescription": "Il s'agit d'un module pour Zeek, anciennement appelé Bro. Il analyse les logs qui sont au [format JSON Zeek](https://www.zeek.org/manual/release/logs/index.html). [En savoir plus]({learnMoreLink}).", - "home.tutorials.zookeeperMetrics.longDescription": "Le module Metricbeat \"{moduleName}\" récupère des indicateurs depuis un serveur Zookeeper. [En savoir plus]({learnMoreLink}).", + "home.tutorials.zookeeperMetrics.longDescription": "Le module Metricbeat `{moduleName}` récupère des indicateurs depuis un serveur Zookeeper. [En savoir plus]({learnMoreLink}).", "home.tutorials.zscalerLogs.longDescription": "Ce module permet de recevoir des logs Zscaler NSS par le biais de Syslog ou d'un fichier. [En savoir plus]({learnMoreLink}).", "home.addData.addDataButtonLabel": "Ajouter des intégrations", "home.addData.guidedOnboardingLinkLabel": "Guides de configuration", @@ -3431,7 +3597,7 @@ "home.guidedOnboarding.gettingStarted.errorSectionTitle": "Impossible de charger l'état du guide", "home.guidedOnboarding.gettingStarted.loadingIndicator": "Chargement de l'état du guide...", "home.guidedOnboarding.gettingStarted.skip.buttonLabel": "J’aimerais explorer par moi-même.", - "home.guidedOnboarding.gettingStarted.useCaseSelectionSubtitle": "Sélectionnez un guide pour vous aider à tirer le meilleur parti de vos données.", + "home.guidedOnboarding.gettingStarted.useCaseSelectionSubtitle": "Filtrer par solution pour afficher les cas d'utilisation associés", "home.guidedOnboarding.gettingStarted.useCaseSelectionTitle": "Par quoi voulez-vous commencer ?", "home.header.title": "Bienvenue chez vous", "home.letsStartDescription": "Ajoutez des données à votre cluster depuis n’importe quelle source, puis analysez-les et visualisez-les en temps réel. Utilisez nos solutions pour définir des recherches, observer votre écosystème et vous défendre contre les menaces de sécurité.", @@ -3501,10 +3667,10 @@ "home.tutorials.activemqLogs.artifacts.dashboards.linkLabel": "Événements d'audit ActiveMQ", "home.tutorials.activemqLogs.nameTitle": "Logs ActiveMQ", "home.tutorials.activemqLogs.shortDescription": "Collectez et analysez les logs à partir des instances ActiveMQ avec Filebeat.", - "home.tutorials.activemqMetrics.artifacts.application.label": "Découverte", + "home.tutorials.activemqMetrics.artifacts.application.label": "Discover", "home.tutorials.activemqMetrics.nameTitle": "Indicateurs ActiveMQ", "home.tutorials.activemqMetrics.shortDescription": "Collectez les indicateurs à partir des instances ActiveMQ avec Metricbeat.", - "home.tutorials.aerospikeMetrics.artifacts.application.label": "Découverte", + "home.tutorials.aerospikeMetrics.artifacts.application.label": "Discover", "home.tutorials.aerospikeMetrics.nameTitle": "Indicateurs Aerospike", "home.tutorials.aerospikeMetrics.shortDescription": "Collectez les indicateurs à partir des serveurs Aerospike avec Metricbeat.", "home.tutorials.apacheLogs.artifacts.dashboards.linkLabel": "Tableau de bord des logs Apache", @@ -3540,7 +3706,7 @@ "home.tutorials.cefLogs.artifacts.dashboards.linkLabel": "Tableau de bord d'aperçu du réseau CEF", "home.tutorials.cefLogs.nameTitle": "Logs CEF", "home.tutorials.cefLogs.shortDescription": "Collectez et analysez les logs à partir de Common Event Format (CEF) avec Filebeat.", - "home.tutorials.cephMetrics.artifacts.application.label": "Découverte", + "home.tutorials.cephMetrics.artifacts.application.label": "Discover", "home.tutorials.cephMetrics.nameTitle": "Indicateurs Ceph", "home.tutorials.cephMetrics.shortDescription": "Collectez les indicateurs à partir des serveurs Ceph avec Metricbeat.", "home.tutorials.checkpointLogs.artifacts.dashboards.linkLabel": "Application Security", @@ -3569,20 +3735,20 @@ "home.tutorials.common.auditbeatInstructions.install.osxTitle": "Télécharger et installer Auditbeat", "home.tutorials.common.auditbeatInstructions.install.rpmTitle": "Télécharger et installer Auditbeat", "home.tutorials.common.auditbeatInstructions.install.windowsTitle": "Télécharger et installer Auditbeat", - "home.tutorials.common.auditbeatInstructions.start.debTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.auditbeatInstructions.start.debTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.auditbeatInstructions.start.debTitle": "Lancer Auditbeat", - "home.tutorials.common.auditbeatInstructions.start.osxTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.auditbeatInstructions.start.osxTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.auditbeatInstructions.start.osxTitle": "Lancer Auditbeat", - "home.tutorials.common.auditbeatInstructions.start.rpmTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.auditbeatInstructions.start.rpmTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.auditbeatInstructions.start.rpmTitle": "Lancer Auditbeat", - "home.tutorials.common.auditbeatInstructions.start.windowsTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.auditbeatInstructions.start.windowsTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.auditbeatInstructions.start.windowsTitle": "Lancer Auditbeat", "home.tutorials.common.auditbeatStatusCheck.buttonLabel": "Vérifier les données", "home.tutorials.common.auditbeatStatusCheck.errorText": "Aucune donnée n'a encore été reçue.", "home.tutorials.common.auditbeatStatusCheck.successText": "Des données ont été reçues.", "home.tutorials.common.auditbeatStatusCheck.text": "Vérifier que des données sont reçues d'Auditbeat", "home.tutorials.common.auditbeatStatusCheck.title": "Statut", - "home.tutorials.common.cloudInstructions.passwordAndResetLink": "Où {passwordTemplate} est le mot de passe de l'utilisateur ''elastic''.\\{#config.cloud.profileUrl\\}\n Mot de passe oublié ? [Réinitialiser dans Elastic Cloud](\\{config.cloud.baseUrl\\}\\{config.cloud.deploymentUrl\\}/security).\n \\{/config.cloud.profileUrl\\}\n\n> **_Important :_** n'utilisez pas l'utilisateur \"elastic\" intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration.", + "home.tutorials.common.cloudInstructions.passwordAndResetLink": "Où {passwordTemplate} est le mot de passe de l'utilisateur `elastic`.\\{#config.cloud.profileUrl\\}\n Mot de passe oublié ? [Réinitialiser dans Elastic Cloud](\\{config.cloud.baseUrl\\}\\{config.cloud.deploymentUrl\\}/security).\n \\{/config.cloud.profileUrl\\}\n\n> **_Important :_** n'employez pas l'utilisateur `elastic` intégré pour sécuriser les clients dans un environnement de production. À la place, configurez des utilisateurs autorisés ou des clés d'API, et n'exposez pas les mots de passe dans les fichiers de configuration.", "home.tutorials.common.filebeat.cloudInstructions.gettingStarted.title": "Commencer", "home.tutorials.common.filebeat.premCloudInstructions.gettingStarted.title": "Commencer", "home.tutorials.common.filebeat.premInstructions.gettingStarted.title": "Commencer", @@ -3599,13 +3765,13 @@ "home.tutorials.common.filebeatInstructions.install.osxTitle": "Télécharger et installer Filebeat", "home.tutorials.common.filebeatInstructions.install.rpmTitle": "Télécharger et installer Filebeat", "home.tutorials.common.filebeatInstructions.install.windowsTitle": "Télécharger et installer Filebeat", - "home.tutorials.common.filebeatInstructions.start.debTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.filebeatInstructions.start.debTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.filebeatInstructions.start.debTitle": "Lancer Filebeat", - "home.tutorials.common.filebeatInstructions.start.osxTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.filebeatInstructions.start.osxTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.filebeatInstructions.start.osxTitle": "Lancer Filebeat", - "home.tutorials.common.filebeatInstructions.start.rpmTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.filebeatInstructions.start.rpmTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.filebeatInstructions.start.rpmTitle": "Lancer Filebeat", - "home.tutorials.common.filebeatInstructions.start.windowsTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.filebeatInstructions.start.windowsTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.filebeatInstructions.start.windowsTitle": "Lancer Filebeat", "home.tutorials.common.filebeatStatusCheck.buttonLabel": "Vérifier les données", "home.tutorials.common.filebeatStatusCheck.errorText": "Aucune donnée n'a encore été reçue de ce module.", @@ -3614,19 +3780,19 @@ "home.tutorials.common.functionbeat.cloudInstructions.gettingStarted.title": "Commencer", "home.tutorials.common.functionbeat.premCloudInstructions.gettingStarted.title": "Commencer", "home.tutorials.common.functionbeat.premInstructions.gettingStarted.title": "Commencer", - "home.tutorials.common.functionbeatAWSInstructions.textPost": "Où '''' et '''' sont vos informations d'identification et ''us-east-1'' est la région désirée.", + "home.tutorials.common.functionbeatAWSInstructions.textPost": "Où `` et `` sont vos informations d'identification et `us-east-1` est la région désirée.", "home.tutorials.common.functionbeatAWSInstructions.textPre": "Définissez vos informations d'identification AWS dans l'environnement :", "home.tutorials.common.functionbeatAWSInstructions.title": "Définir des informations d'identification AWS", "home.tutorials.common.functionbeatCloudInstructions.config.osxTitle": "Modifier la configuration", "home.tutorials.common.functionbeatCloudInstructions.config.windowsTitle": "Modifier la configuration", - "home.tutorials.common.functionbeatEnableOnPremInstructions.defaultTextPost": "Où '''' est le nom du groupe de logs à importer et '''' un nom de compartiment S3 valide pour la mise en œuvre du déploiement de Functionbeat.", + "home.tutorials.common.functionbeatEnableOnPremInstructions.defaultTextPost": "Où `` est le nom du groupe de logs à importer et `` un nom de compartiment S3 valide pour la mise en œuvre du déploiement de Functionbeat.", "home.tutorials.common.functionbeatEnableOnPremInstructions.defaultTitle": "Configurer le groupe de logs Cloudwatch", - "home.tutorials.common.functionbeatEnableOnPremInstructionsOSXLinux.textPre": "Modifiez les paramètres dans le fichier ''functionbeat.yml''.", + "home.tutorials.common.functionbeatEnableOnPremInstructionsOSXLinux.textPre": "Modifiez les paramètres dans le fichier `functionbeat.yml`.", "home.tutorials.common.functionbeatInstructions.config.osxTitle": "Configurer le cluster Elastic", "home.tutorials.common.functionbeatInstructions.config.windowsTitle": "Modifier la configuration", - "home.tutorials.common.functionbeatInstructions.deploy.osxTextPre": "Ceci permet d'installer Functionbeat en tant que fonction Lambda. La commande ''setup'' vérifie la configuration d'Elasticsearch et charge le modèle d'indexation Kibana. L'omission de cette commande est normalement sans risque.", + "home.tutorials.common.functionbeatInstructions.deploy.osxTextPre": "Ceci permet d'installer Functionbeat en tant que fonction Lambda. La commande `setup` vérifie la configuration d'Elasticsearch et charge le modèle d'indexation Kibana. L'omission de cette commande est normalement sans risque.", "home.tutorials.common.functionbeatInstructions.deploy.osxTitle": "Déployer Functionbeat en tant que fonction AWS Lambda", - "home.tutorials.common.functionbeatInstructions.deploy.windowsTextPre": "Ceci permet d'installer Functionbeat en tant que fonction Lambda. La commande ''setup'' vérifie la configuration d'Elasticsearch et charge le modèle d'indexation Kibana. L'omission de cette commande est normalement sans risque.", + "home.tutorials.common.functionbeatInstructions.deploy.windowsTextPre": "Ceci permet d'installer Functionbeat en tant que fonction Lambda. La commande `setup` vérifie la configuration d'Elasticsearch et charge le modèle d'indexation Kibana. L'omission de cette commande est normalement sans risque.", "home.tutorials.common.functionbeatInstructions.deploy.windowsTitle": "Déployer Functionbeat en tant que fonction AWS Lambda", "home.tutorials.common.functionbeatInstructions.install.linuxTitle": "Télécharger et installer Functionbeat", "home.tutorials.common.functionbeatInstructions.install.osxTitle": "Télécharger et installer Functionbeat", @@ -3643,16 +3809,16 @@ "home.tutorials.common.heartbeatCloudInstructions.config.osxTitle": "Modifier la configuration", "home.tutorials.common.heartbeatCloudInstructions.config.rpmTitle": "Modifier la configuration", "home.tutorials.common.heartbeatCloudInstructions.config.windowsTitle": "Modifier la configuration", - "home.tutorials.common.heartbeatEnableCloudInstructions.debTextPre": "Modifiez le paramètre ''heartbeat.monitors'' dans le fichier ''heartbeat.yml''.", + "home.tutorials.common.heartbeatEnableCloudInstructions.debTextPre": "Modifiez le paramètre `heartbeat.monitors` dans le fichier `heartbeat.yml`.", "home.tutorials.common.heartbeatEnableCloudInstructions.defaultTitle": "Modifier la configuration – Ajouter des moniteurs", - "home.tutorials.common.heartbeatEnableCloudInstructions.osxTextPre": "Modifiez le paramètre ''heartbeat.monitors'' dans le fichier ''heartbeat.yml''.", - "home.tutorials.common.heartbeatEnableCloudInstructions.rpmTextPre": "Modifiez le paramètre ''heartbeat.monitors'' dans le fichier ''heartbeat.yml''.", - "home.tutorials.common.heartbeatEnableCloudInstructions.windowsTextPre": "Modifiez le paramètre ''heartbeat.monitors'' dans le fichier ''heartbeat.yml''.", - "home.tutorials.common.heartbeatEnableOnPremInstructions.debTextPre": "Modifiez le paramètre ''heartbeat.monitors'' dans le fichier ''heartbeat.yml''.", + "home.tutorials.common.heartbeatEnableCloudInstructions.osxTextPre": "Modifiez le paramètre `heartbeat.monitors` dans le fichier `heartbeat.yml`.", + "home.tutorials.common.heartbeatEnableCloudInstructions.rpmTextPre": "Modifiez le paramètre `heartbeat.monitors` dans le fichier `heartbeat.yml`.", + "home.tutorials.common.heartbeatEnableCloudInstructions.windowsTextPre": "Modifiez le paramètre `heartbeat.monitors` dans le fichier `heartbeat.yml`.", + "home.tutorials.common.heartbeatEnableOnPremInstructions.debTextPre": "Modifiez le paramètre `heartbeat.monitors` dans le fichier `heartbeat.yml`.", "home.tutorials.common.heartbeatEnableOnPremInstructions.defaultTitle": "Modifier la configuration – Ajouter des moniteurs", - "home.tutorials.common.heartbeatEnableOnPremInstructions.osxTextPre": "Modifiez le paramètre ''heartbeat.monitors'' dans le fichier ''heartbeat.yml''.", - "home.tutorials.common.heartbeatEnableOnPremInstructions.rpmTextPre": "Modifiez le paramètre ''heartbeat.monitors'' dans le fichier ''heartbeat.yml''.", - "home.tutorials.common.heartbeatEnableOnPremInstructions.windowsTextPre": "Modifiez le paramètre ''heartbeat.monitors'' dans le fichier ''heartbeat.yml''.", + "home.tutorials.common.heartbeatEnableOnPremInstructions.osxTextPre": "Modifiez le paramètre `heartbeat.monitors` dans le fichier `heartbeat.yml`.", + "home.tutorials.common.heartbeatEnableOnPremInstructions.rpmTextPre": "Modifiez le paramètre `heartbeat.monitors` dans le fichier `heartbeat.yml`.", + "home.tutorials.common.heartbeatEnableOnPremInstructions.windowsTextPre": "Modifiez le paramètre `heartbeat.monitors` dans le fichier `heartbeat.yml`.", "home.tutorials.common.heartbeatInstructions.config.debTitle": "Modifier la configuration", "home.tutorials.common.heartbeatInstructions.config.osxTitle": "Modifier la configuration", "home.tutorials.common.heartbeatInstructions.config.rpmTitle": "Modifier la configuration", @@ -3661,13 +3827,13 @@ "home.tutorials.common.heartbeatInstructions.install.osxTitle": "Télécharger et installer Heartbeat", "home.tutorials.common.heartbeatInstructions.install.rpmTitle": "Télécharger et installer Heartbeat", "home.tutorials.common.heartbeatInstructions.install.windowsTitle": "Télécharger et installer Heartbeat", - "home.tutorials.common.heartbeatInstructions.start.debTextPre": "La commande ''setup'' charge le modèle d'indexation Kibana.", + "home.tutorials.common.heartbeatInstructions.start.debTextPre": "La commande `setup` charge le modèle d'indexation Kibana.", "home.tutorials.common.heartbeatInstructions.start.debTitle": "Lancer Heartbeat", - "home.tutorials.common.heartbeatInstructions.start.osxTextPre": "La commande ''setup'' charge le modèle d'indexation Kibana.", + "home.tutorials.common.heartbeatInstructions.start.osxTextPre": "La commande `setup` charge le modèle d'indexation Kibana.", "home.tutorials.common.heartbeatInstructions.start.osxTitle": "Lancer Heartbeat", - "home.tutorials.common.heartbeatInstructions.start.rpmTextPre": "La commande ''setup'' charge le modèle d'indexation Kibana.", + "home.tutorials.common.heartbeatInstructions.start.rpmTextPre": "La commande `setup` charge le modèle d'indexation Kibana.", "home.tutorials.common.heartbeatInstructions.start.rpmTitle": "Lancer Heartbeat", - "home.tutorials.common.heartbeatInstructions.start.windowsTextPre": "La commande ''setup'' charge le modèle d'indexation Kibana.", + "home.tutorials.common.heartbeatInstructions.start.windowsTextPre": "La commande `setup` charge le modèle d'indexation Kibana.", "home.tutorials.common.heartbeatInstructions.start.windowsTitle": "Lancer Heartbeat", "home.tutorials.common.heartbeatStatusCheck.buttonLabel": "Vérifier les données", "home.tutorials.common.heartbeatStatusCheck.errorText": "Aucune donnée n'a encore été reçue de Heartbeat.", @@ -3694,13 +3860,13 @@ "home.tutorials.common.metricbeatInstructions.install.osxTitle": "Télécharger et installer Metricbeat", "home.tutorials.common.metricbeatInstructions.install.rpmTitle": "Télécharger et installer Metricbeat", "home.tutorials.common.metricbeatInstructions.install.windowsTitle": "Télécharger et installer Metricbeat", - "home.tutorials.common.metricbeatInstructions.start.debTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.metricbeatInstructions.start.debTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.metricbeatInstructions.start.debTitle": "Lancer Metricbeat", - "home.tutorials.common.metricbeatInstructions.start.osxTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.metricbeatInstructions.start.osxTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.metricbeatInstructions.start.osxTitle": "Lancer Metricbeat", - "home.tutorials.common.metricbeatInstructions.start.rpmTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.metricbeatInstructions.start.rpmTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.metricbeatInstructions.start.rpmTitle": "Lancer Metricbeat", - "home.tutorials.common.metricbeatInstructions.start.windowsTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.metricbeatInstructions.start.windowsTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.metricbeatInstructions.start.windowsTitle": "Lancer Metricbeat", "home.tutorials.common.metricbeatStatusCheck.buttonLabel": "Vérifier les données", "home.tutorials.common.metricbeatStatusCheck.errorText": "Aucune donnée n'a encore été reçue de ce module.", @@ -3714,7 +3880,7 @@ "home.tutorials.common.winlogbeatCloudInstructions.config.windowsTitle": "Modifier la configuration", "home.tutorials.common.winlogbeatInstructions.config.windowsTitle": "Modifier la configuration", "home.tutorials.common.winlogbeatInstructions.install.windowsTitle": "Télécharger et installer Winlogbeat", - "home.tutorials.common.winlogbeatInstructions.start.windowsTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.winlogbeatInstructions.start.windowsTextPre": "La commande `setup` charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.winlogbeatInstructions.start.windowsTitle": "Lancer Winlogbeat", "home.tutorials.common.winlogbeatStatusCheck.buttonLabel": "Vérifier les données", "home.tutorials.common.winlogbeatStatusCheck.errorText": "Aucune donnée n'a encore été reçue.", @@ -3727,10 +3893,10 @@ "home.tutorials.corednsLogs.artifacts.dashboards.linkLabel": "Aperçu de [Filebeat CoreDNS]", "home.tutorials.corednsLogs.nameTitle": "Logs CoreDNS", "home.tutorials.corednsLogs.shortDescription": "Collectez et analysez les logs à partir des serveurs CoreDNS avec Filebeat.", - "home.tutorials.corednsMetrics.artifacts.application.label": "Découverte", + "home.tutorials.corednsMetrics.artifacts.application.label": "Discover", "home.tutorials.corednsMetrics.nameTitle": "Indicateurs CoreDNS", "home.tutorials.corednsMetrics.shortDescription": "Collectez les indicateurs à partir des serveurs CoreDNS avec Metricbeat.", - "home.tutorials.couchbaseMetrics.artifacts.application.label": "Découverte", + "home.tutorials.couchbaseMetrics.artifacts.application.label": "Discover", "home.tutorials.couchbaseMetrics.nameTitle": "Indicateurs Couchbase", "home.tutorials.couchbaseMetrics.shortDescription": "Collectez les indicateurs à partir des bases de données Couchbase avec Metricbeat.", "home.tutorials.couchdbMetrics.artifacts.dashboards.linkLabel": "Tableau de bord des indicateurs CouchDB", @@ -3745,13 +3911,13 @@ "home.tutorials.dockerMetrics.artifacts.dashboards.linkLabel": "Tableau de bord des indicateurs Docker", "home.tutorials.dockerMetrics.nameTitle": "Indicateurs Docker", "home.tutorials.dockerMetrics.shortDescription": "Collectez les indicateurs à partir des conteneurs Docker avec Metricbeat.", - "home.tutorials.dropwizardMetrics.artifacts.application.label": "Découverte", + "home.tutorials.dropwizardMetrics.artifacts.application.label": "Discover", "home.tutorials.dropwizardMetrics.nameTitle": "Indicateurs Dropwizard", "home.tutorials.dropwizardMetrics.shortDescription": "Collectez les indicateurs à partir des applications Dropwizard Java avec Metricbeat.", - "home.tutorials.elasticsearchLogs.artifacts.application.label": "Découverte", + "home.tutorials.elasticsearchLogs.artifacts.application.label": "Discover", "home.tutorials.elasticsearchLogs.nameTitle": "Logs Elasticsearch", "home.tutorials.elasticsearchLogs.shortDescription": "Collectez et analysez les logs à partir des clusters Elasticsearch avec Filebeat.", - "home.tutorials.elasticsearchMetrics.artifacts.application.label": "Découverte", + "home.tutorials.elasticsearchMetrics.artifacts.application.label": "Discover", "home.tutorials.elasticsearchMetrics.nameTitle": "Indicateurs Elasticsearch", "home.tutorials.elasticsearchMetrics.shortDescription": "Collectez les indicateurs à partir de clusters Elasticsearch avec Metricbeat.", "home.tutorials.envoyproxyLogs.artifacts.dashboards.linkLabel": "Aperçu d'Envoy Proxy", @@ -3759,7 +3925,7 @@ "home.tutorials.envoyproxyLogs.shortDescription": "Collectez et analysez les logs à partir d'Envoy Proxy avec Filebeat.", "home.tutorials.envoyproxyMetrics.nameTitle": "Indicateurs Envoy Proxy", "home.tutorials.envoyproxyMetrics.shortDescription": "Collectez les indicateurs à partir d'Envoy Proxy avec Metricbeat.", - "home.tutorials.etcdMetrics.artifacts.application.label": "Découverte", + "home.tutorials.etcdMetrics.artifacts.application.label": "Discover", "home.tutorials.etcdMetrics.nameTitle": "Indicateurs Etcd", "home.tutorials.etcdMetrics.shortDescription": "Collectez les indicateurs à partir des serveurs Etcd avec Metricbeat.", "home.tutorials.f5Logs.artifacts.dashboards.linkLabel": "Application Security", @@ -3783,13 +3949,13 @@ "home.tutorials.haproxyLogs.artifacts.dashboards.linkLabel": "Aperçu de HAProxy", "home.tutorials.haproxyLogs.nameTitle": "Logs HAProxy", "home.tutorials.haproxyLogs.shortDescription": "Collectez et analysez les logs à partir de serveurs HAProxy avec Filebeat.", - "home.tutorials.haproxyMetrics.artifacts.application.label": "Découverte", + "home.tutorials.haproxyMetrics.artifacts.application.label": "Discover", "home.tutorials.haproxyMetrics.nameTitle": "Indicateurs HAProxy", "home.tutorials.haproxyMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs HAProxy avec Metricbeat.", "home.tutorials.ibmmqLogs.artifacts.dashboards.linkLabel": "Événements IBM MQ", "home.tutorials.ibmmqLogs.nameTitle": "Logs IBM MQ", "home.tutorials.ibmmqLogs.shortDescription": "Collectez et analysez les logs à partir d'IBM MQ avec Filebeat.", - "home.tutorials.ibmmqMetrics.artifacts.application.label": "Découverte", + "home.tutorials.ibmmqMetrics.artifacts.application.label": "Discover", "home.tutorials.ibmmqMetrics.nameTitle": "Indicateurs IBM MQ", "home.tutorials.ibmmqMetrics.shortDescription": "Collectez les indicateurs à partir d'instances IBM MQ avec Metricbeat.", "home.tutorials.icingaLogs.artifacts.dashboards.linkLabel": "Log principal Icinga", @@ -3816,13 +3982,13 @@ "home.tutorials.kafkaLogs.artifacts.dashboards.linkLabel": "Tableau de bord des logs Kafka", "home.tutorials.kafkaLogs.nameTitle": "Logs Kafka", "home.tutorials.kafkaLogs.shortDescription": "Collectez et analysez les logs à partir de serveurs Kafka avec Filebeat.", - "home.tutorials.kafkaMetrics.artifacts.application.label": "Découverte", + "home.tutorials.kafkaMetrics.artifacts.application.label": "Discover", "home.tutorials.kafkaMetrics.nameTitle": "Indicateurs Kafka", "home.tutorials.kafkaMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs Kafka avec Metricbeat.", - "home.tutorials.kibanaLogs.artifacts.application.label": "Découverte", + "home.tutorials.kibanaLogs.artifacts.application.label": "Discover", "home.tutorials.kibanaLogs.nameTitle": "Logs Kibana", "home.tutorials.kibanaLogs.shortDescription": "Collectez et analysez les logs à partir de Kibana avec Filebeat.", - "home.tutorials.kibanaMetrics.artifacts.application.label": "Découverte", + "home.tutorials.kibanaMetrics.artifacts.application.label": "Discover", "home.tutorials.kibanaMetrics.nameTitle": "Indicateurs Kibana", "home.tutorials.kibanaMetrics.shortDescription": "Collectez les indicateurs à partir de Kibana avec Metricbeat.", "home.tutorials.kubernetesMetrics.artifacts.dashboards.linkLabel": "Tableau de bord des indicateurs Kubernetes", @@ -3831,10 +3997,10 @@ "home.tutorials.logstashLogs.artifacts.dashboards.linkLabel": "Logs Logstash", "home.tutorials.logstashLogs.nameTitle": "Logs Logstash", "home.tutorials.logstashLogs.shortDescription": "Collectez et analysez les logs principaux et lents à partir de Logstash avec Filebeat.", - "home.tutorials.logstashMetrics.artifacts.application.label": "Découverte", + "home.tutorials.logstashMetrics.artifacts.application.label": "Discover", "home.tutorials.logstashMetrics.nameTitle": "Indicateurs Logstash", "home.tutorials.logstashMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs Logstash avec Metricbeat.", - "home.tutorials.memcachedMetrics.artifacts.application.label": "Découverte", + "home.tutorials.memcachedMetrics.artifacts.application.label": "Discover", "home.tutorials.memcachedMetrics.nameTitle": "Indicateurs Memcached", "home.tutorials.memcachedMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs Memcached avec Metricbeat.", "home.tutorials.microsoftLogs.artifacts.dashboards.linkLabel": "Aperçu de Microsoft ATP", @@ -3849,13 +4015,13 @@ "home.tutorials.mongodbMetrics.artifacts.dashboards.linkLabel": "Tableau de bord des indicateurs MongoDB", "home.tutorials.mongodbMetrics.nameTitle": "Indicateurs MongoDB", "home.tutorials.mongodbMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs MongoDB avec Metricbeat.", - "home.tutorials.mssqlLogs.artifacts.application.label": "Découverte", + "home.tutorials.mssqlLogs.artifacts.application.label": "Discover", "home.tutorials.mssqlLogs.nameTitle": "Logs Microsoft SQL Server", "home.tutorials.mssqlLogs.shortDescription": "Collectez et analysez les logs à partir d'instances Microsoft SQL Server avec Filebeat.", "home.tutorials.mssqlMetrics.artifacts.dashboards.linkLabel": "Tableau de bord des indicateurs Microsoft SQL Server", "home.tutorials.mssqlMetrics.nameTitle": "Indicateurs Microsoft SQL Server", "home.tutorials.mssqlMetrics.shortDescription": "Collectez les indicateurs à partir d'instances Microsoft SQL Server avec Metricbeat.", - "home.tutorials.muninMetrics.artifacts.application.label": "Découverte", + "home.tutorials.muninMetrics.artifacts.application.label": "Discover", "home.tutorials.muninMetrics.nameTitle": "Indicateurs Munin", "home.tutorials.muninMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs Munin avec Metricbeat.", "home.tutorials.mysqlLogs.artifacts.dashboards.linkLabel": "Tableau de bord des logs MySQL", @@ -3890,7 +4056,7 @@ "home.tutorials.oktaLogs.shortDescription": "Collectez et analysez les logs à partir de l'API Okta avec Filebeat.", "home.tutorials.openmetricsMetrics.nameTitle": "Indicateurs OpenMetrics", "home.tutorials.openmetricsMetrics.shortDescription": "Collectez les indicateurs à partir d'un point de terminaison qui sert des indicateurs au format OpenMetrics avec Metricbeat.", - "home.tutorials.oracleMetrics.artifacts.application.label": "Découverte", + "home.tutorials.oracleMetrics.artifacts.application.label": "Discover", "home.tutorials.oracleMetrics.nameTitle": "Indicateurs Oracle", "home.tutorials.oracleMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs Oracle avec Metricbeat.", "home.tutorials.osqueryLogs.artifacts.dashboards.linkLabel": "Pack de conformité osquery", @@ -3906,10 +4072,10 @@ "home.tutorials.postgresqlLogs.shortDescription": "Collectez et analysez les logs à partir de serveurs PostgreSQL avec Filebeat.", "home.tutorials.postgresqlMetrics.nameTitle": "Indicateurs PostgreSQL", "home.tutorials.postgresqlMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs PostgreSQL avec Metricbeat.", - "home.tutorials.prometheusMetrics.artifacts.application.label": "Découverte", + "home.tutorials.prometheusMetrics.artifacts.application.label": "Discover", "home.tutorials.prometheusMetrics.nameTitle": "Indicateurs Prometheus", "home.tutorials.prometheusMetrics.shortDescription": "Collectez les indicateurs à partir d'exportateurs Prometheus avec Metricbeat.", - "home.tutorials.rabbitmqLogs.artifacts.application.label": "Découverte", + "home.tutorials.rabbitmqLogs.artifacts.application.label": "Discover", "home.tutorials.rabbitmqLogs.nameTitle": "Logs RabbitMQ", "home.tutorials.rabbitmqLogs.shortDescription": "Collectez et analysez les logs à partir de serveurs RabbitMQ avec Filebeat.", "home.tutorials.rabbitmqMetrics.artifacts.dashboards.linkLabel": "Tableau de bord des indicateurs RabbitMQ", @@ -3918,7 +4084,7 @@ "home.tutorials.radwareLogs.artifacts.dashboards.linkLabel": "Application Security", "home.tutorials.radwareLogs.nameTitle": "Logs Radware DefensePro", "home.tutorials.radwareLogs.shortDescription": "Collectez et analysez les logs à partir de Radware DefensePro avec Filebeat.", - "home.tutorials.redisenterpriseMetrics.artifacts.application.label": "Découverte", + "home.tutorials.redisenterpriseMetrics.artifacts.application.label": "Discover", "home.tutorials.redisenterpriseMetrics.nameTitle": "Indicateurs Redis Enterprise", "home.tutorials.redisenterpriseMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs Redis Enterprise avec Metricbeat.", "home.tutorials.redisLogs.artifacts.dashboards.linkLabel": "Tableau de bord des logs Redis", @@ -3966,19 +4132,19 @@ "home.tutorials.uwsgiMetrics.artifacts.dashboards.linkLabel": "Tableau de bord des indicateurs uWSGI", "home.tutorials.uwsgiMetrics.nameTitle": "Indicateurs uWSGI", "home.tutorials.uwsgiMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs uWSGI avec Metricbeat.", - "home.tutorials.vsphereMetrics.artifacts.application.label": "Découverte", + "home.tutorials.vsphereMetrics.artifacts.application.label": "Discover", "home.tutorials.vsphereMetrics.nameTitle": "Indicateurs vSphere", "home.tutorials.vsphereMetrics.shortDescription": "Collectez les indicateurs à partir de vSphere avec Metricbeat.", "home.tutorials.windowsEventLogs.artifacts.application.label": "Application SIEM", "home.tutorials.windowsEventLogs.nameTitle": "Logs des événements Windows", "home.tutorials.windowsEventLogs.shortDescription": "Collectez et analysez les logs à partir de Windows Event Logs avec WinLogBeat.", - "home.tutorials.windowsMetrics.artifacts.application.label": "Découverte", + "home.tutorials.windowsMetrics.artifacts.application.label": "Discover", "home.tutorials.windowsMetrics.nameTitle": "Indicateurs Windows", "home.tutorials.windowsMetrics.shortDescription": "Collectez les indicateurs à partir de Windows avec Metricbeat.", "home.tutorials.zeekLogs.artifacts.dashboards.linkLabel": "Aperçu de Zeek", "home.tutorials.zeekLogs.nameTitle": "Logs Zeek", "home.tutorials.zeekLogs.shortDescription": "Collectez et analysez les logs à partir de la sécurité réseau Zeek avec Filebeat.", - "home.tutorials.zookeeperMetrics.artifacts.application.label": "Découverte", + "home.tutorials.zookeeperMetrics.artifacts.application.label": "Discover", "home.tutorials.zookeeperMetrics.nameTitle": "Indicateurs Zookeeper", "home.tutorials.zookeeperMetrics.shortDescription": "Collectez les indicateurs à partir de serveurs Zookeeper avec Metricbeat.", "home.tutorials.zscalerLogs.artifacts.dashboards.linkLabel": "Application Security", @@ -3988,20 +4154,20 @@ "homePackages.sampleDataCard.addButtonAriaLabel": "Ajouter {datasetName}", "homePackages.sampleDataCard.addingButtonAriaLabel": "Ajout de {datasetName}", "homePackages.sampleDataCard.default.addButtonAriaLabel": "Ajouter {datasetName}", - "homePackages.sampleDataCard.default.unableToVerifyErrorMessage": "Impossible de vérifier le statut de l'ensemble de données. Erreur : {statusMsg}", - "homePackages.sampleDataCard.removeButtonAriaLabel": "Retirer {datasetName}", - "homePackages.sampleDataCard.removingButtonAriaLabel": "Retrait de {datasetName}", - "homePackages.sampleDataCard.viewDataButtonAriaLabel": "Afficher {datasetName}", + "homePackages.sampleDataCard.default.unableToVerifyErrorMessage": "Impossible de vérifier le statut de l'ensemble de données. Erreur : {statusMsg}.", + "homePackages.sampleDataCard.removeButtonAriaLabel": "Supprimer {datasetName}", + "homePackages.sampleDataCard.removingButtonAriaLabel": "Suppression de {datasetName}", + "homePackages.sampleDataCard.viewDataButtonAriaLabel": "Consulter {datasetName}", "homePackages.sampleDataSet.installedLabel": "{name} installé", - "homePackages.sampleDataSet.unableToInstallErrorMessage": "Impossible d'installer l'exemple d'ensemble de données : {name}", - "homePackages.sampleDataSet.unableToUninstallErrorMessage": "Impossible de désinstaller l'exemple d'ensemble de données : {name}", + "homePackages.sampleDataSet.unableToInstallErrorMessage": "Impossible d'installer l'exemple d’ensemble de données : {name}.", + "homePackages.sampleDataSet.unableToUninstallErrorMessage": "Impossible de désinstaller l'exemple d’ensemble de données : {name}.", "homePackages.sampleDataSet.uninstalledLabel": "{name} désinstallé", "homePackages.demoEnvironmentPanel.welcomeImageAlt": "Illustration des intégrations de données Elastic", "homePackages.demoEnvironmentPanel.welcomeMessage": "Parcourez des données réelles dans un environnement de démonstration où vous pourrez explorer des cas d'utilisation de recherche, d'observabilité et de sécurité comme le vôtre.", "homePackages.demoEnvironmentPanel.welcomeTitle": "Explorer notre environnement de démonstration en direct", "homePackages.sampleDataCard.addButtonLabel": "Ajouter des données", "homePackages.sampleDataCard.addingButtonLabel": "Ajout", - "homePackages.sampleDataCard.dashboardLinkLabel": "Tableau de bord", + "homePackages.sampleDataCard.dashboardLinkLabel": "Dashboard", "homePackages.sampleDataCard.default.addButtonLabel": "Ajouter des données", "homePackages.sampleDataCard.removeButtonLabel": "Supprimer", "homePackages.sampleDataCard.removingButtonLabel": "Suppression", @@ -4041,12 +4207,12 @@ "imageEmbeddable.triggers.imageClickTriggerTitle": "Clic sur l'image", "indexPatternEditor.pagingLabel": "Lignes par page : {perPage}", "indexPatternEditor.rollup.uncaughtError": "Erreur de vue de données de cumul : {error}", - "indexPatternEditor.status.matchAnyLabel.matchAnyDetail": "Votre modèle d'indexation peut correspondre à {sourceCount, plural, one {# source} many {# sources} other {# sources}}.", - "indexPatternEditor.status.notMatchLabel.allIndicesLabel": "{indicesLength, plural, one {# source} many {# sources} other {# sources}}", + "indexPatternEditor.status.matchAnyLabel.matchAnyDetail": "Votre modèle d'indexation peut correspondre à {sourceCount, plural, one {# source} other {# sources} }.", + "indexPatternEditor.status.notMatchLabel.allIndicesLabel": "{indicesLength, plural, one {# source} other {# sources} }", "indexPatternEditor.status.notMatchLabel.notMatchDetail": "Le modèle d'indexation spécifié ne correspond à aucun flux de données, index ni alias d'index. Vous pouvez faire correspondre {strongIndices}.", - "indexPatternEditor.status.partialMatchLabel.partialMatchDetail": "Votre modèle d'indexation ne correspond à aucun flux de données, index ni alias d'index, mais {strongIndices} {matchedIndicesLength, plural, one {est} many {sont} other {sont du mauvais type}} semblable(s).", - "indexPatternEditor.status.partialMatchLabel.strongIndicesLabel": "{matchedIndicesLength, plural, one {source} many {# sources} other {# sources}}", - "indexPatternEditor.status.successLabel.successDetail": "Votre modèle d'indexation peut correspondre à {sourceCount} {sourceCount, plural, one {source} many {sources organisationnelles} other {sources}}.", + "indexPatternEditor.status.partialMatchLabel.partialMatchDetail": "Votre modèle d'indexation ne correspond à aucun flux de données, index ni alias d'index, mais {strongIndices} {matchedIndicesLength, plural, one {est semblable} other {sont semblables} }.", + "indexPatternEditor.status.partialMatchLabel.strongIndicesLabel": "{matchedIndicesLength, plural, one {source} other {# sources} }", + "indexPatternEditor.status.successLabel.successDetail": "Votre modèle d'indexation correspond à {sourceCount} {sourceCount, plural, one {source} other {sources} }.", "indexPatternEditor.createIndex.noMatch": "Le nom doit correspondre à au moins un flux de données, index ou alias d'index.", "indexPatternEditor.createIndexPattern.stepTime.noTimeFieldOptionLabel": "--- Je ne souhaite pas utiliser le filtre temporel ---", "indexPatternEditor.dataView.unableSaveLabel": "Échec de l'enregistrement de la vue de données.", @@ -4114,16 +4280,16 @@ "indexPatternEditor.typeSelect.standardTitle": "Vue de données standard", "indexPatternEditor.validations.noSingleAstriskPattern": "Un seul astérisque \"*\" n’est pas un modèle d'indexation autorisé", "indexPatternEditor.validations.titleIsRequiredErrorMessage": "Un modèle d'indexation est requis.", - "indexPatternFieldEditor.date.momentLabel": "Modèle de format Moment.js (Par défaut : {defaultPattern})", - "indexPatternFieldEditor.defaultErrorMessage": "Une erreur s'est produite lors de l'utilisation de cette configuration de format : {message}", - "indexPatternFieldEditor.defaultFormatHeader": "Format (Par défaut : {defaultFormat})", - "indexPatternFieldEditor.deleteRuntimeField.confirmModal.deleteMultipleTitle": "Supprimer {count} champs", + "indexPatternFieldEditor.date.momentLabel": "Modèle de format Moment.js (par défaut : {defaultPattern})", + "indexPatternFieldEditor.defaultErrorMessage": "Une erreur s'est produite lors de l'utilisation de cette configuration de format : {message}.", + "indexPatternFieldEditor.defaultFormatHeader": "Format (par défaut : {defaultFormat})", + "indexPatternFieldEditor.deleteRuntimeField.confirmModal.deleteMultipleTitle": "Supprimer {count} champs", "indexPatternFieldEditor.editField.flyoutAriaLabel": "Modifier le champ {fieldName}", "indexPatternFieldEditor.editor.flyoutEditFieldSubtitle": "Vue de données : {patternName}", - "indexPatternFieldEditor.editor.form.source.scriptFieldHelpText": "Les champs d'exécution sans script récupèrent les valeurs de {source}. Si un champ n'existe pas dans _source, la requête de recherche ne renvoie aucune valeur. {learnMoreLink}", + "indexPatternFieldEditor.editor.form.source.scriptFieldHelpText": "Les champs d'exécution sans script récupèrent les valeurs de {source}. Si un champ n'existe pas dans _source, la recherche ne renvoie pas de valeur. {learnMoreLink}", "indexPatternFieldEditor.editor.form.valueDescription": "Définissez une valeur pour le champ au lieu de la récupérer à partir du champ portant le même nom dans {source}.", "indexPatternFieldEditor.fieldPreview.subTitle": "De : {documentSource}", - "indexPatternFieldEditor.number.numeralLabel": "Modèle de format Numeral.js (Par défaut : {defaultPattern})", + "indexPatternFieldEditor.number.numeralLabel": "Modèle de format Numeral.js (par défaut : {defaultPattern})", "indexPatternFieldEditor.cancelField.confirmationModal.cancelButtonLabel": "Annuler", "indexPatternFieldEditor.cancelField.confirmationModal.description": "Les modifications apportées à votre champ seront ignorées. Voulez-vous vraiment continuer ?", "indexPatternFieldEditor.cancelField.confirmationModal.title": "Ignorer les modifications", @@ -4261,42 +4427,45 @@ "indexPatternFieldEditor.url.urlTemplateLabel": "Modèle d'URL", "indexPatternFieldEditor.url.widthLabel": "Largeur", "indexPatternManagement.createDataView.emptyState.createAnywayTxt": "Vous pouvez également {link}", - "indexPatternManagement.dataViewTable.deleteButtonLabel": "Supprimer {selectedItems, number} {selectedItems, plural, one {Vue de données} many {Vues de données} other {Vues de données}}", - "indexPatternManagement.dataViewTable.deleteConfirmSummary": "Vous allez supprimer définitivement {count, number} {count, plural, one {vue de données} many {Les vues de données sont introuvables} other {vues de données}}.", - "indexPatternManagement.defaultFormatHeader": "Format (Par défaut : {defaultFormat})", + "indexPatternManagement.dataViewTable.deleteButtonLabel": "Supprimer {selectedItems, number} {selectedItems, plural, one {vue de données} other {vues de données} }", + "indexPatternManagement.dataViewTable.deleteConfirmSummary": "Vous allez supprimer de manière définitive {count, number} {count, plural, one {vue de données} other {vues de données} }.", + "indexPatternManagement.defaultFormatHeader": "Format (par défaut : {defaultFormat})", "indexPatternManagement.deleteFieldLabel": "Il est impossible de récupérer un champ supprimé.{separator}Voulez-vous vraiment continuer ?", "indexPatternManagement.editDataView.deleteWarning": "La vue de données {dataViewName} va être supprimée. Vous ne pouvez pas annuler cette action.", "indexPatternManagement.editDataView.deleteWarningWithNamespaces": "Supprimer la vue de données {dataViewName} de tous les espaces dans lesquels elle est partagée. Vous ne pouvez pas annuler cette action.", "indexPatternManagement.editHeader": "Modifier {fieldName}", "indexPatternManagement.editIndexPattern.couldNotLoadMessage": "La vue de données ayant l'ID {objectId} n'a pas pu être chargée. Essayez d'en créer une nouvelle.", "indexPatternManagement.editIndexPattern.deprecation": "Les champs scriptés sont déclassés. Utilisez {runtimeDocs} à la place.", - "indexPatternManagement.editIndexPattern.fields.conflictModal.description": "Le type du champ {fieldName} change entre les index et peut ne pas être disponible pour la recherche, les visualisations et d'autres analyses.", + "indexPatternManagement.editIndexPattern.fields.conflictModal.description": "Le type de champ {fieldName} change entre les index et peut ne pas être disponible pour la recherche, les visualisations et d'autres analyses.", "indexPatternManagement.editIndexPattern.list.DateHistogramDelaySummary": "retard : {delay},", "indexPatternManagement.editIndexPattern.list.dateHistogramSummary": "{aggName} (intervalle : {interval}, {delay} {time_zone})", "indexPatternManagement.editIndexPattern.list.histogramSummary": "{aggName} (intervalle : {interval})", - "indexPatternManagement.editIndexPattern.mappingConflictLabel": "{conflictFieldsLength, plural, one {Un champ est défini} many {# champs} other {# champs sont définis}} avec plusieurs types (chaîne, entier, etc.) dans les différents index qui correspondent à ce modèle. Vous pourrez peut-être utiliser ce ou ces champs en conflit dans certaines parties de Kibana, mais ils ne seront pas disponibles pour les fonctions qui nécessitent que Kibana connaisse leur type. Pour corriger ce problème, vous devrez réindexer vos données.", + "indexPatternManagement.editIndexPattern.mappingConflictLabel": "{conflictFieldsLength, plural, one {Un champ est défini} other {# champs sont définis}} avec plusieurs types (chaîne, entier, etc.) dans les différents index qui correspondent à ce modèle. Vous pourrez peut-être utiliser ce ou ces champs en conflit dans certaines parties de Kibana, mais ils ne seront pas disponibles pour les fonctions qui nécessitent que Kibana connaisse leur type. Pour corriger ce problème, vous devrez réindexer vos données.", "indexPatternManagement.editIndexPattern.scripted.deprecationLangLabel.deprecationLangDetail": "Les langages déclassés suivants sont en cours d'utilisation : {deprecatedLangsInUse}. La prise en charge de ces langages sera supprimée dans la prochaine version majeure de Kibana et d'Elasticsearch. Convertissez vos champs scriptés en {link} pour éviter tout problème.", "indexPatternManagement.editIndexPattern.tabs.relationshipsHeader": "Relations ({count})", - "indexPatternManagement.mappingConflictLabel.mappingConflictDetail": "{mappingConflict} Vous avez déjà un champ avec le nom {fieldName}. Si vous donnez le même nom à votre champ scripté, vous ne pourrez pas interroger les deux champs en même temps.", + "indexPatternManagement.mappingConflictLabel.mappingConflictDetail": "{mappingConflict} Vous avez déjà un champ nommé {fieldName}. Si vous donnez le même nom à votre champ scripté, vous ne pourrez pas interroger les deux champs en même temps.", "indexPatternManagement.script.accessWithLabel": "Accédez aux champs avec {code}.", "indexPatternManagement.scriptedFieldsDeprecatedBody": "Pour profiter de plus de flexibilité et de la prise en charge des scripts Painless, utilisez {runtimeDocs}.", - "indexPatternManagement.syntax.defaultLabel.defaultDetail": "Par défaut, les champs scriptés Kibana utilisent {painless}, un langage de script simple et sécurisé conçu spécifiquement pour être utilisé avec Elasticsearch. Pour accéder aux valeurs du document, utilisez le format suivant :", + "indexPatternManagement.syntax.defaultLabel.defaultDetail": "Par défaut, les champs scriptés Kibana emploient {painless}, un langage de script simple et sécurisé spécialement conçu pour Elasticsearch. Pour accéder aux valeurs du document, utilisez le format suivant :", "indexPatternManagement.syntax.lucene.commonLabel.commonDetail": "Vous venez d'une ancienne version de Kibana ? Les expressions {lucene} que vous connaissez et adorez sont toujours disponibles. Les expressions Lucene ressemblent beaucoup à du JavaScript, mais elles se limitent aux opérations arithmétiques de base, aux opérations au niveau du bit et aux opérations de comparaison.", "indexPatternManagement.syntax.lucene.operations.arithmeticLabel": "Opérateurs arithmétiques : {operators}", - "indexPatternManagement.syntax.lucene.operations.bitwiseLabel": "Opérateurs bit : {operators}", + "indexPatternManagement.syntax.lucene.operations.bitwiseLabel": "Opérateurs au niveau du bit : {operators}", "indexPatternManagement.syntax.lucene.operations.booleanLabel": "Opérateurs booléens (y compris l'opérateur ternaire) : {operators}", "indexPatternManagement.syntax.lucene.operations.comparisonLabel": "Opérateurs de comparaison : {operators}", "indexPatternManagement.syntax.lucene.operations.distanceLabel": "Fonctions de distance : {operators}", "indexPatternManagement.syntax.lucene.operations.mathLabel": "Fonctions mathématiques communes : {operators}", "indexPatternManagement.syntax.lucene.operations.miscellaneousLabel": "Fonctions diverses : {operators}", - "indexPatternManagement.syntax.lucene.operations.trigLabel": "Fonctions de la bibliothèque trigonométrique : {operators}", + "indexPatternManagement.syntax.lucene.operations.trigLabel": "Fonctions de bibliothèque trigonométrique : {operators}", "indexPatternManagement.syntax.painlessLabel.painlessDetail": "Painless est un langage puissant, mais facile à utiliser. Il donne accès à de nombreuses {javaAPIs}. Lisez-en plus sur sa {syntax} et découvrez tout ce que vous devez savoir en un rien de temps !", - "indexPatternManagement.warningCallOutLabel.callOutDetail": "Familiarisez-vous avec les {scripFields} et {scriptsInAggregation} avant d'utiliser cette fonctionnalité. Les champs scriptés peuvent être utilisés pour afficher et agréger les valeurs calculées. Dès lors, ils peuvent être très lents et, s'ils ne sont pas faits correctement, ils peuvent rendre Kibana inutilisable.", - "indexPatternManagement.warningLabel.warningDetail": "{language} est obsolète et la prise en charge sera supprimée dans la prochaine version majeure de Kibana et Elasticsearch. Nous recommandons d'utiliser {painlessLink} pour de nouveaux champs scriptés.", + "indexPatternManagement.warningCallOutLabel.callOutDetail": "Familiarisez-vous avec les {scripFields} et les {scriptsInAggregation} avant d'utiliser cette fonctionnalité. Les champs scriptés peuvent être utilisés pour afficher et agréger les valeurs calculées. Dès lors, ils peuvent être très lents et, s'ils ne sont pas faits correctement, ils peuvent rendre Kibana inutilisable.", + "indexPatternManagement.warningLabel.warningDetail": "{language} est déclassé et ne sera plus pris en charge dans la prochaine version majeure de Kibana et d'Elasticsearch. Nous recommandons d'utiliser {painlessLink} pour les nouveaux champs scriptés.", "indexPatternManagement.actions.cancelButton": "Annuler", "indexPatternManagement.actions.createButton": "Créer un champ", "indexPatternManagement.actions.deleteButton": "Supprimer", "indexPatternManagement.actions.saveButton": "Enregistrer le champ", + "indexPatternManagement.addDataPrompt.addDataText": "Ajouter des données", + "indexPatternManagement.addDataPrompt.dataViewExplanation": "Les vues de données identifient les données Elasticsearch que vous souhaitez explorer. Une fois vos données ajoutées à Elasticsearch, vous pouvez faire pointer des vues de données vers l'un ou plusieurs des indices, flux de données et alias d'index qui ont été créés. Ajoutez vos données dès maintenant pour lancer la recherche.", + "indexPatternManagement.addDataPrompt.toCreateAddData": "Pour créer une vue de données, ajoutez vos données à Elasticsearch", "indexPatternManagement.createDataView.emptyState.checkDataButton": "Rechercher de nouvelles données", "indexPatternManagement.createDataView.emptyState.createAnywayLink": "créer une vue de données par rapport à des index masqués, système ou par défaut.", "indexPatternManagement.createDataView.emptyState.haveData": "Vous pensez avoir déjà des données ?", @@ -4329,7 +4498,7 @@ "indexPatternManagement.defaultFormatDropDown": "- Par défaut -", "indexPatternManagement.deleteField.cancelButton": "Annuler", "indexPatternManagement.deleteField.deleteButton": "Supprimer", - "indexPatternManagement.deleteField.deletedHeader": "\"’{fieldName}\" supprimé", + "indexPatternManagement.deleteField.deletedHeader": "\"{fieldName}\" supprimé", "indexPatternManagement.deleteField.savedHeader": "\"{fieldName}\" enregistré", "indexPatternManagement.deleteFieldHeader": "Supprimer le champ \"{fieldName}\"", "indexPatternManagement.disabledCallOutHeader": "Scripts désactivés", @@ -4340,6 +4509,8 @@ "indexPatternManagement.editDataView.editTooltip": "Modifier", "indexPatternManagement.editDataView.fields.table.conflictType": "Conflit", "indexPatternManagement.editDataView.fields.table.runtimeIconTipText": "Ce champ existe uniquement dans la vue de données.", + "indexPatternManagement.editDataView.refreshAria": "Actualiser", + "indexPatternManagement.editDataView.refreshTooltip": "Actualiser la copie locale de la liste des champs de vues de données", "indexPatternManagement.editDataView.removeAria": "Supprimer la vue de données.", "indexPatternManagement.editDataView.removeTooltip": "Supprimer", "indexPatternManagement.editDataView.setDefaultAria": "Définir en tant que vue de données par défaut.", @@ -4425,11 +4596,12 @@ "indexPatternManagement.editIndexPattern.source.table.notMatchedLabel": "Le filtre source ne correspond à aucun champ connu.", "indexPatternManagement.editIndexPattern.source.table.saveAria": "Enregistrer", "indexPatternManagement.editIndexPattern.sourceLabel": "Les filtres de champ peuvent être utilisés pour exclure un ou plusieurs champs lors de la récupération d'un document. Cela se produit lors de l'affichage d'un document dans l'application Discover ou avec un tableau affichant les résultats d'une recherche enregistrée dans l'application Dashboard. Si vous avez des documents avec des champs de grande taille ou peu importants, il pourrait être utile de filtrer ces champs à ce niveau plus bas.", - "indexPatternManagement.editIndexPattern.sourcePlaceholder": "filtre de champ, accepte les caractères génériques (par ex. \"utilisateur*\" pour filtrer les champs commençant par \"utilisateur\")", + "indexPatternManagement.editIndexPattern.sourcePlaceholder": "filtre de champ, accepte les caractères génériques (par ex. `user*` pour filtrer les champs commençant par `user`)", "indexPatternManagement.editIndexPattern.tabs.fieldsHeader": "Champs", "indexPatternManagement.editIndexPattern.tabs.scriptedHeader": "Champs scriptés", "indexPatternManagement.editIndexPattern.tabs.sourceHeader": "Filtres de champ", "indexPatternManagement.editIndexPattern.timeFilterHeading": "Champ temporel :", + "indexPatternManagement.editIndexPattern.viewMappingConflictButton": "Afficher les conflits", "indexPatternManagement.fieldTypeConflict": "Conflit de type de champ", "indexPatternManagement.formatHeader": "Format", "indexPatternManagement.formatLabel": "Le formatage détermine la façon dont les valeurs sont affichées. La modification de ce paramètre peut également affecter la valeur du champ et la mise en surbrillance dans Discover.", @@ -4446,6 +4618,8 @@ "indexPatternManagement.nameErrorMessage": "Nom obligatoire", "indexPatternManagement.nameLabel": "Nom", "indexPatternManagement.namePlaceholder": "Nouveau champ scripté", + "indexPatternManagement.noDataViewsPrompt.learnMore": "Envie d'en savoir plus ?", + "indexPatternManagement.noDataViewsPrompt.readDocumentation": "Lisez les documents", "indexPatternManagement.objectsTable.relationships.columnTitleDescription": "Titre de l'objet enregistré", "indexPatternManagement.objectsTable.relationships.columnTitleName": "Titre", "indexPatternManagement.objectsTable.relationships.columnTypeDescription": "Type de l'objet enregistré", @@ -4486,10 +4660,12 @@ "indexPatternManagement.warningHeader": "Avertissement de déclassement :", "indexPatternManagement.warningLabel.painlessLinkLabel": "Painless", "inputControl.control.noIndexPatternTooltip": "Impossible de localiser l'ID du modèle d'indexation : {indexPatternId}.", - "inputControl.control.noValuesDisableTooltip": "Le filtrage se produit sur le champ \"{fieldName}\", qui n'existe sur aucun document dans le modèle d'indexation \"{indexPatternName}\". Sélectionnez un champ différent ou des documents d'index qui contiennent des valeurs pour ce champ.", - "inputControl.listControl.unableToFetchTooltip": "Impossible de récupérer les termes. Erreur : {errorMessage}", - "inputControl.rangeControl.unableToFetchTooltip": "Impossible de récupérer les valeurs min. et max. de la plage. Erreur : {errorMessage}", + "inputControl.control.noValuesDisableTooltip": "Le filtrage se produit sur le champ \"{fieldName}\", qui n'existe dans aucun document du modèle d'indexation \"{indexPatternName}\". Sélectionnez un champ différent ou des documents d'index qui contiennent des valeurs pour ce champ.", + "inputControl.listControl.unableToFetchTooltip": "Impossible de récupérer les termes. Erreur : {errorMessage}.", + "inputControl.rangeControl.unableToFetchTooltip": "Impossible de récupérer les valeurs min. et max. de la plage. Erreur : {errorMessage}.", "inputControl.control.notInitializedTooltip": "Le contrôle n'a pas été initialisé.", + "inputControl.deprecationBadgeAction.deprecationBadgeLabel": "Déclassé", + "inputControl.deprecationBadgeAction.deprecationWarningDescription": "Les contrôles d'entrée sont déclassés et seront supprimés dans une prochaine version. Utilisez les nouveaux contrôles pour filtrer les données de votre tableau de bord et interagir avec elles.", "inputControl.editor.controlEditor.controlLabel": "Contrôler l'étiquette", "inputControl.editor.controlEditor.moveControlDownAriaLabel": "Abaisser le contrôle", "inputControl.editor.controlEditor.moveControlUpAriaLabel": "Remonter le contrôle", @@ -4529,17 +4705,17 @@ "inputControl.vis.listControl.partialResultsWarningMessage": "La liste des termes peut être incomplète, car la requête prend trop de temps. Ajustez les paramètres de saisie semi-automatique dans le fichier kibana.yml pour obtenir des résultats complets.", "inputControl.vis.listControl.selectPlaceholder": "Sélectionner…", "inputControl.vis.listControl.selectTextPlaceholder": "Sélectionner…", - "inspector.requests.clusters.shards.flyoutTitle": "Échec de {failedShardCount} {failedShardCount, plural, one {partition} many {partitions} other {partitions}}", - "inspector.requests.clusters.shards.openShardFailureFlyoutButtonLabel": "Afficher l'échec de {failedShardCount} {failedShardCount, plural, one {partition} many {partitions} other {partitions}}", - "inspector.requests.clusters.shards.successfulShardsLabel": "{successful} {total} réussie(s)", + "inspector.requests.clusters.shards.flyoutTitle": "{failedShardCount} {failedShardCount, plural, one {partition a échoué} other {partitions ont échoué}}", + "inspector.requests.clusters.shards.openShardFailureFlyoutButtonLabel": "Voir {failedShardCount} {failedShardCount, plural, one {la partition a échoué} other {les partitions ont échoué}}", + "inspector.requests.clusters.shards.successfulShardsLabel": "{successful} réussie(s) sur {total}", "inspector.requests.clusters.shards.totalShardsLabel": "Nombre total de partitions : {total}", - "inspector.requests.clusters.table.responseTimeInMilliseconds": "{responseTime} ms", - "inspector.requests.clusters.totalClustersLabel": "{total} {total, plural, one {cluster} many {clusters} other {clusters}}", + "inspector.requests.clusters.table.responseTimeInMilliseconds": "{responseTime}ms", + "inspector.requests.clusters.totalClustersLabel": "{total} {total, plural, one {cluster} other {clusters}}", "inspector.requests.requestTimeLabel": "{requestTime} ms", - "inspector.requests.requestWasMadeDescription": "{requestsCount, plural, one {# demande effectuée} many {# demandes effectuées} other {# demandes effectuées}} {failedRequests}", - "inspector.requests.requestWasMadeDescription.requestHadFailureText": ", {failedCount} en échec", + "inspector.requests.requestWasMadeDescription": "{requestsCount, plural, one {# requête a été effectuée} other {# requêtes ont été effectuées} }{failedRequests}", + "inspector.requests.requestWasMadeDescription.requestHadFailureText": ", {failedCount} a/ont échoué.", "inspector.requests.searchSessionId": "ID de la session de recherche : {searchSessionId}", - "inspector.view": "Afficher : {viewName}", + "inspector.view": "Vue : {viewName}", "inspector.closeButton": "Fermer l'inspecteur", "inspector.reqTimestampDescription": "Heure de début de la requête", "inspector.reqTimestampKey": "Horodatage de la requête", @@ -4560,9 +4736,11 @@ "inspector.requests.clusters.table.expandRow": "Développer la ligne du tableau pour afficher les détails de cluster", "inspector.requests.clusters.table.localClusterDisplayName": "Cluster local", "inspector.requests.clusters.table.nameLabel": "Nom", + "inspector.requests.clusters.table.noItemsFound": "Aucun cluster trouvé", "inspector.requests.clusters.table.responseTimeLabel": "Temps de réponse", "inspector.requests.clusters.table.statusLabel": "Statut", "inspector.requests.clusters.timedOutMessage": "Requête expirée avant achèvement. Les résultats peuvent être incomplets ou vides.", + "inspector.requests.clusters.view.statusFilterLabel": "Statut", "inspector.requests.clustersTabLabel": "Clusters et partitions", "inspector.requests.copyToClipboardLabel": "Copier dans le presse-papiers", "inspector.requests.descriptionRowIconAriaLabel": "Description", @@ -4582,20 +4760,20 @@ "inspector.requests.responseTabLabel": "Réponse", "inspector.requests.statisticsTabLabel": "Statistiques", "inspector.title": "Inspecteur", - "interactiveSetup.certificatePanel.fingerprint": "Empreinte numérique (SHA-256) : {fingerprint}", + "interactiveSetup.certificatePanel.fingerprint": "Empreinte digitale (SHA-256) : {fingerprint}", "interactiveSetup.certificatePanel.issuer": "Émis par : {issuer}", "interactiveSetup.certificatePanel.validFrom": "Émis le : {validFrom}", "interactiveSetup.certificatePanel.validTo": "Expire le : {validTo}", - "interactiveSetup.clusterAddressForm.submitButton": "{isSubmitting, select, true {Vérification de l''adresse…} other {Vérifier l''adresse}}", - "interactiveSetup.clusterConfigurationForm.submitButton": "{isSubmitting, select, true {Configuration d''Elastic…} other {Configurer Elastic}}", - "interactiveSetup.enrollmentTokenForm.submitButton": "{isSubmitting, select, true {Configuration d''Elastic…} other {Configurer Elastic}}", + "interactiveSetup.clusterAddressForm.submitButton": "{isSubmitting, select, true{Vérification de l'adresse…} other{Vérifier l'adresse}}", + "interactiveSetup.clusterConfigurationForm.submitButton": "{isSubmitting, select, true{Configuration d'Elastic…} other{Configurer Elastic}}", + "interactiveSetup.enrollmentTokenForm.submitButton": "{isSubmitting, select, true{Configuration d'Elastic…} other{Configurer Elastic}}", "interactiveSetup.forgotPasswordPopover.helpText": "Pour réinitialiser le mot de passe de l'utilisateur {username}, exécutez la commande suivante à partir du répertoire d'installation Elasticsearch :", "interactiveSetup.singleCharsField.digitLabel": "Chiffre {index}", "interactiveSetup.submitErrorCallout.compatibilityFailureErrorDescription": "Le cluster Elasticsearch (v{elasticsearchVersion}) est incompatible avec cette version de Kibana (v{kibanaVersion}).", "interactiveSetup.submitErrorCallout.kibanaConfigFailureErrorDescription": "Réessayez ou mettez à jour le fichier {config} manuellement.", "interactiveSetup.submitErrorCallout.kibanaConfigNotWritableErrorDescription": "Vérifiez les autorisations du fichier et assurez-vous que {config} peut être écrit par le processus Kibana.", "interactiveSetup.verificationCodeForm.codeDescription": "Copiez le code à partir du serveur Kibana ou exécutez {command} pour le récupérer.", - "interactiveSetup.verificationCodeForm.submitButton": "{isSubmitting, select, true {Vérification en cours…} other {Vérifier}}", + "interactiveSetup.verificationCodeForm.submitButton": "{isSubmitting, select, true{Vérification…} other{Vérifier}}", "interactiveSetup.app.notReady": "Le serveur Kibana n’est pas encore prêt.", "interactiveSetup.app.pageTitle": "Configurez Elastic pour commencer", "interactiveSetup.certificateChain.cancelButton": "Fermer", @@ -4650,24 +4828,24 @@ "interactiveSetup.verificationCodeForm.submitErrorTitle": "Vérification du code impossible", "interactiveSetup.verificationCodeForm.title": "Vérification requise", "kbnConfig.deprecations.conflictSetting.manualStepOneMessage": "Assurez-vous que \"{fullNewPath}\" contient la valeur correcte dans le fichier de configuration, l'indicateur CLI ou la variable d'environnement (dans Docker uniquement).", - "kbnConfig.deprecations.conflictSetting.manualStepTwoMessage": "Retirez \"{fullOldPath}\" de la configuration.", + "kbnConfig.deprecations.conflictSetting.manualStepTwoMessage": "Supprimez \"{fullOldPath}\" de la configuration.", "kbnConfig.deprecations.conflictSettingMessage": "Le paramètre \"{fullOldPath}\" a été remplacé par \"{fullNewPath}\". Cependant, les deux clés sont présentes. Ignorer \"{fullOldPath}\"", - "kbnConfig.deprecations.deprecatedSetting.manualStepOneMessage": "Retirez \"{fullPath}\" du fichier de configuration Kibana, de l'indicateur CLI ou de la variable d'environnement (dans Docker uniquement) avant de passer à {removeBy}.", + "kbnConfig.deprecations.deprecatedSetting.manualStepOneMessage": "Retirez \"{fullPath}\" dans le fichier de configuration Kibana, l'indicateur CLI ou la variable d'environnement (dans Docker uniquement) avant de passer à {removeBy}.", "kbnConfig.deprecations.deprecatedSettingMessage": "La configuration de \"{fullPath}\" est déclassée et sera supprimée dans {removeBy}.", "kbnConfig.deprecations.deprecatedSettingTitle": "Le paramètre \"{deprecationPath}\" est déclassé", "kbnConfig.deprecations.replacedSetting.manualStepOneMessage": "Remplacez \"{fullOldPath}\" par \"{fullNewPath}\" dans le fichier de configuration Kibana, l'indicateur CLI ou la variable d'environnement (dans Docker uniquement).", - "kbnConfig.deprecations.replacedSettingMessage": "Le paramètre \"{fullOldPath}\" a été remplacé par \"{fullNewPath}\"", - "kbnConfig.deprecations.unusedSetting.manualStepOneMessage": "Retirez \"{fullPath}\" du fichier de configuration Kibana, de l'indicateur CLI ou de la variable d'environnement (dans Docker uniquement).", - "kbnConfig.deprecations.unusedSettingMessage": "Vous n'avez plus besoin de configurer \"{fullPath}\".", + "kbnConfig.deprecations.replacedSettingMessage": "Le paramètre \"{fullOldPath}\" a été remplacé par \"{fullNewPath}\".", + "kbnConfig.deprecations.unusedSetting.manualStepOneMessage": "Retirez \"{fullPath}\" dans le fichier de configuration Kibana, l'indicateur CLI ou la variable d'environnement (dans Docker uniquement).", + "kbnConfig.deprecations.unusedSettingMessage": "Vous n’avez plus besoin de configurer \"{fullPath}\".", "kibana_utils.stateManagement.stateHash.unableToStoreHistoryInSessionErrorMessage": "Kibana n'est pas en mesure de stocker des éléments d'historique dans votre session, car le stockage est arrivé à saturation et il ne semble pas y avoir d'éléments pouvant être supprimés sans risque.\n\nCe problème peut généralement être corrigé en passant à un nouvel onglet, mais il peut être causé par un problème plus important. Si ce message s'affiche régulièrement, veuillez nous en faire part sur {gitHubIssuesUrl}.", "kibana_utils.history.savedObjectIsMissingNotificationMessage": "L'objet enregistré est manquant.", "kibana_utils.stateManagement.stateHash.unableToRestoreUrlErrorMessage": "Impossible de restaurer complètement l'URL. Assurez-vous d'utiliser la fonctionnalité de partage.", "kibana_utils.stateManagement.url.restoreUrlErrorTitle": "Erreur lors de la restauration de l'état depuis l'URL.", "kibana_utils.stateManagement.url.saveStateInUrlErrorTitle": "Erreur lors de l'enregistrement de l'état dans l'URL.", - "kibana-react.dualRangeControl.outsideOfRangeErrorMessage": "Les valeurs doivent être comprises entre {min} et {max}, inclus", + "kibana-react.dualRangeControl.outsideOfRangeErrorMessage": "Les valeurs doivent être comprises entre {min} et {max}, inclus.", "kibana-react.noDataPage.cantDecide": "Vous ne savez pas quoi utiliser ? {link}", "kibana-react.noDataPage.intro": "Ajoutez vos données pour commencer, ou {link} sur {solution}.", - "kibana-react.noDataPage.welcomeTitle": "Bienvenue dans Elastic {solution} !", + "kibana-react.noDataPage.welcomeTitle": "Bienvenue dans Elastic {solution}.", "kibana-react.solutionNav.mobileTitleText": "Menu {solutionName}", "kibana-react.dualRangeControl.maxInputAriaLabel": "Maximum de la plage", "kibana-react.dualRangeControl.minInputAriaLabel": "Minimum de la plage", @@ -4691,11 +4869,14 @@ "kibana-react.solutionNav.openLabel": "Ouvrir la navigation latérale", "languageDocumentationPopover.header": "Référence de {language}", "languageDocumentationPopover.tooltip": "Référence de {lang}", + "languageDocumentationPopover.documentationLinkLabel": "Voir toute la documentation", "languageDocumentationPopover.searchPlaceholder": "Recherche", "links.contentManagement.saveModalTitle": "Enregistrer le panneau {contentId} dans la bibliothèque", + "links.editor.deleteLinkTitle": "Supprimer le lien {label}", + "links.editor.editLinkTitle.hasLabel": "Modifier le lien {label}", "links.externalLink.editor.urlFormatError": "Format non valide. Exemple : {exampleUrl}", "links.dashboardLink.description": "Accéder au tableau de bord", - "links.dashboardLink.displayName": "Tableau de bord", + "links.dashboardLink.displayName": "Dashboard", "links.dashboardLink.editor.currentDashboardLabel": "Actuel", "links.dashboardLink.editor.dashboardComboBoxPlaceholder": "Rechercher un tableau de bord", "links.dashboardLink.editor.dashboardErrorLabel": "Erreur lors de la récupération du tableau de bord", @@ -4732,16 +4913,17 @@ "links.panelEditor.saveButtonLabel": "Enregistrer", "links.panelEditor.saveToLibrarySwitchLabel": "Enregistrer dans la bibliothèque", "links.panelEditor.saveToLibrarySwitchTooltip": "Enregistrer ce panneau de liens dans la bibliothèque afin de pouvoir l'ajouter facilement à d'autres tableaux de bord.", - "links.panelEditor.technicalPreviewLabel": "Version d'évaluation technique", - "links.panelEditor.technicalPreviewTooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale.", "links.panelEditor.titleInputLabel": "Titre", "links.saveDuplicateRejectedDescription": "La confirmation d'enregistrement avec un doublon de titre a été rejetée.", "links.visTypeAlias.title": "Liens", "management.landing.header": "Bienvenue dans Gestion de la Suite {version}", - "management.settings.defaultValueText": "Par défaut : {value}", + "management.settings.defaultValueText": "Valeur par défaut : {value}", + "management.settings.emptyState.noSearchResultText": "Aucun paramètre trouvé pour {queryText}. {clearSearch}", "management.settings.field.changeImageLinkAriaLabel": "Modifier {ariaLabel}", "management.settings.field.deprecationClickAreaLabel": "Cliquez ici pour afficher la documentation de déclassement pour {name}.", - "management.settings.field.resetToDefaultLinkAriaLabel": "Réinitialiser {ariaLabel} à la valeur par défaut", + "management.settings.field.resetToDefaultLinkAriaLabel": "Réinitialiser {ariaLabel} aux valeurs par défaut", + "management.settings.fieldCategory.searchResultText": "Les termes de la recherche masquent {settingsCount} paramètres {clearSearch}", + "management.settings.form.countOfSettingsChanged": "{unsavedCount} {unsavedCount, plural, one {paramètre non enregistré} other {paramètres non enregistrés} }{hiddenCount, plural, =0 {masqué} other {, # masqués} }.", "management.breadcrumb": "Gestion de la Suite", "management.landing.subhead": "Gérez vos index, vues de données, objets enregistrés, paramètres Kibana et plus encore.", "management.landing.text": "Vous trouverez une liste complète des applications dans le menu de gauche.", @@ -4757,11 +4939,11 @@ "management.landing.withCardNavigation.ingestPipelinesDescription": "Supprimez des champs, extrayez des valeurs et réalisez des transformations de vos données.", "management.landing.withCardNavigation.maintenanceWindowsDescription": "Supprimez les notifications de règles pour les périodes où il est prévu d'effectuer des maintenances, des mises à jour et d'autres tâches liées au système.", "management.landing.withCardNavigation.mlDescription": "Identifiez, analysez et traitez vos données à l'aide de techniques perfectionnées d'analyses.", - "management.landing.withCardNavigation.objectsDescription": "Gérer les vues enregistrées de vos tableaux de bord, cartes et données ainsi que vos workpads Canvas.", + "management.landing.withCardNavigation.objectsDescription": "Gérez les tableaux de bords, les visualisations, les cartes et les vues de données que vous avez enregistrés.", "management.landing.withCardNavigation.otherTitle": "Autre", "management.landing.withCardNavigation.pageDescription": "Gérez les données et les index, supervisez les règles et les connecteurs, organisez les objets et les fichiers enregistrés et créez des clés d'API dans un emplacement central.", "management.landing.withCardNavigation.pageTitle": "Gestion", - "management.landing.withCardNavigation.reportingDescription": "Gérez les rapports PDF, PNG et CSV générés.", + "management.landing.withCardNavigation.reportingDescription": "Gérez les rapports CSV générés.", "management.landing.withCardNavigation.rulesDescription": "Définissez à quel moment générer des alertes et des notifications.", "management.landing.withCardNavigation.settingsDescription": "Contrôlez les comportements des projets, tels que l'affichage des dates et le tri par défaut.", "management.landing.withCardNavigation.tagsDescription": "Organisez, recherchez et filtrez vos objets enregistrés en fonction de critères spécifiques.", @@ -4779,24 +4961,37 @@ "management.sections.section.title": "Sécurité", "management.sections.stackTip": "Gérez votre licence et mettez la Suite à niveau.", "management.sections.stackTitle": "Suite", - "management.settings.categoryNames.discoverLabel": "Découverte", + "management.settings.advancedSettingsLabel": "Paramètres avancés", + "management.settings.badge.readOnly.text": "Lecture seule", + "management.settings.badge.readOnly.tooltip": "Impossible d’enregistrer les paramètres avancés", + "management.settings.categoryNames.accessibilityLabel": "Accessibilité", + "management.settings.categoryNames.autocompleteLabel": "Saisie semi-automatique", + "management.settings.categoryNames.bannerLabel": "Bannière", + "management.settings.categoryNames.devToolsLabel": "Outils de développeur", + "management.settings.categoryNames.discoverLabel": "Discover", "management.settings.categoryNames.enterpriseSearchLabel": "Enterprise Search", "management.settings.categoryNames.generalLabel": "Général", "management.settings.categoryNames.machineLearningLabel": "Machine Learning", "management.settings.categoryNames.notificationsLabel": "Notifications", "management.settings.categoryNames.observabilityLabel": "Observabilité", + "management.settings.categoryNames.presentationLabLabel": "Ateliers de présentation", "management.settings.categoryNames.reportingLabel": "Reporting", + "management.settings.categoryNames.rollupsLabel": "Cumuls", "management.settings.categoryNames.searchLabel": "Recherche", "management.settings.categoryNames.securitySolutionLabel": "Solution de sécurité", "management.settings.categoryNames.timelionLabel": "Timelion", - "management.settings.categoryNames.visualizationsLabel": "Visualisations", + "management.settings.categoryNames.visualizationsLabel": "Visualisation", + "management.settings.categorySearchLabel": "Catégorie", "management.settings.changeImageLinkText": "Modifier l'image", "management.settings.customSettingTooltip": "Paramètre personnalisé", + "management.settings.emptyState.clearNoSearchResultText": "(effacer la recherche)", + "management.settings.field.codeEditorSyntaxErrorMessage": "Syntaxe JSON non valide", "management.settings.field.customSettingAriaLabel": "Paramètre personnalisé", "management.settings.field.imageChangeErrorMessage": "Impossible d’enregistrer l'image", "management.settings.field.invalidIconLabel": "Non valide", "management.settings.field.settingIsUnsaved": "Le paramètre n'est actuellement pas enregistré.", "management.settings.field.unsavedIconLabel": "Non enregistré", + "management.settings.fieldCategory.clearSearchResultText": "(effacer la recherche)", "management.settings.fieldInput.color.invalidMessage": "Fournir une valeur de couleur valide", "management.settings.form.cancelButtonLabel": "Annuler les modifications", "management.settings.form.requiresPageReloadToastButtonLabel": "Actualiser la page", @@ -4804,22 +4999,217 @@ "management.settings.form.saveButtonLabel": "Enregistrer les modifications", "management.settings.form.saveButtonTooltipWithInvalidChanges": "Corrigez les paramètres non valides avant d'enregistrer.", "management.settings.form.saveErrorMessage": "Enregistrement impossible", + "management.settings.globalCalloutSubtitle": "Les modifications seront appliquées à tous les utilisateurs dans l'ensemble des espaces. Cela inclut les utilisateurs Kibana natifs et les utilisateurs qui se connectent via l'authentification unique.", + "management.settings.globalCalloutTitle": "Les modifications auront une incidence sur tous les paramètres utilisateur dans l'ensemble des espaces", + "management.settings.globalSettingsTabTitle": "Paramètres généraux", "management.settings.helpText": "Ce paramètre est défini par le serveur Kibana et ne peut pas être modifié.", "management.settings.offLabel": "Désactivé", "management.settings.onLabel": "Activé", "management.settings.resetToDefaultLinkText": "Réinitialiser à la valeur par défaut", - "monaco.esql.autocomplete.matchingFieldDefinition": "Utiliser pour correspondance avec {matchingField} de la politique", - "monaco.esql.autocomplete.policyDefinition": "Politique définie selon {count, plural, one {index} many {index système non migrés} other {des index}} : {indices}", - "monaco.esql.autocomplete.constantDefinition": "Variable définie par l'utilisateur", - "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.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.sourceDefinition": "Tableau d'entrée", + "management.settings.searchBar.unableToParseQueryErrorMessage": "Impossible d'analyser la requête", + "management.settings.searchBarPlaceholder": "Rechercher dans les paramètres avancés", + "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", + "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**", + "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}\"", @@ -4832,17 +5222,58 @@ "newsfeed.headerButton.readAriaLabel": "Menu du fil d'actualités – Tous les éléments lus", "newsfeed.headerButton.unreadAriaLabel": "Menu du fil d'actualités – Éléments non lus disponibles", "newsfeed.loadingPrompt.gettingNewsText": "Obtention des dernières actualités…", + "presentationPanel.action.editPanel.displayName": "Modifier {value}", + "presentationPanel.contextMenu.ariaLabelWithIndex": "Options pour le panneau {index}", + "presentationPanel.contextMenu.ariaLabelWithTitle": "Options de panneau pour {title}", + "presentationPanel.enhancedAriaLabel": "Panneau : {title}", + "presentationPanel.error.editButton": "Modifier {value}", + "presentationPanel.header.titleAriaLabel": "Cliquez pour modifier le titre : {title}", + "presentationPanel.action.customizePanel.displayName": "Paramètres du panneau", + "presentationPanel.action.customizePanel.flyout.cancelButtonTitle": "Annuler", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editFiltersButtonAriaLabel": "Modifier les filtres", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editFiltersButtonLabel": "Modifier", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editQueryButtonAriaLabel": "Modifier la recherche", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editQueryButtonLabel": "Modifier", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelDescriptionAriaLabel": "Entrer une description personnalisée pour votre panneau", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelDescriptionFormRowLabel": "Description", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelTimeRangeFormRowLabel": "Plage temporelle", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelTitleFormRowLabel": "Titre", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelTitleInputAriaLabel": "Entrez un titre personnalisé pour le panneau.", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomDescriptionButtonAriaLabel": "Réinitialiser la description", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomTitleButtonAriaLabel": "Réinitialiser le titre", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomTitleButtonLabel": "Réinitialiser", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.showCustomTimeRangeSwitch": "Appliquer une plage temporelle personnalisée", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.showTitle": "Afficher le titre", + "presentationPanel.action.customizePanel.flyout.saveButtonTitle": "Appliquer", + "presentationPanel.action.customizePanel.flyout.title": "Paramètres du panneau", + "presentationPanel.action.customizePanel.modal.optionsMenuForm.resetCustomDescriptionButtonLabel": "Réinitialiser", + "presentationPanel.action.inspectPanel.displayName": "Inspecter", + "presentationPanel.action.inspectPanel.untitledEmbeddableFilename": "sans titre", + "presentationPanel.action.removePanel.displayName": "Supprimer du tableau de bord", + "presentationPanel.ariaLabel": "Panneau", + "presentationPanel.badgeTrigger.description": "Des actions de badge apparaissent dans la barre de titre lorsqu'un élément incorporable est en cours de chargement dans un panneau.", + "presentationPanel.badgeTrigger.title": "Badges du panneau", + "presentationPanel.contextMenu.ariaLabel": "Options de panneau", + "presentationPanel.contextMenu.loadingTitle": "Options", + "presentationPanel.contextMenuTrigger.description": "Une nouvelle action sera ajoutée au menu contextuel du panneau", + "presentationPanel.contextMenuTrigger.title": "Menu contextuel", + "presentationPanel.error.errorWhenLoadingPanel": "Une erreur s'est produite lors du chargement de ce panneau.", + "presentationPanel.filters.filtersTitle": "Filtres", + "presentationPanel.filters.queryTitle": "Recherche", + "presentationPanel.hoverTrigger.description": "Une nouvelle action sera ajoutée au menu flottant du panneau", + "presentationPanel.hoverTrigger.title": "Menu contextuel du panneau", + "presentationPanel.notificationTrigger.description": "Les actions de notification apparaissent dans l'angle supérieur droit des panneaux.", + "presentationPanel.notificationTrigger.title": "Notifications du panneau", + "presentationPanel.placeholderTitle": "[Aucun titre]", "presentationUtil.expressionInput.argReferenceAliasesDetail": "{BOLD_MD_TOKEN}Alias{BOLD_MD_TOKEN} : {aliases}", "presentationUtil.expressionInput.argReferenceDefaultDetail": "{BOLD_MD_TOKEN}Par défaut{BOLD_MD_TOKEN} : {defaultVal}", - "presentationUtil.expressionInput.argReferenceRequiredDetail": "{BOLD_MD_TOKEN}Obligatoire{BOLD_MD_TOKEN} : {required}", + "presentationUtil.expressionInput.argReferenceRequiredDetail": "{BOLD_MD_TOKEN}Requis{BOLD_MD_TOKEN} : {required}", "presentationUtil.expressionInput.argReferenceTypesDetail": "{BOLD_MD_TOKEN}Types{BOLD_MD_TOKEN} : {types}", "presentationUtil.expressionInput.functionReferenceAccepts": "{BOLD_MD_TOKEN}Accepte{BOLD_MD_TOKEN} : {acceptTypes}", "presentationUtil.expressionInput.functionReferenceReturns": "{BOLD_MD_TOKEN}Renvoie{BOLD_MD_TOKEN} : {returnType}", "presentationUtil.labs.components.disabledStatusMessage": "Par défaut : {status}", "presentationUtil.labs.components.enabledStatusMessage": "Par défaut : {status}", "presentationUtil.labs.components.noProjectsinSolutionMessage": "Aucun atelier actuellement dans {solutionName}.", - "presentationUtil.labs.enableLinksPanelProjectDescription": "{technicalPreviewLabel} Active le panneau de liens pour le tableau de bord, ce qui permet aux auteurs de tableaux de bord de les associer facilement entre eux.", - "presentationUtil.advancedSettings.technicalPreviewLabel": "version d'évaluation technique", "presentationUtil.dashboardDrilldownConfig.components.openInNewTab": "Ouvrir le tableau de bord dans un nouvel onglet", "presentationUtil.dashboardDrilldownConfig.components.useCurrentDateRange": "Utiliser la plage de dates du tableau de bord d'origine", "presentationUtil.dashboardDrilldownConfig.components.useCurrentFiltersLabel": "Utiliser les filtres et la requête du tableau de bord d'origine", @@ -4871,7 +5302,6 @@ "presentationUtil.labs.enableByValueEmbeddableName": "Éléments d'incorporation By-Value", "presentationUtil.labs.enableDeferBelowFoldProjectDescription": "Les panneaux sous \"le pli\" (la zone masquée en dessous de la fenêtre accessible en faisant défiler), ne se chargeront pas immédiatement, mais seulement lorsqu'ils entreront dans la fenêtre d'affichage.", "presentationUtil.labs.enableDeferBelowFoldProjectName": "Différer le chargement des panneaux sous \"le pli\"", - "presentationUtil.labs.enableLinksPanelProjectName": "Activer le panneau de liens", "presentationUtil.saveModalDashboard.addToDashboardLabel": "Ajouter au tableau de bord", "presentationUtil.saveModalDashboard.dashboardInfoTooltip": "Les éléments ajoutés à la bibliothèque Visualize sont disponibles pour tous les tableaux de bord. Les modifications apportées à un élément de bibliothèque sont répercutées partout où il est utilisé.", "presentationUtil.saveModalDashboard.existingDashboardOptionLabel": "Existant", @@ -4882,10 +5312,16 @@ "presentationUtil.saveModalDashboard.saveAndGoToDashboardLabel": "Enregistrer et accéder au tableau de bord", "presentationUtil.saveModalDashboard.saveLabel": "Enregistrer", "presentationUtil.saveModalDashboard.saveToLibraryLabel": "Enregistrer et ajouter à la bibliothèque", - "savedObjects.confirmModal.overwriteConfirmationMessage": "Voulez-vous vraiment écraser {title} ?", + "reporting.commonExportTypesHelpers.failedToDecryptReportJobDataErrorMessage": "Impossible de déchiffrer les données de la tâche de reporting. Veuillez vous assurer que {encryptionKey} est défini et générez à nouveau ce rapport. {err}", + "reporting.common.browserCouldNotLaunchErrorMessage": "Impossible de générer des captures d'écran, car le navigateur ne s’est pas lancé. Consultez les logs de serveur pour en savoir plus.", + "reporting.common.cloud.insufficientSystemMemoryError": "Impossible de générer ce rapport en raison d’un manque de mémoire.", + "reporting.common.pdfWorkerOutOfMemoryErrorMessage": "Impossible de générer un PDF en raison d’un manque de mémoire. Essayez de réduire la taille du PDF et relancez ce rapport.", + "reporting.commonExportTypesHelpers.missingJobHeadersErrorMessage": "Les en-têtes de tâche sont manquants", + "savedObjects.confirmModal.overwriteConfirmationMessage": "Êtes-vous sûr de vouloir écraser {title} ?", "savedObjects.confirmModal.overwriteTitle": "Écraser {name} ?", "savedObjects.confirmModal.saveDuplicateButtonLabel": "Enregistrer {name}", - "savedObjects.saveModal.duplicateTitleLabel": "Ce {objectType} existe déjà", + "savedObjects.confirmModal.saveDuplicateConfirmationMessage": "Il y a déjà une occurrence de {name} avec le titre \"{title}\". Voulez-vous tout de même enregistrer ?", + "savedObjects.saveModal.duplicateTitleLabel": "Ce {objectType} existe déjà.", "savedObjects.saveModal.saveAsNewLabel": "Enregistrer en tant que nouveau {objectType}", "savedObjects.saveModal.saveTitle": "Enregistrer {objectType}", "savedObjects.saveModalOrigin.originAfterSavingSwitchLabel": "{originVerb} à {origin} après l'enregistrement", @@ -4904,27 +5340,27 @@ "savedObjects.saveModalOrigin.returnToOriginLabel": "Renvoyer", "savedObjects.saveModalOrigin.saveAndReturnLabel": "Enregistrer et revenir", "savedObjectsManagement.breadcrumb.inspect": "Inspecter {savedObjectType}", - "savedObjectsManagement.importSummary.createdCountHeader": "{createdCount} nouveau", - "savedObjectsManagement.importSummary.errorCountHeader": "{errorCount} erreur", + "savedObjectsManagement.importSummary.createdCountHeader": "{createdCount} nouveau(x)", + "savedObjectsManagement.importSummary.errorCountHeader": "{errorCount} erreur(s)", "savedObjectsManagement.importSummary.errorOutcomeLabel": "{errorMessage}", - "savedObjectsManagement.importSummary.headerLabel": "{importCount, plural, one {1 objet a été importé} many {# objets ont été importés} other {# objets ont été importés}}", - "savedObjectsManagement.importSummary.overwrittenCountHeader": "{overwrittenCount} écrasé", - "savedObjectsManagement.objectsTable.delete.successNotification": "{count, plural, one {# objet a bien été supprimé.} many {# objets} other {# objets ont bien été supprimés.}} a bien été supprimé.", - "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.content": "{objectCount, plural, one {# objet est masqué et ne peut pas être supprimé} many {# objets sont masqués et ne peuvent pas être supprimés} other {# objets sont masqués et ne peuvent pas être supprimés}}. {objectCount, plural, one {Il a été exclu} many {Ils ont été exclus} other {Ils ont été exclus}} du récapitulatif du tableau.", - "savedObjectsManagement.objectsTable.deleteConfirmModal.sharedObjectsCallout.title": "{sharedObjectsCount, plural, one {# objet enregistré est partagé} many {# de vos objets enregistrés ont été partagés} other {# de vos objets enregistrés ont été partagés}}", - "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.deleteButtonLabel": "Supprimer {objectsCount, plural, one {# objet} many {# objets} other {# objets}}", + "savedObjectsManagement.importSummary.headerLabel": "{importCount, plural, one {1 objet importé} other {# objets importés}}", + "savedObjectsManagement.importSummary.overwrittenCountHeader": "{overwrittenCount} écrasé(s)", + "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.content": "{objectCount, plural, one {# objet est} other {# objets sont}} masqués et ne peuvent être supprimés.", + "savedObjectsManagement.objectsTable.deleteConfirmModal.sharedObjectsCallout.title": "{sharedObjectsCount, plural, one {# objet enregistré est partagé} other {# de vos objets enregistrés sont partagés}}.", + "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.deleteButtonLabel": "Supprimer {objectsCount, plural, one {# objet} other {# objets}}", "savedObjectsManagement.objectsTable.export.toastErrorMessage": "Impossible de générer l'export : {error}", - "savedObjectsManagement.objectsTable.exportObjectsConfirmModalTitle": "Exporter {filteredItemCount, plural, one {# objet} many {# objets} other {# objets}}", - "savedObjectsManagement.objectsTable.flyout.importFileErrorMessage": "Impossible de traiter le fichier en raison d'une erreur : \"{error}\"", + "savedObjectsManagement.objectsTable.exportObjectsConfirmModalTitle": "Exporter {filteredItemCount, plural, one {# objet} other {# objets}}", + "savedObjectsManagement.objectsTable.flyout.importFileErrorMessage": "Impossible de traiter le fichier en raison d'une erreur : \"{error}\".", "savedObjectsManagement.objectsTable.flyout.indexPatternConflictsDescription": "Les objets enregistrés suivants utilisent des vues de données qui n'existent pas. Veuillez sélectionner les vues de données que vous souhaitez réassocier. Vous pouvez {indexPatternLink} si nécessaire.", - "savedObjectsManagement.objectsTable.header.exportButtonLabel": "Exporter {filteredCount, plural, one {# objet} many {# objets} other {# objets}}", + "savedObjectsManagement.objectsTable.header.exportButtonLabel": "Exporter {filteredCount, plural, one{# objet} other {# objets}}", "savedObjectsManagement.objectsTable.overwriteModal.body.ambiguousConflict": "\"{title}\" est en conflit avec plusieurs objets existants. En écraser un ?", "savedObjectsManagement.objectsTable.overwriteModal.body.conflict": "\"{title}\" est en conflit avec un objet existant. L'écraser ?", "savedObjectsManagement.objectsTable.overwriteModal.title": "Écraser {type} ?", "savedObjectsManagement.objectsTable.relationships.relationshipsTitle": "Voici les objets enregistrés associés à {title}. La suppression de ce {type} a un impact sur ses objets parents, mais pas sur ses enfants.", - "savedObjectsManagement.objectsTable.table.tooManyResultsLabel": "Affichage de {limit} sur {totalItemCount, plural, one {# objet} many {# objets} other {# objets}}", + "savedObjectsManagement.objectsTable.table.tooManyResultsLabel": "Affichage de {limit} sur {totalItemCount, plural, one {# objet} other {# objets}}", + "savedObjectsManagement.objectView.unableDeleteSavedObjectNotificationMessage": "Impossible de supprimer l'objet '{title}' {type}", "savedObjectsManagement.view.howToFixErrorDescription": "Si vous savez à quoi cette erreur fait référence, vous pouvez utiliser les {savedObjectsApis} pour la corriger. Sinon, cliquez sur le bouton Supprimer ci-dessus.", - "savedObjectsManagement.view.inspectCodeEditorAriaLabel": "inspecter {title}", + "savedObjectsManagement.view.inspectCodeEditorAriaLabel": "inspecter { title }", "savedObjectsManagement.view.inspectItemTitle": "Inspecter {title}", "savedObjectsManagement.view.viewItemButtonLabel": "Afficher {title}", "savedObjectsManagement.breadcrumb.index": "Objets enregistrés", @@ -4940,10 +5376,10 @@ "savedObjectsManagement.managementSectionLabel": "Objets enregistrés", "savedObjectsManagement.objects.savedObjectsDescription": "Importez, exportez et gérez vos objets enregistrés.", "savedObjectsManagement.objects.savedObjectsTitle": "Objets enregistrés", - "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.title": "Certains objets ne peuvent pas être supprimés", + "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.title": "Certains objets ont été exclus", "savedObjectsManagement.objectsTable.deleteConfirmModal.sharedObjectsCallout.content": "Les objets partagés sont supprimés de tous les espaces dans lesquels ils se trouvent.", "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.cancelButtonLabel": "Annuler", - "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.idColumnName": "Id", + "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.idColumnName": "ID", "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.titleColumnName": "Titre", "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.typeColumnName": "Type", "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModalTitle": "Supprimer les objets enregistrés", @@ -5051,21 +5487,41 @@ "savedSearch.kibana_context.q.help": "Spécifier une recherche en texte libre Kibana", "savedSearch.kibana_context.savedSearchId.help": "Spécifier l'ID de recherche enregistrée à utiliser pour les requêtes et les filtres", "savedSearch.kibana_context.timeRange.help": "Spécifier le filtre de plage temporelle Kibana", - "searchApiPanels.welcomeBanner.header.greeting.customTitle": "Bonjour {name} !", + "searchApiPanels.welcomeBanner.header.greeting.customTitle": "👋 Bonjour {name} !", "searchApiPanels.welcomeBanner.installClient.clientDocLink": "Documentation du client {languageName}", - "searchApiPanels.welcomeBanner.selectClient.description": "Elastic construit et assure la maintenance des clients dans plusieurs langues populaires et notre communauté a contribué à beaucoup d'autres. Sélectionnez votre client linguistique favori or explorez la {console} pour commencer.", + "searchApiPanels.welcomeBanner.selectClient.description": "Elastic construit et assure la maintenance des clients dans plusieurs langues populaires et notre communauté a contribué à beaucoup d'autres. Sélectionnez votre client de langage favori ou explorez la {console} pour commencer.", + "searchApiPanels.cloudIdDetails.cloudId.description": "Des bibliothèques et des connecteurs clients peuvent utiliser cet identificateur unique propre à Elastic Cloud.", + "searchApiPanels.cloudIdDetails.cloudId.title": "Identifiant du cloud", + "searchApiPanels.cloudIdDetails.description": "Soyez prêt à ingérer et rechercher vos données en choisissant une option de connexion :", + "searchApiPanels.cloudIdDetails.elasticsearchEndpoint.description": "La méthode la plus courante pour établir une connexion Elasticsearch.", + "searchApiPanels.cloudIdDetails.elasticsearchEndpoint.recommendedBadge": "Recommandé", + "searchApiPanels.cloudIdDetails.elasticsearchEndpoint.title": "Point de terminaison Elasticsearch", + "searchApiPanels.cloudIdDetails.title": "Copiez vos informations de connexion", + "searchApiPanels.pipeline.overview.anonymization.description": "Retirez les informations sensibles des documents avant l'indexation.", + "searchApiPanels.pipeline.overview.anonymization.title": "Anonymiser les données", + "searchApiPanels.pipeline.overview.dataEnrichment.description": "Ajouter des informations des sources externes ou appliquer des transformations à vos documents pour une recherche plus contextuelle et pertinente.", + "searchApiPanels.pipeline.overview.dataEnrichment.title": "Enrichir les données", + "searchApiPanels.pipeline.overview.extAndStandard.description": "Analysez les informations depuis vos documents pour assurer qu'ils sont conformes au format standardisé.", + "searchApiPanels.pipeline.overview.extAndStandard.title": "Extraire et standardiser", "searchApiPanels.welcomeBanner.codeBox.copyButtonLabel": "Copier", "searchApiPanels.welcomeBanner.codeBox.selectAriaLabel": "Sélectionner un langage de programmation", "searchApiPanels.welcomeBanner.header.description": "Configurez votre client de langage de programmation, ingérez des données, et vous serez prêt à commencer vos recherches en quelques minutes.", - "searchApiPanels.welcomeBanner.header.greeting.defaultTitle": "Bonjour !", + "searchApiPanels.welcomeBanner.header.greeting.defaultTitle": "👋 Bonjour", "searchApiPanels.welcomeBanner.header.title": "Lancez-vous avec Elasticsearch", - "searchApiPanels.welcomeBanner.ingestData.description": "Ajoutez des données à votre flux de données ou à votre index pour les rendre interrogeables. Choisissez une méthode d’ingestion qui correspond à votre application et à votre workflow.", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions": "Autres options d'ingestion", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsDescription": "Des agents légers conçus pour le transfert de données pour Elasticsearch. Utilisez Beats pour envoyer des données opérationnelles depuis vos serveurs.", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsDocumentationLabel": "Documentation", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsTitle": "Beats", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashDescription": "Pipeline de traitement des données à usage général pour Elasticsearch. Utilisez Logstash pour extraire et transformer les données d'une variétés d'entrées et de sorties.", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashDocumentationLabel": "Documentation", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashTitle": "Logstash", + "searchApiPanels.welcomeBanner.ingestData.description": "Ajoutez des données à votre flux de données ou à votre index pour les rendre interrogeables à l'aide de l'API. ", "searchApiPanels.welcomeBanner.ingestData.title": "Ingérer des données", - "searchApiPanels.welcomeBanner.installClient.description": "Elastic construit et assure la maintenance des clients dans plusieurs langues populaires et notre communauté a contribué à beaucoup d'autres. Installez votre client de langage favori pour commencer.", + "searchApiPanels.welcomeBanner.installClient.description": "Vous devez d'abord installer le client de langage de programmation de votre choix.", "searchApiPanels.welcomeBanner.installClient.title": "Installer un client", "searchApiPanels.welcomeBanner.panels.learnMore": "En savoir plus", "searchApiPanels.welcomeBanner.selectClient.apiRequestConsoleDocLink": "Exécuter des requêtes d’API dans la console ", - "searchApiPanels.welcomeBanner.selectClient.callout.description": "Avec la console, vous pouvez directement commencer à utiliser nos API REST. Aucune installation n’est requise. ", + "searchApiPanels.welcomeBanner.selectClient.callout.description": "Avec la console, vous pouvez directement commencer à utiliser nos API REST. Aucune installation n’est requise.", "searchApiPanels.welcomeBanner.selectClient.callout.link": "Essayez la console maintenant", "searchApiPanels.welcomeBanner.selectClient.callout.title": "Lancez-vous dans la console", "searchApiPanels.welcomeBanner.selectClient.description.console.link": "Console", @@ -5073,17 +5529,337 @@ "searchApiPanels.welcomeBanner.selectClient.heading": "Choisissez-en un", "searchApiPanels.welcomeBanner.selectClient.title": "Sélectionner votre client", "searchApiPanels.welcomeBanner.tryInConsoleButton": "Essayer dans la console", - "searchResponseWarnings.badgeButtonLabel": "{warningCount} {warningCount, plural, one {avertissement} many {avertissements} other {avertissements}}", + "searchConnectors.config.invalidInteger": "{label} doit être un nombre entier.", + "searchConnectors.configurationConnector.config.defaultValue": "Si cette option est laissée vide, la valeur par défaut {defaultValue} sera utilisée.", + "searchConnectors.index.syncJobs.documents.volume.aboutLabel": "À propos de {volume}", + "searchConnectors.syncJobs.flyout.canceledDescription": "Synchronisation annulée le {date}", + "searchConnectors.syncJobs.flyout.completedDescription": "Terminé le {date}", + "searchConnectors.syncJobs.flyout.failureDescription": "Échec de la synchronisation : {error}.", + "searchConnectors.syncJobs.flyout.inProgressDescription": "La synchronisation est en cours depuis {duration}.", + "searchConnectors.syncJobs.flyout.startedAtDescription": "Démarrée le {date}", + "searchConnectors.configuration.openPopoverLabel": "Ouvrir la fenêtre contextuelle de licence", + "searchConnectors.configurationConnector.config.advancedConfigurations.title": "Configurations avancées", + "searchConnectors.configurationConnector.config.cancelEditingButton.title": "Annuler", + "searchConnectors.configurationConnector.config.editButton.title": "Modifier la configuration", + "searchConnectors.configurationConnector.config.error.title": "Erreur de connecteur", + "searchConnectors.configurationConnector.config.noConfigCallout.description": "Ce connecteur ne possède aucun champ de configuration. Votre connecteur a-t-il pu se connecter avec succès à Elasticsearch et définir sa configuration ?", + "searchConnectors.configurationConnector.config.noConfigCallout.title": "Aucun champ de configuration", + "searchConnectors.configurationConnector.config.submitButton.title": "Enregistrer la configuration", + "searchConnectors.connector.documentLevelSecurity.enablePanel.description": "Vous permet de contrôler les documents auxquels peuvent accéder les utilisateurs, selon leurs autorisations. Cela permet de vous assurer que les résultats de recherche ne renvoient que des informations pertinentes et autorisées pour les utilisateurs, selon leurs rôles.", + "searchConnectors.connector.documentLevelSecurity.enablePanel.heading": "Sécurité au niveau du document", + "searchConnectors.connectors.subscriptionLabel": "Plans d'abonnement", + "searchConnectors.connectors.upgradeDescription": "Pour utiliser ce connecteur, vous devez mettre à jour votre licence vers Platinum ou commencer un essai gratuit de 30 jours.", + "searchConnectors.connectors.upgradeTitle": "Mettre à niveau vers Elastic Platinum", + "searchConnectors.content.filteringRules.policy.exclude": "Exclure", + "searchConnectors.content.filteringRules.policy.include": "Inclure", + "searchConnectors.content.filteringRules.rules.contains": "Contient", + "searchConnectors.content.filteringRules.rules.endsWith": "Se termine par", + "searchConnectors.content.filteringRules.rules.equals": "Est égal à", + "searchConnectors.content.filteringRules.rules.greaterThan": "Supérieur à", + "searchConnectors.content.filteringRules.rules.lessThan": "Inférieur à", + "searchConnectors.content.filteringRules.rules.regEx": "Expression régulière", + "searchConnectors.content.filteringRules.rules.startsWith": "Commence par", + "searchConnectors.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", + "searchConnectors.content.nativeConnectors.s3.accessKey.label": "ID de clé d'accès AWS", + "searchConnectors.content.nativeConnectors.s3.buckets.label": "Compartiments AWS", + "searchConnectors.content.nativeConnectors.s3.buckets.tooltip": "Les compartiments AWS sont ignorés lorsque des règles de synchronisation avancées sont appliquées.", + "searchConnectors.content.nativeConnectors.s3.connectTimeout.label": "Délai d'attente de connexion", + "searchConnectors.content.nativeConnectors.s3.maxAttempts.label": "Nombre maximum de nouvelles tentatives", + "searchConnectors.content.nativeConnectors.s3.maxPageSize.label": "Taille maximum de la page", + "searchConnectors.content.nativeConnectors.s3.name": "S3", + "searchConnectors.content.nativeConnectors.s3.readTimeout.label": "Délai d'attente de lecture", + "searchConnectors.content.nativeConnectors.s3.secretKey.label": "Clé secrète AWS", + "searchConnectors.content.nativeConnectors.salesforce.clientId.label": "ID client", + "searchConnectors.content.nativeConnectors.salesforce.clientId.tooltip": "L'ID client de votre application connectée utilisant le protocole OAuth2. Également appelé \"clé consommateur\"", + "searchConnectors.content.nativeConnectors.salesforce.clientSecret.label": "Identifiant client secret", + "searchConnectors.content.nativeConnectors.salesforce.clientSecret.tooltip": "L'identifiant client secret de votre application connectée utilisant le protocole OAuth2. Également appelé \"secret consommateur\"", + "searchConnectors.content.nativeConnectors.salesforce.domain.label": "Domaine", + "searchConnectors.content.nativeConnectors.salesforce.domain.tooltip": "Le domaine de votre instance Salesforce. Si votre URL Salesforce est, le domaine est \"foo\".", + "searchConnectors.content.nativeConnectors.salesforce.name": "Salesforce", + "searchConnectors.index.filtering.field": "champ", + "searchConnectors.index.filtering.policy": "Politique", + "searchConnectors.index.filtering.priority": "Priorité de la règle", + "searchConnectors.index.filtering.rule": "Règle", + "searchConnectors.index.filtering.value": "Valeur", + "searchConnectors.index.syncJobs.actions.viewJob.caption": "Afficher cette tâche de synchronisation", + "searchConnectors.index.syncJobs.actions.viewJob.title": "Afficher cette tâche de synchronisation", + "searchConnectors.index.syncJobs.documents.added": "Ajouté", + "searchConnectors.index.syncJobs.documents.removed": "Retiré", + "searchConnectors.index.syncJobs.documents.title": "Documents", + "searchConnectors.index.syncJobs.documents.total": "Total", + "searchConnectors.index.syncJobs.documents.value": "Valeur", + "searchConnectors.index.syncJobs.documents.volume": "Volume", + "searchConnectors.index.syncJobs.documents.volume.lessThanOneMBLabel": "Inférieur à 1 Mo", + "searchConnectors.index.syncJobs.events.cancelationRequested": "Annulation demandée", + "searchConnectors.index.syncJobs.events.canceled": "Annulé", + "searchConnectors.index.syncJobs.events.completed": "Terminé", + "searchConnectors.index.syncJobs.events.lastUpdated": "Dernière mise à jour", + "searchConnectors.index.syncJobs.events.state": "État", + "searchConnectors.index.syncJobs.events.syncRequestedManually": "Synchronisation demandée manuellement", + "searchConnectors.index.syncJobs.events.syncRequestedScheduled": "Synchronisation demandée par planification", + "searchConnectors.index.syncJobs.events.syncStarted": "Synchronisation démarrée", + "searchConnectors.index.syncJobs.events.time": "Heure", + "searchConnectors.index.syncJobs.events.title": "Événements", + "searchConnectors.index.syncJobs.pipeline.extractBinaryContent": "Extraire le contenu binaire", + "searchConnectors.index.syncJobs.pipeline.name": "Nom du pipeline", + "searchConnectors.index.syncJobs.pipeline.reduceWhitespace": "Réduire l'espace", + "searchConnectors.index.syncJobs.pipeline.runMlInference": "Inférence de Machine Learning", + "searchConnectors.index.syncJobs.pipeline.setting": "Paramètre de pipeline", + "searchConnectors.index.syncJobs.pipeline.title": "Pipeline", + "searchConnectors.index.syncJobs.syncRulesAdvancedTitle": "Règles de synchronisation avancées", + "searchConnectors.index.syncJobs.syncRulesTitle": "Règles de synchronisation", + "searchConnectors.manageLicenseButtonLabel": "Gérer la licence", + "searchConnectors.nativeConnectors.advancedRulesIgnored.label": "Ce champ configurable est ignoré lorsque les règles de synchronisation avancées sont appliquées.", + "searchConnectors.nativeConnectors.azureBlobStorage.accountKeyLabel": "Clé du compte", + "searchConnectors.nativeConnectors.azureBlobStorage.accountNameLabel": "Nom du compte", + "searchConnectors.nativeConnectors.azureBlobStorage.blobEndpointLabel": "Point de terminaison Blob", + "searchConnectors.nativeConnectors.azureBlobStorage.containerNameLabel": "Liste des conteneurs", + "searchConnectors.nativeConnectors.azureBlobStorage.name": "Stockage Blob Azure", + "searchConnectors.nativeConnectors.confluence.name": "Confluence", + "searchConnectors.nativeConnectors.confluence.spaceKeysLabel": "Touche espace Confluence", + "searchConnectors.nativeConnectors.confluence.urlLabel": "Étiquette URL Confluence", + "searchConnectors.nativeConnectors.confluenceCloud.accountEmailLabel": "E-mail du compte Confluence Cloud", + "searchConnectors.nativeConnectors.confluenceCloud.name": "Cloud Confluence", + "searchConnectors.nativeConnectors.confluenceDataCenter.name": "Centre de données Confluence", + "searchConnectors.nativeConnectors.confluenceDataCenter.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.confluenceDataCenter.usernameLabel": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.confluenceServer.apiTokenLabel": "Token d'API de Confluence Cloud", + "searchConnectors.nativeConnectors.confluenceServer.name": "Serveur Confluence", + "searchConnectors.nativeConnectors.confluenceServer.passwordLabel": "Mot de passe du serveur Confluence", + "searchConnectors.nativeConnectors.confluenceServer.usernameLabel": "Nom d'utilisateur du serveur Confluence", + "searchConnectors.nativeConnectors.confluenceSource.label": "Source de données Confluence", + "searchConnectors.nativeConnectors.databaseLabel": "Base de données", + "searchConnectors.nativeConnectors.dropbox.name": "Dropbox", + "searchConnectors.nativeConnectors.enableDLS.label": "Activer la sécurité au niveau du document", + "searchConnectors.nativeConnectors.enableDLS.tooltip": "La sécurité au niveau du document préserve dans Elasticsearch les identités et permissions paramétrées dans Google Drive. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", + "searchConnectors.nativeConnectors.enableSSL.label": "Activer SSL", + "searchConnectors.nativeConnectors.gdrive.label": "Compte de service JSON Google Drive", + "searchConnectors.nativeConnectors.gdrive.maxHTTPRequest.label": "Requêtes HTTP simultanées maximales", + "searchConnectors.nativeConnectors.gdrive.maxHTTPRequest.tooltip": "Ce paramètre fixe le nombre maximal de requêtes HTTP simultanées envoyées à l'API Google pour récupérer des données. Augmenter cette valeur peut améliorer la vitesse de récupération des données, mais également accroître les demandes de ressources systèmes et de bande passante du réseau.", + "searchConnectors.nativeConnectors.gdrive.tooltip": "Ces connecteurs s'authentifient comme un compte de service afin de synchroniser le contenu depuis Google Drive.", + "searchConnectors.nativeConnectors.gdrive.useDomainWideDelegation.label": "Utiliser la délégation à l'échelle du domaine pour la synchronisation des données", + "searchConnectors.nativeConnectors.gdrive.useDomainWideDelegation.tooltip": "Activez la délégation à l'échelle du domaine pour synchroniser automatiquement le contenu de tous les Drive partagés et individuels de Google Workspace. Il n'est donc plus nécessaire de partager manuellement les données de Google Drive avec votre compte de service, mais le temps de synchronisation risque d'être plus long. Si la fonctionnalité est désactivée, seuls les éléments et les dossiers partagés manuellement avec le compte de service seront synchronisés. Veuillez consulter la documentation du connecteur pour vous assurer que la délégation à l'échelle du domaine est correctement configurée et a les cadres appropriés.", + "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmail.label": "E-mail administrateur Google Workspace", + "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmail.tooltip": "Afin d'utiliser la sécurité au niveau du document, vous devez activer la délégation d'autorité au niveau du domaine de Google Workspace pour votre compte de service. Un compte de service dont l'autorité est déléguée peut offrir à l'administrateur des permissions suffisantes pour récupérer tous les utilisateurs et toutes les permissions associées.", + "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmailDataSync.label": "E-mail administrateur Google Workspace", + "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmailDataSync.tooltip": "Indiquez l'e-mail de l'administrateur à utiliser avec la délégation à l'échelle du domaine pour la synchronisation des données. Cette adresse e-mail permet au connecteur d'utiliser l'API Admin Directory pour répertorier les utilisateurs de l'organisation. Veuillez consulter la documentation du connecteur pour vous assurer que la délégation à l'échelle du domaine est correctement configurée et a les cadres appropriés.", + "searchConnectors.nativeConnectors.gdrive.workspaceEmailSharedDrivesSync.label": "E-mail Google Workspace pour la synchronisation des Drive partagés", + "searchConnectors.nativeConnectors.gdrive.workspaceEmailSharedDrivesSync.tooltip": "Fournissez l'e-mail de l'utilisateur de Google Workspace pour la découverte et la synchronisation des Drive partagés. Seuls les Drive partagés auxquels cet utilisateur a accès seront synchronisés.", + "searchConnectors.nativeConnectors.github.configuration.useDocumentLevelSecurityTooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans GitHub. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", + "searchConnectors.nativeConnectors.github.label": "Source de données GitHub", + "searchConnectors.nativeConnectors.github.listOfRepos.label": "Listes de référentiels", + "searchConnectors.nativeConnectors.github.listOfRepos.tooltip": "Ce champ configurable est ignoré lorsque les règles de synchronisation avancées sont appliquées.", + "searchConnectors.nativeConnectors.github.name": "GitHub", + "searchConnectors.nativeConnectors.github.options.cloudLabel": "Cloud GitHub", + "searchConnectors.nativeConnectors.github.options.cloudServer": "Serveur GitHub", + "searchConnectors.nativeConnectors.github.options.organization": "Organisation", + "searchConnectors.nativeConnectors.github.options.other": "Autre", + "searchConnectors.nativeConnectors.github.org_name.label": "Nom de l'organisation", + "searchConnectors.nativeConnectors.github.repo_type": "La fonctionnalité de sécurité au niveau du document n'est pas disponible pour le type de référentiel \"autre\"", + "searchConnectors.nativeConnectors.github.repo_type.label": "Type de référentiel", + "searchConnectors.nativeConnectors.github.token.label": "Jeton GitHub", + "searchConnectors.nativeConnectors.github.url.label": "URL GitHub", + "searchConnectors.nativeConnectors.gmail.customer_id.label": "ID client Google", + "searchConnectors.nativeConnectors.gmail.customer_id.tooltip": "Console admin Google -> Compte -> Paramètres -> ID client", + "searchConnectors.nativeConnectors.gmail.include_spam_and_trash.label": "Inclure le spam et les e-mails indésirables", + "searchConnectors.nativeConnectors.gmail.include_spam_and_trash.tooltip": "Si réglé sur \"true\", inclura le spam et les e-mails indésirables.", + "searchConnectors.nativeConnectors.gmail.name": "Gmail", + "searchConnectors.nativeConnectors.gmail.service_account_credentials.label": "Compte de service JSON GMail", + "searchConnectors.nativeConnectors.gmail.subject.label": "E-mail administrateur Google Workspace", + "searchConnectors.nativeConnectors.gmail.subject.tooltip": "Adresse e-mail du compte admin", + "searchConnectors.nativeConnectors.gmail.use_document_level_security.label": "Activer la sécurité au niveau du document", + "searchConnectors.nativeConnectors.gmail.use_document_level_security.tooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans GMail. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs pour les documents contenus dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", + "searchConnectors.nativeConnectors.google_drive.name": "Google Drive", + "searchConnectors.nativeConnectors.googleCloudStorage.bucketNameLabel": "Liste des compartiments", + "searchConnectors.nativeConnectors.googleCloudStorage.label": "Compte de service JSON Google Cloud", + "searchConnectors.nativeConnectors.googleCloudStorage.retry.label": "Nombre maximum de nouvelles tentatives pour les requêtes ayant échoué", + "searchConnectors.nativeConnectors.jira.cloudApiTokenLabel": "Token d'API Jira Cloud", + "searchConnectors.nativeConnectors.jira.cloudServiceAccountLabel": "Id de compte service Jira Cloud", + "searchConnectors.nativeConnectors.jira.dataCenterPasswordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.jira.dataCenterUsername": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.jira.dataSourceLabel": "Source de données Jira", + "searchConnectors.nativeConnectors.jira.hostUrlLabel": "URL de l'hôte Jira", + "searchConnectors.nativeConnectors.jira.jiraCloudLabel": "Jira Cloud", + "searchConnectors.nativeConnectors.jira.jiraDataCenterLabel": "Centre de données Jira", + "searchConnectors.nativeConnectors.jira.jiraServerLabel": "Serveur Jira", + "searchConnectors.nativeConnectors.jira.name": "Jira", + "searchConnectors.nativeConnectors.jira.projectKeysLabel": "Clés de projet Jira", + "searchConnectors.nativeConnectors.jira.serverPasswordLabel": "Mot de passe serveur Jira", + "searchConnectors.nativeConnectors.jira.serverUsername": "Nom d'utilisateur serveur Jira", + "searchConnectors.nativeConnectors.mongodb.configuration.collectionLabel": "Collection", + "searchConnectors.nativeConnectors.mongodb.configuration.directConnectionLabel": "Connexion directe", + "searchConnectors.nativeConnectors.mongodb.configuration.hostLabel": "Nom d'hôte du serveur", + "searchConnectors.nativeConnectors.mongodb.configuration.sslCaLabel": "Autorité de certification (.pem)", + "searchConnectors.nativeConnectors.mongodb.configuration.sslCaTooltip": "Précise le certificat racine fourni par l'Autorité de certification. La valeur du certificat permet de valider le certificat présenté par l'instance MongoDB.", + "searchConnectors.nativeConnectors.mongodb.configuration.sslEnabledLabel": "Connexion SSL/TLS", + "searchConnectors.nativeConnectors.mongodb.configuration.sslEnabledTooltip": "Cette option établit une connexion sécurisée au serveur MongoDB grâce au chiffrement SSL/TLS. Assurez-vous que votre déploiement MongoDB prend en charge les connexions SSL/TLS. Activez cette option si le cluster MongoDB utilise des enregistrements DNS SRV.", + "searchConnectors.nativeConnectors.mongodb.configuration.tlsInsecureLabel": "Ignorer la vérification du certificat", + "searchConnectors.nativeConnectors.mongodb.configuration.tlsInsecureTooltip": "Cette option permet d'ignorer la validation du certificat pour les connexions TLS/SSL à votre serveur MongoDB. Nous vous recommandons fortement de la désactiver.", + "searchConnectors.nativeConnectors.mongodb.name": "MongoDB", + "searchConnectors.nativeConnectors.mssql.configuration.hostLabel": "Hôte", + "searchConnectors.nativeConnectors.mssql.configuration.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.mssql.configuration.retriesLabel": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.mssql.configuration.rowsFetchedLabel": "Lignes extraites par requête", + "searchConnectors.nativeConnectors.mssql.configuration.schemaLabel": "Schéma", + "searchConnectors.nativeConnectors.mssql.configuration.tablesLabel": "Liste de tables séparées par des virgules", + "searchConnectors.nativeConnectors.mssql.configuration.usernameLabel": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.mssql.configuration.validateHostLabel": "Valider l’hôte", + "searchConnectors.nativeConnectors.mssql.name": "Microsoft SQL", + "searchConnectors.nativeConnectors.mysql.configuration.hostLabel": "Hôte", + "searchConnectors.nativeConnectors.mysql.configuration.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.mysql.configuration.retriesLabel": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.mysql.configuration.rowsFetchedLabel": "Lignes extraites par requête", + "searchConnectors.nativeConnectors.mysql.configuration.tablesLabel": "Liste de tables séparées par des virgules", + "searchConnectors.nativeConnectors.mysql.configuration.usernameLabel": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.mysql.name": "MySQL", + "searchConnectors.nativeConnectors.nativeConnectors.maximumConcurrentLabel": "Téléchargement actuels maximaux", + "searchConnectors.nativeConnectors.networkDrive.ipAddressLabel": "Adresse IP", + "searchConnectors.nativeConnectors.networkDrive.name": "Lecteur réseau", + "searchConnectors.nativeConnectors.networkDrive.pathLabel": "Chemin", + "searchConnectors.nativeConnectors.oneDrive.azureClientId.label": "ID client application Azure", + "searchConnectors.nativeConnectors.oneDrive.azureClientSecret.label": "Identifiant client secret application Azure", + "searchConnectors.nativeConnectors.onedrive.name": "OneDrive", + "searchConnectors.nativeConnectors.oneDrive.tenantId.label": "ID locataire application Azure", + "searchConnectors.nativeConnectors.oracle.configuration.databaseLabel": "Base de données", + "searchConnectors.nativeConnectors.oracle.configuration.fetch_sizeLabel": "Lignes extraites par requête", + "searchConnectors.nativeConnectors.oracle.configuration.hostLabel": "Hôte", + "searchConnectors.nativeConnectors.oracle.configuration.oracle_homeLabel": "Chemin d'accès à la page d'accueil d'Oracle", + "searchConnectors.nativeConnectors.oracle.configuration.oracle_protocolLabel": "Protocole de connexion à Oracle", + "searchConnectors.nativeConnectors.oracle.configuration.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.oracle.configuration.portLabel": "Port", + "searchConnectors.nativeConnectors.oracle.configuration.retry_countLabel": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.oracle.configuration.tablesLabel": "Liste de tables séparées par des virgules", + "searchConnectors.nativeConnectors.oracle.configuration.usernameLabel": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.oracle.configuration.wallet_configuration_pathLabel": "Chemin d'accès aux fichiers de configuration du portefeuille SSL", + "searchConnectors.nativeConnectors.oracle.name": "Oracle", + "searchConnectors.nativeConnectors.outlook.active_directory_server.label": "Serveur Active Directory", + "searchConnectors.nativeConnectors.outlook.active_directory_server.tooltip": "Adresse IP du serveur Active Directory. P. ex. 127.0.0.1", + "searchConnectors.nativeConnectors.outlook.client_id.label": "ID client", + "searchConnectors.nativeConnectors.outlook.client_secret.label": "Valeur de l'identifiant client secret", + "searchConnectors.nativeConnectors.outlook.data_source.label": "Source de données Outlook", + "searchConnectors.nativeConnectors.outlook.domain.label": "Nom de domaine du serveur Exchange", + "searchConnectors.nativeConnectors.outlook.domain.tooltip": "Nom de domaine, p. ex gmail.com ou outlook.com", + "searchConnectors.nativeConnectors.outlook.exchange_server.label": "Serveur Exchange", + "searchConnectors.nativeConnectors.outlook.exchange_server.tooltip": "Adresse IP du serveur Exchange. P. ex. 127.0.0.1", + "searchConnectors.nativeConnectors.outlook.name": "Outlook", + "searchConnectors.nativeConnectors.outlook.password.label": "Mot de passe du serveur Exchange", + "searchConnectors.nativeConnectors.outlook.ssl_ca.label": "Certificat SSL", + "searchConnectors.nativeConnectors.outlook.ssl_enabled.label": "Activer SSL", + "searchConnectors.nativeConnectors.outlook.tenant_id.label": "ID locataire", + "searchConnectors.nativeConnectors.outlook.use_text_extraction_service.label": "Utiliser un service d’extraction de texte", + "searchConnectors.nativeConnectors.outlook.use_text_extraction_service.toolip": "Nécessite un déploiement distinct du service d'extraction de texte d'Elastic. Nécessite que l'extraction de texte soit désactivée dans les paramètres du pipeline.", + "searchConnectors.nativeConnectors.outlook.username.label": "Nom d'utilisateur du serveur Exchange", + "searchConnectors.nativeConnectors.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.portLabel": "Port", + "searchConnectors.nativeConnectors.postgresql.configuration.hostLabel": "Hôte", + "searchConnectors.nativeConnectors.postgresql.configuration.retriesLabel": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "Lignes extraites par requête", + "searchConnectors.nativeConnectors.postgresql.configuration.tablesLabel": "Liste de tables séparées par des virgules", + "searchConnectors.nativeConnectors.postgresql.name": "PostgreSQL", + "searchConnectors.nativeConnectors.retriesPerRequest.label": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.schemaLabel": "Schéma", + "searchConnectors.nativeConnectors.servicenow.configuration.useDocumentLevelSecurityTooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans ServiceNow. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", + "searchConnectors.nativeConnectors.servicenow.name": "ServiceNow", + "searchConnectors.nativeConnectors.servicenow.password.label": "Mot de passe", + "searchConnectors.nativeConnectors.servicenow.services.label": "Liste des services séparés par des virgules", + "searchConnectors.nativeConnectors.servicenow.services.tooltip": "La liste des services est ignorée lorsque des règles de synchronisation avancées sont appliquées.", + "searchConnectors.nativeConnectors.servicenow.url.label": "URL des services", + "searchConnectors.nativeConnectors.servicenow.username.label": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "ID client", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.enumerateAllSitesLabel": "Énumérer tous les sites ?", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.enumerateAllSitesTooltip": "Si cette fonctionnalité est activée, les sites seront recherchés en bloc, puis filtrés pour obtenir la liste de sites configurés. Cela est efficace pour synchroniser de nombreux sites. Si la fonctionnalité est désactivée, chaque site configuré sera recherché au moyen d'une requête individuelle. Cela est efficace pour synchroniser quelques sites.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchDriveItemPermissionsLabel": "Récupérer les autorisations d'un driveItem", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchDriveItemPermissionsTooltip": "Activer cette option pour récupérer des autorisations spécifiques d'un driveItem. Ce paramètre est susceptible d'augmenter le délai de synchronisation.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchSubsitesLabel": "Rechercher les sous-sites des sites configurés ?", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchSubsitesTooltip": "Si les sous-sites du ou des sites configurés doivent être automatiquement recherchés.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListItemPermissionsLabel": "Récupérer les autorisations d'un élément de liste unique", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListItemPermissionsTooltip": "Activer cette option pour récupérer les autorisations d'un élément de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, un élément de liste hérite des permissions de son site parent.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListPermissionsLabel": "Récupérer les autorisations de liste unique", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListPermissionsTooltip": "Activer cette option pour récupérer les autorisations de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, une liste hérite des permissions de son site parent.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniquePagePermissionsLabel": "Récupérer les autorisations de page unique", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniquePagePermissionsTooltip": "Activer cette option pour récupérer les autorisations de page unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, une page hérite des permissions de son site parent.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "Valeur secrète", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "Liste de sites séparées par des virgules", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "Une liste de sites séparés par des virgules dont les données doivent être ingérées. Utilisez \"*\" pour inclure tous les sites disponibles.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "ID locataire", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "Nom du locataire", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.useDocumentLevelSecurityLabel": "Activer la sécurité au niveau du document", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.useDocumentLevelSecurityTooltip": "La sécurité au niveau du document préserve dans Elasticsearch les identités et permissions paramétrées dans Sharepoint Online. Ces métadonnées sont ajoutées à votre document Elasticsearch afin que vous puissiez contrôler l'accès en lecture des utilisateurs et des groupes. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées.", + "searchConnectors.nativeConnectors.sharepoint_online.name": "SharePoint en ligne", + "searchConnectors.nativeConnectors.sslCertificate.label": "Certificat SSL", + "searchConnectors.nativeConnectors.textExtractionService.label": "Utiliser un service d’extraction de texte", + "searchConnectors.nativeConnectors.textExtractionService.tooltip": "Nécessite un déploiement distinct du service d’extraction de données d’Elastic. Nécessite également que les paramètres de pipeline désactivent l’extraction de texte.", + "searchConnectors.nativeConnectors.usernameLabel": "Nom d'utilisateur", + "searchConnectors.searchIndices.addedDocs.columnTitle": "Documents ajoutés", + "searchConnectors.searchIndices.deletedDocs.columnTitle": "Documents supprimés", + "searchConnectors.searchIndices.identitySync.columnTitle": "Identités synchronisées", + "searchConnectors.searchIndices.syncJobType.columnTitle": "Type de synchronisation de contenu", + "searchConnectors.searchIndices.syncStatus.columnTitle": "Statut", + "searchConnectors.server.connectors.configuration.error": "Connecteur introuvable", + "searchConnectors.server.connectors.scheduling.error": "Document introuvable", + "searchConnectors.syncJobs.flyout.canceledTitle": "Synchronisation annulée", + "searchConnectors.syncJobs.flyout.completedTitle": "Synchronisation terminée", + "searchConnectors.syncJobs.flyout.failureTitle": "Échec de la synchronisation", + "searchConnectors.syncJobs.flyout.inProgressTitle": "En cours", + "searchConnectors.syncJobs.flyout.sync": "Sync", + "searchConnectors.syncJobs.flyout.sync.id": "ID", + "searchConnectors.syncJobs.flyout.syncStartedManually": "Synchronisation démarrée manuellement", + "searchConnectors.syncJobs.flyout.syncStartedScheduled": "Synchronisation démarrée par planification", + "searchConnectors.syncJobs.flyout.title": "Log d'événements", + "searchConnectors.syncJobs.lastSync.columnTitle": "Dernière synchronisation", + "searchConnectors.syncJobs.syncDuration.columnTitle": "Durée de synchronisation", + "searchConnectors.syncJobType.full": "Contenu entier", + "searchConnectors.syncJobType.incremental": "Contenu progressif", + "searchConnectors.syncStatus.canceled": "Annulation de la synchronisation", + "searchConnectors.syncStatus.canceling": "Synchronisation annulée", + "searchConnectors.syncStatus.completed": "Synchronisation terminée", + "searchConnectors.syncStatus.error": "Échec de la synchronisation", + "searchConnectors.syncStatus.inProgress": "Synchronisation en cours", + "searchConnectors.syncStatus.pending": "Synchronisation en attente", + "searchConnectors.syncStatus.suspended": "Synchronisation suspendue", + "searchErrors.painlessError.painlessScriptedFieldErrorMessage": "Erreur d'exécution du champ d'exécution ou du champ scripté sur la vue de données {indexPatternName}", + "searchErrors.tsdbError.message": "Le champ {field} du type de série temporelle [compteur] a été utilisé avec une opération {op} non prise en charge.", + "searchErrors.errors.fetchError": "Vérifiez votre connexion réseau et réessayez.", + "searchErrors.esError.unknownRootCause": "inconnue", + "searchErrors.esError.viewDetailsButtonLabel": "Afficher les détails", + "searchErrors.painlessError.buttonTxt": "Modifier le script", + "searchErrors.search.esErrorTitle": "Impossible d’extraire les résultats de recherche", + "searchErrors.search.httpErrorTitle": "Impossible de se connecter au serveur Kibana", + "searchErrors.tsdbError.tsdbCounterDocsLabel": "Pour en savoir plus sur les types de champs des séries temporelles et les agrégations compatibles [counter]", + "searchIndexDocuments.documentList.description": "Affichage de {results} sur {total}. Nombre maximal de résultats de recherche de {maximum} documents.", + "searchIndexDocuments.documentList.pagination.itemsPerPage": "Documents par page : {docPerPage}", + "searchIndexDocuments.documentList.paginationOptions.option": "{docCount} documents", + "searchIndexDocuments.documentList.resultLimit": "Seuls les {number} premiers résultats sont disponibles pour la pagination. Veuillez utiliser la barre de recherche pour filtrer vos résultats.", + "searchIndexDocuments.documentList.resultLimitTitle": "Les résultats sont limités à {number} documents", + "searchIndexDocuments.result.expandTooltip.showFewer": "Afficher {amount} champs en moins", + "searchIndexDocuments.result.expandTooltip.showMore": "Afficher {amount} champs en plus", + "searchIndexDocuments.result.header.metadata.icon.ariaLabel": "Métadonnées pour le document : {id}", + "searchIndexDocuments.result.title.id": "ID de document : {id}", + "searchIndexDocuments.documentList.docsPerPage": "Nombre de documents par page déroulée", + "searchIndexDocuments.documentList.paginationAriaLabel": "Pagination pour la liste de documents", + "searchIndexDocuments.documents.searchField.placeholder": "Rechercher des documents dans cet index", + "searchIndexDocuments.documents.title": "Parcourir des documents", + "searchIndexDocuments.result.expandTooltip.allVisible": "Tous les champs sont visibles", + "searchIndexDocuments.result.header.metadata.deleteDocument": "Supprimer le document", + "searchIndexDocuments.result.header.metadata.title": "Métadonnées du document", + "searchResponseWarnings.badgeButtonLabel": "{warningCount} {warningCount, plural, one {avertissement} other {avertissements}}", + "searchResponseWarnings.title.clustersClause": "Un problème est survenu avec {nonSuccessfulClustersCount} {nonSuccessfulClustersCount, plural, one {cluster} other {clusters}}", + "searchResponseWarnings.title.clustersClauseAndRequestsClause": "{clustersClause} pour {requestsCount} requêtes", + "searchResponseWarnings.description.multipleClusters": "Ces clusters ont rencontré des problèmes lors du renvoi des données et les résultats pourraient être incomplets.", + "searchResponseWarnings.description.singleCluster": "Ce cluster a rencontré des problèmes lors du renvoi des données et les résultats pourraient être incomplets.", "searchResponseWarnings.noResultsTitle": "Résultat introuvable", - "securitySolutionPackages.dataTable.eventsTab.unit": "{totalCount, plural, =1 {alerte} one {alertes} many {alertes} other {alertes}}", - "securitySolutionPackages.dataTable.unit": "{totalCount, plural, =1 {alerte} one {alertes} many {alertes} other {alertes}}", - "securitySolutionPackages.ecsDataQualityDashboard.allTab.allFieldsTableTitle": "Tous les champs – {indexName}", + "searchResponseWarnings.viewDetailsButtonLabel": "Afficher les détails", + "securitySolutionPackages.alertAssignments.upsell": "Passer à {requiredLicense} pour utiliser les affectations d'alertes", + "securitySolutionPackages.alertSuppressionRuleForm.upsell": "La suppression d'alertes est activée avec la licence {requiredLicense} ou supérieure", + "securitySolutionPackages.dataTable.eventsTab.unit": "{totalCount, plural, =1 {alerte} other {alertes}}", + "securitySolutionPackages.dataTable.unit": "{totalCount, plural, =1 {alerte} other {alertes}}", + "securitySolutionPackages.ecsDataQualityDashboard.allTab.allFieldsTableTitle": "Tous les champs - {indexName}", "securitySolutionPackages.ecsDataQualityDashboard.checkAllErrorCheckingIndexMessage": "Une erreur s'est produite lors de la vérification de l'index {indexName}", "securitySolutionPackages.ecsDataQualityDashboard.checkingLabel": "Vérification de {index}", - "securitySolutionPackages.ecsDataQualityDashboard.coldPatternTooltip": "{indices} {indices, plural, =1 {index} one {index système non migrés} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {sont} many {sont} other {sont}} cold. Les index \"cold\" ne sont plus mis à jour et ne sont pas interrogés fréquemment. Les informations doivent toujours être interrogeables, mais il est acceptable que ces requêtes soient plus lentes.", + "securitySolutionPackages.ecsDataQualityDashboard.coldPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} other {sont}} \"cold\". Les index \"cold\" ne sont plus mis à jour et ne sont pas interrogés fréquemment. Les informations doivent toujours être interrogeables, mais il est acceptable que ces requêtes soient plus lentes.", "securitySolutionPackages.ecsDataQualityDashboard.createADataQualityCaseForIndexHeaderText": "Créer un cas de qualité des données pour l'index {indexName}", - "securitySolutionPackages.ecsDataQualityDashboard.customTab.customFieldsTableTitle": "Champs personnalisés – {indexName}", - "securitySolutionPackages.ecsDataQualityDashboard.customTab.ecsComplaintFieldsTableTitle": "Champs de plainte ECS – {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.customTab.customFieldsTableTitle": "Champs personnalisés - {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.customTab.ecsComplaintFieldsTableTitle": "Champs de plainte ECS - {indexName}", "securitySolutionPackages.ecsDataQualityDashboard.dataQualityPromptContextPill": "Qualité des données ({indexName})", "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingMappingsBody": "Un problème est survenu lors du chargement des mappings : {error}", "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingMetadataTitle": "Les index correspondant au modèle {pattern} ne seront pas vérifiés", @@ -5092,21 +5868,21 @@ "securitySolutionPackages.ecsDataQualityDashboard.errorLoadingMappingsLabel": "Erreur lors du chargement des mappings pour {patternOrIndexName} : {details}", "securitySolutionPackages.ecsDataQualityDashboard.errorLoadingStatsLabel": "Erreur lors du chargement des statistiques : {details}", "securitySolutionPackages.ecsDataQualityDashboard.errorLoadingUnallowedValuesLabel": "Erreur lors du chargement des valeurs non autorisées pour l'index {indexName} : {details}", - "securitySolutionPackages.ecsDataQualityDashboard.frozenPatternTooltip": "{indices} {indices, plural, =1 {index} one {index système non migrés} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {sont} many {sont} other {sont}} frozen. Les index gelés ne sont plus mis à jour et sont rarement interrogés. Les informations doivent toujours être interrogeables, mais il est acceptable que ces requêtes soient extrêmement lentes.", - "securitySolutionPackages.ecsDataQualityDashboard.hotPatternTooltip": "{indices} {indices, plural, =1 {index} one {index système non migrés} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {sont} many {sont} other {sont}} hot. Les index \"hot\" sont mis à jour et interrogés de façon active.", + "securitySolutionPackages.ecsDataQualityDashboard.frozenPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} other {sont}} \"frozen\". Les index gelés ne sont plus mis à jour et sont rarement interrogés. Les informations doivent toujours être interrogeables, mais il est acceptable que ces requêtes soient extrêmement lentes.", + "securitySolutionPackages.ecsDataQualityDashboard.hotPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} other {sont}} \"hot\". Les index \"hot\" sont mis à jour et interrogés de façon active.", "securitySolutionPackages.ecsDataQualityDashboard.incompatibleTab.incompatibleFieldMappingsTableTitle": "Mappings de champ incompatibles – {indexName}", "securitySolutionPackages.ecsDataQualityDashboard.incompatibleTab.incompatibleFieldValuesTableTitle": "Valeurs de champ incompatibles – {indexName}", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCallout": "Tous les mappings relatifs aux champs de cet index, y compris ceux qui sont conformes à la version {version} d'Elastic Common Schema (ECS) et ceux qui ne le sont pas", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCalloutTitle": "Tous les {fieldCount} {fieldCount, plural, =1 {mapping de champ} one {mappings de champ} many {mappings de champ} other {mappings de champ}}", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCallout": "{fieldCount, plural, =1 {Ce champ n''est pas défini} one {Ce champ n''est pas défini} many {Ces champs ne sont pas définis} other {Ces champs ne sont pas définis}} par l'Elastic Common Schema (ECS), version {version}.", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {mapping de champ} one {mappings de champ} many {mappings de champ} other {mappings de champ}} personnalisé(s)", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantCallout": "{fieldCount, plural, =1 {Le type de mapping d''index et les valeurs de document pour ce champ sont conformes} one {Le type de mapping d''index et les valeurs de document pour ce champ sont conformes} many {Les types de mapping d''index et les valeurs de document pour ce champ sont conformes} other {Les types de mapping d''index et les valeurs de document pour ce champ sont conformes}} avec la version {version} d'Elastic Common Schema (ECS)", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {champ} one {champs} many {champs} other {champs}} conforme(s) à ECS", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCalloutTitle": "L'ensemble {fieldCount} {fieldCount, plural, =1 {du mapping de champs} other {des mappings de champs}}", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCallout": "{fieldCount, plural, =1 {Ce champ n'est pas défini} other {Ces champs ne sont pas définis}} par la version {version} d'Elastic Common Schema (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Mapping de champs personnalisé} other {Mappings de champ personnalisés}}", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantCallout": "{fieldCount, plural, =1 {Le type de mapping d'index et les valeurs de document de ce champ sont conformes} other {Les types de mapping d'index et les valeurs de document de ces champs sont conformes}} à la version {version} d'Elastic Common Schema (ECS)", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Champ conforme} other {Champs conformes}} à ECS", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCallout": "Les champs sont incompatibles avec ECS lorsque les mappings d'index, ou les valeurs des champs de l'index, ne sont pas conformes à la version {version} d'Elastic Common Schema (ECS).", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {champ} one {champs} many {champs} other {champs}} incompatible(s)", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyCallout": "{fieldCount, plural, =1 {Ce champ est défini} one {Ces champs sont définis} many {Ces champs sont définis} other {Ces champs sont définis}} par l'Elastic Common Schema (ECS), version {version}, toutefois {fieldCount, plural, =1 {son type de mapping ne correspond pas} one {leurs types de mapping ne correspondent pas} many {leurs types de mapping ne correspondent pas} other {leurs types de mapping ne correspondent pas}} correspondent parfaitement.", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyCalloutTitle": "{fieldCount} Même famille de {fieldCount, plural, =1 {mapping de champ} one {mappings de champ} many {mappings de champ} other {mappings de champ}}", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.summaryMarkdownDescription": "L'index \"{indexName}\" contient des [mappings]({mappingUrl}) ou des valeurs de champs différents des [définitions]({ecsFieldReferenceUrl}) de la version \"{version}\" d'[Elastic Common Schema]({ecsReferenceUrl}) (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Champ incompatible} other {Champs incompatibles}}", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyCallout": "{fieldCount, plural, =1 {Ce champ est défini} other {Ces champs sont définis}} par Elastic Common Schema (ECS), version {version}, mais {fieldCount, plural, =1 {son type de mapping de ne correspond} other {leurs types de mapping ne correspondent}} pas exactement.", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Mapping de champs} other {Mappings de champ}} de même famille", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.summaryMarkdownDescription": "L'index `{indexName}` a des [mappings]({mappingUrl}) ou des valeurs de champ différentes de l'[Elastic Common Schema]({ecsReferenceUrl}) (ECS), [définitions]({ecsFieldReferenceUrl}).de version `{version}`.", "securitySolutionPackages.ecsDataQualityDashboard.sameFamilyTab.sameFamilyFieldMappingsTableTitle": "Mêmes familles de mappings de champ – {indexName}", "securitySolutionPackages.ecsDataQualityDashboard.statLabels.customIndexToolTip": "Décompte des mappings d'index personnalisés dans l'index {indexName}", "securitySolutionPackages.ecsDataQualityDashboard.statLabels.customPatternToolTip": "Nombre total de mappings d'index personnalisés, dans les index correspondant au modèle {pattern}", @@ -5114,18 +5890,19 @@ "securitySolutionPackages.ecsDataQualityDashboard.statLabels.incompatiblePatternToolTip": "Nombre total de champs incompatibles avec ECS, dans les index correspondant au modèle {pattern}", "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indexDocsCountToolTip": "Nombre de documents dans l'index {indexName}", "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indexDocsPatternToolTip": "Nombre total de documents, dans les index correspondant au modèle {pattern}", - "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indicesSizePatternToolTip": "Taille totale de tous les index principaux correspondant au modèle {pattern} (n'inclut pas de répliques)", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indicesSizePatternToolTip": "Taille totale de tous les index principaux correspondant au modèle {pattern} (n'inclut pas les répliques)", "securitySolutionPackages.ecsDataQualityDashboard.statLabels.sameFamilyPatternToolTip": "Le nombre total de champs de la même famille tel que le type spécifié par l'ECS, dans les index correspondant au modèle {pattern}", "securitySolutionPackages.ecsDataQualityDashboard.statLabels.totalCountOfIndicesCheckedMatchingPatternToolTip": "Nombre total d'index vérifiés correspondant au modèle {pattern}", "securitySolutionPackages.ecsDataQualityDashboard.statLabels.totalCountOfIndicesMatchingPatternToolTip": "Nombre total d'index correspondant au modèle {pattern}", "securitySolutionPackages.ecsDataQualityDashboard.storageTreemap.noDataReasonLabel": "Le champ {stackByField1} n'était présent dans aucun groupe", "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indexToolTip": "Cet index correspond au nom d'index ou de modèle : {pattern}", - "securitySolutionPackages.ecsDataQualityDashboard.unmanagedPatternTooltip": "{indices} {indices, plural, =1 {index} one {index système non migrés} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {sont} many {sont} other {ne sont pas gérés}} par Index Lifecycle Management (ILM)", - "securitySolutionPackages.ecsDataQualityDashboard.warmPatternTooltip": "{indices} {indices, plural, =1 {index} one {index système non migrés} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {sont} many {sont} other {sont}} warm. Les index \"warm\" ne sont plus mis à jour, mais ils sont toujours interrogés.", - "securitySolutionPackages.entityAnalytics.paywall.upgradeButton": "Mise à niveau vers {requiredLicenseOrProduct}", + "securitySolutionPackages.ecsDataQualityDashboard.unmanagedPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {n'est pas géré} other {ne sont pas gérés}} par la gestion du cycle de vie des index (ILM)", + "securitySolutionPackages.ecsDataQualityDashboard.warmPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} other {sont}} \"warm\". Les index \"warm\" ne sont plus mis à jour, mais ils sont toujours interrogés.", + "securitySolutionPackages.entityAnalytics.paywall.upgradeButton": "Passer à {requiredLicenseOrProduct}", "securitySolutionPackages.entityAnalytics.paywall.upgradeLicenseMessage": "Cette fonctionnalité est disponible avec l'abonnement {requiredLicense} ou supérieur", "securitySolutionPackages.entityAnalytics.paywall.upgradeProductMessage": "La capacité d'évaluation du risque des entités est disponible dans notre niveau de licence {requiredProduct}", - "securitySolutionPackages.markdown.insight.upsell": "Passez au niveau {requiredLicense} pour pouvoir utiliser les informations exploitables dans des guides d'investigation", + "securitySolutionPackages.markdown.insight.upsell": "Passez au niveau {requiredLicense} pour pouvoir utiliser les informations des guides d'investigation", + "securitySolutionPackages.alertSuppressionRuleDetails.upsell": "La suppression d'alertes est configurée mais elle ne sera pas appliquée en raison d'une licence insuffisante", "securitySolutionPackages.beta.label": "Bêta", "securitySolutionPackages.dataTable.ariaLabel": "Alertes", "securitySolutionPackages.dataTable.columnHeaders.flyout.pane.removeColumnButtonLabel": "Supprimer la colonne", @@ -5133,7 +5910,7 @@ "securitySolutionPackages.dataTable.eventRenderedView.ruleTitle.column": "Règle", "securitySolutionPackages.dataTable.eventRenderedView.timestampTitle.column": "Horodatage", "securitySolutionPackages.dataTable.loadingEventsDataLabel": "Chargement des événements", - "securitySolutionPackages.ecsDataQualityDashboard.addToCaseSuccessToast": "Résultats de qualité des données ajoutés avec succès au cas", + "securitySolutionPackages.ecsDataQualityDashboard.addToCaseSuccessToast": "Résultats de qualité des données ajoutés au cas", "securitySolutionPackages.ecsDataQualityDashboard.addToNewCaseButton": "Ajouter au nouveau cas", "securitySolutionPackages.ecsDataQualityDashboard.cancelButton": "Annuler", "securitySolutionPackages.ecsDataQualityDashboard.checkAllButton": "Tout vérifier", @@ -5178,6 +5955,7 @@ "securitySolutionPackages.ecsDataQualityDashboard.errorsViewerTable.patternColumn": "Modèle", "securitySolutionPackages.ecsDataQualityDashboard.fieldsLabel": "Champs", "securitySolutionPackages.ecsDataQualityDashboard.frozenDescription": "L'index n'est plus mis à jour et il est rarement interrogé. Les informations doivent toujours être interrogeables, mais il est acceptable que ces requêtes soient extrêmement lentes.", + "securitySolutionPackages.ecsDataQualityDashboard.getResultErrorTitle": "Erreur lors de la lecture des résultats d'examen qualité des données sauvegardées", "securitySolutionPackages.ecsDataQualityDashboard.hotDescription": "L'index est mis à jour et interrogé de façon active", "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseLabel": "Phase ILM", "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptBody": "La qualité des données sera vérifiée pour les index comprenant ces phases de gestion du cycle de vie des index (ILM, Index Lifecycle Management)", @@ -5213,8 +5991,8 @@ "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsVersionMarkdownComment": "Version Elastic Common Schema (ECS)", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCallout.fieldsWithMappingsSameFamilyLabel": "Les champs avec des mappings dans la même famille ont exactement le même comportement de recherche que le type défini par ECS, mais ils peuvent avoir une utilisation de l'espace différente ou différentes caractéristiques de performances.", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCallout.whenAFieldIsIncompatibleLabel": "Lorsqu'un champ est incompatible :", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyContent": "Tous les mappings de champs et valeurs de documents de cet index sont conformes à Elastic Common Schema (ECS).", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyTitle": "Tous les mappings et valeurs de champs sont conformes à ECS", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyContent": "Tous les mappings de champs et toutes les valeurs de documents de cet index sont conformes à Elastic Common Schema (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyTitle": "Toutes les valeurs et tous les mappings de champs sont conformes à ECS", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleFieldsTab": "Champs incompatibles", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.indexMarkdown": "Index", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.mappingThatConflictWithEcsMessage": "❌ Les mappings ou valeurs de champs qui ne sont pas conformes à ECS ne sont pas pris en charge", @@ -5225,8 +6003,8 @@ "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.pagesMayNotDisplayEventsMessage": "❌ Les pages peuvent ne pas afficher certains événements ou champs en raison de mappings ou valeurs de champs inattendus", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.pagesMayNotDisplayFieldsMessage": "🌕 Certaines pages et fonctionnalités peuvent ne pas afficher ces champs", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.preBuiltDetectionEngineRulesWorkMessage": "✅ Les règles de moteur de détection préconstruites fonctionnent", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyEmptyContent": "Tous les mappings de champs et valeurs de documents de cet index sont conformes à Elastic Common Schema (ECS).", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyEmptyTitle": "Tous les mappings et valeurs de champs sont conformes à ECS", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyEmptyContent": "Tous les mappings de champs et toutes les valeurs de documents de cet index sont conformes à Elastic Common Schema (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyEmptyTitle": "Toutes les valeurs et tous les mappings de champs sont conformes à ECS", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyTab": "Même famille", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sometimesIndicesCreatedByOlderDescription": "Parfois, les index créés par des intégrations plus anciennes comporteront des mappings ou des valeurs qui étaient conformes, mais ne le sont plus.", "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.summaryMarkdownTitle": "Qualité des données", @@ -5240,6 +6018,7 @@ "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.docsLabel": "Documents", "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.indicesLabel": "Index", "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.patternOrIndexTooltip": "Modèle, ou index spécifique", + "securitySolutionPackages.ecsDataQualityDashboard.postResultErrorTitle": "Erreur lors de l'écriture des résultats d'examen qualité des données sauvegardées", "securitySolutionPackages.ecsDataQualityDashboard.remoteClustersCallout.title": "Les clusters distants ne seront pas vérifiés", "securitySolutionPackages.ecsDataQualityDashboard.remoteClustersCallout.toCheckIndicesOnRemoteClustersLabel": "Pour vérifier les index sur des clusters distants prenant en charge la recherche dans différents clusters, connectez-vous à l'instance Kibana du cluster distant", "securitySolutionPackages.ecsDataQualityDashboard.sameFamilyBadgeLabel": "même famille", @@ -5273,6 +6052,7 @@ "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indexesNameLabel": "Nom de l'index", "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indicesCheckedColumn": "Index vérifiés", "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indicesColumn": "Index", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.lastCheckColumn": "Dernière vérification", "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.passedTooltip": "Approuvé", "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.resultColumn": "Résultat", "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.sizeColumn": "Taille", @@ -5286,6 +6066,8 @@ "securitySolutionPackages.entityAnalytics.pageDesc": "Détecter les menaces des utilisateurs et des hôtes de votre réseau avec l'Analyse des entités", "securitySolutionPackages.features.featureRegistry.assistant.createConversationSubFeatureDetails": "Créer des conversations", "securitySolutionPackages.features.featureRegistry.assistant.createConversationSubFeatureName": "Créer des Conversations", + "securitySolutionPackages.features.featureRegistry.casesSettingsSubFeatureDetails": "Modifier les paramètres du cas", + "securitySolutionPackages.features.featureRegistry.casesSettingsSubFeatureName": "Paramètres du cas", "securitySolutionPackages.features.featureRegistry.deleteSubFeatureDetails": "Supprimer les cas et les commentaires", "securitySolutionPackages.features.featureRegistry.deleteSubFeatureName": "Supprimer", "securitySolutionPackages.features.featureRegistry.linkSecuritySolutionAssistantTitle": "Assistant d’intelligence artificielle d’Elastic", @@ -5305,7 +6087,7 @@ "securitySolutionPackages.features.featureRegistry.subFeatures.eventFilters.description": "Excluez les événements de point de terminaison dont vous n'avez pas besoin ou que vous ne souhaitez pas stocker dans Elasticsearch.", "securitySolutionPackages.features.featureRegistry.subFeatures.eventFilters.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux filtres d'événements.", "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations": "Exécuter les opérations", - "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations.description": "Effectuez l'exécution de script sur le point de terminaison.", + "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations.description": "Effectuez les actions de réponse d'exécution de script dans la console de réponse.", "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux opérations d'exécution.", "securitySolutionPackages.features.featureRegistry.subFeatures.fileOperations": "Opérations de fichier", "securitySolutionPackages.features.featureRegistry.subFeatures.fileOperations.description": "Effectuez les actions de réponse liées aux fichiers dans la console de réponse.", @@ -5331,10 +6113,10 @@ "securitySolutionPackages.sideNav.betaBadge.label": "Bêta", "securitySolutionPackages.sideNav.togglePanel": "Activer/Désactiver le panneau de navigation", "share.contextMenuTitle": "Partager ce {objectType}", - "share.urlPanel.canNotShareAsSavedObjectHelpText": "Pour le partager comme objet partagé, enregistrez le {objectType}.", + "share.urlPanel.canNotShareAsSavedObjectHelpText": "Pour le partager comme objet enregistré, enregistrez le {objectType}.", "share.urlPanel.savedObjectDescription": "Vous pouvez partager cette URL avec des personnes pour leur permettre de charger la version enregistrée la plus récente de ce {objectType}.", - "share.urlPanel.snapshotDescription": "Les URL de snapshot encodent l'état actuel de {objectType} dans l'URL proprement dite. Les modifications apportées au {objectType} enregistré ne seront pas visibles via cette URL.", - "share.urlPanel.unableCreateShortUrlErrorMessage": "Impossible de créer une URL courte. Erreur : {errorMessage}", + "share.urlPanel.snapshotDescription": "Les URL de snapshot encodent l'état actuel de {objectType} dans l'URL elle-même. Les modifications apportées au {objectType} enregistré ne seront pas visibles via cette URL.", + "share.urlPanel.unableCreateShortUrlErrorMessage": "Impossible de créer une URL courte. Erreur : {errorMessage}.", "share.urlService.redirect.RedirectManager.locatorNotFound": "Le localisateur [ID = {id}] n'existe pas.", "share.advancedSettings.csv.quoteValuesText": "Les valeurs doivent-elles être mises entre guillemets dans les exportations CSV ?", "share.advancedSettings.csv.quoteValuesTitle": "Mettre les valeurs CSV entre guillemets", @@ -5354,22 +6136,27 @@ "share.urlPanel.shortUrlLabel": "URL courte", "share.urlPanel.snapshotLabel": "Snapshot", "share.urlPanel.urlGroupTitle": "URL", - "share.urlService.redirect.components.Error.title": "Erreur de redirection", + "share.urlService.redirect.components.docTitle": "Introuvable", + "share.urlService.redirect.components.Error.body": "Désolé, l'objet que vous recherchez est introuvable à cet URL. Il a peut-être été supprimé ou renommé, ou peut-être qu'il n'a jamais existé.", + "share.urlService.redirect.components.Error.homeButton": "Retour à l'accueil", + "share.urlService.redirect.components.Error.title": "Impossible d'ouvrir l'URL", "share.urlService.redirect.components.Spinner.label": "Redirection…", "share.urlService.redirect.RedirectManager.invalidParamParams": "Impossible d'analyser les paramètres du localisateur. Les paramètres du localisateur doivent être sérialisés en tant que JSON et définis au paramètre de recherche d'URL \"p\".", "share.urlService.redirect.RedirectManager.missingParamLocator": "ID du localisateur non spécifié. Spécifiez le paramètre de recherche \"l\" dans l'URL ; ce devrait être un ID de localisateur existant.", "share.urlService.redirect.RedirectManager.missingParamParams": "Paramètres du localisateur non spécifiés. Spécifiez le paramètre de recherche \"p\" dans l'URL ; ce devrait être un objet sérialisé JSON des paramètres du localisateur.", "share.urlService.redirect.RedirectManager.missingParamVersion": "Version des paramètres du localisateur non spécifiée. Spécifiez le paramètre de recherche \"v\" dans l'URL ; ce devrait être la version de Kibana au moment de la génération des paramètres du localisateur.", - "sharedUXPackages.codeEditor.startEditing": "Appuyez sur {key} pour démarrer la modification.", - "sharedUXPackages.codeEditor.startEditingReadOnly": "Appuyez sur {key} pour commencer à interagir avec le code.", + "sharedUXPackages.codeEditor.startEditing": "Appuyez sur {key} pour modifier.", + "sharedUXPackages.codeEditor.startEditingReadOnly": "Appuyez sur {key} pour interagir avec le code.", "sharedUXPackages.codeEditor.stopEditing": "Appuyez sur {key} pour arrêter la modification.", - "sharedUXPackages.codeEditor.stopEditingReadOnly": "Appuyez sur {key} pour arrêter d'interagir avec le code.", + "sharedUXPackages.codeEditor.stopEditingReadOnly": "Appuyez sur {key} pour arrêter l'interaction.", + "sharedUXPackages.error_boundary.fatal.prompt.details": "L'erreur ci-dessus a eu lieu dans {name} :", "sharedUXPackages.filePicker.deleteFileQuestion": "Voulez-vous vraiment supprimer \"{fileName}\" ?", - "sharedUXPackages.filePicker.selectFilesButtonLable": "Sélectionner {nrOfFiles} fichiers", - "sharedUXPackages.fileUpload.fileTooLargeErrorMessage": "Le fichier est trop volumineux. La taille maximale est de {expectedSize, plural, one {# octet} many {# octets} other {# octets}}.", - "sharedUXPackages.fileUpload.mimeTypeNotSupportedErrorMessage": "Le type de fichier mime \"{mimeType}\" n’est pas pris en charge. Les types mime pris en charge sont : {supportedMimeTypes}.", + "sharedUXPackages.filePicker.selectFilesButtonLable": "Sélectionner {nrOfFiles} fichiers", + "sharedUXPackages.fileUpload.fileTooLargeErrorMessage": "Le fichier est trop volumineux. La taille maximale est de {expectedSize, plural, one {# octet} other {# octets} }.", + "sharedUXPackages.fileUpload.mimeTypeNotSupportedErrorMessage": "Le type de fichier mime \"{mimeType}\" n'est pas pris en charge. Les types de fichiers mime pris en charge sont : {supportedMimeTypes}.", + "sharedUXPackages.no_data_views.esqlMessage": "Vous pouvez aussi rechercher vos données en utilisant directement ES|QL (version d'évaluation technique). {docsLink}", "sharedUXPackages.noDataPage.intro": "Ajoutez vos données pour commencer, ou {link} sur {solution}.", - "sharedUXPackages.noDataPage.welcomeTitle": "Bienvenue dans Elastic {solution} !", + "sharedUXPackages.noDataPage.welcomeTitle": "Bienvenue dans Elastic {solution}.", "sharedUXPackages.solutionNav.mobileTitleText": "{solutionName} {menuText}", "sharedUXPackages.buttonToolbar.buttons.addFromLibrary.libraryButtonLabel": "Ajouter depuis la bibliothèque", "sharedUXPackages.buttonToolbar.toolbar.errorToolbarText": "Il y a plus de 120 boutons supplémentaires. Nous vous invitons à limiter le nombre de boutons.", @@ -5377,10 +6164,23 @@ "sharedUXPackages.card.noData.noPermission.description": "Cette intégration n'est pas encore activée. Votre administrateur possède les autorisations requises pour l'activer.", "sharedUXPackages.card.noData.noPermission.title": "Contactez votre administrateur", "sharedUXPackages.card.noData.title": "Ajouter Elastic Agent", + "sharedUXPackages.chrome.sideNavigation.betaBadge.label": "Bêta", "sharedUXPackages.chrome.sideNavigation.recentlyAccessed.title": "Récent", + "sharedUXPackages.chrome.sideNavigation.togglePanel": "Afficher/Masquer le panneau de navigation", "sharedUXPackages.codeEditor.ariaLabel": "Éditeur de code", "sharedUXPackages.codeEditor.enterKeyLabel": "Entrée", "sharedUXPackages.codeEditor.escapeKeyLabel": "Échap", + "sharedUXPackages.codeEditor.readOnlyMessage": "Modification impossible dans l'éditeur en lecture seule", + "sharedUXPackages.error_boundary.fatal.prompt.body": "Essayez d'actualiser la page pour résoudre le problème.", + "sharedUXPackages.error_boundary.fatal.prompt.detailButton": "Afficher les détails", + "sharedUXPackages.error_boundary.fatal.prompt.details.close": "Fermer", + "sharedUXPackages.error_boundary.fatal.prompt.details.copyToClipboard": "Copier l'erreur dans le presse-papiers", + "sharedUXPackages.error_boundary.fatal.prompt.details.title": "Détails de l'erreur", + "sharedUXPackages.error_boundary.fatal.prompt.pageReloadButton": "Actualiser la page", + "sharedUXPackages.error_boundary.fatal.prompt.title": "Impossible de charger la page", + "sharedUXPackages.error_boundary.recoverable.prompt.body": "Cela devrait résoudre les problèmes de chargement de la page.", + "sharedUXPackages.error_boundary.recoverable.prompt.pageReloadButton": "Actualiser la page", + "sharedUXPackages.error_boundary.recoverable.prompt.title": "Actualiser la page", "sharedUXPackages.exitFullScreenButton.exitFullScreenModeButtonText": "Quitter le plein écran", "sharedUXPackages.exitFullScreenButton.fullScreenModeDescription": "En mode Plein écran, appuyez sur Échap pour quitter.", "sharedUXPackages.filePicker.cancel": "Annuler", @@ -5405,6 +6205,8 @@ "sharedUXPackages.fileUpload.uploadCompleteButtonLabel": "Chargement terminé", "sharedUXPackages.fileUpload.uploadDoneToolTipContent": "Votre fichier a bien été chargé !", "sharedUXPackages.fileUpload.uploadingButtonLabel": "Chargement", + "sharedUXPackages.no_data_views.esqlButtonLabel": "Essayer ES|QL", + "sharedUXPackages.no_data_views.esqlDocsLink": "En savoir plus.", "sharedUXPackages.noDataConfig.addIntegrationsDescription": "Utilisez Elastic Agent pour collecter des données et créer des solutions Analytics.", "sharedUXPackages.noDataConfig.addIntegrationsTitle": "Ajouter des intégrations", "sharedUXPackages.noDataConfig.analytics": "Analyse", @@ -5412,7 +6214,12 @@ "sharedUXPackages.noDataConfig.elasticsearch": "Elasticsearch", "sharedUXPackages.noDataConfig.elasticsearchDescription": "Configurez votre client de langage de programmation, ingérez des données et lancez vos recherches.", "sharedUXPackages.noDataConfig.elasticsearchPageTitle": "Bienvenue dans Elasticsearch !", - "sharedUXPackages.noDataConfig.elasticsearchTitle": "Démarrer", + "sharedUXPackages.noDataConfig.elasticsearchTitle": "Ajouter des données", + "sharedUXPackages.noDataConfig.observability": "Observabilité", + "sharedUXPackages.noDataConfig.observabilityDescription": "Commencez par collecter les données en utilisant une de nos nombreuses intégrations.", + "sharedUXPackages.noDataConfig.observabilityPageDescription": "Combinez les indicateurs, les logs et les traces pour surveiller la santé de vos applications.", + "sharedUXPackages.noDataConfig.observabilityPageTitle": "Bienvenue dans Elastic Observability !", + "sharedUXPackages.noDataConfig.observabilityTitle": "Ajouter des données", "sharedUXPackages.noDataPage.intro.link": "en savoir plus", "sharedUXPackages.noDataPage.introNoDocLink": "Ajoutez vos données pour commencer.", "sharedUXPackages.noDataViewsPrompt.addDataViewText": "Créer une vue de données", @@ -5430,9 +6237,9 @@ "sharedUXPackages.solutionNav.menuText": "menu", "sharedUXPackages.solutionNav.openLabel": "Ouvrir la navigation latérale", "telemetry.callout.appliesSettingTitle": "Les modifications apportées à ce paramètre s'appliquent dans {allOfKibanaText} et sont enregistrées automatiquement.", - "telemetry.dataManagementDisclaimerPrivacy": "{optInStatus} Ceci nous permet de savoir ce qui intéresse le plus nos utilisateurs, afin d’améliorer nos produits et services. Consultez notre {privacyStatementLink}.", - "telemetry.seeExampleOfClusterDataAndEndpointSecuity": "Découvrez des exemples des {clusterData} et {securityData} que nous collectons.", - "telemetry.telemetryConfigAndLinkDescription": "Activer la collecte de données d’utilisation nous permet de savoir ce qui intéresse le plus nos utilisateurs, afin de pouvoir améliorer nos produits et services. Consultez notre {privacyStatementLink}.", + "telemetry.dataManagementDisclaimerPrivacy": "{optInStatus} Ceci nous permet de savoir ce qui intéresse le plus nos utilisateurs, afin d'améliorer nos produits et services. Veuillez vous référer à notre {privacyStatementLink}.", + "telemetry.seeExampleOfClusterDataAndEndpointSecuity": "Découvrez des exemples de {clusterData} et de {securityData} que nous collectons.", + "telemetry.telemetryConfigAndLinkDescription": "Activer la collecte de données d’utilisation nous permet de savoir ce qui intéresse le plus nos utilisateurs, afin de pouvoir améliorer nos produits et services. Veuillez vous référer à notre {privacyStatementLink}.", "telemetry.callout.appliesSettingTitle.allOfKibanaText": "tout Kibana", "telemetry.callout.clusterStatisticsDescription": "Voici un exemple des statistiques de cluster de base que nous collecterons. Cela comprend le nombre d'index, de partitions et de nœuds. Cela comprend également des statistiques d'utilisation de niveau élevé, comme l'état d'activation du monitoring.", "telemetry.callout.clusterStatisticsTitle": "Statistiques du cluster", @@ -5460,104 +6267,117 @@ "telemetry.telemetryOptedInNoticeTitle": "Aidez-nous à améliorer la Suite Elastic.", "telemetry.usageCollectionConstant": "collecte de données d’utilisation", "telemetry.usageDataTitle": "Collecte de données d’utilisation", - "textBasedEditor.query.textBasedLanguagesEditor.errorCount": "{count} {count, plural, one {erreur} many {erreurs} other {erreurs}}", - "textBasedEditor.query.textBasedLanguagesEditor.lineCount": "{count} {count, plural, one {ligne} many {lignes} other {lignes}}", + "textBasedEditor.query.textBasedLanguagesEditor.errorCount": "{count} {count, plural, one {erreur} other {erreurs}}", + "textBasedEditor.query.textBasedLanguagesEditor.lineCount": "{count} {count, plural, one {ligne} other {lignes}}", "textBasedEditor.query.textBasedLanguagesEditor.lineNumber": "Ligne {lineNumber}", - "textBasedEditor.query.textBasedLanguagesEditor.warningCount": "{count} {count, plural, one {avertissement} many {avertissements} other {avertissements}}", + "textBasedEditor.query.textBasedLanguagesEditor.warningCount": "{count} {count, plural, one {avertissement} other {avertissements}}", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.absFunction.markdown": "### ABS\nRenvoie la valeur absolue.\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL abs_height = ABS(0.0 - height)\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.acosFunction.markdown": "### ACOS\nFonction trigonométrique cosinus inverse.\n\n```\nROW a=.9\n| EVAL acos=ACOS(a)\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.asinFunction.markdown": "### ASIN\nFonction trigonométrique sinus inverse.\n\n```\nROW a=.9\n| EVAL asin=ASIN(a)\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.atan2Function.markdown": "### ATAN2\nL'angle entre l'axe positif des x et le rayon allant de l'origine au point (x , y) dans le plan cartésien.\n\n```\nROW y=12.9, x=.6\n| EVAL atan2=ATAN2(y, x)\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.atanFunction.markdown": "### ATAN\nFonction trigonométrique tangente inverse.\n\n```\nROW a=.12.9\n| EVAL atan=ATAN(a)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.autoBucketFunction.markdown": "### AUTO_BUCKET\nCrée des compartiments ergonomiques et renvoie une valeur `datetime` pour chaque ligne qui correspond au compartiment dans lequel la ligne est classée. Associer `AUTO_BUCKET` à `STATS... BY` pour créer un histogramme des dates.\n\nIndiquez un nombre cible de compartiments, une date de début et une date de fin, et le système choisit une taille de compartiment appropriée afin de générer le nombre cible de compartiments ou moins. Par exemple, cette fonction demande un maximum de 20 compartiments sur une année entière, permettant de sélectionner des compartiments mensuels :\n\n```\nROW date=TO_DATETIME(\"1985-07-09T00:00:00.000Z\")\n| EVAL bucket=AUTO_BUCKET(date, 20, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n```\n\nRenvoi :\n```\n1985-07-09T00:00:00.000Z | 1985-07-01T00:00:00.000Z\n```\n\nL'objectif n'est pas de fournir le nombre cible *exact* de compartiments, mais de choisir\nune fourchette avec laquelle chacun se sent à l'aise et qui fournit au maximum le nombre cible de\ncompartiments.\n\nSi vous demandez plus de compartiments, `AUTO_BUCKET` peut choisir une fourchette moins élevée. Par exemple,\nsi vous demandez un maximum de 100 compartiments par an, vous obtiendrez des compartiments d'une semaine :\n\n```\nROW date=TO_DATETIME(\"1985-07-09T00:00:00.000Z\")\n| EVAL bucket=AUTO_BUCKET(date, 100, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n```\n\nRenvoi :\n```\n1985-07-09T00:00:00.000Z | 1985-07-08T00:00:00.000Z\n```\n\n`AUTO_BUCKET` ne filtre aucune ligne. Il n'utilise que la plage temporelle fournie pour choisir une taille de compartiment appropriée. Pour les lignes dont la date se situe en dehors de la plage, il renvoie une date qui correspond à un compartiment situé en dehors de la plage. Associez `AUTO_BUCKET` à `WHERE` pour filtrer les lignes.\n\nVoici un exemple plus exhaustif :\n\n```\nFROM employees\n| WHERE hire_date >= \"1985-01-01T00:00:00Z\" AND hire_date < \"1986-01-01T00:00:00Z\"\n| EVAL bucket = AUTO_BUCKET(hire_date, 20, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n| STATS AVG(salary) BY bucket\n| SORT bucket\n```\n\nRenvoi :\n```\n46305.0 | 1985-02-01T00:00:00.000Z\n44817.0 | 1985-05-01T00:00:00.000Z\n62405.0 | 1985-07-01T00:00:00.000Z\n49095.0 | 1985-09-01T00:00:00.000Z\n51532.0 | 1985-10-01T00:00:00.000Z\n54539.75 | 1985-11-01T00:00:00.000\n```\n\nREMARQUE : `AUTO_BUCKET` ne crée pas de compartiments qui ne correspondent à aucun document. C'est pourquoi, dans l'exemple ci-dessus, il manque 1985-03-01 ainsi que d'autres dates.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.avgFunction.markdown": "### AVG\nLa moyenne d'un champ numérique.\n\n```\nFROM employees\n| STATS AVG(height)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.binaryOperators.markdown": "### Opérateurs binaires\nLes opérateurs de comparaison binaire suivants sont pris en charge :\n\n* égalité : `==`\n* inégalité : `!=`\n* inférieur à : `<`\n* inférieur ou égal à : `<=`\n* supérieur à : `>`\n* supérieur ou égal à : `>=`\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.autoBucketFunction.markdown": "### AUTO_BUCKET\nCrée des compartiments ergonomiques et renvoie une valeur `datetime` pour chaque ligne qui correspond au compartiment dans lequel la ligne est classée. Associer `AUTO_BUCKET` à \"=`STATS... BY` pour créer un histogramme des dates.\n\nIndiquez un nombre cible de compartiments, une date de début et une date de fin, et le système choisit une taille de compartiment appropriée afin de générer le nombre cible de compartiments ou moins. Par exemple, cette fonction demande un maximum de 20 compartiments sur une année entière, permettant de sélectionner des compartiments mensuels :\n\n```\nROW date=TO_DATETIME(\"1985-07-09T00:00:00.000Z\")\n| EVAL bucket=AUTO_BUCKET(date, 20, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n```\n\nRenvoi :\n```\n1985-07-09T00:00:00.000Z | 1985-07-01T00:00:00.000Z\n```\n\nL'objectif n'est pas de fournir le nombre cible *exact* de compartiments, mais de choisir\nune fourchette avec laquelle chacun se sent à l'aise et qui fournit au maximum le nombre cible de\ncompartiments.\n\nSi vous demandez plus de compartiments, `AUTO_BUCKET` peut choisir une fourchette moins élevée. Par exemple,\nsi vous demandez un maximum de 100 compartiments par an, vous obtiendrez des compartiments d'une semaine :\n\n```\nROW date=TO_DATETIME(\"1985-07-09T00:00:00.000Z\")\n| EVAL bucket=AUTO_BUCKET(date, 100, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n```\n\nRenvoi :\n```\n1985-07-09T00:00:00.000Z | 1985-07-08T00:00:00.000Z\n```\n\n`AUTO_BUCKET` ne filtre aucune ligne. Il n'utilise que la plage temporelle fournie pour choisir une taille de compartiment appropriée. Pour les lignes dont la date se situe en dehors de la plage, il renvoie une date qui correspond à un compartiment situé en dehors de la plage. Associez `AUTO_BUCKET` à `WHERE` pour filtrer les lignes.\n\nVoici un exemple plus exhaustif :\n\n```\nFROM employees\n| WHERE hire_date >= \"1985-01-01T00:00:00Z\" AND hire_date < \"1986-01-01T00:00:00Z\"\n| EVAL bucket = AUTO_BUCKET(hire_date, 20, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n| STATS AVG(salary) BY bucket\n| SORT bucket\n```\n\nRenvoi :\n```\n46305.0 | 1985-02-01T00:00:00.000Z\n44817.0 | 1985-05-01T00:00:00.000Z\n62405.0 | 1985-07-01T00:00:00.000Z\n49095.0 | 1985-09-01T00:00:00.000Z\n51532.0 | 1985-10-01T00:00:00.000Z\n54539.75 | 1985-11-01T00:00:00.000\n```\n\nREMARQUE : `AUTO_BUCKET` ne crée pas de compartiments qui ne correspondent à aucun document. C'est pourquoi, dans l'exemple ci-dessus, il manque 1985-03-01 ainsi que d'autres dates.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.avgFunction.markdown": "### AVG\nRenvoie la moyenne d'un champ numérique.\n\n````\nFROM employees\n| STATS AVG(height)\n````\n\nCette expression peut utiliser des fonctions alignées. Par exemple, pour calculer la moyenne sur une colonne multivaluée, il faut d'abord utiliser`MV_AVG` pour faire la moyenne des multiples valeurs par ligne et utiliser le résultat avec la fonction `AVG` :\n\n````\nFROM employees\n| STATS avg_salary_change = AVG(MV_AVG(salary_change))\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.binaryOperators.markdown": "### Opérateurs binaires\nLes opérateurs de comparaison binaire suivants sont pris en charge :\n\n* égalité : `==`\n* inégalité insensible à la casse `=~`\n* inégalité : `!=`\n* inférieur à : `<`\n* inférieur ou égal à : `<=`\n* supérieur à : `>`\n* supérieur ou égal à : `>=`\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.booleanOperators.markdown": "### Opérateurs booléens\nLes opérateurs booléens suivants sont pris en charge :\n\n* `AND`\n* `OR`\n* `NOT`\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.caseFunction.markdown": "### CASE\nAccepte des paires de conditions et de valeurs. La fonction renvoie la valeur correspondant à la première condition évaluée à `true`. 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.\n\n```\nFROM employees\n| EVAL type = CASE(\n languages <= 1, \"monolingual\",\n languages <= 2, \"bilingual\",\n \"polyglot\")\n| KEEP first_name, last_name, type\n```\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.caseFunction.markdown": "### CASE\nAccepte des 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.\n\n```\nFROM employees\n| EVAL type = CASE(\n languages <= 1, \"monolingual\",\n languages <= 2, \"bilingual\",\n \"polyglot\")\n| KEEP first_name, last_name, type\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.ceilFunction.markdown": "### CEIL\nArrondir un nombre à l'entier supérieur.\n\n```\nROW a=1.8\n| EVAL a=CEIL(a)\n```\n\nRemarque : Il s'agit d'un noop pour `long` (y compris non signé) et `integer`. Pour `double`, la fonction choisit la valeur `double` la plus proche de l'entier, de manière similaire à la méthode `Math.ceil` de Java.\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.cidrMatchFunction.markdown": "### CIDR_MATCH\nRenvoie `true` si l'IP fournie est contenue dans l'un des blocs CIDR fournis. \n\nLa fonction `CIDR_MATCH` accepte deux arguments ou plus. Le premier argument est l'adresse IP de type `ip` (les adresses IPv4 et IPv6 sont prises en charge). Les arguments suivants correspondent aux blocs CIDR pour tester l'adresse IP.\n\n```\nFROM hosts\n| WHERE CIDR_MATCH(ip, \"127.0.0.2/32\", \"127.0.0.3/32\")\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.coalesceFunction.markdown": "### COALESCE\nRenvoie la première valeur non nulle.\n\n```\nROW a=null, b=\"b\"\n| EVAL COALESCE(a, b)\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.concatFunction.markdown": "### CONCAT\nConcatène deux ou plusieurs chaînes.\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL fullname = CONCAT(first_name, \" \", last_name)\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.cosFunction.markdown": "### COS\nFonction trigonométrique cosinus.\n\n```\nROW a=1.8\n| EVAL cos=COS(a)\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.coshFunction.markdown": "### COSH\nFonction hyperbolique cosinus.\n\n```\nROW a=1.8\n| EVAL cosh=COSH(a)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.countDistinctFunction.markdown": "### COUNT_DISTINCT\n Nombre approximatif de valeurs distinctes.\n\n ```\n FROM hosts\n | STATS COUNT_DISTINCT(ip0), COUNT_DISTINCT(ip1)\n ```\n\n La fonction `COUNT_DISTINCT` est approximative, basée sur l'algorithme HyperLogLog++. Pour en savoir plus, consultez la [documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html#_counts_are_approximate). La précision est configurable à l'aide d'un second paramètre facultatif :\n\n ```\n FROM hosts\n | STATS COUNT_DISTINCT(ip0, 80000), COUNT_DISTINCT(ip1, 5)\n ```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.countFunction.markdown": "### COUNT\nComptabilise les valeurs des champs.\n\n```\nFROM employees\n| STATS COUNT(height)\n```\n\nAccepte n'importe quel type de champ en tant qu'entrée ; le résultat sera toujours `long` quel que soit le type d'entrée.\n\nREMARQUE : Il n'existe pas encore de `COUNT(*)`. Veuillez comptabiliser un champ à valeur unique si vous souhaitez obtenir un nombre de lignes.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateExtractFunction.markdown": "### DATE_EXTRACT\nExtrait 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` de Java.\n\n```\nROW date = DATE_PARSE(\"2022-05-06\", \"yyyy-MM-dd\")\n| EVAL year = DATE_EXTRACT(date, \"year\")\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateFormatFunction.markdown": "### DATE_FORMAT\nRenvoie 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é.\n\n```\nFROM employees\n| KEEP first_name, last_name, hire_date\n| EVAL hired = DATE_FORMAT(hire_date, \"YYYY-MM-dd\")\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateParseFunction.markdown": "### DATE_PARSE\nConvertit une chaîne en date, dans le format fourni. Si aucun format n'est indiqué, le format `yyyy-MM-dd'T'HH:mm:ss.SSSZ` est utilisé.\n\n```\nROW date_string = \"2022-05-06\"\n| EVAL date = DATE_PARSE(date_string, \"yyyy-MM-dd\")\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateTruncFunction.markdown": "### DATE_TRUNC\nArrondit une date à l'intervalle le plus proche.\n\n```\nFROM employees\n| EVAL year_hired = DATE_TRUNC(hire_date, 1 year)\n| STATS count(emp_no) BY year_hired\n| SORT year_hired\n```\n\nLes intervalles peuvent être exprimés à l'aide de la syntaxe littérale timespan. Les littéraux au format timespan sont représentés par une combinaison d'un nombre et d'un qualificatif. Les qualificatifs suivants sont pris en charge :\n\n* `millisecond`/`milliseconds`\n* `second`/`seconds`\n* `minute`/`minutes`\n* `hour`/`hours`\n* `day`/`days`\n* `week`/`weeks`\n* `month`/`months`\n* `year`/`years`\n\nLes littéraux au format timespan ne sont pas sensibles à l'espacement. Les expressions suivantes sont toutes valides :\n\n* `1day`\n* `1 day`\n* `1      day`\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dissect.markdown": "### DISSECT\n`DISSECT` vous permet d'extraire des données structurées d'une chaîne. `DISSECT` compare la chaîne à un modèle basé sur les délimiteurs, et extrait les clés indiquées en tant que colonnes.\n\nPour obtenir la syntaxe des modèles `dissect`, consultez [la documentation relative au processeur `dissect`](https://www.elastic.co/guide/en/elasticsearch/reference/current/dissect-processor.html).\n\n```\nROW a = \"1953-01-23T12:15:00Z - some text - 127.0.0.1\"\n| DISSECT a \"%\\{Y\\}-%\\{M\\}-%\\{D\\}T%\\{h\\}:%\\{m\\}:%\\{s\\}Z - %\\{msg\\} - %\\{ip\\}\"\n```\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.countDistinctFunction.markdown": "### COUNT_DISTINCT\nDécompte le nombre approximatif de valeurs distinctes.\n\n````\nFROM hosts\n| STATS COUNT_DISTINCT(ip0), COUNT_DISTINCT(ip1)\n```\n\nLa fonction `COUNT_DISTINCT` est approximative, basée sur l'algorithme HyperLogLog++. Pour en savoir plus, consultez la [documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html#_counts_are_approximate). La précision est configurable à l'aide d'un deuxième paramètre facultatif. La valeur maximale compatible est 40000. Les seuils supérieurs à ce nombre auront le même effet qu'un seuil de 40000. La valeur par défaut est 3000.\n\n````\nFROM hosts\n| STATS COUNT_DISTINCT(ip0, 80000), COUNT_DISTINCT(ip1, 5)\n````\n\nCette expression peut utiliser des fonctions alignées. Cet exemple divise une chaîne en plusieurs valeurs à l'aide de la fonction `SPLIT` et compte les valeurs uniques :\n\n````\nROW words=\"foo;bar;baz;qux;quux;foo\"\n| STATS distinct_word_count = COUNT_DISTINCT(SPLIT(words, \";\"))\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.countFunction.markdown": "### COUNT\nRenvoie le nombre total de valeurs en entrée.\n\n````\nFROM employees\n| STATS COUNT(height)\n````\n\nPeut prendre n'importe quel type de champ en entrée.\n\nPour compter le nombre de lignes, utiliser `COUNT()` ou `COUNT(*)` :\n\n````\nFROM employees\n| STATS count = COUNT(*) BY languages\n| SORT languages DESC\n````\n\nCette expression peut utiliser des fonctions alignées. Cet exemple divise une chaîne en plusieurs valeurs à l'aide de la fonction `SPLIT` et compte les valeurs :\n\n````\nROW words=\"foo;bar;baz;qux;quux;foo\"\n| STATS word_count = COUNT(SPLIT(words, \";\"))\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateDiffFunction.markdown": "### DATE_DIFF\nSoustrait le `startTimestamp` du `endTimestamp` et renvoie la différence en multiples d'unité. Si `startTimestamp` est postérieur à `endTimestamp`, des valeurs négatives sont renvoyées.\n \n````\nROW date1 = TO_DATETIME(\"2023-12-02T11:00:00.000Z\"), date2 = TO_DATETIME(\"2023-12-02T11:00:00.001Z\")\n| EVAL dd_ms = DATE_DIFF(\"microseconds\", date1, date2)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateExtractFunction.markdown": "### DATE_EXTRACT\nExtrait 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` de Java.\n\n```\nROW date = DATE_PARSE(\"yyyy-MM-dd\", \"2022-05-06\")\n| EVAL year = DATE_EXTRACT(\"year\", date)\n````\n\nPar exemple, pour trouver tous les événements qui ont eu lieu en dehors des heures de bureau (avant 9 h et après 17 h) à une date donnée :\n\n````\nFROM sample_data\n| WHERE DATE_EXTRACT(\"hour_of_day\", @timestamp) < 9 AND DATE_EXTRACT(\"hour_of_day\", @timestamp) >= 17\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateFormatFunction.markdown": "### DATE_FORMAT\nRenvoie 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é.\n\n```\nFROM employees\n| KEEP first_name, last_name, hire_date\n| EVAL hired = DATE_FORMAT(\"YYYY-MM-dd\", hire_date)\n```\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateParseFunction.markdown": "### DATE_PARSE\nRenvoie une date en analysant le deuxième argument selon le format spécifié dans le premier argument. Si aucun format n'est indiqué, le format `yyyy-MM-dd'T'HH:mm:ss.SSSZ` est utilisé.\nVeuillez vous référer à la documentation [`DateTimeFormatter` ](https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/time/format/DateTimeFormatter.html) pour la syntaxe.\n````\nROW date_string = \"2022-05-06\"\n| EVAL date = DATE_PARSE(\"yyyy-MM-dd\", date_string)\n```\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateTruncFunction.markdown": "### DATE_TRUNC\nArrondit une date à l'intervalle le plus proche.\n\n```\nFROM employees\n| EVAL year_hired = DATE_TRUNC(1 year, hire_date)\n| STATS count(emp_no) BY year_hired\n| SORT year_hired\n```\n\nLes intervalles peuvent être exprimés à l'aide de la syntaxe littérale timespan. Les littéraux au format timespan sont représentés par une combinaison d'un nombre et d'un qualificatif. Les qualificatifs suivants sont pris en charge :\n\n* `millisecond`/`milliseconds`\n* `second`/`seconds`\n* `minute`/`minutes`\n* `hour`/`hours`\n* `day`/`days`\n* `week`/`weeks`\n* `month`/`months`\n* `year`/`years`\n\nLes littéraux au format timespan ne sont pas sensibles à l'espacement. Les expressions suivantes sont toutes valides :\n\n* `1day`\n* `1 day`\n* `1 day`\n\nCombiner `DATE_TRUNC` avec `STATS ... BY` pour créer des histogrammes des dates. Par exemple, pour renvoyer le nombre d'embauches par an :\n\n````\nFROM employees\n| EVAL year = DATE_TRUNC(1 year, hire_date)\n| STATS hires = COUNT(emp_no) BY year\n| SORT year\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dissect.markdown": "### DISSECT\n`DISSECT` vous permet d'extraire des données structurées d'une chaîne. `DISSECT` compare la chaîne à un modèle basé sur les délimiteurs, et extrait les clés indiquées en tant que colonnes.\n\nPour obtenir la syntaxe des modèles \"dissect\", consultez [la documentation relative au processeur \"dissect\"](https://www.elastic.co/guide/en/elasticsearch/reference/current/dissect-processor.html).\n\n```\nROW a = \"1953-01-23T12:15:00Z - some text - 127.0.0.1\"\n| DISSECT a \"%\\{Y\\}-%\\{M\\}-%\\{D\\}T%\\{h\\}:%\\{m\\}:%\\{s\\}Z - %\\{msg\\} - %\\{ip\\}\"\n```\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.drop.markdown": "### DROP\nAfin de supprimer certaines colonnes d'un tableau, utilisez `DROP` :\n \n```\nFROM employees\n| DROP height\n```\n\nPlutôt que de spécifier chaque colonne par son nom, vous pouvez utiliser des caractères génériques pour supprimer toutes les colonnes dont le nom correspond à un modèle :\n\n```\nFROM employees\n| DROP height*\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.eFunction.markdown": "### E\nNombre d'Euler.\n\n```\nROW E()\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.enrich.markdown": "### ENRICH\nVous pouvez utiliser `ENRICH` pour ajouter les données de vos index existants aux enregistrements entrants. Une fonction similaire à l'[enrichissement par ingestion](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-enriching-data.html), mais qui fonctionne au moment de la requête.\n\n```\nROW language_code = \"1\"\n| ENRICH languages_policy\n```\n\n`ENRICH` requiert l'exécution d'une [politique d'enrichissement](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-enriching-data.html#enrich-policy). La politique d'enrichissement définit un champ de correspondance (un champ clé) et un ensemble de champs d'enrichissement.\n\n`ENRICH` recherche les enregistrements dans l'[index d'enrichissement](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-enriching-data.html#enrich-index) en se basant sur la valeur du champ de correspondance. La clé de correspondance dans l'ensemble de données d'entrée peut être définie en utilisant `ON `. Si elle n'est pas spécifiée, la correspondance sera effectuée sur un champ portant le même nom que le champ de correspondance défini dans la politique d'enrichissement.\n\n```\nROW a = \"1\"\n| ENRICH languages_policy ON a\n```\n\nVous pouvez indiquer quels attributs (parmi ceux définis comme champs d'enrichissement dans la politique) doivent être ajoutés au résultat, en utilisant la syntaxe `WITH , ...`.\n\n```\nROW a = \"1\"\n| ENRICH languages_policy ON a WITH language_name\n```\n\nLes attributs peuvent également être renommés à l'aide de la syntaxe `WITH new_name=`\n\n```\nROW a = \"1\"\n| ENRICH languages_policy ON a WITH name = language_name\n```\n\nPar défaut (si aucun `WITH` n'est défini), `ENRICH` ajoute au résultat tous les champs d'enrichissement définis dans la politique d'enrichissement.\n\nEn cas de collision de noms, les champs nouvellement créés remplacent les champs existants.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.eval.markdown": "### EVAL\n`EVAL` permet d'ajouter des colonnes :\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL height_feet = height * 3.281, height_cm = height * 100\n```\n\nSi la colonne indiquée existe déjà, la colonne existante sera supprimée et la nouvelle colonne sera ajoutée au tableau :\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL height = height * 3.281\n```\n\n#### Fonctions\n`EVAL` prend en charge diverses fonctions de calcul des valeurs. Pour en savoir plus, consultez les fonctions.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.floorFunction.markdown": "### FLOOR\nArrondir un nombre à l'entier inférieur.\n\n```\nROW a=1.8\n| EVAL a=FLOOR(a)\n```\n\nIl s'agit d'un noop pour `long` (y compris non connecté) et `integer`. Pour `double`, la fonction choisit la valeur `double` la plus proche de l'entier, de manière similaire à la méthode `Math.floor` de Java.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.from.markdown": "### FROM\nLa commande source `FROM` renvoie un tableau contenant jusqu'à 10 000 documents issus d'un flux de données, d'un index ou d'un alias. Chaque ligne du tableau obtenu correspond à un document. Chaque colonne correspond à un champ et est accessible par le nom de ce champ.\n\n```\nFROM employees\n```\n\nVous pouvez utiliser des [calculs impliquant des dates](https://www.elastic.co/guide/en/elasticsearch/reference/current/api-conventions.html#api-date-math-index-names) pour désigner les indices, les alias et les flux de données. Cela peut s'avérer utile pour les données temporelles.\n\nUtilisez des listes séparées par des virgules ou des caractères génériques pour rechercher plusieurs flux de données, indices ou alias :\n\n```\nFROM employees-00001,employees-*\n```\n\n#### Métadonnées\n\nES|QL peut accéder aux champs de métadonnées suivants :\n\n* `_index` : l'index auquel appartient le document. Le champ est du type `keyword`.\n* `_id` : l'identifiant du document source. Le champ est du type `keyword`.\n* `_id` : la version du document source. Le champ est du type `long`.\n\nUtilisez la directive `METADATA` pour activer les champs de métadonnées :\n\n```\nFROM index [METADATA _index, _id]\n```\n\nLes champs de métadonnées ne sont disponibles que si la source des données est un index. Par conséquent, `FROM` est la seule commande source qui prend en charge la directive `METADATA`.\n\nUne fois activés, les champs sont disponibles pour les commandes de traitement suivantes, tout comme les autres champs de l'index :\n\n```\nFROM ul_logs, apps [METADATA _index, _version]\n| WHERE id IN (13, 14) AND _version == 1\n| EVAL key = CONCAT(_index, \"_\", TO_STR(id))\n| SORT id, _index\n| KEEP id, _index, _version, key\n```\n\nDe même, comme pour les champs d'index, une fois l'agrégation effectuée, un champ de métadonnées ne sera plus accessible aux commandes suivantes, sauf s'il est utilisé comme champ de regroupement :\n\n```\nFROM employees [METADATA _index, _id]\n| STATS max = MAX(emp_no) BY _index\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.greatestFunction.markdown": "### GREATEST\nRenvoie la valeur maximale de plusieurs colonnes. Cette fonction est similaire à `MV_MAX`. Toutefois, elle est destinée à être exécutée sur plusieurs colonnes à la fois.\n\n```\nROW a = 10, b = 20\n| EVAL g = GREATEST(a, b);\n```\n\nRemarque : lorsque cette fonction est exécutée sur les champs `keyword` ou `text`, elle renvoie la dernière chaîne dans l'ordre alphabétique. Lorsqu'elle est exécutée sur des colonnes `boolean`, elle renvoie `true` si l'une des valeurs l'est.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.grok.markdown": "### GROK\n`GROK` vous permet d'extraire des données structurées d'une chaîne. `GROK` compare la chaîne à des modèles,sur la base d’expressions régulières, et extrait les modèles indiqués en tant que colonnes.\n\nPour obtenir la syntaxe des modèles `grok`, consultez [la documentation relative au processeur `grok`](https://www.elastic.co/guide/en/elasticsearch/reference/current/grok-processor.html).\n\n```\nROW a = \"12 15.5 15.6 true\"\n| GROK a \"%\\{NUMBER:b:int\\} %\\{NUMBER:c:float\\} %\\{NUMBER:d:double\\} %\\{WORD:e:boolean\\}\"\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.inOperator.markdown": "### IN\nL'opérateur `IN` permet de tester si un champ ou une expression est égal à un élément d'une liste de littéraux, de champs ou d'expressions :\n\n```\nROW a = 1, b = 4, c = 3\n| WHERE c-a IN (3, b / 2, a)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.keep.markdown": "### KEEP\nLa commande `KEEP` permet de définir les colonnes qui seront renvoyées et l'ordre dans lequel elles le seront.\n\nPour limiter les colonnes retournées, utilisez une liste de noms de colonnes séparés par des virgules. Les colonnes sont renvoyées dans l'ordre indiqué :\n \n```\nFROM employees\n| KEEP first_name, last_name, height\n```\n\nPlutôt que de spécifier chaque colonne par son nom, vous pouvez utiliser des caractères génériques pour renvoyer toutes les colonnes dont le nom correspond à un modèle :\n\n```\nFROM employees\n| KEEP h*\n```\n\nLe caractère générique de l'astérisque (`*`) placé de manière isolée transpose l'ensemble des colonnes qui ne correspondent pas aux autres arguments. La requête suivante renverra en premier lieu toutes les colonnes dont le nom commence par un h, puis toutes les autres colonnes :\n\n```\nFROM employees\n| KEEP h*, *\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.leastFunction.markdown": "### LEAST\nRenvoie la valeur minimale de plusieurs colonnes. Cette fonction est similaire à `MV_MIN`. Toutefois, elle est destinée à être exécutée sur plusieurs colonnes à la fois.\n\n```\nROW a = 10, b = 20\n| EVAL l = LEAST(a, b)\n```\n\nRemarque : lorsque cette fonction est exécutée sur les champs `keyword` ou `text`, elle renvoie la première chaîne dans l'ordre alphabétique. Lorsqu'elle est exécutée sur des colonnes `boolean`, elle renvoie `false` si l'une des valeurs l'est.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.leftFunction.markdown": "### LEFT\nRenvoie la sous-chaîne qui extrait la longueur des caractères de la chaîne en partant de la gauche.\n\n```\nFROM employees\n| KEEP last_name\n| EVAL left = LEFT(last_name, 3)\n| SORT last_name ASC\n| LIMIT 5\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.lengthFunction.markdown": "### LENGTH\nRenvoie la longueur des caractères d'une chaîne.\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL fn_length = LENGTH(first_name)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.limit.markdown": "### LIMIT\nLa commande de traitement `LIMIT` permet de restreindre le nombre de lignes :\n \n```\nFROM employees\n| LIMIT 5\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.log10Function.markdown": "### LOG10\nRenvoie le log de base 10. La valeur de renvoi est toujours un double, quelle que soit la valeur numérique de l'entrée.\n\nLes logs des nombres négatifs affichent une valeur NaN. Les logs des infinis et de 0 sont infinis.\n\n```\nROW d = 1000.0\n| EVAL s = LOG10(d)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.ltrimFunction.markdown": "### LTRIM\nRetire les espaces au début des chaînes.\n\n```\nROW message = \" some text \", color = \" red \"\n| EVAL message = LTRIM(message)\n| EVAL color = LTRIM(color)\n| EVAL message = CONCAT(\"'\", message, \"'\")\n| EVAL color = CONCAT(\"'\", color, \"'\")\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.markdown": "## ES|QL\n\nUne requête ES|QL (langage de requête Elasticsearch) se compose d'une série de commandes, séparées par une barre verticale : `|`. Chaque requête commence par une **commande source**, qui produit un tableau, habituellement avec des données issues d'Elasticsearch. \n\nUne commande source peut être suivie d'une ou plusieurs **commandes de traitement**. Les commandes de traitement peuvent modifier le tableau de sortie de la commande précédente en ajoutant, supprimant et modifiant les lignes et les colonnes.\n\n```\nsource-command\n| processing-command1\n| processing-command2\n```\n\nLe résultat d'une requête est le tableau produit par la dernière commande de traitement. \n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.maxFunction.markdown": "### MAX\nValeur maximale d'un champ numérique.\n\n```\nFROM employees\n| STATS MAX(languages)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.medianAbsoluteDeviationFunction.markdown": "### MEDIAN_ABSOLUTE_DEVIATION\nÉcart absolu médian, une mesure de la variabilité. Il s'agit d'un indicateur robuste, ce qui signifie qu'il est utile pour décrire des données qui peuvent présenter des valeurs aberrantes ou ne pas être normalement distribuées. Pour de telles données, il peut être plus descriptif que l'écart type.\n\nIl est calculé comme la médiane de chaque écart de point de données par rapport à la médiane de l'ensemble de l'échantillon. Autrement dit, pour une variable aléatoire X, l'écart absolu médian est `médian(|médian(X) - Xi|)`.\n\n```\nFROM employees\n| STATS MEDIAN(salary), MEDIAN_ABSOLUTE_DEVIATION(salary)\n```\n\nREMARQUE : Comme la fonction `PERCENTILE`, la fonction `MEDIAN_ABSOLUTE_DEVIATION` est généralement approximative, et basée sur l'algorithme TDigest. Elle est également non déterministe. Cela signifie que vous pouvez obtenir des résultats légèrement différents en utilisant les mêmes données.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.medianFunction.markdown": "### MEDIAN\nLa médiane est la valeur qui est supérieure à la moitié de toutes les valeurs et inférieure à la moitié de toutes les valeurs, également connue sous le nom de percentile 50.\n\n```\nFROM employees\n| STATS MEDIAN(salary)\n```\n\nREMARQUE : Comme la fonction `PERCENTILE`, la fonction `MEDIAN` est généralement approximative, et basée sur l'algorithme TDigest. Elle est également non déterministe. Cela signifie que vous pouvez obtenir des résultats légèrement différents en utilisant les mêmes données.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.minFunction.markdown": "### MIN\nValeur minimale d'un champ numérique.\n\n```\nFROM employees\n| STATS MIN(languages)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvAvgFunction.markdown": "### MV_AVG\nConvertit un champ multivalué en un champ à valeur unique comprenant la moyenne de toutes les valeurs. Par exemple :\n\n```\nROW a=[3, 5, 1, 6]\n| EVAL avg_a = MV_AVG(a)\n```\n\nRenvoi :\n\n```\n[3, 5, 1, 6] | 3.75\n```\n\nREMARQUE : Le type de sortie est toujours un double et le type d'entrée peut être n'importe quel nombre.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvConcatFunction.markdown": "### MV_CONCAT\nConvertit 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 :\n\n```\nROW a=[\"foo\", \"zoo\", \"bar\"]\n| EVAL j = MV_CONCAT(a, \", \")\n```\n\nRenvoi :\n\n```\n[\"foo\", \"zoo\", \"bar\"] | \"foo, zoo, bar\"\n```\n\nSi vous voulez lier des champs qui ne sont pas des chaînes, appelez en premier lieu `TO_STRING` sur ces champs :\n\n```\nROW a=[10, 9, 8]\n| EVAL j = MV_CONCAT(TO_STRING(a), \", \")\n```\n\nRenvoi :\n\n```\n[10, 9, 8] | \"10, 9, 8\"\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvCountFunction.markdown": "### MV_COUNT\nConvertit un champ multivalué en un champ à valeur unique comprenant un décompte du nombre de valeurs :\n\n```\nROW a=[\"foo\", \"zoo\", \"bar\"]\n| EVAL count_a = MV_COUNT(a)\n```\n\nRenvoi :\n\n```\n[\"foo\", \"zoo\", \"bar\"] | 3\n```\n\nREMARQUE : Cette fonction accepte tous les types de valeurs et renvoie toujours un nombre entier.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvDedupeFunction.markdown": "### MV_DEDUPE\nSupprime les doublons d'un champ multivalué. Par exemple :\n\n```\nROW a=[\"foo\", \"foo\", \"bar\", \"foo\"]\n| EVAL dedupe_a = MV_DEDUPE(a)\n```\n\nRenvoi :\n\n```\n[\"foo\", \"foo\", \"bar\", \"foo\"] | [\"foo\", \"bar\"]\n```\n\nREMARQUE : la fonction `MV_DEDUPE` est en mesure de trier les valeurs du champ, mais ne le fait pas systématiquement.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvExpand.markdown": "### MV_EXPAND\nLa commande de traitement `MV_EXPAND` développe les champs multivalués en indiquant une valeur par ligne et en dupliquant les autres champs : \n```\nROW a=[1,2,3], b=\"b\", j=[\"a\",\"b\"]\n| MV_EXPAND a\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvMaxFunction.markdown": "### MV_MAX\nConvertit un champ multivalué en un champ à valeur unique comprenant la valeur maximale. Par exemple :\n\n```\nROW a=[3, 5, 1]\n| EVAL max_a = MV_MAX(a)\n```\n\nRenvoi :\n\n```\n[3, 5, 1] | 5\n```\n\nElle peut être utilisée par n'importe quel type de champ, y compris les champs de type `keyword`. Dans ce cas, elle choisit la dernière chaîne, en comparant leur représentation utf-8 octet par octet :\n\n```\nROW a=[\"foo\", \"zoo\", \"bar\"]\n| EVAL max_a = MV_MAX(a)\n```\n\nRenvoi :\n\n```\n[\"foo\", \"zoo\", \"bar\"] | \"zoo\"\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvMedianFunction.markdown": "### MV_MEDIAN\nConvertit un champ multivalué en un champ à valeur unique comprenant la valeur médiane. Par exemple :\n\n```\nROW a=[3, 5, 1]\n| EVAL median_a = MV_MEDIAN(a)\n```\n\nRenvoi :\n\n```\n[3, 5, 1] | 3\n```\n\nElle peut être utilisée par n'importe quel type de champ numérique et renvoie une valeur du même type. Si la ligne comprend un nombre pair de valeurs pour une colonne, le résultat sera la moyenne des deux entrées du milieu. Si le champ n'inclut pas une valeur en virgule flottante, la moyenne est arrondie à la valeur **inférieure** :\n\n```\nROW a=[3, 7, 1, 6]\n| EVAL median_a = MV_MEDIAN(a)\n```\n\nRenvoi :\n\n```\n[3, 7, 1, 6] | 4\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvMinFunction.markdown": "### MV_MIN\nConvertit un champ multivalué en un champ à valeur unique comprenant la valeur minimale. Par exemple :\n\n```\nROW a=[2, 1]\n| EVAL min_a = MV_MIN(a)\n```\n\nRenvoi :\n\n```\n[2, 1] | 1\n```\n\nElle peut être utilisée par n'importe quel type de champ, y compris les champs de type `keyword`. Dans ce cas, elle choisit la dernière chaîne, en comparant leur représentation utf-8 octet par octet :\n\n```\nROW a=[\"foo\", \"bar\"]\n| EVAL min_a = MV_MIN(a)\n```\n\nRenvoi :\n\n```\n[\"foo\", \"bar\"] | \"bar\"\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvSumFunction.markdown": "### MV_SUM\nConvertit un champ multivalué en un champ à valeur unique comprenant la somme de toutes les valeurs. Par exemple :\n```\nROW a=[3, 5, 6]\n| EVAL sum_a = MV_SUM(a)\n```\n\nRenvoi :\n\n```\n[3, 5, 6] | 14\n```\n\nREMARQUE : Le type d'entrée peut être n'importe quel nombre et le type de sortie est identique au type d'entrée.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.nowFunction.markdown": "### NOW\nRenvoie la date et l'heure actuelles.\n\n```\nROW current_date = NOW()\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.percentileFunction.markdown": "### PERCENTILE\nValeur à laquelle un certain pourcentage des valeurs observées se produit. Par exemple, le 95e percentile est la valeur qui est supérieure à 95 % des valeurs observées et le 50percentile est la médiane (`MEDIAN`).\n\n```\nFROM employees\n| STATS p0 = PERCENTILE(salary, 0)\n , p50 = PERCENTILE(salary, 50)\n , p99 = PERCENTILE(salary, 99)\n```\n\nREMARQUE : la fonction `PERCENTILE` est généralement approximative, et basée sur l'algorithme TDigest. Elle est également non déterministe. Cela signifie que vous pouvez obtenir des résultats légèrement différents en utilisant les mêmes données.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.piFunction.markdown": "### PI\nRapport entre la circonférence et le diamètre d'un cercle.\n\n```\nROW PI()\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.powFunction.markdown": "### POW\nRenvoie la valeur d'une base (premier argument) élevée à une puissance (deuxième argument). Les deux arguments doivent être numériques.\n\n```\nROW base = 2.0, exponent = 2.0 \n| EVAL s = POW(base, exponent)\n```\n\n#### Règles de type\n\nLe type de la valeur renvoyée est défini par les types de la base et de l'exposant. Les règles suivantes sont appliquées pour définir le type du résultat :\n\n* Si la base ou l'exposant sont de type virgule flottante, le résultat sera un double\n* Si la base ou l'exposant sont de type 64 bits (long ou long non signé), le résultat sera un long\n* Sinon, le résultat sera un entier de 32 bits (cela couvre tous les autres types numériques, y compris `int`, `short` et `byte`).\n\nPar exemple, l'utilisation d'entiers simples en tant qu'arguments conduira à un résultat entier :\n\n```\nROW base = 2, exponent = 2\n| EVAL s = POW(base, exponent)\n```\n\nRemarque : la fonction de puissance réelle est exécutée à l'aide de valeurs à double précision dans tous les cas. Cela signifie que pour les valeurs très élevées à virgule fixe, le risque que l'opération conduise à des réponses légèrement différentes de celles attendues est faible. Cependant, le résultat le plus probable pour des valeurs très élevées en virgule flottante est un dépassement numérique.\n\n#### Erreurs arithmétiques\n\nLes erreurs arithmétiques et les dépassements numériques n'entraînent pas d'erreur. Au lieu de cela, le résultat sera `null`, et un avertissement pour l'exception `ArithmeticException` sera ajouté. Par exemple :\n\n```\nROW x = POW(9223372036854775808, 2)\n```\n\nAfin de se protéger contre les dépassements numériques, utilisez la fonction `TO_DOUBLE` sur l'un ou l'autre des arguments :\n\n```\nROW x = POW(9223372036854775808, TO_DOUBLE(1))\n```\n\n#### Exposants fractionnaires\n\nL'exposant peut être un nombre fractionnaire, ce qui revient à effectuer une racine. Par exemple, l'exposant de 0,5 donnera la racine carrée de la base :\n\n```\nROW base = 4, exponent = 0.5\n| EVAL s = POW(base, exponent)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.predicates.markdown": "### Valeurs NULL\nPour une comparaison avec une valeur NULL, utilisez les attributs `IS NULL` et `IS NOT NULL` :\n\n```\nFROM employees\n| WHERE birth_date IS NULL\n| KEEP first_name, last_name\n| SORT first_name\n| LIMIT 3\n```\n\n```\nFROM employees\n| WHERE is_rehired IS NOT NULL\n| STATS count(emp_no)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.rename.markdown": "### RENAME\nUtilisez `RENAME` pour renommer une colonne en utilisant la syntaxe suivante :\n\n```\nRENAME AS \n```\n\nPar exemple :\n\n```\nFROM employees\n| KEEP first_name, last_name, still_hired\n| RENAME still_hired AS employed\n```\n\nSi une colonne portant le nouveau nom existe déjà, elle sera remplacée par la nouvelle colonne.\n\nPlusieurs colonnes peuvent être renommées à l'aide d'une seule commande `RENAME` :\n\n```\nFROM employees\n| KEEP first_name, last_name\n| RENAME first_name AS fn, last_name AS ln\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.rightFunction.markdown": "### RIGHT\nRenvoie la sous-chaîne qui extrait la longueur (`length`) des caractères de la chaîne en partant de la droite (`right`).\n\n```\nFROM employees\n| KEEP last_name\n| EVAL right = RIGHT(last_name, 3)\n| SORT last_name ASC\n| LIMIT 5\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.roundFunction.markdown": "### ROUND\nArrondit un nombre à un certain nombre de décimales spécifié. Si le nombre de décimales n'est pas spécifié, la fonction arrondit par défaut au nombre entier le plus proche. Si le nombre de décimales spécifié est négatif, la fonction arrondit au nombre de décimales à gauche de la virgule.\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL height = ROUND(height * 3.281, 1)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.row.markdown": "### ROW\nLa commande source `ROW` 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.\n \n```\nROW a = 1, b = \"two\", c = null\n```\n\nUtilisez des crochets pour créer des colonnes à valeurs multiples :\n\n```\nROW a = [2, 1]\n```\n\nROW permet d'utiliser des fonctions :\n\n```\nROW a = ROUND(1.23, 0)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.rtrimFunction.markdown": "### RTRIM\nSupprime les espaces à la fin des chaînes.\n\n```\nROW message = \" some text \", color = \" red \"\n| EVAL message = RTRIM(message)\n| EVAL color = RTRIM(color)\n| EVAL message = CONCAT(\"'\", message, \"'\")\n| EVAL color = CONCAT(\"'\", color, \"'\")\n```\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.eFunction.markdown": "### E\nNombre d'Euler.\n\n```\nROW E()\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.endsWithFunction.markdown": "### ENDS_WITH\nRenvoie un booléen qui indique si une chaîne de mots-clés débute par une autre chaîne :\n\n````\nFROM employees\n| KEEP last_name\n| EVAL ln_E = ENDS_WITH(last_name, \"d\")\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.enrich.markdown": "### ENRICH\nVous pouvez utiliser `ENRICH` pour ajouter les données de vos index existants aux enregistrements entrants. Une fonction similaire à l'[enrichissement par ingestion](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-enriching-data.html), mais qui fonctionne au moment de la requête.\n\n```\nROW language_code = \"1\"\n| ENRICH languages_policy\n```\n\n`ENRICH` requiert l'exécution d'une [politique d'enrichissement](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-enriching-data.html#enrich-policy). La politique d'enrichissement définit un champ de correspondance (un champ clé) et un ensemble de champs d'enrichissement.\n\n`ENRICH` recherche les enregistrements dans l'[index d'enrichissement](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-enriching-data.html#enrich-index) en se basant sur la valeur du champ de correspondance. La clé de correspondance dans l'ensemble de données d'entrée peut être définie en utilisant `ON `. Si elle n'est pas spécifiée, la correspondance sera effectuée sur un champ portant le même nom que le champ de correspondance défini dans la politique d'enrichissement.\n\n```\nROW a = \"1\"\n| ENRICH languages_policy ON a\n```\n\nVous pouvez indiquer quels attributs (parmi ceux définis comme champs d'enrichissement dans la politique) doivent être ajoutés au résultat, en utilisant la syntaxe `WITH , ...`.\n\n```\nROW a = \"1\"\n| ENRICH languages_policy ON a WITH language_name\n```\n\nLes attributs peuvent également être renommés à l'aide de la syntaxe `WITH new_name=`\n\n```\nROW a = \"1\"\n| ENRICH languages_policy ON a WITH name = language_name\n````\n\nPar défaut (si aucun `WITH` n'est défini), `ENRICH` ajoute au résultat tous les champs d'enrichissement définis dans la politique d'enrichissement.\n\nEn cas de collision de noms, les champs nouvellement créés remplacent les champs existants.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.eval.markdown": "### EVAL\n`EVAL` permet d'ajouter des colonnes :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL height_feet = height * 3.281, height_cm = height * 100\n````\n\nSi la colonne indiquée existe déjà, la colonne existante sera supprimée et la nouvelle colonne sera ajoutée au tableau :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL height = height * 3.281\n````\n\n#### Fonctions\n`EVAL` prend en charge diverses fonctions de calcul des valeurs. Pour en savoir plus, consultez les fonctions.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.floorFunction.markdown": "### FLOOR\nArrondir un nombre à l'entier inférieur.\n\n````\nROW a=1.8\n| EVAL a=FLOOR(a)\n````\n\nIl s'agit d'un noop pour `long` (y compris non connecté) et `integer`. Pour `double`, la fonction choisit la valeur `double` la plus proche de l'entier, de manière similaire à la méthode `Math.floor` de Java.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.from.markdown": "### FROM\nLa commande source `FROM` renvoie un tableau contenant jusqu'à 10 000 documents issus d'un flux de données, d'un index ou d'un alias. Chaque ligne du tableau obtenu correspond à un document. Chaque colonne correspond à un champ et est accessible par le nom de ce champ.\n\n````\nFROM employees\n````\n\nVous pouvez utiliser des [calculs impliquant des dates](https://www.elastic.co/guide/en/elasticsearch/reference/current/api-conventions.html#api-date-math-index-names) pour désigner les indices, les alias et les flux de données. Cela peut s'avérer utile pour les données temporelles.\n\nUtilisez des listes séparées par des virgules ou des caractères génériques pour rechercher plusieurs flux de données, indices ou alias :\n\n````\nFROM employees-00001,employees-*\n````\n\n#### Métadonnées\n\nES|QL peut accéder aux champs de métadonnées suivants :\n\n* `_index` : l'index auquel appartient le document. Le champ est du type `keyword`.\n* `_id` : l'identifiant du document source. Le champ est du type `keyword`.\n* `_id` : la version du document source. Le champ est du type `long`.\n\nUtilisez la directive `METADATA` pour activer les champs de métadonnées :\n\n````\nFROM index [METADATA _index, _id]\n````\n\nLes champs de métadonnées ne sont disponibles que si la source des données est un index. Par conséquent, `FROM` est la seule commande source qui prend en charge la directive `METADATA`.\n\nUne fois activés, les champs sont disponibles pour les commandes de traitement suivantes, tout comme les autres champs de l'index :\n\n````\nFROM ul_logs, apps [METADATA _index, _version]\n| WHERE id IN (13, 14) AND _version == 1\n| EVAL key = CONCAT(_index, \"_\", TO_STR(id))\n| SORT id, _index\n| KEEP id, _index, _version, key\n````\n\nDe même, comme pour les champs d'index, une fois l'agrégation effectuée, un champ de métadonnées ne sera plus accessible aux commandes suivantes, sauf s'il est utilisé comme champ de regroupement :\n\n````\nFROM employees [METADATA _index, _id]\n| STATS max = MAX(emp_no) BY _index\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.greatestFunction.markdown": "### GREATEST\nRenvoie la valeur maximale de plusieurs colonnes. Cette fonction est similaire à `MV_MAX`. Toutefois, elle est destinée à être exécutée sur plusieurs colonnes à la fois.\n\n````\nROW a = 10, b = 20\n| EVAL g = GREATEST(a, b);\n````\n\nRemarque : lorsque cette fonction est exécutée sur les champs `keyword` ou `text`, elle renvoie la dernière chaîne dans l'ordre alphabétique. Lorsqu'elle est exécutée sur des colonnes `boolean`, elle renvoie `true` si l'une des valeurs l'est.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.grok.markdown": "### GROK\n`GROK` vous permet d'extraire des données structurées d'une chaîne. `GROK` compare la chaîne à des modèles, sur la base d’expressions régulières, et extrait les modèles indiqués en tant que colonnes.\n\nPour obtenir la syntaxe des modèles \"grok\", consultez [la documentation relative au processeur \"grok\"](https://www.elastic.co/guide/en/elasticsearch/reference/current/grok-processor.html).\n\n````\nROW a = \"12 15.5 15.6 true\"\n| GROK a \"%\\{NUMBER:b:int\\} %\\{NUMBER:c:float\\} %\\{NUMBER:d:double\\} %\\{WORD:e:boolean\\}\"\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.inOperator.markdown": "### IN\nL'opérateur `IN` permet de tester si un champ ou une expression est égal à un élément d'une liste de littéraux, de champs ou d'expressions :\n\n````\nROW a = 1, b = 4, c = 3\n| WHERE c-a IN (3, b / 2, a)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.keep.markdown": "### KEEP\nLa commande `KEEP` permet de définir les colonnes qui seront renvoyées et l'ordre dans lequel elles le seront.\n\nPour limiter les colonnes retournées, utilisez une liste de noms de colonnes séparés par des virgules. Les colonnes sont renvoyées dans l'ordre indiqué :\n \n````\nFROM employees\n| KEEP first_name, last_name, height\n````\n\nPlutôt que de spécifier chaque colonne par son nom, vous pouvez utiliser des caractères génériques pour renvoyer toutes les colonnes dont le nom correspond à un modèle :\n\n````\nFROM employees\n| KEEP h*\n````\n\nLe caractère générique de l'astérisque (\"*\") placé de manière isolée transpose l'ensemble des colonnes qui ne correspondent pas aux autres arguments. La requête suivante renverra en premier lieu toutes les colonnes dont le nom commence par un h, puis toutes les autres colonnes :\n\n````\nFROM employees\n| KEEP h*, *\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.leastFunction.markdown": "### LEAST\nRenvoie la valeur minimale de plusieurs colonnes. Cette fonction est similaire à `MV_MIN`. Toutefois, elle est destinée à être exécutée sur plusieurs colonnes à la fois.\n\n````\nROW a = 10, b = 20\n| EVAL l = LEAST(a, b)\n````\n\nRemarque : lorsque cette fonction est exécutée sur les champs `keyword` ou `text`, elle renvoie la première chaîne dans l'ordre alphabétique. Lorsqu'elle est exécutée sur des colonnes `boolean`, elle renvoie `false` si l'une des valeurs l'est.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.leftFunction.markdown": "### LEFT\nRenvoie la sous-chaîne qui extrait la longueur des caractères de la chaîne en partant de la gauche.\n\n````\nFROM employees\n| KEEP last_name\n| EVAL left = LEFT(last_name, 3)\n| SORT last_name ASC\n| LIMIT 5\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.lengthFunction.markdown": "### LENGTH\nRenvoie la longueur des caractères d'une chaîne.\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL fn_length = LENGTH(first_name)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.limit.markdown": "### LIMIT\nLa commande de traitement `LIMIT` permet de restreindre le nombre de lignes :\n \n````\nFROM employees\n| LIMIT 5\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.log10Function.markdown": "### LOG10\nRenvoie le log de base 10. La valeur de renvoi est toujours un double, quelle que soit la valeur numérique de l'entrée.\n\nLes logs des nombres négatifs affichent une valeur NaN. Les logs des infinis et de 0 sont infinis.\n\n````\nROW d = 1000.0\n| EVAL s = LOG10(d)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.ltrimFunction.markdown": "### LTRIM\nRetire les espaces au début des chaînes.\n\n````\nROW message = \" some text \", color = \" red \"\n| EVAL message = LTRIM(message)\n| EVAL color = LTRIM(color)\n| EVAL message = CONCAT(\"'\", message, \"'\")\n| EVAL color = CONCAT(\"'\", color, \"'\")\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.markdown": "## ES|QL\n\nUne requête ES|QL (langage de requête Elasticsearch) se compose d'une série de commandes, séparées par une barre verticale : `|`. Chaque requête commence par une **commande source**, qui produit un tableau, habituellement avec des données issues d'Elasticsearch. \n\nUne commande source peut être suivie d'une ou plusieurs **commandes de traitement**. Les commandes de traitement peuvent modifier le tableau de sortie de la commande précédente en ajoutant, supprimant ou modifiant les lignes et les colonnes.\n\n````\nsource-command\n| processing-command1\n| processing-command2\n````\n\nLe résultat d'une requête est le tableau produit par la dernière commande de traitement. \n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.maxFunction.markdown": "### MAX\nRenvoie la valeur maximale d'une expression numérique.\n\n````\nFROM employees\n| STATS MAX(languages)\n````\n\nCette expression peut utiliser des fonctions alignées. Par exemple, pour calculer le maximum sur une moyenne d'une colonne multivaluée, il faut utiliser `MV_AVG` pour faire la moyenne des multiples valeurs par ligne et utiliser le résultat avec la fonction `MAX` :\n\n````\nFROM employees\n| STATS max_avg_salary_change = MAX(MV_AVG(salary_change))\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.medianAbsoluteDeviationFunction.markdown": "### MEDIAN_ABSOLUTE_DEVIATION\nRenvoie l'écart absolu médian, une mesure de la variabilité. Il s'agit d'un indicateur robuste, ce qui signifie qu'il est utile pour décrire des données qui peuvent présenter des valeurs aberrantes ou ne pas être normalement distribuées. Pour de telles données, il peut être plus descriptif que l'écart-type.\n\nIl est calculé comme la médiane de chaque écart de point de données par rapport à la médiane de l'ensemble de l'échantillon. Autrement dit, pour une variable aléatoire X, l'écart absolu médian est `median(|median(X) - X|)`.\n\n````\nFROM employees\n| STATS MEDIAN(salary), MEDIAN_ABSOLUTE_DEVIATION(salary)\n````\n\nREMARQUE : Comme la fonction `PERCENTILE`, la fonction `MEDIAN_ABSOLUTE_DEVIATION` est généralement approximative, et basée sur l'algorithme TDigest. Elle est également non déterministe. Cela signifie que vous pouvez obtenir des résultats légèrement différents en utilisant les mêmes données.\n\nCette expression peut utiliser des fonctions alignées. Par exemple, pour calculer l'écart absolu médian des valeurs maximales d'une colonne multivaluée, il faut d'abord utiliser `MV_MAX` pour obtenir la valeur maximale par ligne, et utiliser le résultat avec la fonction `MEDIAN_ABSOLUTE_DEVIATION` :\n\n````\nFROM employees\n| STATS m_a_d_max_salary_change = MEDIAN_ABSOLUTE_DEVIATION(MV_MAX(salary_change))\n````\n\n", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.medianFunction.markdown": "### MEDIAN\nRenvoie la valeur qui est supérieure à la moitié de toutes les valeurs et inférieure à la moitié de toutes les valeurs, également connue sous le nom de `PERCENTILE` 50 %.\n\n**REMARQUE :** Comme la fonction `PERCENTILE`, la fonction `MEDIAN` est généralement approximative et basée sur l'algorithme TDigest.\n\n**AVERTISSEMENT :** `MEDIAN` est également [non déterministe](https://en.wikipedia.org/wiki/Nondeterministic_algorithm). Cela signifie que vous pouvez obtenir des résultats légèrement différents en utilisant les mêmes données.\n\nExemple :\n\n````\nFROM employees\n| STATS MEDIAN(salary), PERCENTILE(salary, 50)\n````\n\nCette expression peut utiliser des fonctions alignées. Par exemple, pour calculer le médian des valeurs maximales d'une colonne multivaluée, il faut d'abord utiliser `MV_MAX` pour obtenir la valeur maximale par ligne et utiliser le résultat avec la fonction `MEDIAN` :\n\n````\nFROM employees\n| STATS median_max_salary_change = MEDIAN(MV_MAX(salary_change))\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.minFunction.markdown": "### MIN\nRenvoie la valeur minimale d'un champ numérique.\n\n````\nFROM employees\n| STATS MIN(languages)\n````\n\nCette expression peut utiliser des fonctions alignées. Par exemple, pour calculer le minimum sur une moyenne d'une colonne multivaluée, il faut utiliser `MV_AVG` pour faire la moyenne des valeurs multiples par ligne et utiliser le résultat avec la fonction `MIN` :\n\n````\nFROM employees\n| STATS min_avg_salary_change = MIN(MV_AVG(salary_change))\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvAvgFunction.markdown": "### MV_AVG\nConvertit un champ multivalué en un champ à valeur unique comprenant la moyenne de toutes les valeurs. Par exemple :\n\n````\nROW a=[3, 5, 1, 6]\n| EVAL avg_a = MV_AVG(a)\n````\n\nRenvoi :\n\n````\n[3, 5, 1, 6] | 3.75\n````\n\nREMARQUE : Le type de sortie est toujours un double et le type d'entrée peut être n'importe quel nombre.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvConcatFunction.markdown": "### MV_CONCAT\nConvertit 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 :\n\n````\nROW a=[\"foo\", \"zoo\", \"bar\"]\n| EVAL j = MV_CONCAT(a, \", \")\n````\n\nRenvoi :\n\n````\n[\"foo\", \"zoo\", \"bar\"] | \"foo, zoo, bar\"\n````\n\nSi vous voulez lier des champs qui ne sont pas des chaînes, appelez en premier lieu `TO_STRING` sur ces champs :\n\n````\nROW a=[10, 9, 8]\n| EVAL j = MV_CONCAT(TO_STRING(a), \", \")\n````\n\nRenvoi :\n\n````\n[10, 9, 8] | \"10, 9, 8\"\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvCountFunction.markdown": "### MV_COUNT\nConvertit un champ multivalué en un champ à valeur unique comprenant un décompte du nombre de valeurs :\n\n````\nROW a=[\"foo\", \"zoo\", \"bar\"]\n| EVAL count_a = MV_COUNT(a)\n````\n\nRenvoi :\n\n````\n[\"foo\", \"zoo\", \"bar\"] | 3\n````\n\nREMARQUE : Cette fonction accepte tous les types de valeurs et renvoie toujours un nombre entier.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvDedupeFunction.markdown": "### MV_DEDUPE\nSupprime les doublons d'un champ multivalué. Par exemple :\n\n````\nROW a=[\"foo\", \"foo\", \"bar\", \"foo\"]\n| EVAL dedupe_a = MV_DEDUPE(a)\n````\n\nRenvoi :\n\n````\n[\"foo\", \"foo\", \"bar\", \"foo\"] | [\"foo\", \"bar\"]\n````\n\nREMARQUE : la fonction `MV_DEDUPE` est en mesure de trier les valeurs du champ, mais ne le fait pas systématiquement.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvExpand.markdown": "### MV_EXPAND\nLa commande de traitement `MV_EXPAND` développe les champs multivalués en indiquant une valeur par ligne et en dupliquant les autres champs : \n````\nROW a=[1,2,3], b=\"b\", j=[\"a\",\"b\"]\n| MV_EXPAND a\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvFirstFunction.markdown": "### MV_FIRST\nConvertit un champ multivalué en un champ à valeur unique contenant la première valeur. Ceci est particulièrement utile pour lire une fonction qui émet des champs multivalués dans un ordre connu, comme `SPLIT`.\n\nPar exemple :\n\n````\nROW a=\"foo;bar;baz\" \n| EVAL first_a = MV_FIRST(SPLIT(a, \";\"))\n````\n\nRenvoi :\n\n````\nfoo;bar;baz | foo\n````\n\nL'ordre dans lequel [les champs multivalués](https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-multivalued-fields.html) sont lus à partir du stockage sous-jacent n'est pas garanti. Il est souvent ascendant, mais ne vous y fiez pas. Si vous avez besoin de la valeur minimale d'un champ, utilisez `MV_MIN` au lieu de `MV_FIRST`. `MV_MIN` a des optimisations pour les valeurs triées, donc il n'y a pas d'avantage de performance à utiliser `MV_FIRST`. `MV_FIRST` est surtout utile avec les fonctions qui créent des champs multivalués comme `SPLIT`.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvLastFunction.markdown": "### MV_LAST\nConvertit un champ multivalué en un champ à valeur unique comprenant la dernière valeur. Ceci est particulièrement utile pour lire une fonction qui émet des champs multivalués dans un ordre connu, comme `SPLIT` :\n \n````\nROW a=\"foo;bar;baz\" \n| EVAL first_a = MV_FIRST(SPLIT(a, \";\"))\n````\n\nRenvoi :\n\n````\nfoo;bar;baz | baz\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvMaxFunction.markdown": "### MV_MAX\nConvertit un champ multivalué en un champ à valeur unique comprenant la valeur maximale. Par exemple :\n\n````\nROW a=[3, 5, 1]\n| EVAL max_a = MV_MAX(a)\n````\n\nRenvoi :\n\n````\n[3, 5, 1] | 5\n````\n\nElle peut être utilisée par n'importe quel type de champ, y compris les champs de type `keyword`. Dans ce cas, elle choisit la dernière chaîne, en comparant leur représentation utf-8 octet par octet :\n\n````\nROW a=[\"foo\", \"zoo\", \"bar\"]\n| EVAL max_a = MV_MAX(a)\n````\n\nRenvoi :\n\n````\n[\"foo\", \"zoo\", \"bar\"] | \"zoo\"\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvMedianFunction.markdown": "### MV_MEDIAN\nConvertit un champ multivalué en un champ à valeur unique comprenant la valeur médiane. Par exemple :\n\n````\nROW a=[3, 5, 1]\n| EVAL median_a = MV_MEDIAN(a)\n````\n\nRenvoi :\n\n````\n[3, 5, 1] | 3\n````\n\nElle peut être utilisée par n'importe quel type de champ numérique et renvoie une valeur du même type. Si la ligne comprend un nombre pair de valeurs pour une colonne, le résultat sera la moyenne des deux entrées du milieu. Si le champ n'inclut pas une valeur en virgule flottante, la moyenne est arrondie à la valeur **inférieure** :\n\n````\nROW a=[3, 7, 1, 6]\n| EVAL median_a = MV_MEDIAN(a)\n````\n\nRenvoi :\n\n````\n[3, 7, 1, 6] | 4\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvMinFunction.markdown": "### MV_MIN\nConvertit un champ multivalué en un champ à valeur unique comprenant la valeur minimale. Par exemple :\n\n````\nROW a=[2, 1]\n| EVAL min_a = MV_MIN(a)\n````\n\nRenvoi :\n\n````\n[2, 1] | 1\n````\n\nElle peut être utilisée par n'importe quel type de champ, y compris les champs de type `keyword`. Dans ce cas, elle choisit la dernière chaîne, en comparant leur représentation utf-8 octet par octet :\n\n````\nROW a=[\"foo\", \"bar\"]\n| EVAL min_a = MV_MIN(a)\n````\n\nRenvoi :\n\n````\n[\"foo\", \"bar\"] | \"bar\"\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvSumFunction.markdown": "### MV_SUM\nConvertit un champ multivalué en un champ à valeur unique comprenant la somme de toutes les valeurs. Par exemple :\n````\nROW a=[3, 5, 6]\n| EVAL sum_a = MV_SUM(a)\n````\n\nRenvoi :\n\n````\n[3, 5, 6] | 14\n````\n\nREMARQUE : Le type d'entrée peut être n'importe quel nombre et le type de sortie est identique au type d'entrée.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.nowFunction.markdown": "### NOW\nRenvoie la date et l'heure actuelles.\n\n````\nROW current_date = NOW()\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.percentileFunction.markdown": "### PERCENTILE\nValeur à laquelle un certain pourcentage des valeurs observées se produit. Par exemple, le 95e percentile est la valeur qui est supérieure à 95 % des valeurs observées et le 50percentile est la médiane (`MEDIAN`).\n\n````\nFROM employees\n| STATS p0 = PERCENTILE(salary, 0)\n , p50 = PERCENTILE(salary, 50)\n , p99 = PERCENTILE(salary, 99)\n````\n\n**REMARQUE** : La fonction `PERCENTILE` est généralement approximative et basée sur l'algorithme TDigest. \n\n**AVERTISSEMENT :** `PERCENTILE` est aussi [non déterministe](https://en.wikipedia.org/wiki/Nondeterministic_algorithm). Cela signifie que vous pouvez obtenir des résultats légèrement différents en utilisant les mêmes données.\n\nCette expression peut utiliser des fonctions alignées. Par exemple, pour calculer un percentile des valeurs maximales d'une colonne multivaluée, il faut d'abord utiliser `MV_MAX` pour obtenir la valeur maximale par ligne et utiliser le résultat avec la fonction `PERCENTILE` :\n\n````\nFROM employees\n| STATS p80_max_salary_change = PERCENTILE(MV_MAX(salary_change), 80)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.piFunction.markdown": "### PI\nRapport entre la circonférence et le diamètre d'un cercle.\n\n````\nROW PI()\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.powFunction.markdown": "### POW\nRenvoie la valeur d'une base (premier argument) élevée à la puissance d'un exposant (deuxième argument). Les deux arguments doivent être numériques. La sortie est toujours un double. Veuillez noter qu'il est toujours possible de dépasser un résultat double ici ; dans ce cas, la valeur `null` sera renvoyée.\n\n````\nROW base = 2.0, exponent = 2.0 \n| EVAL s = POW(base, exponent)\n````\n\n#### Exposants fractionnaires\n\nL'exposant peut être un nombre fractionnaire, ce qui revient à effectuer une racine. Par exemple, l'exposant de 0,5 donnera la racine carrée de la base :\n\n````\nROW base = 4, exponent = 0.5\n| EVAL s = POW(base, exponent)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.predicates.markdown": "### Valeurs NULL\nPour une comparaison avec une valeur NULL, utilisez les attributs `IS NULL` et `IS NOT NULL` :\n\n````\nFROM employees\n| WHERE birth_date IS NULL\n| KEEP first_name, last_name\n| SORT first_name\n| LIMIT 3\n````\n\n````\nFROM employees\n| WHERE is_rehired IS NOT NULL\n| STATS count(emp_no)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.rename.markdown": "### RENAME\nUtilisez `RENAME` pour renommer une colonne en utilisant la syntaxe suivante :\n\n````\nRENAME AS \n````\n\nPar exemple :\n\n````\nFROM employees\n| KEEP first_name, last_name, still_hired\n| RENAME still_hired AS employed\n````\n\nSi une colonne portant le nouveau nom existe déjà, elle sera remplacée par la nouvelle colonne.\n\nPlusieurs colonnes peuvent être renommées à l'aide d'une seule commande `RENAME` :\n\n````\nFROM employees\n| KEEP first_name, last_name\n| RENAME first_name AS fn, last_name AS ln\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.rightFunction.markdown": "### RIGHT\nRenvoie la sous-chaîne qui extrait la longueur (`length`) des caractères de la chaîne en partant de la droite (`right`).\n\n````\nFROM employees\n| KEEP last_name\n| EVAL right = RIGHT(last_name, 3)\n| SORT last_name ASC\n| LIMIT 5\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.roundFunction.markdown": "### ROUND\nArrondit un nombre à un certain nombre de décimales spécifié. Si le nombre de décimales n'est pas spécifié, la fonction arrondit par défaut au nombre entier le plus proche. Si le nombre de décimales spécifié est négatif, la fonction arrondit au nombre de décimales à gauche de la virgule.\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL height = ROUND(height * 3.281, 1)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.row.markdown": "### ROW\nLa commande source `ROW` 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.\n \n````\nROW a = 1, b = \"two\", c = null\n````\n\nUtilisez des crochets pour créer des colonnes à valeurs multiples :\n\n````\nROW a = [2, 1]\n````\n\nROW permet d'utiliser des fonctions :\n\n````\nROW a = ROUND(1.23, 0)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.rtrimFunction.markdown": "### RTRIM\nSupprime les espaces à la fin des chaînes.\n\n````\nROW message = \" some text \", color = \" red \"\n| EVAL message = RTRIM(message)\n| EVAL color = RTRIM(color)\n| EVAL message = CONCAT(\"'\", message, \"'\")\n| EVAL color = CONCAT(\"'\", color, \"'\")\n````\n ", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.show.markdown": "### SHOW\nLa commande source `SHOW ` renvoie des informations sur le déploiement et ses capacités :\n\n* Utilisez `SHOW INFO` pour renvoyer la version du déploiement, la date de compilation et le hachage.\n* Utilisez `SHOW FUNCTIONS` pour renvoyer une liste de toutes les fonctions prises en charge et un résumé de chaque fonction.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sinFunction.markdown": "### SIN\nFonction trigonométrique sinus.\n\n```\nROW a=1.8\n| EVAL sin=SIN(a)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sinhFunction.markdown": "### SINH\nFonction hyperbolique sinus.\n\n```\nROW a=1.8\n| EVAL sinh=SINH(a)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sort.markdown": "### SORT\nUtilisez la commande `SORT` pour trier les lignes sur un ou plusieurs champs :\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height\n```\n\nL'ordre de tri par défaut est croissant. Définissez un ordre de tri explicite en utilisant `ASC` ou `DESC` :\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height DESC\n```\n\nSi deux lignes disposent de la même clé de tri, l'ordre original sera préservé. Vous pouvez ajouter des expressions de tri pour départager les deux lignes :\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height DESC, first_name ASC\n```\n\n#### valeurs `null`\nPar défaut, les valeurs `null` sont considérées comme étant supérieures à toutes les autres valeurs. Selon un ordre de tri croissant, les valeurs `null` sont classées en dernier. Selon un ordre de tri décroissant, les valeurs `null` sont classées en premier. Pour modifier cet ordre, utilisez `NULLS FIRST` ou `NULLS LAST` :\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| SORT first_name ASC NULLS FIRST\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.splitFunction.markdown": "### SPLIT\nDivise une chaîne de valeur unique en plusieurs chaînes. Par exemple :\n\n```\nROW words=\"foo;bar;baz;qux;quux;corge\"\n| EVAL word = SPLIT(words, \";\")\n```\n\nQui divise `\"foo;bar;baz;qux;quux;corge\"` sur `;` et renvoie un tableau :\n\n```\nfoo;bar;baz;qux;quux;corge | [foo,bar,baz,qux,quux,corge]\n```\n\nREMARQUE : Seuls les délimiteurs d'un seul octet sont actuellement pris en charge.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sqrtFunction.markdown": "### SQRT\nRenvoie la racine carrée d'un nombre. La valeur de renvoi est toujours un double, quelle que soit la valeur numérique de l'entrée.\n\nLes racines carrées des nombres négatifs affichent une valeur NaN. La racine carrée de l'infini est égale à l'infini.\n\n```\nROW d = 100.0\n| EVAL s = SQRT(d)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.startsWithFunction.markdown": "### STARTS_WITH\nRenvoie un booléen qui indique si une chaîne de mots-clés débute par une autre chaîne.\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL ln_S = STARTS_WITH(last_name, \"S\")\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.statsby.markdown": "### STATS ... BY\nUtilisez `STATS ... BY` pour regrouper les lignes en fonction d'une valeur commune et calculer une ou plusieurs valeurs agrégées sur les lignes regroupées.\n\n```\nFROM employees\n| STATS count = COUNT(languages) BY languages\n```\n\nSi `BY` est omis, le tableau de sortie contient exactement une ligne avec les agrégations appliquées sur l'ensemble des données :\n\n```\nFROM employees\n| STATS avg_lang = AVG(languages)\n```\n\nIl est possible de calculer plusieurs valeurs :\n\n```\nFROM employees\n| STATS avg_lang = AVG(languages), max_lang = MAX(languages)\n```\n\nIl est également possible d'effectuer des regroupements en fonction de plusieurs valeurs (uniquement pour les champs longs et les champs de la famille de mots-clés) :\n\n```\nFROM employees\n| EVAL hired = DATE_FORMAT(hire_date, \"YYYY\")\n| STATS avg_salary = AVG(salary) BY hired, languages.long\n| EVAL avg_salary = ROUND(avg_salary)\n| SORT hired, languages.long\n```\n\nConsultez la rubrique **Fonctions d'agrégation** pour obtenir la liste des fonctions pouvant être utilisées avec `STATS ... BY`.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.stringOperators.markdown": "### LIKE et RLIKE\nPour comparer des chaînes en utilisant des caractères génériques ou des expressions régulières, utilisez `LIKE` ou `RLIKE` :\n\nUtilisez `LIKE` pour faire correspondre des chaînes à l'aide de caractères génériques. Les caractères génériques suivants sont pris en charge :\n\n* `*` correspond à zéro caractère ou plus.\n* `?` correspond à un seul caractère.\n\n```\nFROM employees\n| WHERE first_name LIKE \"?b*\"\n| KEEP first_name, last_name\n```\n\nUtilisez `RLIKE` pour faire correspondre des chaînes à l'aide d'expressions régulières :\n\n```\nFROM employees\n| WHERE first_name RLIKE \".leja.*\"\n| KEEP first_name, last_name\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.substringFunction.markdown": "### SUBSTRING\nRenvoie la sous-chaîne d'une chaîne, délimitée en fonction d'une position de départ et d'une longueur facultative. L'exemple suivant renvoie les trois premières lettres de chaque nom de famille :\n\n```\nFROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, 1, 3)\n```\n\nUne position de départ négative est interprétée comme étant relative à la fin de la chaîne. L'exemple suivant renvoie les trois dernières lettres de chaque nom de famille :\n\n```\nFROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, -3, 3)\n```\n\nSi la longueur n'est pas spécifiée, la sous-chaîne renvoie le reste de la chaîne. L'exemple suivant renvoie toutes les lettres à l'exception de la première :\n\n```\nFROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, 2)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sumFunction.markdown": "### SUM\nSomme d'un champ numérique.\n\n```\nFROM employees\n| STATS SUM(languages)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tanFunction.markdown": "### TAN\nFonction trigonométrique tangente.\n\n```\nROW a=1.8\n| EVAL tan=TAN(a)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tanhFunction.markdown": "### TANH\nFonction hyperbolique tangente.\n\n```\nROW a=1.8\n| EVAL tanh=TANH(a)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tauFunction.markdown": "### TAU\nRapport entre la circonférence et le rayon d'un cercle.\n\n```\nROW TAU()\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toBooleanFunction.markdown": "### TO_BOOLEAN\nConvertit une valeur d'entrée en une valeur booléenne.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type chaîne ou numérique.\n\nUne chaîne de valeur **\"true\"** sera convertie, sans tenir compte de la casse, en une valeur booléenne **true**. Pour toute autre valeur, y compris une chaîne vide, la fonction renverra **false**. Par exemple :\n\n```\nROW str = [\"true\", \"TRuE\", \"false\", \"\", \"yes\", \"1\"]\n| EVAL bool = TO_BOOLEAN(str)\n```\n\nRenvoi :\n\n```\n[\"true\", \"TRuE\", \"false\", \"\", \"yes\", \"1\"] | [true, true, false, false, false, false]\n```\n\nLa valeur numérique **0** sera convertie en **false**, toute autre valeur sera convertie en **true**.\n\nAlias : TO_BOOL\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDatetimeFunction.markdown": "### TO_DATETIME\nConvertit une valeur d'entrée en une valeur de date.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type chaîne ou numérique.\n\nUne chaîne ne sera convertie efficacement que si elle respecte le format `yyyy-MM-dd'T'HH:mm:ss.SSS'Z'`. Par exemple :\n\n```\nROW string = [\"1953-09-02T00:00:00.000Z\", \"1964-06-02T00:00:00.000Z\", \"1964-06-02 00:00:00\"]\n| EVAL datetime = TO_DATETIME(string)\n```\n\nRenvoi :\n\n```\n[\"1953-09-02T00:00:00.000Z\", \"1964-06-02T00:00:00.000Z\", \"1964-06-02 00:00:00\"] | [1953-09-02T00:00:00.000Z, 1964-06-02T00:00:00.000Z]\n```\n\nNotez que, dans cet exemple, la dernière valeur du champ source multivalué n'a pas été convertie. En effet, si le format de la date n'est pas respecté, la conversion aboutira à une valeur **null**.\n\nSi le paramètre d'entrée est de type numérique, sa valeur sera interprétée en millisecondes depuis l'heure Unix. Par exemple :\n\n```\nROW int = [0, 1]\n| EVAL dt = TO_DATETIME(int)\n```\n\nRenvoi :\n\n```\n[0, 1] | [1970-01-01T00:00:00.000Z, 1970-01-01T00:00:00.001Z]\n```\n\nAlias : TO_DT\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDegreesFunction.markdown": "### TO_DEGREES\nConvertit un nombre en radians en degrés.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type numérique et le résultat est toujours `double`.\n\n```\nROW rad = [1.57, 3.14, 4.71]\n| EVAL deg = TO_DEGREES(rad)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDoubleFunction.markdown": "### TO_DOUBLE\nConvertit une valeur d'entrée en une valeur double.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type booléen, date, chaîne ou numérique.\n\nExemple :\n\n```\nROW str1 = \"5.20128E11\", str2 = \"foo\"\n| EVAL dbl = TO_DOUBLE(\"520128000000\"), dbl1 = TO_DOUBLE(str1), dbl2 = TO_DOUBLE(str2)\n```\n\nRenvoi :\n\n```\n5.20128E11 | foo | 5.20128E11 | 5.20128E11 | null\n```\n\nNotez que, dans cet exemple, la dernière conversion de la chaîne n'est pas possible. Dans ce cas, le résultat est une valeur **null**.\n\nSi le paramètre d'entrée est de type date, sa valeur sera interprétée en millisecondes depuis l'heure Unix, convertie en double.\n\nLe booléen **true** sera converti en double **1.0**, et **false** en **0.0**.\n\nAlias : TO_DBL\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toIntegerFunction.markdown": "### TO_INTEGER\nConvertit une valeur d'entrée en une valeur entière.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type booléen, date, chaîne ou numérique.\n\nExemple :\n\n```\nROW long = [5013792, 2147483647, 501379200000]\n| EVAL int = TO_INTEGER(long)\n```\n\nRenvoi :\n\n```\n[5013792, 2147483647, 501379200000] | [5013792, 2147483647]\n```\n\nNotez que, dans cet exemple, la dernière valeur du champ multivalué ne peut pas être convertie en un nombre entier. Dans ce cas, le résultat est une valeur **null**.\n\nSi le paramètre d'entrée est de type date, sa valeur sera interprétée en millisecondes depuis l'heure Unix, convertie en nombre entier.\n\nLe booléen **true** sera converti en entier **1**, et **false** en **0**.\n\nAlias : TO_INT\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toIpFunction.markdown": "### TO_IP\nConvertit une chaîne d'entrée en valeur IP.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression.\n\nExemple :\n\n```\nROW str1 = \"1.1.1.1\", str2 = \"foo\"\n| EVAL ip1 = TO_IP(str1), ip2 = TO_IP(str2)\n| WHERE CIDR_MATCH(ip1, \"1.0.0.0/8\")\n```\n\nRenvoi :\n\n```\n1.1.1.1 | foo | 1.1.1.1 | null\n```\n\nNotez que, dans l'exemple ci-dessus, la dernière conversion de la chaîne n'est pas possible. Dans ce cas, le résultat est une valeur **null**.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toLongFunction.markdown": "### TO_LONG\nConvertit une valeur d'entrée en une valeur longue.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type booléen, date, chaîne ou numérique.\n\nExemple :\n\n```\nROW str1 = \"2147483648\", str2 = \"2147483648.2\", str3 = \"foo\"\n| EVAL long1 = TO_LONG(str1), long2 = TO_LONG(str2), long3 = TO_LONG(str3)\n```\n\nRenvoi :\n\n```\n2147483648 | 2147483648.2 | foo | 2147483648 | 2147483648 | null\n```\n\nNotez que, dans cet exemple, la dernière conversion de la chaîne n'est pas possible. Dans ce cas, le résultat est une valeur **null**. \n\nSi le paramètre d'entrée est de type date, sa valeur sera interprétée en millisecondes depuis l'heure Unix, convertie en nombre entier.\n\nLe booléen **true** sera converti en valeur longue **1**, et **false** en **0**.\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toRadiansFunction.markdown": "### TO_RADIANS\nConvertit un nombre en degrés en radians.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type numérique et le résultat est toujours `double`.\n\n```\nROW deg = [90.0, 180.0, 270.0]\n| EVAL rad = TO_RADIANS(deg)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toStringFunction.markdown": "### TO_STRING\nConvertit un champ en une chaîne. Par exemple :\n\n```\nROW a=10\n| EVAL j = TO_STRING(a)\n```\n\nCela fonctionne également pour les champs multivalués :\n\n```\nROW a=[10, 9, 8]\n| EVAL j = TO_STRING(a)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toUnsignedLongFunction.markdown": "### TO_UNSIGNED_LONG\nConvertit une valeur d'entrée en une valeur longue non signée.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type booléen, date, chaîne ou numérique.\n\n```\nROW str1 = \"2147483648\", str2 = \"2147483648.2\", str3 = \"foo\"\n| EVAL long1 = TO_UNSIGNED_LONG(str1), long2 = TO_ULONG(str2), long3 = TO_UL(str3)\n```\n\nNotez que, dans cet exemple, la dernière conversion de la chaîne n'est pas possible. Dans ce cas, le résultat est une valeur **null**. La réponse est accompagnée d'un champ d'avertissement. L’en-tête indiquera l'origine de l'échec :\n\n```\n\"Line 1:133: evaluation of [TO_UL(str3)] failed, treating result as null. Only first 20 failures recorded.\"\n```\n\nUn autre en-tête indiquera la raison de l'échec et la valeur incriminée :\n\n```\n\"java.lang.NumberFormatException: Character f is neither a decimal digit number, decimal point, nor \"e\" notation exponential mark.\"\n```\n\nSi le paramètre d'entrée est de type date, sa valeur sera interprétée en millisecondes depuis l'heure Unix, convertie en valeur longue non signée.\n\nLe booléen **true** sera converti en valeur longue non signée **1**, et **false** en **0**.\n\nAlias : TO_ULONG, TO_UL\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toVersionFunction.markdown": "### TO_VERSION\nConvertit une chaîne d'entrée en une valeur de version. Par exemple :\n\n```\nROW v = TO_VERSION(\"1.2.3\")\n```\n\nRenvoi :\n\n```\n1.2.3\n```\n\nAlias : TO_VER\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.trimFunction.markdown": "### TRIM\nSupprime les espaces de début et de fin d'une chaîne.\n\n```\nROW message = \" some text \", color = \" red \"\n| EVAL message = TRIM(message)\n| EVAL color = TRIM(color)\n```\n ", - "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.where.markdown": "### WHERE\nUtilisez `WHERE` afin d'obtenir un tableau qui comprend toutes les lignes du tableau d'entrée pour lesquelles la condition fournie est évaluée à `true` :\n \n```\nFROM employees\n| KEEP first_name, last_name, still_hired\n| WHERE still_hired == true\n```\n\n#### Opérateurs\n\nPour obtenir un aperçu des opérateurs pris en charge, consultez la section **Opérateurs**.\n\n#### Fonctions\n`WHERE` prend en charge diverses fonctions de calcul des valeurs. Pour en savoir plus, consultez la section **Fonctions**.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sinFunction.markdown": "### SIN\nFonction trigonométrique sinus.\n\n````\nROW a=1.8\n| EVAL sin=SIN(a)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sinhFunction.markdown": "### SINH\nFonction hyperbolique sinus.\n\n````\nROW a=1.8\n| EVAL sinh=SINH(a)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sort.markdown": "### SORT\nUtilisez la commande `SORT` pour trier les lignes sur un ou plusieurs champs :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height\n````\n\nL'ordre de tri par défaut est croissant. Définissez un ordre de tri explicite en utilisant `ASC` ou `DESC` :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height DESC\n````\n\nSi deux lignes disposent de la même clé de tri, l'ordre original sera préservé. Vous pouvez ajouter des expressions de tri pour départager les deux lignes :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height DESC, first_name ASC\n````\n\n#### valeurs `null`\nPar défaut, les valeurs `null` sont considérées comme étant supérieures à toutes les autres valeurs. Selon un ordre de tri croissant, les valeurs `null` sont classées en dernier. Selon un ordre de tri décroissant, les valeurs `null` sont classées en premier. Pour modifier cet ordre, utilisez `NULLS FIRST` ou `NULLS LAST` :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| SORT first_name ASC NULLS FIRST\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.splitFunction.markdown": "### SPLIT\nDivise une chaîne de valeur unique en plusieurs chaînes. Par exemple :\n\n````\nROW words=\"foo;bar;baz;qux;quux;corge\"\n| EVAL word = SPLIT(words, \";\")\n````\n\nQui divise `\"foo;bar;baz;qux;quux;corge\"` sur `;` et renvoie un tableau :\n\n````\nfoo;bar;baz;qux;quux;corge | [foo,bar,baz,qux,quux,corge]\n````\n\nREMARQUE : Seuls les délimiteurs d'un seul octet sont actuellement pris en charge.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sqrtFunction.markdown": "### SQRT\nRenvoie la racine carrée d'un nombre. La valeur de renvoi est toujours un double, quelle que soit la valeur numérique de l'entrée.\n\nLes racines carrées des nombres négatifs affichent une valeur NaN. La racine carrée de l'infini est égale à l'infini.\n\n````\nROW d = 100.0\n| EVAL s = SQRT(d)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.startsWithFunction.markdown": "### STARTS_WITH\nRenvoie un booléen qui indique si une chaîne de mots-clés débute par une autre chaîne :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL ln_S = STARTS_WITH(last_name, \"S\")\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.statsby.markdown": "### STATS ... BY\nUtilisez `STATS ... BY` pour regrouper les lignes en fonction d'une valeur commune et calculer une ou plusieurs valeurs agrégées sur les lignes regroupées.\n\n**Exemples** :\n\n````\nFROM employees\n| STATS count = COUNT(emp_no) BY languages\n| SORT languages\n````\n\nSi `BY` est omis, le tableau de sortie contient exactement une ligne avec les agrégations appliquées sur l'ensemble des données :\n\n````\nFROM employees\n| STATS avg_lang = AVG(languages)\n````\n\nIl est possible de calculer plusieurs valeurs :\n\n````\nFROM employees\n| STATS avg_lang = AVG(languages), max_lang = MAX(languages)\n````\n\nIl est également possible d'effectuer des regroupements en fonction de plusieurs valeurs (uniquement pour les champs longs et les champs de la famille de mots-clés) :\n\n````\nFROM employees\n| EVAL hired = DATE_FORMAT(hire_date, \"YYYY\")\n| STATS avg_salary = AVG(salary) BY hired, languages.long\n| EVAL avg_salary = ROUND(avg_salary)\n| SORT hired, languages.long\n````\n\nConsultez la rubrique **Fonctions d'agrégation** pour obtenir la liste des fonctions pouvant être utilisées avec `STATS ... BY`.\n\nLes fonctions d'agrégation et les expressions de regroupement acceptent toutes deux d'autres fonctions. Ceci est utile pour utiliser `STATS...BY` sur des colonnes à valeur multiple. Par exemple, pour calculer l'évolution moyenne du salaire, vous pouvez utiliser `MV_AVG` pour faire la moyenne des multiples valeurs par employé, et utiliser le résultat avec la fonction `AVG` :\n\n````\nFROM employees\n| STATS avg_salary_change = AVG(MV_AVG(salary_change))\n````\n\nLe regroupement par expression est par exemple le regroupement des employés en fonction de la première lettre de leur nom de famille :\n\n````\nFROM employees\n| STATS my_count = COUNT() BY LEFT(last_name, 1)\n| SORT \"LEFT(last_name, 1)\"\n````\n\nIl n'est pas obligatoire d'indiquer le nom de la colonne de sortie. S'il n'est pas spécifié, le nouveau nom de la colonne est égal à l'expression. La requête suivante renvoie une colonne appelée `AVG(salary)` :\n\n````\nFROM employees\n| STATS AVG(salary)\n````\n\nComme ce nom contient des caractères spéciaux, il doit être placé entre deux caractères (`) lorsqu'il est utilisé dans des commandes suivantes :\n\n````\nFROM employees\n| STATS AVG(salary)\n| EVAL avg_salary_rounded = ROUND(\"AVG(salary)\")\n````\n\n**Remarque** : `STATS` sans aucun groupe est beaucoup plus rapide que l'ajout d'un groupe.\n\n**Remarque** : Le regroupement sur une seule expression est actuellement beaucoup plus optimisé que le regroupement sur plusieurs expressions.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.stCentroidFunction.markdown": "### ST_CENTROID\nCalcule le centroïde spatial sur un champ avec un type de géométrie de point spatial.\n\n````\nAéroports FROM\n| STATS centroid=ST_CENTROID(location)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.stringOperators.markdown": "### LIKE et RLIKE\nPour comparer des chaînes en utilisant des caractères génériques ou des expressions régulières, utilisez `LIKE` ou `RLIKE` :\n\nUtilisez `LIKE` pour faire correspondre des chaînes à l'aide de caractères génériques. Les caractères génériques suivants sont pris en charge :\n\n* `*` correspond à zéro caractère ou plus.\n* `?` correspond à un seul caractère.\n\n````\nFROM employees\n| WHERE first_name LIKE \"?b*\"\n| KEEP first_name, last_name\n````\n\nUtilisez `RLIKE` pour faire correspondre des chaînes à l'aide d'expressions régulières :\n\n````\nFROM employees\n| WHERE first_name RLIKE \".leja.*\"\n| KEEP first_name, last_name\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.substringFunction.markdown": "### SUBSTRING\nRenvoie la sous-chaîne d'une chaîne, délimitée en fonction d'une position de départ et d'une longueur facultative. L'exemple suivant renvoie les trois premières lettres de chaque nom de famille :\n\n````\nFROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, 1, 3)\n````\n\nUne position de départ négative est interprétée comme étant relative à la fin de la chaîne. L'exemple suivant renvoie les trois dernières lettres de chaque nom de famille :\n\n````\nFROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, -3, 3)\n````\n\nSi la longueur n'est pas spécifiée, la sous-chaîne renvoie le reste de la chaîne. L'exemple suivant renvoie toutes les lettres à l'exception de la première :\n\n````\nFROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, 2)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sumFunction.markdown": "### SUM\nRenvoie la somme d'un champ numérique.\n\n````\nFROM employees\n| STATS SUM(languages)\n````\n\nCette expression peut utiliser des fonctions alignées. Par exemple, pour calculer la somme de l'évolution de salaire maximale de chaque employé, appliquez la fonction `MV_MAX` à chaque ligne et additionnez les résultats (`SUM`) :\n\n````\nFROM employees\n| STATS total_salary_changes = SUM(MV_MAX(salary_change))\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tanFunction.markdown": "### TAN\nFonction trigonométrique tangente.\n\n````\nROW a=1.8\n| EVAL tan=TAN(a)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tanhFunction.markdown": "### TANH\nFonction hyperbolique tangente.\n\n````\nROW a=1.8\n| EVAL tanh=TANH(a)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tauFunction.markdown": "### TAU\nRapport entre la circonférence et le rayon d'un cercle.\n\n````\nROW TAU()\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toBooleanFunction.markdown": "### TO_BOOLEAN\nConvertit une valeur d'entrée en une valeur booléenne.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type chaîne ou numérique.\n\nUne chaîne de valeur **\"true\"** sera convertie, sans tenir compte de la casse, en une valeur booléenne **true**. Pour toute autre valeur, y compris une chaîne vide, la fonction renverra **false**. Par exemple :\n\n````\nROW str = [\"true\", \"TRuE\", \"false\", \"\", \"yes\", \"1\"]\n| EVAL bool = TO_BOOLEAN(str)\n````\n\nRenvoi :\n\n````\n[\"true\", \"TRuE\", \"false\", \"\", \"yes\", \"1\"] | [true, true, false, false, false, false]\n````\n\nLa valeur numérique **0** sera convertie en **false**, toute autre valeur sera convertie en **true**.\n\nAlias : TO_BOOL\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toCartesianpointFunction.markdown": "### TO_CARTESIANPOINT\nConvertit une valeur d'entrée en une valeur de `point`.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être une chaîne ou un point cartésien.\n\nUne chaîne ne sera convertie avec succès que si elle respecte le format [WKT Point](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) :\n\n````\nROW wkt = [\"POINT(4297.11 -1475.53)\", \"POINT(7580.93 2272.77)\"]\n| MV_EXPAND wkt\n| EVAL pt = TO_CARTESIANPOINT(wkt)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toCartesianShapeFunction.markdown": "### TO_CARTESIANSHAPE\nConvertit une valeur d'entrée en une valeur `cartesian_shape`.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être une chaîne ou un `cartesian_shape`.\n \nUne chaîne ne sera convertie avec succès que si elle respecte le format [WKT](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) :\n \nPar exemple :\n \n````\nROW wkt = [\"POINT(4297.11 -1475.53)\", \"POLYGON ((3339584.72 1118889.97, 4452779.63 4865942.27, 2226389.81 4865942.27, 1113194.90 2273030.92, 3339584.72 1118889.97))\"]\n| MV_EXPAND wkt\n| EVAL geom = TO_CARTESIANSHAPE(wkt)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDatetimeFunction.markdown": "### TO_DATETIME\nConvertit une valeur d'entrée en une valeur de date.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type chaîne ou numérique.\n\nUne chaîne ne sera convertie efficacement que si elle respecte le format `yyyy-MM-dd'T'HH:mm:ss.SSS'Z'`. Par exemple :\n\n````\nROW string = [\"1953-09-02T00:00:00.000Z\", \"1964-06-02T00:00:00.000Z\", \"1964-06-02 00:00:00\"]\n| EVAL datetime = TO_DATETIME(string)\n````\n\nRenvoi :\n\n````\n[\"1953-09-02T00:00:00.000Z\", \"1964-06-02T00:00:00.000Z\", \"1964-06-02 00:00:00\"] | [1953-09-02T00:00:00.000Z, 1964-06-02T00:00:00.000Z]\n````\n\nNotez que, dans cet exemple, la dernière valeur du champ source multivalué n'a pas été convertie. En effet, si le format de la date n'est pas respecté, la conversion aboutira à une valeur **null**.\n\nSi le paramètre d'entrée est de type numérique, sa valeur sera interprétée en millisecondes depuis l'heure Unix. Par exemple :\n\n````\nROW int = [0, 1]\n| EVAL dt = TO_DATETIME(int)\n````\n\nRenvoi :\n\n````\n[0, 1] | [1970-01-01T00:00:00.000Z, 1970-01-01T00:00:00.001Z]\n````\n\nAlias : TO_DT\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDegreesFunction.markdown": "### TO_DEGREES\nConvertit un nombre en radians en degrés.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type numérique et le résultat est toujours `double`.\n\n````\nROW rad = [1.57, 3.14, 4.71]\n| EVAL deg = TO_DEGREES(rad)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDoubleFunction.markdown": "### TO_DOUBLE\nConvertit une valeur d'entrée en une valeur double.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type booléen, date, chaîne ou numérique.\n\nExemple :\n\n````\nROW str1 = \"5.20128E11\", str2 = \"foo\"\n| EVAL dbl = TO_DOUBLE(\"520128000000\"), dbl1 = TO_DOUBLE(str1), dbl2 = TO_DOUBLE(str2)\n````\n\nRenvoi :\n\n````\n5.20128E11 | foo | 5.20128E11 | 5.20128E11 | null\n````\n\nNotez que, dans cet exemple, la dernière conversion de la chaîne n'est pas possible. Dans ce cas, le résultat est une valeur **null**.\n\nSi le paramètre d'entrée est de type date, sa valeur sera interprétée en millisecondes depuis l'heure Unix, convertie en double.\n\nLe booléen **true** sera converti en double **1.0**, et **false** en **0.0**.\n\nAlias : TO_DBL\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toGeopointFunction.markdown": "### TO_GEOPOINT\nConvertit une valeur d'entrée en une valeur `geo_point`.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être une chaîne ou un `geo_point`.\n\nUne chaîne ne sera convertie avec succès que si elle respecte le format [WKT Point](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) :\n\n````\nROW wkt = \"POINT(42.97109630194 14.7552534413725)\"\n| EVAL pt = TO_GEOPOINT(wkt)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toGeoshapeFunction.markdown": "### TO_GEOSHAPE\nConvertit une valeur d'entrée en une valeur `geo_shape`.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être une chaîne ou un `geo_shape`.\n\nUne chaîne ne sera convertie avec succès que si elle respecte le [format WKT](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry).\n\nPar exemple :\n\n````\nROW wkt = \"POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))\"\n| EVAL geom = TO_GEOSHAPE(wkt)\n````\n\nRenvoi :\n\n````\nPOLYGON ((30 10, 40 40, 20 40, 10 20, 30 10)) | POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toIntegerFunction.markdown": "### TO_INTEGER\nConvertit une valeur d'entrée en une valeur entière.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type booléen, date, chaîne ou numérique.\n\nExemple :\n\n````\nROW long = [5013792, 2147483647, 501379200000]\n| EVAL int = TO_INTEGER(long)\n````\n\nRenvoi :\n\n````\n[5013792, 2147483647, 501379200000] | [5013792, 2147483647]\n````\n\nNotez que, dans cet exemple, la dernière valeur du champ multivalué ne peut pas être convertie en un nombre entier. Dans ce cas, le résultat est une valeur **null**.\n\nSi le paramètre d'entrée est de type date, sa valeur sera interprétée en millisecondes depuis l'heure Unix, convertie en nombre entier.\n\nLe booléen **true** sera converti en entier **1**, et **false** en **0**.\n\nAlias : TO_INT\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toIpFunction.markdown": "### TO_IP\nConvertit une chaîne d'entrée en valeur IP.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression.\n\nExemple :\n\n````\nROW str1 = \"1.1.1.1\", str2 = \"foo\"\n| EVAL ip1 = TO_IP(str1), ip2 = TO_IP(str2)\n| WHERE CIDR_MATCH(ip1, \"1.0.0.0/8\")\n````\n\nRenvoi :\n\n````\n1.1.1.1 | foo | 1.1.1.1 | null\n````\n\nNotez que, dans l'exemple ci-dessus, la dernière conversion de la chaîne n'est pas possible. Dans ce cas, le résultat est une valeur **null**.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toLongFunction.markdown": "### TO_LONG\nConvertit une valeur d'entrée en une valeur longue.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type booléen, date, chaîne ou numérique.\n\nExemple :\n\n````\nROW str1 = \"2147483648\", str2 = \"2147483648.2\", str3 = \"foo\"\n| EVAL long1 = TO_LONG(str1), long2 = TO_LONG(str2), long3 = TO_LONG(str3)\n````\n\nRenvoi :\n\n````\n2147483648 | 2147483648.2 | foo | 2147483648 | 2147483648 | null\n````\n\nNotez que, dans cet exemple, la dernière conversion de la chaîne n'est pas possible. Dans ce cas, le résultat est une valeur **null**. \n\nSi le paramètre d'entrée est de type date, sa valeur sera interprétée en millisecondes depuis l'heure Unix, convertie en nombre entier.\n\nLe booléen `true` sera converti en valeur longue `1`, et `false` en `0`.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toLowerFunction.markdown": "### TO_LOWER\nRenvoie une nouvelle chaîne représentant la chaîne d'entrée convertie en minuscules.\nPar exemple :\n \n````\nROW message = \"Some Text\" \n| EVAL message_lower = TO_LOWER(message)\n````\n\nRenvoi :\n\n````\nSome Text | some text\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toRadiansFunction.markdown": "### TO_RADIANS\nConvertit un nombre en degrés en radians.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type numérique et le résultat est toujours `double`.\n\n````\nROW deg = [90.0, 180.0, 270.0]\n| EVAL rad = TO_RADIANS(deg)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toStringFunction.markdown": "### TO_STRING\nConvertit un champ en une chaîne. Par exemple :\n\n````\nROW a=10\n| EVAL j = TO_STRING(a)\n````\n\nCela fonctionne également pour les champs multivalués :\n\n````\nROW a=[10, 9, 8]\n| EVAL j = TO_STRING(a)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toUnsignedLongFunction.markdown": "### TO_UNSIGNED_LONG\nConvertit une valeur d'entrée en une valeur longue non signée.\n\nL'entrée peut être un champ à une ou plusieurs valeurs, ou une expression. Le type d'entrée doit être de type booléen, date, chaîne ou numérique.\n\n````\nROW str1 = \"2147483648\", str2 = \"2147483648.2\", str3 = \"foo\"\n| EVAL long1 = TO_UNSIGNED_LONG(str1), long2 = TO_ULONG(str2), long3 = TO_UL(str3)\n````\n\nNotez que, dans cet exemple, la dernière conversion de la chaîne n'est pas possible. Dans ce cas, le résultat est une valeur **null**. La réponse est accompagnée d'un champ d'avertissement. L’en-tête indiquera l'origine de l'échec :\n\n````\n\"Line 1:133: evaluation of [TO_UL(str3)] failed, treating result as null. Only first 20 failures recorded.\"\n````\n\nUn autre en-tête indiquera la raison de l'échec et la valeur incriminée :\n\n````\n\"java.lang.NumberFormatException: Character f is neither a decimal digit number, decimal point, nor \"e\" notation exponential mark.\"\n````\n\nSi le paramètre d'entrée est de type date, sa valeur sera interprétée en millisecondes depuis l'heure Unix, convertie en valeur longue non signée.\n\nLe booléen `true` sera converti en valeur longue non signée `1`, et `false` en `0`.\n\nAlias : TO_ULONG, TO_UL\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toUpperFunction.markdown": "### TO_UPPER\nRenvoie une nouvelle chaîne représentant la chaîne d'entrée convertie en majuscules.\n\nPar exemple :\n\n````\nROW message = \"Some Text\" \n| EVAL message_upper = TO_UPPER(message)\n````\n\nRenvoi :\n\n````\nSome Text | SOME TEXT\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toVersionFunction.markdown": "### TO_VERSION\nConvertit une chaîne d'entrée en une valeur de version. Par exemple :\n\n````\nROW v = TO_VERSION(\"1.2.3\")\n````\n\nRenvoi :\n\n````\n1.2.3\n````\n\nAlias : TO_VER\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.trimFunction.markdown": "### TRIM\nSupprime les espaces de début et de fin d'une chaîne.\n\n````\nROW message = \" some text \", color = \" red \"\n| EVAL message = TRIM(message)\n| EVAL color = TRIM(color)\n````\n ", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.where.markdown": "### WHERE\nUtilisez `WHERE` afin d'obtenir un tableau qui comprend toutes les lignes du tableau d'entrée pour lesquelles la condition fournie est évaluée à `true` :\n \n````\nFROM employees\n| KEEP first_name, last_name, still_hired\n| WHERE still_hired == true\n````\n\n#### Opérateurs\n\nPour obtenir un aperçu des opérateurs pris en charge, consultez la section **Opérateurs**.\n\n#### Fonctions\n`WHERE` prend en charge diverses fonctions de calcul des valeurs. Pour en savoir plus, consultez la section **Fonctions**.\n ", + "textBasedEditor.query.textBasedLanguagesEditor.aborted": "La demande a été annulée", "textBasedEditor.query.textBasedLanguagesEditor.aggregationFunctions": "Fonctions d'agrégation", "textBasedEditor.query.textBasedLanguagesEditor.aggregationFunctionsDocumentationESQLDescription": "Ces fonctions peuvent être utilisées avec STATS...BY :", + "textBasedEditor.query.textBasedLanguagesEditor.cancel": "Annuler", "textBasedEditor.query.textBasedLanguagesEditor.commandsDescription": "Une commande source produit un tableau, habituellement avec des données issues d'Elasticsearch. ES|QL est compatible avec les commandes sources suivantes.", - "textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel": "Désactiver l'encadrement par des barres", + "textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel": "Supprimer les sauts de ligne des barres verticales", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.absFunction": "ABS", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.acosFunction": "ACOS", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.asinFunction": "ASIN", @@ -5576,6 +6396,7 @@ "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.coshFunction": "COSH", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.countDistinctFunction": "COUNT_DISTINCT", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.countFunction": "COUNT", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateDiffFunction": "DATE_DIFF", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateExtractFunction": "DATE_EXTRACT", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateFormatFunction": "DATE_FORMAT", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dateParseFunction": "DATE_PARSE", @@ -5583,6 +6404,7 @@ "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.dissect": "DISSECT", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.drop": "DROP", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.eFunction": "E", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.endsWithFunction": "ENDS_WITH", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.enrich": "ENRICH", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.eval": "EVAL", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.floorFunction": "FLOOR", @@ -5606,6 +6428,8 @@ "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvCountFunction": "MV_COUNT", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvDedupeFunction": "MV_DEDUPE", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvExpand": "MV_EXPAND", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvFirstFunction": "MV_FIRST", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvLastFunction": "MV_LAST", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvMaxFunction": "MV_MAX", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvMedianFunction": "MV_MEDIAN", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.mvMinFunction": "MV_MIN", @@ -5628,6 +6452,7 @@ "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sqrtFunction": "SQRT", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.startsWithFunction": "STARTS_WITH", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.statsby": "STATS ... BY", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.stCentroidFunction": "ST_CENTROID", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.stringOperators": "LIKE et RLIKE", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.substringFunction": "SUBSTRING", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sumFunction": "SUM", @@ -5635,23 +6460,30 @@ "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tanhFunction": "TANH", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tauFunction": "TAU", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toBooleanFunction": "TO_BOOLEAN", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toCartesianpointFunction": "TO_CARTESIANPOINT", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toCartesianShapeFunction": "TO_CARTESIANSHAPE", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDatetimeFunction": "TO_DATETIME", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDegreesFunction": "TO_DEGREES", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDoubleFunction": "TO_DOUBLE", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toGeopointFunction": "TO_GEOPOINT", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toGeoshapeFunction": "TO_GEOSHAPE", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toIntegerFunction": "TO_INTEGER", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toIpFunction": "TO_IP", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toLongFunction": "TO_LONG", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toLowerFunction": "TO_LOWER", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toRadiansFunction": "TO_RADIANS", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toStringFunction": "TO_STRING", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toUnsignedLongFunction": "TO_UNSIGNED_LONG", + "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toUpperFunction": "TO_UPPER", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toVersionFunction": "TO_VERSION", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.trimFunction": "TRIM", "textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.where": "WHERE", "textBasedEditor.query.textBasedLanguagesEditor.documentationLabel": "Documentation", - "textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel": "Intégrés avec des canaux", + "textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel": "Ajouter des sauts de ligne aux barres verticales", "textBasedEditor.query.textBasedLanguagesEditor.errorsTitle": "Erreurs", "textBasedEditor.query.textBasedLanguagesEditor.esql": "ES|QL", "textBasedEditor.query.textBasedLanguagesEditor.expandTooltip": "Développer l’éditeur de requête", + "textBasedEditor.query.textBasedLanguagesEditor.feedback": "Commentaires", "textBasedEditor.query.textBasedLanguagesEditor.functions": "Fonctions", "textBasedEditor.query.textBasedLanguagesEditor.functionsDocumentationESQLDescription": "Les fonctions sont compatibles avec \"ROW\" (Ligne), \"EVAL\" (Évaluation) et \"WHERE\" (Où).", "textBasedEditor.query.textBasedLanguagesEditor.MinimizeEditor": "Réduire l'éditeur", @@ -5660,39 +6492,41 @@ "textBasedEditor.query.textBasedLanguagesEditor.operatorsDocumentationESQLDescription": "ES|QL est compatible avec les opérateurs suivants :", "textBasedEditor.query.textBasedLanguagesEditor.processingCommands": "Traitement des commandes", "textBasedEditor.query.textBasedLanguagesEditor.processingCommandsDescription": "Le traitement des commandes transforme un tableau des entrées par l'ajout, le retrait ou la modification des lignes et des colonnes. ES|QL est compatible avec le traitement des commandes suivant.", + "textBasedEditor.query.textBasedLanguagesEditor.run": "Exécuter", "textBasedEditor.query.textBasedLanguagesEditor.runQuery": "Exécuter la requête", "textBasedEditor.query.textBasedLanguagesEditor.sourceCommands": "Commandes sources", - "textBasedEditor.query.textBasedLanguagesEditor.timestampDetected": "@timestamp détecté", - "textBasedEditor.query.textBasedLanguagesEditor.timestampNotDetected": "@timestamp non détecté", + "textBasedEditor.query.textBasedLanguagesEditor.submitFeedback": "Soumettre un commentaire", + "textBasedEditor.query.textBasedLanguagesEditor.timestampDetected": "@timestamp trouvé", + "textBasedEditor.query.textBasedLanguagesEditor.timestampNotDetected": "@timestamp non trouvé", "textBasedEditor.query.textBasedLanguagesEditor.warningsTitle": "Avertissements", - "timelion.help.functions.aggregate.args.functionHelpText": "L'une des {functions}", + "timelion.help.functions.aggregate.args.functionHelpText": "L'une des options suivantes : {functions}.", "timelion.help.functions.aggregateHelpText": "Crée une ligne statique sur la base du résultat du traitement de tous les points de la série. Fonctions disponibles : {functions}", "timelion.help.functions.common.args.fitHelpText": "Algorithme à utiliser pour adapter les séries à l'intervalle et à la période cible. Disponible : {fitFunctions}", - "timelion.help.functions.es.args.splitHelpText": "Un champ Elasticsearch avec lequel diviser la série et une limite. Par exemple, \"{hostnameSplitArg}\" pour obtenir les 10 premiers noms d'hôte", - "timelion.help.functions.fit.args.modeHelpText": "L'algorithme à utiliser pour adapter les séries à la cible. L'une des options suivantes : {fitFunctions}", + "timelion.help.functions.es.args.splitHelpText": "Un champ Elasticsearch avec lequel diviser la série et une limite. Par ex. \"{hostnameSplitArg}\" pour obtenir les 10 premiers noms d'hôte.", + "timelion.help.functions.fit.args.modeHelpText": "L'algorithme à utiliser pour adapter les séries à la cible. L'une des options suivantes : {fitFunctions}.", "timelion.help.functions.legend.args.timeFormatHelpText": "Modèle de format moment.js. Par défaut : {defaultTimeFormat}", - "timelion.help.functions.movingaverage.args.positionHelpText": "Position des points moyens par rapport à l'heure du résultat. L'une des options suivantes : {validPositions}", - "timelion.help.functions.movingstd.args.positionHelpText": "Position de la section de la fenêtre par rapport à l'heure du résultat. Les options sont {positions}. Par défaut : {defaultPosition}", + "timelion.help.functions.movingaverage.args.positionHelpText": "Position des points moyens par rapport à l'heure du résultat. L'une des options suivantes : {validPositions}.", + "timelion.help.functions.movingstd.args.positionHelpText": "Position de la section de la fenêtre par rapport à l'heure du résultat. Les options sont {positions}. Par défaut : {defaultPosition}.", "timelion.help.functions.points.args.symbolHelpText": "symbole de point. L'une des options suivantes : {validSymbols}", - "timelion.help.functions.propsHelpText": "À utiliser à vos risques et périls ; définit des propriétés arbitraires sur la série. Par exemple {example}", - "timelion.help.functions.trend.args.modeHelpText": "L'algorithme à utiliser pour générer la courbe de tendance. L'une des options suivantes : {validRegressions}", + "timelion.help.functions.propsHelpText": "À utiliser à vos risques et périls ; définit des propriétés arbitraires sur la série. Par exemple : {example}", + "timelion.help.functions.trend.args.modeHelpText": "L'algorithme à utiliser pour générer la courbe de tendance. L'une des options suivantes : {validRegressions}.", "timelion.help.functions.worldbank.args.codeHelpText": "Chemin de l'API Worldbank (Banque mondiale). Il s'agit généralement de tout ce qui suit le domaine, avant la chaîne de requête. Par exemple : {apiPathExample}.", - "timelion.help.functions.worldbankHelpText": "\n [expérimental]\n Extrayez des données de {worldbankUrl} à l'aide du chemin d'accès aux séries.\n La Banque mondiale fournit surtout des données annuelles et n'a souvent aucune donnée pour l'année en cours.\n Essayez {offsetQuery} si vous n'obtenez pas de données pour les plages temporelles récentes.", - "timelion.help.functions.worldbankIndicators.args.indicatorHelpText": "Le code d'indicateur à utiliser. Vous devrez le rechercher sur {worldbankUrl}. Souvent très complexe. Par exemple, {indicatorExample} correspond à la population", - "timelion.help.functions.worldbankIndicatorsHelpText": "\n [expérimental]\n Extrayez des données de {worldbankUrl} à l'aide du nom et de l'indicateur du pays. La Banque mondiale fournit\n surtout des données annuelles et n'a souvent aucune donnée pour l'année en cours. Essayez {offsetQuery} si vous n'obtenez pas de données pour\n les plages temporelles récentes.", - "timelion.help.functions.yaxis.args.unitsHelpText": "La fonction à utiliser pour mettre en forme les étiquettes de l'axe Y. L'une des options suivantes : {formatters}", + "timelion.help.functions.worldbankHelpText": "\n [expérimental]\n Extrayez des données de {worldbankUrl} à l'aide du chemin d’accès aux séries.\n La Banque mondiale fournit surtout des données annuelles et n'a souvent aucune donnée pour l'année en cours.\n Essayez {offsetQuery} si vous n’obtenez pas de données pour les plages temporelles récentes.", + "timelion.help.functions.worldbankIndicators.args.indicatorHelpText": "Le code d'indicateur à utiliser. Vous devrez le rechercher sur {worldbankUrl}. Souvent très complexe. Par exemple, {indicatorExample} correspond à la population.", + "timelion.help.functions.worldbankIndicatorsHelpText": "\n [expérimental]\n Extrayez des données de {worldbankUrl} à l'aide du nom et de l'indicateur du pays. La Banque mondiale fournit\n surtout des données annuelles et n'a souvent aucune donnée pour l'année en cours. Essayez {offsetQuery} si vous n’obtenez pas de données pour\n les plages temporelles récentes.", + "timelion.help.functions.yaxis.args.unitsHelpText": "La fonction à utiliser pour mettre en forme les étiquettes de l'axe Y. L'une des options suivantes : {formatters}.", "timelion.noFunctionErrorMessage": "Fonction inconnue : {name}", "timelion.serverSideErrors.argumentsOverflowErrorMessage": "Trop d'arguments transmis à : {functionName}", - "timelion.serverSideErrors.bucketsOverflowErrorMessage": "Nombre max. de compartiments dépassé : {bucketCount} sur {maxBuckets} autorisés. Sélectionnez un intervalle plus grand ou une période plus courte.", - "timelion.serverSideErrors.errorInCell": " dans la cellule n°{number} : {message}", + "timelion.serverSideErrors.bucketsOverflowErrorMessage": "Nombre max. de compartiments dépassé : {bucketCount} sur {maxBuckets} autorisés. Sélectionnez un intervalle plus grand ou une période plus courte.", + "timelion.serverSideErrors.errorInCell": " dans la cellule n{number} : {message}", "timelion.serverSideErrors.esFunction.indexNotFoundErrorMessage": "Index Elasticsearch introuvable : {index}", - "timelion.serverSideErrors.movingaverageFunction.notValidPositionErrorMessage": "Les positions valides sont les suivantes : {validPositions}", - "timelion.serverSideErrors.movingstdFunction.notValidPositionErrorMessage": "Les positions valides sont les suivantes : {validPositions}", - "timelion.serverSideErrors.pointsFunction.notValidSymbolErrorMessage": "Les symboles valides sont les suivants : {validSymbols}", - "timelion.serverSideErrors.sheetParseErrorMessage": "Attendu : {expectedDescription} au niveau du caractère {column}", + "timelion.serverSideErrors.movingaverageFunction.notValidPositionErrorMessage": "Les positions valides sont : {validPositions}.", + "timelion.serverSideErrors.movingstdFunction.notValidPositionErrorMessage": "Les positions valides sont : {validPositions}.", + "timelion.serverSideErrors.pointsFunction.notValidSymbolErrorMessage": "Les symboles valides sont : {validSymbols}.", + "timelion.serverSideErrors.sheetParseErrorMessage": "Attendu : {expectedDescription} au caractère {column}", "timelion.serverSideErrors.unknownArgumentErrorMessage": "Argument inconnu pour {functionName} : {argumentName}", "timelion.serverSideErrors.unknownArgumentTypeErrorMessage": "Type d'argument non pris en charge : {argument}", - "timelion.serverSideErrors.worldbankFunction.noDataErrorMessage": "La requête à la Banque mondiale a réussi, mais il n'y a pas de données pour {code}", + "timelion.serverSideErrors.worldbankFunction.noDataErrorMessage": "La requête à la Banque mondiale a réussi, mais il n'y a pas de données pour {code}.", "timelion.serverSideErrors.wrongFunctionArgumentTypeErrorMessage": "{functionName}({argumentName}) doit être l'une des options suivantes : {requiredTypes}. Obtenu : {actualType}", "timelion.serverSideErrors.yaxisFunction.notSupportedUnitTypeErrorMessage": "{units} n'est pas un type d'unité pris en charge.", "timelion.uiSettings.defaultIndexDescription": "Index Elasticsearch par défaut dans lequel rechercher avec {esParam}", @@ -5848,7 +6682,7 @@ "uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedTitle": "Recherche \"{drilldownName}\" créée", "uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedTitle": "Recherche \"{drilldownName}\" mise à jour", "uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedTitle": "{n} recherches supprimées", - "uiActionsEnhanced.drilldowns.containers.drilldownList.copyingNotification.body": "{count, number} {count, plural, one {exploration copiée} many {explorations copiées} other {explorations copiées}}.", + "uiActionsEnhanced.drilldowns.containers.drilldownList.copyingNotification.body": "{count, number} {count, plural, one {recherche} other {recherches}} copiée(s).", "uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.urlTemplatePlaceholderText": "Exemple : {exampleUrl}", "uiActionsEnhanced.drilldowns.urlDrilldownValidation.urlFormatErrorMessage": "Format non valide : {message}", "uiActionsEnhanced.drilldowns.urlDrilldownValidation.urlFormatGeneralErrorMessage": "Format non valide. Exemple : {exampleUrl}", @@ -5923,11 +6757,11 @@ "unifiedDataTable.grid.copyClipboardButtonTitle": "Copier la valeur de {column}", "unifiedDataTable.grid.filterForAria": "Filtrer sur cette {value}", "unifiedDataTable.grid.filterOutAria": "Exclure cette {value}", - "unifiedDataTable.gridSampleSize.lastPageDescription": "Les résultats de recherche sont limités à {rowCount} documents", - "unifiedDataTable.gridSampleSize.limitDescription": "Les résultats de recherche sont limités à {sampleSize} documents Ajoutez d'autres termes pour affiner votre recherche.", + "unifiedDataTable.gridSampleSize.lastPageDescription": "Les résultats de recherche sont limités à {rowCount} documents.", + "unifiedDataTable.gridSampleSize.limitDescription": "Les résultats de recherche sont limités à {sampleSize} documents. Ajoutez d'autres termes pour affiner votre recherche.", "unifiedDataTable.searchGenerationWithDescription": "Tableau généré par la recherche {searchTitle}", "unifiedDataTable.searchGenerationWithDescriptionGrid": "Tableau généré par la recherche {searchTitle} ({searchDescription})", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} – Ce champ représente l'heure à laquelle les événements se sont produits.", + "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} : ce champ représente l'heure à laquelle les événements se sont produits.", "unifiedDataTable.clearSelection": "Effacer la sélection", "unifiedDataTable.controlColumnHeader": "Colonne de commande", "unifiedDataTable.copyColumnNameToClipboard.toastTitle": "Copié dans le presse-papiers", @@ -5947,32 +6781,40 @@ "unifiedDataTable.grid.viewDoc": "Afficher/Masquer les détails de la boîte de dialogue", "unifiedDataTable.gridSampleSize.fetchMoreLinkDisabledTooltip": "Pour charger plus, l'intervalle d'actualisation doit d'abord être désactivé", "unifiedDataTable.gridSampleSize.fetchMoreLinkLabel": "Charger plus", + "unifiedDataTable.headerRowHeightLabel": "Hauteur de ligne d’en-tête", "unifiedDataTable.json.codeEditorAriaLabel": "Affichage JSON en lecture seule d’un document Elasticsearch", "unifiedDataTable.json.copyToClipboardLabel": "Copier dans le presse-papiers", "unifiedDataTable.loadingResults": "Chargement des résultats", "unifiedDataTable.noResultsFound": "Résultat introuvable", "unifiedDataTable.removeColumnLabel": "Supprimer la colonne", + "unifiedDataTable.rowHeight.auto": "Ajustement automatique", + "unifiedDataTable.rowHeight.custom": "Personnalisé", + "unifiedDataTable.rowHeight.single": "Unique", + "unifiedDataTable.rowHeightLabel": "Hauteur de ligne de cellule", + "unifiedDataTable.sampleSizeSettings.sampleSizeLabel": "Taille de l'échantillon", "unifiedDataTable.selectColumnHeader": "Sélectionner la colonne", + "unifiedDataTable.selectedRowsButtonLabel": "Sélectionné", "unifiedDataTable.showAllDocuments": "Afficher tous les documents", "unifiedDataTable.showSelectedDocumentsOnly": "Afficher uniquement les documents sélectionnés", "unifiedDataTable.tableHeader.timeFieldIconTooltip": "Ce champ représente l'heure à laquelle les événements se sont produits.", "unifiedFieldList.fieldItemButton.addFieldToWorkspaceLabel": "Ajouter un champ \"{field}\"", - "unifiedFieldList.fieldItemButton.ariaLabel": "Aperçu {fieldDisplayName} : {fieldType}", + "unifiedFieldList.fieldItemButton.ariaLabel": "Aperçu de {fieldDisplayName} : {fieldType}", "unifiedFieldList.fieldItemButton.fieldTitle": "{fieldDisplayName} ({fieldName})", - "unifiedFieldList.fieldItemButton.removeFieldToWorkspaceLabel": "Retirer le champ \"{field}\"", - "unifiedFieldList.fieldListGrouped.fieldSearchForAvailableFieldsLiveRegion": "{availableFields} {availableFields, plural, one {champ} many {champs} other {champs}} disponible(s).", - "unifiedFieldList.fieldListGrouped.fieldSearchForEmptyFieldsLiveRegion": "{emptyFields} {emptyFields, plural, one {champ} many {champs} other {champs}} vide(s).", - "unifiedFieldList.fieldListGrouped.fieldSearchForMetaFieldsLiveRegion": "{metaFields} {metaFields, plural, one {champ} many {champs} other {champs}} méta.", - "unifiedFieldList.fieldListGrouped.fieldSearchForPopularFieldsLiveRegion": "{popularFields} {popularFields, plural, one {champ} many {champs} other {champs}} populaire(s).", - "unifiedFieldList.fieldListGrouped.fieldSearchForSelectedFieldsLiveRegion": "{selectedFields} {selectedFields, plural, one {champ} many {champs} other {champs}} sélectionné(s).", - "unifiedFieldList.fieldListGrouped.fieldSearchForUnmappedFieldsLiveRegion": "{unmappedFields} {unmappedFields, plural, one {champ} many {champs} other {champs}} non mappé(s).", + "unifiedFieldList.fieldItemButton.mappingConflictWithTypesDescription": "Ce champ est défini par plusieurs types ({types}) dans les différents index qui correspondent à ce modèle. Vous pourrez peut-être utiliser ce champ conflictuels, mais il ne sera pas disponible pour les fonctions qui nécessitent que Kibana connaisse leur type. Pour corriger ce problème, vous devrez réindexer vos données.", + "unifiedFieldList.fieldItemButton.removeFieldToWorkspaceLabel": "Supprimer le champ \"{field}\"", + "unifiedFieldList.fieldListGrouped.fieldSearchForAvailableFieldsLiveRegion": "{availableFields} {availableFields, plural, one {champ disponible} other {champs disponibles}}.", + "unifiedFieldList.fieldListGrouped.fieldSearchForEmptyFieldsLiveRegion": "{emptyFields} {emptyFields, plural, one {champ vide} other {champs vides}}.", + "unifiedFieldList.fieldListGrouped.fieldSearchForMetaFieldsLiveRegion": "{metaFields} {metaFields, plural, one {champ} other {champs}} méta.", + "unifiedFieldList.fieldListGrouped.fieldSearchForPopularFieldsLiveRegion": "{popularFields} {popularFields, plural, one {Champ populaire} other {Champs populaires}}.", + "unifiedFieldList.fieldListGrouped.fieldSearchForSelectedFieldsLiveRegion": "{selectedFields} {selectedFields, plural, one {champ sélectionné} other {champs sélectionnés}}.", + "unifiedFieldList.fieldListGrouped.fieldSearchForUnmappedFieldsLiveRegion": "{unmappedFields} {unmappedFields, plural, one {Champ non mappé} other {Champs non mappés}}.", "unifiedFieldList.fieldPopover.addFieldToWorkspaceLabel": "Ajouter un champ \"{field}\"", - "unifiedFieldList.fieldStats.bucketPercentageTooltip": "{formattedPercentage} ({count, plural, one {# enregistrement} many {# enregistrements} other {# enregistrements}})", - "unifiedFieldList.fieldStats.calculatedFromSampleRecordsLabel": "Calcul effectué à partir de {sampledDocumentsFormatted} exemple(s) d'{sampledDocuments, plural, one {enregistrement} many {enregistrements} other {enregistrements}}.", - "unifiedFieldList.fieldStats.calculatedFromTotalRecordsLabel": "Calcul effectué à partir de {totalDocumentsFormatted} {totalDocuments, plural, one {enregistrement} many {enregistrements} other {enregistrements}}.", - "unifiedFieldList.fieldStats.filterOutValueButtonAriaLabel": "Exclure {field} : \"{value}\"", - "unifiedFieldList.fieldStats.filterValueButtonAriaLabel": "Filtrer sur {field} : \"{value}\"", - "unifiedFieldList.fieldStats.noFieldDataInSampleDescription": "Aucune donnée de champ pour {sampledDocumentsFormatted} exemple(s) d'{sampledDocuments, plural, one {enregistrement} many {enregistrements} other {enregistrements}}.", + "unifiedFieldList.fieldStats.bucketPercentageTooltip": "{formattedPercentage} ({count, plural, one {# enregistrement} other {# enregistrements}})", + "unifiedFieldList.fieldStats.calculatedFromSampleRecordsLabel": "Calculé à partir de {sampledDocumentsFormatted} {sampledDocuments, plural, one {exemple d'enregistrement} other {exemples d'enregistrement}}.", + "unifiedFieldList.fieldStats.calculatedFromTotalRecordsLabel": "Calculé à partir de {totalDocumentsFormatted} {totalDocuments, plural, one {enregistrement} other {enregistrements}}.", + "unifiedFieldList.fieldStats.filterOutValueButtonAriaLabel": "Exclure le {field} : \"{value}\"", + "unifiedFieldList.fieldStats.filterValueButtonAriaLabel": "Filtrer sur le {field} : \"{value}\"", + "unifiedFieldList.fieldStats.noFieldDataInSampleDescription": "Aucune donnée de champ pour {sampledDocumentsFormatted} {sampledDocuments, plural, one {exemple d'enregistrement} other {exemples d'enregistrement}}.", "unifiedFieldList.fieldCategorizeButton.label": "Exécuter l'analyse du modèle", "unifiedFieldList.fieldItemButton.mappingConflictDescription": "Ce champ est défini avec plusieurs types (chaîne, entier, etc.) dans les différents index qui correspondent à ce modèle. Vous pouvez toujours utiliser ce champ conflictuel, mais il sera indisponible pour les fonctions qui nécessitent que Kibana en connaisse le type. Pour corriger ce problème, vous devrez réindexer vos données.", "unifiedFieldList.fieldItemButton.mappingConflictTitle": "Conflit de mapping", @@ -5988,6 +6830,7 @@ "unifiedFieldList.fieldListSidebar.collapseSidebarButton": "Masquer la barre latérale", "unifiedFieldList.fieldListSidebar.expandSidebarButton": "Afficher la barre latérale", "unifiedFieldList.fieldListSidebar.fieldsMobileButtonLabel": "Champs", + "unifiedFieldList.fieldListSidebar.fieldsSidebarAriaLabel": "Champs", "unifiedFieldList.fieldListSidebar.flyoutBackIcon": "Retour", "unifiedFieldList.fieldListSidebar.flyoutHeading": "Liste des champs", "unifiedFieldList.fieldListSidebar.toggleSidebarLegend": "Activer/Désactiver la barre latérale", @@ -6017,7 +6860,7 @@ "unifiedFieldList.fieldTypeFilter.filterByTypeAriaLabel": "Filtrer par type", "unifiedFieldList.fieldTypeFilter.learnMoreText": "Découvrez", "unifiedFieldList.fieldTypeFilter.title": "Filtrer par type de champ", - "unifiedFieldList.fieldVisualizeButton.label": "Visualiser", + "unifiedFieldList.fieldVisualizeButton.label": "Visualize", "unifiedFieldList.useGroupedFields.allFieldsLabel": "Tous les champs", "unifiedFieldList.useGroupedFields.availableFieldsLabel": "Champs disponibles", "unifiedFieldList.useGroupedFields.emptyFieldsLabel": "Champs vides", @@ -6031,13 +6874,21 @@ "unifiedFieldList.useGroupedFields.selectedFieldsLabel": "Champs sélectionnés", "unifiedFieldList.useGroupedFields.unmappedFieldsLabel": "Champs non mappés", "unifiedFieldList.useGroupedFields.unmappedFieldsLabelHelp": "Champs qui ne sont pas explicitement mappés à un type de données de champ.", - "unifiedHistogram.breakdownColumnLabel": "Top 3 des valeurs de {fieldName}", - "unifiedHistogram.bucketIntervalTooltip": "Cet intervalle crée {bucketsDescription} pour un affichage dans la plage temporelle sélectionnée. Il a donc été scalé à {bucketIntervalDescription}.", + "unifiedHistogram.breakdownColumnLabel": "3 principales valeurs de {fieldName}", + "unifiedHistogram.breakdownFieldSelector.breakdownByButtonLabel": "Répartir par {fieldName}", + "unifiedHistogram.bucketIntervalTooltip": "Cet intervalle crée {bucketsDescription} pour permettre l’affichage dans la plage temporelle sélectionnée, il a donc été redimensionné vers {bucketIntervalDescription}.", "unifiedHistogram.histogramTimeRangeIntervalDescription": "(intervalle : {value})", + "unifiedHistogram.timeIntervalSelector.buttonLabel": "Intervalle : {timeInterval}", + "unifiedHistogram.toolbarSelectorPopover.noResults": "Résultats introuvables pour {term}", + "unifiedHistogram.breakdownFieldSelector.breakdownFieldPopoverTitle": "Sélectionner le champ de répartition", + "unifiedHistogram.breakdownFieldSelector.noBreakdownButtonLabel": "Pas de répartition", "unifiedHistogram.bucketIntervalTooltip.tooLargeBucketsText": "des compartiments trop volumineux", "unifiedHistogram.bucketIntervalTooltip.tooManyBucketsText": "un trop grand nombre de compartiments", + "unifiedHistogram.chartActionsGroupLegend": "Actions du graphique", "unifiedHistogram.countColumnLabel": "Nombre d'enregistrements", "unifiedHistogram.editVisualizationButton": "Modifier la visualisation", + "unifiedHistogram.hideChartButton": "Masquer le graphique", + "unifiedHistogram.hideChartButtongroupLegend": "Visibilité du graphique", "unifiedHistogram.histogramOfFoundDocumentsAriaLabel": "Histogramme des documents détectés", "unifiedHistogram.histogramTimeRangeIntervalAuto": "Auto", "unifiedHistogram.histogramTimeRangeIntervalLoading": "Chargement", @@ -6045,32 +6896,41 @@ "unifiedHistogram.inspectorRequestDescriptionTotalHits": "Cette requête interroge Elasticsearch afin de récupérer le nombre total de résultats.", "unifiedHistogram.lensTitle": "Modifier la visualisation", "unifiedHistogram.saveVisualizationButton": "Enregistrer la visualisation", + "unifiedHistogram.showChartButton": "Afficher le graphique", "unifiedHistogram.suggestionSelectorPlaceholder": "Sélectionner la visualisation", + "unifiedHistogram.timeIntervalSelector.autoIntervalButtonLabel": "Intervalle automatique", + "unifiedHistogram.timeIntervalSelector.timeIntervalPopoverTitle": "Sélectionner un intervalle de temps", "unifiedHistogram.timeIntervalWithValueWarning": "Avertissement", - "unifiedSearch.filter.filterBar.filterActionsMessage": "Filtrer : {innerText}. Sélectionner pour plus d’actions de filtrage.", + "unifiedHistogram.toolbarSelectorPopover.searchPlaceholder": "Recherche", + "unifiedSearch.filter.filterBar.filterActionsMessage": "Filtre : {innerText}. Sélectionner pour plus d’actions de filtrage.", "unifiedSearch.filter.filterBar.filterItemBadgeIconAriaLabel": "Supprimer {filter}", - "unifiedSearch.filter.filterBar.filterString": "Filtrer : {innerText}.", - "unifiedSearch.filter.filterBar.labelWarningInfo": "Le champ {fieldName} n'existe pas dans la vue en cours", - "unifiedSearch.filter.filterBar.preview": "{icon} Aperçu", + "unifiedSearch.filter.filterBar.filterString": "Filtre : {innerText}.", + "unifiedSearch.filter.filterBar.labelWarningInfo": "Le champ {fieldName} n'existe pas dans la vue en cours.", + "unifiedSearch.filter.filterBar.preview": "Aperçu {icon}", "unifiedSearch.filter.filtersBuilder.delimiterLabel": "{booleanRelation}", - "unifiedSearch.kueryAutocomplete.andOperatorDescription": "Nécessite que {bothArguments} soient définis sur \"true\"", + "unifiedSearch.kueryAutocomplete.andOperatorDescription": "Nécessite que {bothArguments} soient ''vrai''.", "unifiedSearch.kueryAutocomplete.equalOperatorDescription": "{equals} une certaine valeur", - "unifiedSearch.kueryAutocomplete.existOperatorDescription": "{exists} sous une certaine forme", + "unifiedSearch.kueryAutocomplete.existOperatorDescription": "{exists} sous un certain format", "unifiedSearch.kueryAutocomplete.greaterThanOperatorDescription": "est {greaterThan} une certaine valeur", "unifiedSearch.kueryAutocomplete.greaterThanOrEqualOperatorDescription": "est {greaterThanOrEqualTo} une certaine valeur", "unifiedSearch.kueryAutocomplete.lessThanOperatorDescription": "est {lessThan} une certaine valeur", "unifiedSearch.kueryAutocomplete.lessThanOrEqualOperatorDescription": "est {lessThanOrEqualTo} une certaine valeur", - "unifiedSearch.kueryAutocomplete.orOperatorDescription": "Nécessite que {oneOrMoreArguments} soient définis sur \"true\"", + "unifiedSearch.kueryAutocomplete.orOperatorDescription": "Nécessite qu’{oneOrMoreArguments} soit ''vrai''.", "unifiedSearch.query.queryBar.comboboxAriaLabel": "Rechercher et filtrer la page {pageType}", - "unifiedSearch.query.queryBar.indexPattern.createForMatchingIndices": "Explorer {indicesLength, plural, one {# index correspondant} many {# index correspondants} other {# index correspondants}}", + "unifiedSearch.query.queryBar.indexPattern.createForMatchingIndices": "Explorer {indicesLength, plural,\n one {# index correspondant}\n other {# index correspondants}}", "unifiedSearch.query.queryBar.indexPattern.textBasedLangSwitchWarning": "Modifier la vue de données supprime la requête {textBasedLanguage} en cours. Sauvegardez cette recherche pour ne pas perdre de travail.", "unifiedSearch.query.queryBar.indexPattern.textBasedLanguagesTransitionModalBody": "Modifier la vue de données supprime la requête {language} en cours. Sauvegardez cette recherche pour ne pas perdre de travail.", - "unifiedSearch.query.queryBar.KQLNestedQuerySyntaxInfoText": "Il semblerait que votre requête porte sur un champ imbriqué. Selon le résultat visé, il existe plusieurs façons de construire une syntaxe KQL pour des requêtes imbriquées. Apprenez-en plus dans notre {link}.", - "unifiedSearch.query.queryBar.searchInputAriaLabel": "Commencer à taper pour rechercher et filtrer la page {pageType}", + "unifiedSearch.query.queryBar.KQLNestedQuerySyntaxInfoText": "Il semblerait que votre requête porte sur un champ imbriqué. Selon le résultat visé, il existe plusieurs façons de construire une syntaxe KQL pour des requêtes imbriquées. Apprenez-en plus avec notre {link}.", + "unifiedSearch.query.queryBar.searchInputAriaLabel": "Commencer à taper pour rechercher et filtrer la page {pageType}", "unifiedSearch.query.queryBar.searchInputPlaceholder": "Filtrer vos données à l'aide de la syntaxe {language}", - "unifiedSearch.query.queryBar.textBasedNonTimestampWarning": "La sélection de plage de données pour les requêtes en {language} requiert la présence d’un champ @timestamp dans l’ensemble de données.", + "unifiedSearch.query.queryBar.textBasedNonTimestampWarning": "La sélection de plage de données pour les requêtes en {language} requiert la présence d'un champ @timestamp dans l'ensemble de données.", + "unifiedSearch.search.searchBar.deleteQueryErrorMessage": "Une erreur s'est produite lors de la suppression de la requête \"{queryTitle}\" : {errorMessage}", + "unifiedSearch.search.searchBar.deleteQuerySuccessMessage": "La requête \"{queryTitle}\" a été supprimée", "unifiedSearch.search.searchBar.savedQueryPopoverConfirmDeletionTitle": "Supprimer \"{savedQueryName}\" ?", "unifiedSearch.search.searchBar.savedQueryPopoverSaveChangesButtonAriaLabel": "Enregistrer les modifications apportées à {title}", + "unifiedSearch.search.searchBar.savedQueryTotalQueryCount": "{totalQueryCount, plural, one {# requête} other {# requêtes}}", + "unifiedSearch.search.searchBar.saveQueryErrorMessage": "Une erreur s'est produite lors de l'enregistrement de votre requête : {errorMessage}", + "unifiedSearch.search.searchBar.saveQuerySuccessMessage": "Votre requête \"{queryTitle}\" a été enregistrée", "unifiedSearch.search.unableToGetSavedQueryToastTitle": "Impossible de charger la requête {savedQueryId}", "unifiedSearch.filter.applyFilterActionTitle": "Appliquer le filtre à la vue en cours", "unifiedSearch.filter.applyFilters.popupHeader": "Sélectionner les filtres à appliquer", @@ -6110,12 +6970,14 @@ "unifiedSearch.filter.filterEditor.editQueryDslButtonLabel": "Modifier en tant que Query DSL", "unifiedSearch.filter.filterEditor.existsOperatorOptionLabel": "existe", "unifiedSearch.filter.filterEditor.falseOptionLabel": "faux", + "unifiedSearch.filter.filterEditor.greaterThanOrEqualOptionLabel": "supérieur ou égal", "unifiedSearch.filter.filterEditor.isBetweenOperatorOptionLabel": "est entre", "unifiedSearch.filter.filterEditor.isNotBetweenOperatorOptionLabel": "n'est pas entre", "unifiedSearch.filter.filterEditor.isNotOneOfOperatorOptionLabel": "n'est pas l'une des options suivantes", "unifiedSearch.filter.filterEditor.isNotOperatorOptionLabel": "n'est pas", "unifiedSearch.filter.filterEditor.isOneOfOperatorOptionLabel": "est l'une des options suivantes", "unifiedSearch.filter.filterEditor.isOperatorOptionLabel": "est", + "unifiedSearch.filter.filterEditor.lessThanOrEqualOptionLabel": "inférieur à", "unifiedSearch.filter.filterEditor.queryDslAriaLabel": "Éditeur Query DSL d'Elasticsearch", "unifiedSearch.filter.filterEditor.queryDslDocsLinkLabel": "En savoir plus sur la syntaxe Query DSL", "unifiedSearch.filter.filterEditor.queryDslLabel": "Query DSL d'Elasticsearch", @@ -6152,6 +7014,7 @@ "unifiedSearch.filter.options.loadCurrentFilterSetLabel": "Charger la requête", "unifiedSearch.filter.options.loadOtherFilterSetLabel": "Charger la requête", "unifiedSearch.filter.options.pinAllFiltersButtonLabel": "Tout épingler", + "unifiedSearch.filter.options.quickFiltersLabel": "Filtres rapides", "unifiedSearch.filter.options.saveAsNewFilterSetLabel": "Enregistrer la requête", "unifiedSearch.filter.options.saveCurrentFilterSetLabel": "Enregistrer en tant que nouvelle", "unifiedSearch.filter.options.saveFilterSetLabel": "Enregistrer la requête", @@ -6193,28 +7056,45 @@ "unifiedSearch.query.queryBar.textBasedLanguagesTechPreviewLabel": "Version d'évaluation technique", "unifiedSearch.query.queryBar.textBasedLanguagesTryLabel": "Essayer ES|QL", "unifiedSearch.queryBarTopRow.datePicker.disabledLabel": "Tout le temps", + "unifiedSearch.queryBarTopRow.submitButton.cancel": "Annuler", "unifiedSearch.queryBarTopRow.submitButton.refresh": "Actualiser la requête", "unifiedSearch.queryBarTopRow.submitButton.run": "Exécuter la requête", "unifiedSearch.queryBarTopRow.submitButton.update": "Nécessite une mise à jour", + "unifiedSearch.search.searchBar.savedQueryActiveBadgeText": "Actif", + "unifiedSearch.search.searchBar.savedQueryDelete": "Supprimer la recherche", "unifiedSearch.search.searchBar.savedQueryDescriptionText": "Enregistrez le texte et les filtres de la requête que vous souhaitez réutiliser.", + "unifiedSearch.search.searchBar.savedQueryForm.titleConflictText": "Ce nom est en conflit avec une requête existante.", "unifiedSearch.search.searchBar.savedQueryForm.titleExistsText": "Un nom est requis.", "unifiedSearch.search.searchBar.savedQueryFormSaveButtonText": "Enregistrer la requête", "unifiedSearch.search.searchBar.savedQueryIncludeFiltersLabelText": "Inclure les filtres", "unifiedSearch.search.searchBar.savedQueryIncludeTimeFilterLabelText": "Inclure le filtre temporel", + "unifiedSearch.search.searchBar.savedQueryListAriaLabel": "Liste des requêtes", + "unifiedSearch.search.searchBar.savedQueryLoadingQueriesText": "Chargement des requêtes", + "unifiedSearch.search.searchBar.savedQueryMonthLabel": "Ce mois", "unifiedSearch.search.searchBar.savedQueryMultipleNamespacesDeleteWarning": "Cette requête enregistrée est partagée sur plusieurs espaces. Si vous la supprimez, elle disparaît de tous les espaces où elle est partagée. Vous ne pouvez pas annuler cette action.", "unifiedSearch.search.searchBar.savedQueryNameLabelText": "Nom", "unifiedSearch.search.searchBar.savedQueryNoSavedQueriesText": "Aucune requête enregistrée.", "unifiedSearch.search.searchBar.savedQueryPopoverApplyFilterSetLabel": "Charger la requête", "unifiedSearch.search.searchBar.savedQueryPopoverConfirmDeletionCancelButtonText": "Annuler", "unifiedSearch.search.searchBar.savedQueryPopoverConfirmDeletionConfirmButtonText": "Supprimer", + "unifiedSearch.search.searchBar.savedQueryPopoverManageLabel": "Gérer les requêtes", "unifiedSearch.search.searchBar.savedQueryPopoverSaveAsNewButtonAriaLabel": "Enregistrer en tant que nouvelle requête", "unifiedSearch.search.searchBar.savedQueryPopoverSaveAsNewButtonText": "Enregistrer en tant que nouvelle", "unifiedSearch.search.searchBar.savedQueryPopoverSaveChangesButtonText": "Mettre à jour la recherche", + "unifiedSearch.search.searchBar.savedQuerySelectedQueryCount": "1 sélectionnée", + "unifiedSearch.search.searchBar.savedQuerySelectionRequired": "Vous devez d'abord sélectionner une requête", + "unifiedSearch.search.searchBar.savedQueryTodayLabel": "Aujourd'hui", + "unifiedSearch.search.searchBar.savedQueryWeekLabel": "Cette semaine", + "unifiedSearch.search.searchBar.savedQueryYearLabel": "Cette année", + "unifiedSearch.searchBar.savedQueryMonthToDateLabel": "Mensuel à ce jour", + "unifiedSearch.searchBar.savedQueryWeekToDateLabel": "Hebdomadaire à ce jour", + "unifiedSearch.searchBar.savedQueryYearToDateLabel": "Annuel à ce jour", + "unifiedSearch.searchBar.savedQueryYesterdayLabel": "Hier", "unifiedSearch.switchLanguage.buttonText": "Bouton de changement de langue.", "unifiedSearch.triggers.updateFilterReferencesTrigger": "Mettre à jour les références de filtre", "unifiedSearch.triggers.updateFilterReferencesTriggerDescription": "Mettre à jour les références de filtre", - "userProfileComponents.userProfilesSelectable.limitReachedMessage": "Vous avez sélectionné la limite maximale de {count, plural, one {# utilisateur} many {# utilisateurs} other {# utilisateurs}}", - "userProfileComponents.userProfilesSelectable.selectedStatusMessage": "{count, plural, one {# utilisateur sélectionné} many {# utilisateurs sélectionnés} other {# utilisateurs sélectionnés}}", + "userProfileComponents.userProfilesSelectable.limitReachedMessage": "Vous avez sélectionné la limite maximale de {count, plural, one {# utilisateur} other {# utilisateurs}}", + "userProfileComponents.userProfilesSelectable.selectedStatusMessage": "{count, plural, one {# utilisateur sélectionné} other {# utilisateurs sélectionnés}}", "userProfileComponents.updateUserProfile.notification.requiresPageReloadButtonLabel": "Actualiser la page", "userProfileComponents.updateUserProfile.notification.requiresPageReloadDescription": "Un ou plusieurs paramètres nécessitent d’actualiser la page pour pouvoir prendre effet.", "userProfileComponents.updateUserProfile.notification.submitSuccessTitle": "Profil mis à jour", @@ -6222,41 +7102,41 @@ "userProfileComponents.userProfilesSelectable.defaultOptionsLabel": "Suggérée", "userProfileComponents.userProfilesSelectable.nullOptionLabel": "Aucun utilisateur", "userProfileComponents.userProfilesSelectable.searchPlaceholder": "Recherche", - "visDefaultEditor.agg.disableAggButtonTooltip": "Désactiver l'agrégation {schemaTitle} {aggTitle}", - "visDefaultEditor.agg.enableAggButtonTooltip": "Activer l'agrégation {schemaTitle} {aggTitle}", - "visDefaultEditor.agg.errorsAriaLabel": "L'agrégation {schemaTitle} {aggTitle} comporte des erreurs", - "visDefaultEditor.agg.modifyPriorityButtonTooltip": "Modifier la priorité de {schemaTitle} {aggTitle} par glisser-déposer", - "visDefaultEditor.agg.removeDimensionButtonTooltip": "Retirer l'agrégation {schemaTitle} {aggTitle}", + "visDefaultEditor.agg.disableAggButtonTooltip": "Désactiver l'agrégation {aggTitle} de {schemaTitle}", + "visDefaultEditor.agg.enableAggButtonTooltip": "Activer l'agrégation {aggTitle} de {schemaTitle}", + "visDefaultEditor.agg.errorsAriaLabel": "L'agrégation {aggTitle} de {schemaTitle} présente des erreurs.", + "visDefaultEditor.agg.modifyPriorityButtonTooltip": "Modifier la priorité de l'agrégation {aggTitle} de {schemaTitle} en la faisant glisser", + "visDefaultEditor.agg.removeDimensionButtonTooltip": "Supprimer l'agrégation {aggTitle} de {schemaTitle}", "visDefaultEditor.agg.toggleEditorButtonAriaLabel": "Activer/Désactiver l'éditeur {schema}", "visDefaultEditor.aggAdd.addGroupButtonLabel": "Ajouter {groupNameLabel}", - "visDefaultEditor.aggAdd.addSubGroupButtonLabel": "Ajouter un sous-{groupNameLabel}", + "visDefaultEditor.aggAdd.addSubGroupButtonLabel": "Ajouter sous-{groupNameLabel}", "visDefaultEditor.aggAdd.maxBuckets": "Nombre maximal de {groupNameLabel} atteint", - "visDefaultEditor.aggParams.errors.aggWrongRunOrderErrorMessage": "Les agrégations \"{schema}\" doivent s'exécuter avant tous les autres compartiments !", - "visDefaultEditor.aggSelect.helpLinkLabel": "Aide de {aggTitle}", - "visDefaultEditor.aggSelect.noCompatibleAggsDescription": "Le modèle d'indexation {indexPatternTitle} ne comporte pas de champs regroupables.", + "visDefaultEditor.aggParams.errors.aggWrongRunOrderErrorMessage": "Les agrégations \"{schema}\" doivent s'exécuter avant tous les autres compartiments.", + "visDefaultEditor.aggSelect.helpLinkLabel": "Aide {aggTitle}", + "visDefaultEditor.aggSelect.noCompatibleAggsDescription": "Le modèle d'indexation {indexPatternTitle} ne possède pas de champs regroupables.", "visDefaultEditor.controls.dateRanges.removeRangeButtonAriaLabel": "Supprimer la plage allant de {from} à {to}", "visDefaultEditor.controls.definiteMetricLabel": "Indicateur : {metric}", "visDefaultEditor.controls.field.fieldIsNotExists": "Le champ \"{fieldParameter}\" associé à cet objet n'existe plus dans le modèle d'indexation. Veuillez utiliser un autre champ.", "visDefaultEditor.controls.field.invalidFieldForAggregation": "Le champ enregistré \"{fieldParameter}\" du modèle d'indexation \"{indexPatternTitle}\" n'est pas valide pour une utilisation avec cette agrégation. Veuillez sélectionner un nouveau champ.", - "visDefaultEditor.controls.field.noCompatibleFieldsDescription": "Le modèle d'indexation {indexPatternTitle} ne contient aucun des types de champ compatibles suivants : {fieldTypes}", - "visDefaultEditor.controls.filters.definiteFilterLabel": "Filtrer l'étiquette {index}", - "visDefaultEditor.controls.filters.filterLabel": "Filtrer {index}", - "visDefaultEditor.controls.ipRanges.cidrMaskAriaLabel": "Masque CIDR : {mask}", - "visDefaultEditor.controls.ipRanges.ipRangeFromAriaLabel": "Début de la plage d'IP : {value}", - "visDefaultEditor.controls.ipRanges.ipRangeToAriaLabel": "Fin de la plage d'IP : {value}", + "visDefaultEditor.controls.field.noCompatibleFieldsDescription": "Le modèle d'indexation {indexPatternTitle} ne contient aucun des types de champs compatibles suivants : {fieldTypes}.", + "visDefaultEditor.controls.filters.definiteFilterLabel": "Étiquette du filtre {index}", + "visDefaultEditor.controls.filters.filterLabel": "Filtre {index}", + "visDefaultEditor.controls.ipRanges.cidrMaskAriaLabel": "Masque CIDR : {mask}", + "visDefaultEditor.controls.ipRanges.ipRangeFromAriaLabel": "Début de la plage d’IP : {value}", + "visDefaultEditor.controls.ipRanges.ipRangeToAriaLabel": "Fin de la plage d’IP : {value}", "visDefaultEditor.controls.ipRanges.removeCidrMaskButtonAriaLabel": "Supprimer la valeur du masque CIDR de {mask}", "visDefaultEditor.controls.ipRanges.removeRangeAriaLabel": "Supprimer la plage allant de {from} à {to}", - "visDefaultEditor.controls.maxBars.maxBarsHelpText": "Les intervalles seront sélectionnés automatiquement en fonction des données disponibles. Le nombre maximal de barres ne peut jamais être supérieur à la valeur {histogramMaxBars} des paramètres avancés", - "visDefaultEditor.controls.numberInterval.minimumIntervalTooltip": "L'intervalle sera automatiquement scalé si la valeur fournie crée plus de compartiments que ce qui est spécifié par la valeur {histogramMaxBars} dans les paramètres avancés", + "visDefaultEditor.controls.maxBars.maxBarsHelpText": "Les intervalles seront sélectionnés automatiquement en fonction des données disponibles. Le nombre maximal de barres ne peut jamais être supérieur à la valeur {histogramMaxBars} des paramètres avancés.", + "visDefaultEditor.controls.numberInterval.minimumIntervalTooltip": "L'intervalle sera scalé automatiquement si la valeur fournie crée plus de compartiments que ce qui est spécifié par la valeur {histogramMaxBars} dans les paramètres avancés.", "visDefaultEditor.controls.numberList.addUnitButtonLabel": "Ajouter {unitName}", "visDefaultEditor.controls.numberList.invalidRangeErrorMessage": "La valeur doit être comprise dans la plage allant de {min} à {max}.", "visDefaultEditor.controls.numberList.removeUnitButtonAriaLabel": "Supprimer la valeur de rang de {value}", "visDefaultEditor.controls.ranges.removeRangeButtonAriaLabel": "Supprimer la plage allant de {from} à {to}", - "visDefaultEditor.controls.timeInterval.scaledHelpText": "Scalé actuellement à {bucketDescription}", - "visDefaultEditor.editorConfig.dateHistogram.customInterval.helpText": "Doit être un multiple de l'intervalle de configuration : {interval}", - "visDefaultEditor.editorConfig.histogram.interval.helpText": "Doit être un multiple de l'intervalle de configuration : {interval}", + "visDefaultEditor.controls.timeInterval.scaledHelpText": "Actuellement scalé à {bucketDescription}", + "visDefaultEditor.editorConfig.dateHistogram.customInterval.helpText": "Doit être un multiple de l'intervalle de configuration : {interval}.", + "visDefaultEditor.editorConfig.histogram.interval.helpText": "Doit être un multiple de l'intervalle de configuration : {interval}.", "visDefaultEditor.metrics.wrongLastBucketTypeErrorMessage": "La dernière agrégation de compartiments doit être \"Histogramme de date\" ou \"Histogramme\" lorsque vous utilisez l'agrégation d'indicateurs \"{type}\".", - "visDefaultEditor.options.rangeErrorMessage": "Les valeurs doivent être comprises entre {min} et {max}, inclus", + "visDefaultEditor.options.rangeErrorMessage": "Les valeurs doivent être comprises entre {min} et {max}, inclus.", "visDefaultEditor.sidebar.indexPatternAriaLabel": "Modèle d'indexation : {title}", "visDefaultEditor.sidebar.savedSearch.titleAriaLabel": "Recherche enregistrée : {title}", "visDefaultEditor.advancedToggle.advancedLinkLabel": "Avancé", @@ -6294,6 +7174,10 @@ "visDefaultEditor.controls.filters.removeFilterButtonAriaLabel": "Supprimer ce filtre", "visDefaultEditor.controls.filters.toggleFilterButtonAriaLabel": "Activer/Désactiver l'étiquette du filtre", "visDefaultEditor.controls.includeExclude.addUnitButtonLabel": "Ajouter une valeur", + "visDefaultEditor.controls.ipPrefix.errorMessageIpv4": "La longueur du préfixe doit être comprise entre 0 et 32 pour les adresses IPv4.", + "visDefaultEditor.controls.ipPrefix.errorMessageIpv6": "La longueur du préfixe doit être comprise entre 0 et 128 pour les adresses IPv6.", + "visDefaultEditor.controls.IpPrefix.isIpv6": "Le préfixe s'applique aux adresses IPv6", + "visDefaultEditor.controls.IpPrefix.prefixLength": "Longueur du préfixe", "visDefaultEditor.controls.ipRanges.addRangeButtonLabel": "Ajouter une plage", "visDefaultEditor.controls.ipRanges.cidrMasksButtonLabel": "Masques CIDR", "visDefaultEditor.controls.ipRanges.fromToButtonLabel": "De/à", @@ -6388,7 +7272,7 @@ "visTypeTable.params.percentageTableColumnName": "Pourcentages de {title}", "visTypeTable.tableCellFilter.filterForValueAriaLabel": "Filtrer sur : {cellContent}", "visTypeTable.tableCellFilter.filterOutValueAriaLabel": "Exclure : {cellContent}", - "visTypeTable.vis.controls.exportButtonAriaLabel": "Exporter {dataGridAriaLabel} au format CSV", + "visTypeTable.vis.controls.exportButtonAriaLabel": "Exporter {dataGridAriaLabel} au format CSV", "visTypeTable.defaultAriaLabel": "Visualisation du tableau de données", "visTypeTable.function.adimension.buckets": "Compartiments", "visTypeTable.function.args.bucketsHelpText": "Configuration des dimensions de compartiment", @@ -6436,26 +7320,26 @@ "visTypeTable.vis.controls.rawCSVButtonLabel": "Brut", "visTypeTimeseries.advancedSettings.allowStringIndicesText": "Vous permet d'interroger les index Elasticsearch dans les visualisations TSVB.", "visTypeTimeseries.agg.aggIsNotSupportedDescription": "L'agrégation {modelType} n'est plus prise en charge.", - "visTypeTimeseries.agg.aggIsUnsupportedForPanelConfigDescription": "L'agrégation {modelType} n'est pas prise en charge pour la configuration de panneau existante.", + "visTypeTimeseries.agg.aggIsUnsupportedForPanelConfigDescription": "l'agrégation {modelType} n’est pas compatible pour la configuration de panneau existante.", "visTypeTimeseries.annotationRequest.label": "Annotation : {id}", - "visTypeTimeseries.annotationsEditor.rowTemplateHelpText": "Par ex. {rowTemplateExample}", - "visTypeTimeseries.axisLabelOptions.axisLabel": "par {unitValue} {unitString}", + "visTypeTimeseries.annotationsEditor.rowTemplateHelpText": "eg.{rowTemplateExample}", + "visTypeTimeseries.axisLabelOptions.axisLabel": "par {unitValue} {unitString}", "visTypeTimeseries.calculateLabel.metricTypeOfMetricFieldRankLabel": "{metricTypeLabel} de {metricField}", "visTypeTimeseries.calculateLabel.metricTypeOfTargetLabel": "{metricTypeLabel} de {targetLabel}", "visTypeTimeseries.calculateLabel.metricTypeOfTargetWithAdditionalLabel": "{metricTypeLabel} de {targetLabel} ({additionalLabel})", "visTypeTimeseries.calculateLabel.positiveRateLabel": "Taux de compteur de {field}", "visTypeTimeseries.calculateLabel.seriesAggLabel": "Agrégation de séries ({metricFunction})", "visTypeTimeseries.calculateLabel.staticValueLabel": "Valeur statique de {metricValue}", - "visTypeTimeseries.calculation.painlessScriptDescription": "Les variables sont des clés sur l'objet {params} , c.-à-d. {paramsName}. Pour accéder à l'intervalle de compartiment (en millisecondes), utilisez {paramsInterval}.", - "visTypeTimeseries.colorPicker.notAccessibleWithValueAriaLabel": "Sélecteur de couleur ({value}), inaccessible", - "visTypeTimeseries.colorRules.setPrimaryColorLabel": "Définir {primaryName} sur", + "visTypeTimeseries.calculation.painlessScriptDescription": "Les variables sont des clés sur l'objet {params}, c.-à-d. {paramsName}. Pour accéder à l'intervalle de compartiment (en millisecondes), utilisez {paramsInterval}.", + "visTypeTimeseries.colorPicker.notAccessibleWithValueAriaLabel": "Sélecteur de couleur ({value}), non accessible", + "visTypeTimeseries.colorRules.setPrimaryColorLabel": "Définissez {primaryName} sur", "visTypeTimeseries.colorRules.setSecondaryColorLabel": "et {secondaryName} sur", - "visTypeTimeseries.dataFormatPicker.formatPatternLabel": "Modèle de format Numeral.js (Par défaut : {defaultPattern})", + "visTypeTimeseries.dataFormatPicker.formatPatternLabel": "Modèle de format Numeral.js (par défaut : {defaultPattern})", "visTypeTimeseries.errors.dataViewNotFoundError": "Impossible de trouver la vue de données : {dataViewId}", "visTypeTimeseries.errors.fieldNotFound": "Champ \"{field}\" introuvable", "visTypeTimeseries.externalUrlErrorModal.bodyMessage": "Configurez {externalUrlPolicy} dans votre {kibanaConfigFileName} pour autoriser l'accès à {url}.", "visTypeTimeseries.fieldSelect.fieldIsNotValid": "La sélection \"{fieldParameter}\" n'est pas valide pour une utilisation avec l'index actuel.", - "visTypeTimeseries.fieldUtils.multiFieldLabel": "{firstFieldLabel} + {count} {count, plural, one {autre} many {autres} other {autres}}", + "visTypeTimeseries.fieldUtils.multiFieldLabel": "{firstFieldLabel} + {count} {count, plural, one {autre} other {autres}}", "visTypeTimeseries.indexPattern.detailLevelHelpText": "Contrôle les intervalles auto et gte en fonction de la plage temporelle. Les paramètres avancés {histogramTargetBars} et {histogramMaxBars} ont un impact sur l'intervalle par défaut.", "visTypeTimeseries.indexPattern.timeRange.error": "Vous ne pouvez pas utiliser \"{mode}\" avec le type d'index actuel.", "visTypeTimeseries.indexPatternSelect.defaultDataViewText": "Utilisation de la vue de données par défaut. {queryAllIndicesHelpText}", @@ -6466,22 +7350,22 @@ "visTypeTimeseries.lastValueModeIndicator.panelInterval": "Intervalle : {formattedPanelInterval}", "visTypeTimeseries.markdownEditor.howToAccessEntireTreeDescription": "Il existe également une variable spéciale nommée {all} que vous pouvez utiliser pour accéder à l'ensemble de l'arborescence. C'est utile pour créer des listes avec des données à l'aide d'une action Regrouper par :", "visTypeTimeseries.markdownEditor.howToUseVariablesInMarkdownDescription": "Les variables suivantes peuvent être utilisées dans Markdown à l'aide de la syntaxe Handlebar (moustache). {handlebarLink} sur les expressions disponibles.", - "visTypeTimeseries.math.expressionDescription": "Ce champ utilise des expressions mathématiques de base (voir {link}). Les variables sont des clés sur l'objet {params}, c.-à-d. {paramsName} Pour accéder à toutes les données, utilisez {paramsValues} pour un tableau de valeurs et {paramsTimestamps} pour un tableau d'horodatages. {paramsTimestamp} est disponible pour l'horodatage du compartiment actuel, {paramsIndex} est disponible pour l'index du compartiment actuel et {paramsInterval} est disponible pour l'intervalle en millisecondes.", + "visTypeTimeseries.math.expressionDescription": "Ce champ utilise des expressions mathématiques de base (voir {link}). Les variables sont des clés sur l'objet {params}, c.-à-d. {paramsName}. Pour accéder à toutes les données, utilisez {paramsValues} pour un tableau de valeurs et {paramsTimestamps} pour un tableau d’horodatages. {paramsTimestamp} est disponible pour l'horodatage du compartiment actuel, {paramsIndex} est disponible pour l'index du compartiment actuel et {paramsInterval} est disponible pour l'intervalle en millisecondes.", "visTypeTimeseries.metricMissingErrorMessage": "Indicateur manquant {field}", "visTypeTimeseries.missingPanelConfigDescription": "Configuration de panneau manquante pour \"{modelType}\"", "visTypeTimeseries.positiveRate.helpText": "Cette agrégation ne doit être appliquée qu'à {link} ; il s'agit d'un raccourci pour appliquer Max., Dérivée et Positif uniquement à un champ.", - "visTypeTimeseries.replaceVars.errors.unknownVarDescription": "{badVar} est une variable inconnue", + "visTypeTimeseries.replaceVars.errors.unknownVarDescription": "{badVar} est une variable inconnue.", "visTypeTimeseries.seriesConfig.missingSeriesComponentDescription": "Composant de série manquant pour le type de panneau : {panelType}", - "visTypeTimeseries.seriesConfig.templateHelpText": "Par ex. {templateExample}", + "visTypeTimeseries.seriesConfig.templateHelpText": "par ex. {templateExample}", "visTypeTimeseries.seriesRequest.label": "Série : {id}", - "visTypeTimeseries.table.optionsTab.itemUrlHelpText": "Prend en charge les modèles moustache. {key} est défini sur le terme.", - "visTypeTimeseries.table.templateHelpText": "Par ex. {templateExample}", + "visTypeTimeseries.table.optionsTab.itemUrlHelpText": "Prend en charge les modèles de moustaches. {key} est défini sur le terme.", + "visTypeTimeseries.table.templateHelpText": "par ex. {templateExample}", "visTypeTimeseries.tableRequest.label": "Tableau : {id}", - "visTypeTimeseries.timeSeries.templateHelpText": "Par ex. {templateExample}", - "visTypeTimeseries.topN.optionsTab.itemUrlDescription": "Prend en charge les modèles moustache. {key} est défini sur le terme.", + "visTypeTimeseries.timeSeries.templateHelpText": "par ex. {templateExample}", + "visTypeTimeseries.topN.optionsTab.itemUrlDescription": "Prend en charge les modèles de moustaches. {key} est défini sur le terme.", "visTypeTimeseries.unsupportedSplit.splitIsUnsupportedDescription": "Diviser par {modelType} n'est pas pris en charge.", "visTypeTimeseries.visEditorVisualization.dataViewMode.notificationMessage": "Bonne nouvelle ! Vous pouvez visualiser les données des vues de données Kibana (recommandé) ou des index Elasticsearch. {indexPatternModeLink}.", - "visTypeTimeseries.wrongAggregationErrorMessage": "L'agrégation {metricType} n'est pas prise en charge pour la configuration de panneau existante.", + "visTypeTimeseries.wrongAggregationErrorMessage": "l'agrégation {metricType} n’est pas compatible pour la configuration de panneau existante.", "visTypeTimeseries.addDeleteButtons.addButtonDefaultTooltip": "Ajouter", "visTypeTimeseries.addDeleteButtons.cloneButtonDefaultTooltip": "Cloner", "visTypeTimeseries.addDeleteButtons.deleteButtonDefaultTooltip": "Supprimer", @@ -6992,10 +7876,10 @@ "visTypeVega.emsFileParser.emsFileNameDoesNotExistErrorMessage": "{emsfile} {emsfileName} n'existe pas", "visTypeVega.emsFileParser.missingNameOfFileErrorMessage": "{dataUrlParam} avec {dataUrlParamValue} requiert le paramètre {nameParam} (nom du fichier)", "visTypeVega.esQueryParser.autointervalValueTypeErrorMessage": "{autointerval} doit être {trueValue} ou un nombre", - "visTypeVega.esQueryParser.dataUrlMustNotHaveLegacyAndBodyQueryValuesAtTheSameTimeErrorMessage": "{dataUrlParam} ne doit pas avoir de {legacyContext} existant et de {bodyQueryConfigName} en même temps", + "visTypeVega.esQueryParser.dataUrlMustNotHaveLegacyAndBodyQueryValuesAtTheSameTimeErrorMessage": "{dataUrlParam} ne doit pas avoir de {legacyContext} existant et de valeurs {bodyQueryConfigName} en même temps", "visTypeVega.esQueryParser.dataUrlMustNotHaveLegacyContextTogetherWithContextOrTimefieldErrorMessage": "{dataUrlParam} ne doit pas avoir de {legacyContext} avec {context} ou {timefield}", - "visTypeVega.esQueryParser.legacyContextCanBeTrueErrorMessage": "Le {legacyContext} existant peut être {trueValue} (ignore le sélecteur de plage temporelle), ou il peut s'agir du nom du champ temporel, par exemple {timestampParam}", - "visTypeVega.esQueryParser.legacyUrlShouldChangeToWarningMessage": "{urlParam} existant : {legacyUrl} doit être remplacé par {result}", + "visTypeVega.esQueryParser.legacyContextCanBeTrueErrorMessage": "{legacyContext} existant peut être {trueValue} (ignore le sélecteur de plage temporelle), ou il peut s'agir du nom du champ temporel, par ex. {timestampParam}", + "visTypeVega.esQueryParser.legacyUrlShouldChangeToWarningMessage": "{urlParam} existant : {legacyUrl} doit être modifié en {result}", "visTypeVega.esQueryParser.shiftMustValueTypeErrorMessage": "{shiftParam} doit être une valeur numérique", "visTypeVega.esQueryParser.timefilterValueErrorMessage": "La propriété {timefilter} doit être définie sur {trueValue}, {minValue} ou {maxValue}", "visTypeVega.esQueryParser.unknownUnitValueErrorMessage": "Valeur {unitParamName} inconnue. Doit être l'une des valeurs suivantes : [{unitParamValues}]", @@ -7003,8 +7887,8 @@ "visTypeVega.esQueryParser.urlBodyValueTypeErrorMessage": "{configName} doit être un objet", "visTypeVega.esQueryParser.urlContextAndUrlTimefieldMustNotBeUsedErrorMessage": "{urlContext} et {timefield} ne doivent pas être utilisés lorsque {queryParam} est défini", "visTypeVega.inspector.dataViewer.gridAriaLabel": "Grille de données {name}", - "visTypeVega.mapView.experimentalMapLayerInfo": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités dans la version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale. Pour apporter des commentaires, veuillez créer une entrée dans {githubLink}.", - "visTypeVega.mapView.mapStyleNotFoundWarningMessage": "{mapStyleParam} introuvable", + "visTypeVega.mapView.experimentalMapLayerInfo": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera de corriger tous les problèmes, mais les fonctionnalités dans la version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale. Pour apporter des commentaires, veuillez créer une entrée dans {githubLink}.", + "visTypeVega.mapView.mapStyleNotFoundWarningMessage": "{mapStyleParam} est introuvable", "visTypeVega.mapView.minZoomAndMaxZoomHaveBeenSwappedWarningMessage": "{minZoomPropertyName} et {maxZoomPropertyName} ont été permutés", "visTypeVega.mapView.resettingPropertyToMaxValueWarningMessage": "Réinitialisation de {name} sur {max}", "visTypeVega.mapView.resettingPropertyToMinValueWarningMessage": "Réinitialisation de {name} sur {min}", @@ -7012,19 +7896,19 @@ "visTypeVega.urlParser.urlShouldHaveQuerySubObjectWarningMessage": "L'utilisation d'un {urlObject} requiert un sous-objet {subObjectName}", "visTypeVega.vegaParser.autoSizeDoesNotAllowFalse": "{autoSizeParam} est activé ; il peut uniquement être désactivé en définissant {autoSizeParam} sur {noneParam}", "visTypeVega.vegaParser.baseView.externalUrlsAreNotEnabledErrorMessage": "Les URL externes ne sont pas activées. Ajouter {enableExternalUrls} à {kibanaConfigFileName}", - "visTypeVega.vegaParser.baseView.externalUrlServiceErrorMessage": "L'URL externe [{uri}] a été refusée par le service ExternalUrl. Vous pouvez configurer des politiques d'URL externe avec le paramètre \"{externalUrlPolicy}\" dans {kibanaConfigFileName}.", + "visTypeVega.vegaParser.baseView.externalUrlServiceErrorMessage": "l'URL externe [{uri}] a été refusée par le service ExternalUrl. Vous pouvez configurer des politiques d'URL externe avec le paramètre \"{externalUrlPolicy}\" dans {kibanaConfigFileName}.", "visTypeVega.vegaParser.baseView.functionIsNotDefinedForGraphErrorMessage": "{funcName} n'est pas défini pour ce graphe", - "visTypeVega.vegaParser.baseView.indexNotFoundErrorMessage": "Index {index} introuvable", + "visTypeVega.vegaParser.baseView.indexNotFoundErrorMessage": "Impossible de trouver l'index {index}", "visTypeVega.vegaParser.baseView.timeValuesTypeErrorMessage": "Erreur lors de la définition du filtre de temps : les deux valeurs temporelles doivent être des dates relatives ou absolues. {start}, {end}", - "visTypeVega.vegaParser.centerOnMarkConfigValueTypeErrorMessage": "La valeur attendue pour {configName} est {trueValue}, {falseValue} ou un nombre", + "visTypeVega.vegaParser.centerOnMarkConfigValueTypeErrorMessage": "Les valeurs attendues pour {configName} sont {trueValue}, {falseValue} ou un nombre", "visTypeVega.vegaParser.dataExceedsSomeParamsUseTimesLimitErrorMessage": "Les données ne doivent pas avoir plus d'un paramètre {urlParam}, {valuesParam} et {sourceParam}", "visTypeVega.vegaParser.hostConfigIsDeprecatedWarningMessage": "{deprecatedConfigName} a été déclassé. Utilisez {newConfigName} à la place.", - "visTypeVega.vegaParser.hostConfigValueTypeErrorMessage": "S'il est présent, le {configName} doit être un objet", + "visTypeVega.vegaParser.hostConfigValueTypeErrorMessage": "S'il est présent, le paramètre {configName} doit être un objet", "visTypeVega.vegaParser.inputSpecDoesNotSpecifySchemaErrorMessage": "Vos spécifications requièrent un champ {schemaParam} avec une URL valide pour\nVega (voir {vegaSchemaUrl}) ou\nVega-Lite (voir {vegaLiteSchemaUrl}).\nL'URL est uniquement un identificateur. Kibana et votre navigateur n'accéderont jamais à cette URL.", - "visTypeVega.vegaParser.kibanaConfigValueTypeErrorMessage": "S'il est présent, le {configName} doit être un objet", + "visTypeVega.vegaParser.kibanaConfigValueTypeErrorMessage": "S'il est présent, le paramètre {configName} doit être un objet", "visTypeVega.vegaParser.maxBoundsValueTypeWarningMessage": "{maxBoundsConfigName} doit être un tableau avec quatre nombres", "visTypeVega.vegaParser.notSupportedUrlTypeErrorMessage": "{urlObject} n'est pas pris en charge", - "visTypeVega.vegaParser.notValidLibraryVersionForInputSpecWarningMessage": "Les spécifications d'entrée utilisent {schemaLibrary} {schemaVersion}, mais la version actuelle de {schemaLibrary} est {libraryVersion}.", + "visTypeVega.vegaParser.notValidLibraryVersionForInputSpecWarningMessage": "Les spécifications d'entrée utilisent {schemaLibrary} {schemaVersion}, mais la version actuelle de {schemaLibrary} est {libraryVersion}.", "visTypeVega.vegaParser.paddingConfigValueTypeErrorMessage": "La valeur attendue pour {configName} est un nombre", "visTypeVega.vegaParser.someKibanaConfigurationIsNoValidWarningMessage": "{configName} n'est pas valide", "visTypeVega.vegaParser.someKibanaParamValueTypeWarningMessage": "{configName} doit être une valeur booléenne", @@ -7033,7 +7917,7 @@ "visTypeVega.vegaParser.unrecognizedControlsLocationValueErrorMessage": "Valeur {controlsLocationParam} non reconnue. Valeur attendue parmi [{locToDirMap}]", "visTypeVega.vegaParser.unrecognizedDirValueErrorMessage": "Valeur {dirParam} non reconnue. Valeur attendue parmi [{expectedValues}]", "visTypeVega.vegaParser.widthAndHeightParamsAreIgnored": "Les paramètres {widthParam} et {heightParam} sont ignorés, car {autoSizeParam} est activé. Pour le désactiver, définissez {autoSizeParam} sur {noneParam}", - "visTypeVega.vegaParser.widthAndHeightParamsAreRequired": "Aucun rendu n'est généré lorsque {autoSizeParam} est défini sur {noneParam}quand les spécifications {vegaLiteParam} à facette ou répétées sont utilisées. Pour y remédier, retirez {autoSizeParam} ou utilisez {vegaParam}.", + "visTypeVega.vegaParser.widthAndHeightParamsAreRequired": "Aucun rendu n'est généré lorsque {autoSizeParam} est défini sur {noneParam} quand les spécifications {vegaLiteParam} à facette ou répétées sont utilisées. Pour y remédier, retirez {autoSizeParam} ou utilisez {vegaParam}.", "visTypeVega.editor.formatError": "Erreur lors du formatage des spécifications", "visTypeVega.editor.reformatAsHJSONButtonLabel": "Reformater en HJSON", "visTypeVega.editor.reformatAsJSONButtonLabel": "Reformater en JSON, supprimer les commentaires", @@ -7067,7 +7951,7 @@ "visTypeVislib.vislib.legend.filterForValueButtonAriaLabel": "Filtrer sur {legendDataLabel}", "visTypeVislib.vislib.legend.filterOptionsLegend": "{legendDataLabel}, options de filtre", "visTypeVislib.vislib.legend.filterOutValueButtonAriaLabel": "Exclure {legendDataLabel}", - "visTypeVislib.vislib.legend.toggleOptionsButtonAriaLabel": "{legendDataLabel}, activer/désactiver les options", + "visTypeVislib.vislib.legend.toggleOptionsButtonAriaLabel": "{legendDataLabel}, options de basculement", "visTypeVislib.advancedSettings.visualization.heatmap.maxBucketsText": "Nombre maximal de groupes pouvant être renvoyés par une source de données unique. Un nombre plus élevé pourra impacter négativement les performances de rendu du navigateur", "visTypeVislib.advancedSettings.visualization.heatmap.maxBucketsTitle": "Nombre maximal de groupes pour la carte thermique", "visTypeVislib.aggResponse.allDocsTitle": "Tous les docs", @@ -7076,8 +7960,8 @@ "visTypeVislib.vislib.legend.loadingLabel": "chargement…", "visTypeVislib.vislib.legend.toggleLegendButtonAriaLabel": "Basculer la légende", "visTypeVislib.vislib.legend.toggleLegendButtonTitle": "Afficher/Masquer la légende", - "visTypeXy.controls.pointSeries.seriesAccordionAriaLabel": "Activer/désactiver les options {agg}", - "visTypeXy.controls.pointSeries.valueAxes.toggleOptionsAriaLabel": "Activer/désactiver les options {axisName}", + "visTypeXy.controls.pointSeries.seriesAccordionAriaLabel": "Basculer les options {agg}", + "visTypeXy.controls.pointSeries.valueAxes.toggleOptionsAriaLabel": "Basculer les options {axisName}", "visTypeXy.allDocsTitle": "Tous les docs", "visTypeXy.area.areaDescription": "Mettez en avant les données entre un axe et une ligne.", "visTypeXy.area.areaTitle": "Aire", @@ -7194,28 +8078,28 @@ "visTypeXy.thresholdLine.style.dashedText": "Tirets", "visTypeXy.thresholdLine.style.dotdashedText": "Point-tiret", "visTypeXy.thresholdLine.style.fullText": "Pleine", - "visualizations.byValue_pageHeading": "Visualisation de type {chartType} incorporée dans l'application {originatingApp}", - "visualizations.confirmModal.overwriteConfirmationMessage": "Voulez-vous vraiment écraser {title} ?", + "visualizations.byValue_pageHeading": "Visualisation de type {chartType} intégrée à l'application {originatingApp}", + "visualizations.confirmModal.overwriteConfirmationMessage": "Êtes-vous sûr de vouloir écraser {title} ?", "visualizations.confirmModal.overwriteTitle": "Écraser {name} ?", "visualizations.confirmModal.saveDuplicateConfirmationMessage": "L'enregistrement de \"{name}\" crée un doublon de titre. Voulez-vous tout de même enregistrer ?", - "visualizations.editVisualization.readOnlyErrorMessage": "Les visualisations {visTypeTitle} sont en lecture seule et ne peuvent pas être ouvertes dans l’éditeur", + "visualizations.editVisualization.readOnlyErrorMessage": "Les visualisations {visTypeTitle} sont en lecture seule et ne peuvent pas être ouvertes dans l'éditeur", "visualizations.embeddable.legacyURLConflict.errorMessage": "Cette visualisation a la même URL qu'un alias hérité. Désactiver l'alias pour résoudre cette erreur : {json}", - "visualizations.experimentalVisInfoText": "Elle pourra être modifiée ou supprimée totalement dans une prochaine version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale. Pour apporter des commentaires, veuillez créer une entrée dans {githubLink}.", + "visualizations.experimentalVisInfoText": "Elle pourra être modifiée ou supprimée totalement dans une prochaine version. Elastic s'efforcera de corriger tous les problèmes, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale. Pour apporter des commentaires, veuillez créer une entrée dans {githubLink}.", "visualizations.fallbackDataView.label": "{type} introuvable", - "visualizations.function.findAccessorOrFail.error.accessor": "Le nom de la colonne ou l'index fourni n'est pas valide : {accessor}", + "visualizations.function.findAccessorOrFail.error.accessor": "Le nom de la colonne ou l'index fourni sont non valides : {accessor}", "visualizations.legacyUrlConflict.objectNoun": "Visualisation {visName}", - "visualizations.missedDataView.errorMessage": "Impossible de trouver {type} : {id}", + "visualizations.missedDataView.errorMessage": "Impossible de trouver le {type} : {id}", "visualizations.newChart.conditionalMessage.newLibrary": "Passer à la bibliothèque {type} dans {link}", "visualizations.newGaugeChart.notificationMessage": "La nouvelle bibliothèque de graphiques de jauge ne prend pas encore en charge l'agrégation de graphiques fractionnés. {conditionalMessage}", "visualizations.newVisWizard.newVisTypeTitle": "Nouveau {visTypeName}", - "visualizations.newVisWizard.resultsFound": "{resultCount, plural, one {type} many {types} other {types}} trouvé(s)", + "visualizations.newVisWizard.resultsFound": "{resultCount, plural, one {type trouvé} other {types trouvés}}", "visualizations.noMatchRoute.bannerText": "L'application Visualize ne reconnaît pas cet itinéraire : {route}.", "visualizations.oldPieChart.notificationMessage": "Vous utilisez la bibliothèque de graphiques existante qui sera supprimée dans une prochaine version. {conditionalMessage}", - "visualizations.pageHeading": "Visualisation {chartName} {chartType}", + "visualizations.pageHeading": "Visualisation {chartType} {chartName}", "visualizations.reporting.defaultReportTitle": "Visualisation [{date}]", "visualizations.topNavMenu.updatePanel": "Mettre à jour le panneau sur {originatingAppName}", "visualizations.visualizationTypeInvalidMessage": "Type de visualisation non valide \"{visType}\"", - "visualizations.visualizeListingDashboardFlowDescription": "Vous créez un tableau de bord ? Créez et ajoutez vos visualisations directement depuis {dashboardApp}.", + "visualizations.visualizeListingDashboardFlowDescription": "Vous créez un tableau de bord ? Créez et ajoutez vos visualisations directement depuis l'{dashboardApp}.", "visualizations.visualizeListingDeleteErrorTitle.duplicateWarning": "L'enregistrement de \"{value}\" crée un doublon de titre.", "visualizations.actions.editInLens.displayName": "Convertir pour une utilisation dans Lens", "visualizations.badge.readOnly.text": "Lecture seule", @@ -7261,12 +8145,13 @@ "visualizations.listing.createNew.description": "Vous pouvez créer différentes visualisations basées sur vos données.", "visualizations.listing.createNew.title": "Créer votre première visualisation", "visualizations.listing.experimentalTitle": "Version d'évaluation technique", - "visualizations.listing.experimentalTooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale.", + "visualizations.listing.experimentalTooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera de corriger tout problème, mais les fonctionnalités des versions d'évaluation technique ne sont pas soumises aux SLA de support des fonctionnalités officielles en disponibilité générale.", "visualizations.listing.table.entityName": "visualisation", "visualizations.listing.table.entityNamePlural": "visualisations", "visualizations.listing.table.listTitle": "Bibliothèque Visualize", "visualizations.listing.table.typeColumnName": "Type", "visualizations.listingPageTitle": "Bibliothèque Visualize", + "visualizations.managedBadgeTooltip": "Cette visualisation est gérée par Elastic. Les modifications effectuées ici doivent être enregistrées dans une nouvelle visualisation.", "visualizations.missedDataView.dataViewReconfigure": "Recréez-la dans la page de gestion des vues de données.", "visualizations.newChart.conditionalMessage.advancedSettingsLink": "Paramètres avancés.", "visualizations.newChart.libraryMode.new": "nouveau", @@ -7275,7 +8160,7 @@ "visualizations.newVisWizard.aggBasedGroupTitle": "Basé sur une agrégation", "visualizations.newVisWizard.chooseSourceTitle": "Choisir une source", "visualizations.newVisWizard.experimentalTitle": "Version d'évaluation technique", - "visualizations.newVisWizard.experimentalTooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale.", + "visualizations.newVisWizard.experimentalTooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera de corriger tout problème, mais les fonctionnalités des versions d'évaluation technique ne sont pas soumises aux SLA de support des fonctionnalités officielles en disponibilité générale.", "visualizations.newVisWizard.exploreOptionLinkText": "Explorer les options", "visualizations.newVisWizard.filterVisTypeAriaLabel": "Filtrer un type de visualisation", "visualizations.newVisWizard.goBackLink": "Sélectionner une visualisation différente", @@ -7302,6 +8187,7 @@ "visualizations.topNavMenu.cancelButtonLabel": "Annuler", "visualizations.topNavMenu.goToLensButtonAriaLabel": "Rendez-vous sur Lens avec votre configuration actuelle", "visualizations.topNavMenu.goToLensButtonLabel": "Modifier la visualisation dans Lens", + "visualizations.topNavMenu.mustCopyOnSave": "Cette visualisation est gérée par Elastic. Les modifications effectuées ici doivent être enregistrées dans une nouvelle visualisation.", "visualizations.topNavMenu.openInspectorButtonAriaLabel": "Ouvrir l'Inspecteur pour la visualisation", "visualizations.topNavMenu.openInspectorButtonLabel": "inspecter", "visualizations.topNavMenu.openInspectorDisabledButtonTooltip": "Cette visualisation ne prend en charge aucun inspecteur.", @@ -7364,7 +8250,7 @@ "xpack.actions.actionTypeRegistry.register.missingSupportedFeatureIds": "Au moins une valeur \"supportedFeatureId\" doit être fournie pour le type de connecteur \"{connectorTypeId}\".", "xpack.actions.apiAllowedHostsError": "erreur lors de la configuration de l'action du connecteur : {message}", "xpack.actions.disabledActionTypeError": "le type d'action \"{actionType}\" n'est pas activé dans la configuration Kibana xpack.actions.enabledActionTypes", - "xpack.actions.savedObjects.onImportText": "{connectorsWithSecretsLength} {connectorsWithSecretsLength, plural, one {connecteur a} many {connecteurs ont} other {connecteurs ont}} des informations sensibles qui nécessitent des mises à jour.", + "xpack.actions.savedObjects.onImportText": "{connectorsWithSecretsLength} {connectorsWithSecretsLength, plural, one {Le connecteur contient} other {Les connecteurs contiennent}} des informations sensibles qui requièrent des mises à jour.", "xpack.actions.serverSideErrors.expirerdLicenseErrorMessage": "Le type d'action {actionTypeId} est désactivé, car votre licence {licenseType} a expiré.", "xpack.actions.serverSideErrors.invalidLicenseErrorMessage": "Le type d'action {actionTypeId} est désactivé, car votre licence {licenseType} ne le prend pas en charge. Veuillez mettre à niveau votre licence.", "xpack.actions.serverSideErrors.predefinedActionDeleteDisabled": "L'action préconfigurée {id} n'est pas autorisée à effectuer des suppressions.", @@ -7383,51 +8269,59 @@ "xpack.actions.availableConnectorFeatures.cases": "Cas", "xpack.actions.availableConnectorFeatures.compatibility.alertingRules": "Règles d'alerting", "xpack.actions.availableConnectorFeatures.compatibility.cases": "Cas", + "xpack.actions.availableConnectorFeatures.compatibility.generativeAIForObservability": "IA générative pour l'observabilité", + "xpack.actions.availableConnectorFeatures.compatibility.generativeAIForSecurity": "IA générative pour la sécurité", "xpack.actions.availableConnectorFeatures.securitySolution": "Solution de sécurité", "xpack.actions.availableConnectorFeatures.uptime": "Uptime", "xpack.actions.builtin.cases.jiraTitle": "Jira", "xpack.actions.featureRegistry.actionsFeatureName": "Actions et connecteurs", "xpack.actions.savedObjects.goToConnectorsButtonText": "Accéder aux connecteurs", "xpack.actions.serverSideErrors.unavailableLicenseInformationErrorMessage": "Les actions sont indisponibles - les informations de licence ne sont pas disponibles actuellement.", - "xpack.aiops.analysis.errorCallOutTitle": "{errorCount, plural, one {erreur} many {erreurs} other {erreurs}} lors de l'analyse.", + "xpack.aiops.analysis.errorCallOutTitle": "Génération {errorCount, plural, one {de l'erreur suivante} other {des erreurs suivantes}} au cours de l'analyse.", "xpack.aiops.categorizeFlyout.title": "Analyse du modèle de {name}", "xpack.aiops.changePointDetection.attachmentTitle": "Point de modification : {function}({metric}){splitBy}", - "xpack.aiops.changePointDetection.cardinalityWarningMessage": "La cardinalité du champ \"{splitField}\" est {cardinality}, ce qui dépasse la limite de {cardinalityLimit}. Seules les {cardinalityLimit} premières partitions, triées par nombre de documents, sont analysées.", + "xpack.aiops.changePointDetection.cardinalityWarningMessage": "La cardinalité des champs \"{splitField}\" est {cardinality}, ce qui excède la limite de {cardinalityLimit}. Seules les {cardinalityLimit} premières partitions, triées par nombre de documents, sont analysées.", "xpack.aiops.changePointDetection.maxSeriesToPlotError": "La valeur maximale de la série doit être comprise entre {minValue} et {maxValue}", - "xpack.aiops.changePointDetection.splitByTitle": " divisé par \"{splitField}\"", + "xpack.aiops.changePointDetection.splitByTitle": " diviser par \"{splitField}\"", "xpack.aiops.dataViewNotBasedOnTimeSeriesWarning.title": "La vue de données \"{dataViewTitle}\" n'est pas basée sur une série temporelle.", "xpack.aiops.index.dataLoader.internalServerErrorMessage": "Erreur lors du chargement des données dans l'index {index}. {message}. La requête a peut-être expiré. Essayez d'utiliser un échantillon d'une taille inférieure ou de réduire la plage temporelle.", "xpack.aiops.index.dataViewWithoutMetricNotificationTitle": "La vue de données \"{dataViewTitle}\" ne contient aucun champ d'indicateurs.", "xpack.aiops.index.errorLoadingDataMessage": "Erreur lors du chargement des données dans l'index {index}. {message}.", - "xpack.aiops.logCategorization.counts": "{count} {count, plural, one {le modèle} many {Modèles d''indexation manquants} other {Modèles d''indexation manquants}}", + "xpack.aiops.logCategorization.counts": "{count} {count, plural, one {Modèle trouvé} other {Modèles trouvés}}", "xpack.aiops.logCategorization.filterAliasLabel": "Catégorisation - {field}", - "xpack.aiops.logCategorization.filterIn": "Filtrer sur {values, plural, one {un modèle} many {Modèles d''indexation manquants} other {des modèles}} dans Discover", - "xpack.aiops.logCategorization.filterOut": "Exclure {values, plural, one {un modèle} many {Modèles d''indexation manquants} other {des modèles}} dans Discover", - "xpack.aiops.logCategorization.flyout.filterIn": "Filtrer sur {values, plural, one {un modèle} many {Modèles d''indexation manquants} other {des modèles}}", - "xpack.aiops.logCategorization.flyout.filterOut": "Exclure {values, plural, one {un modèle} many {Modèles d''indexation manquants} other {des modèles}}", + "xpack.aiops.logCategorization.filterIn": "Filtrer sur {values, plural, one {modèle} other {modèles}} dans Discover", + "xpack.aiops.logCategorization.filterOut": "Exclure {values, plural, one {modèle} other {modèles}} dans Discover", + "xpack.aiops.logCategorization.flyout.filterIn": "Filtrer sur {values, plural, one {modèle} other {modèles}}", + "xpack.aiops.logCategorization.flyout.filterOut": "Exclure {values, plural, one {modèle} other {modèles}}", "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.probabilityLabel": "Probabilité utilisée : {samplingProbability} %", "xpack.aiops.logCategorization.selectedCounts": " | {count} sélectionné(s)", - "xpack.aiops.logRateAnalysis.loadingState.identifiedFieldCandidates": "{fieldCandidatesCount, plural, one {# champ candidat a été identifié} many {# champs candidats ont été identifiés} other {# champs candidats ont été identifiés}}.", - "xpack.aiops.logRateAnalysis.loadingState.identifiedFieldValuePairs": "{fieldValuePairsCount, plural, one {# paire champ/valeur significative a été identifiée} many {# paires champ/valeur significatives ont été identifiées} other {# paires champ/valeur significatives ont été identifiées}}.", + "xpack.aiops.logRateAnalysis.loadingState.identifiedFieldCandidates": "{fieldCandidatesCount, plural, one {# candidat de champ identifié} other {# candidats de champs identifiés}}.", + "xpack.aiops.logRateAnalysis.loadingState.identifiedFieldValuePairs": "{fieldValuePairsCount, plural, one {# paire significative champ/valeur identifiée} other {# paires significatives champ/valeur identifiées}}.", "xpack.aiops.logRateAnalysis.resultsTableGroups.groupColumnTooltip": "Affiche jusqu'à {maxItemCount} éléments de groupe triés par unicité et nombre de documents. Développez la ligne pour voir toutes les paires champ/valeur.", - "xpack.aiops.logRateAnalysis.resultsTableGroups.groupItemsInfo": "Affichage de {valuesBadges} éléments sur {count}.", - "xpack.aiops.logRateAnalysis.resultsTableGroups.groupUniqueItemsInfo": "{count, plural, one {# élément} many {Éléments #} other {Éléments #}} unique(s) à ce groupe.", + "xpack.aiops.logRateAnalysis.resultsTableGroups.groupItemsInfo": "Affichage de {valuesBadges} sur {count} éléments.", + "xpack.aiops.logRateAnalysis.resultsTableGroups.groupUniqueItemsInfo": "{count, plural, one {# élément unique} other {# éléments uniques}} à ce groupe.", "xpack.aiops.progressTitle": "Progression : {progress} % — {progressMessage}", "xpack.aiops.searchPanel.sampleProbabilityLabel": "Probabilité d'échantillonnage : {strongSamplingProbability}", - "xpack.aiops.searchPanel.sampleProbabilityNumber": "{sampleProbability, plural, one {#} many {#} other {#}}", + "xpack.aiops.searchPanel.sampleProbabilityNumber": "{sampleProbability, plural, other {#}}", "xpack.aiops.searchPanel.totalDocCountLabel": "Total des documents : {strongTotalCount}", - "xpack.aiops.searchPanel.totalDocCountNumber": "{totalCount, plural, one {#} many {#} other {#}}", + "xpack.aiops.searchPanel.totalDocCountNumber": "{totalCount, plural, other {#}}", "xpack.aiops.actions.editChangePointChartsName": "Modifier les graphiques de points de modification", + "xpack.aiops.actions.openChangePointInMlAppName": "Ouvrir dans AIOps Labs", "xpack.aiops.analysis.analysisTypeDipCallOutContent": "Le taux de log médian pour la plage temporelle d'écart-type sélectionnée est inférieur à la référence de base. Le tableau des résultats de l'analyse présente donc des éléments statistiquement significatifs inclus dans la plage temporelle de base qui sont moins nombreux ou manquant dans la plage temporelle d'écart-type. La colonne \"doc count\" (décompte de documents) renvoie à la quantité de documents dans la plage temporelle de base.", + "xpack.aiops.analysis.analysisTypeDipCallOutContentFallback": "La plage temporelle de déviation ne contient aucun document. Les résultats montrent donc les catégories de message des meilleurs logs et les valeurs des champs pour la période de référence.", "xpack.aiops.analysis.analysisTypeDipCallOutTitle": "Type d'analyse : Baisse du taux de log", + "xpack.aiops.analysis.analysisTypeDipFallbackCallOutTitle": "Type d'analyse : Meilleurs éléments pour la plage temporelle de référence de base", "xpack.aiops.analysis.analysisTypeSpikeCallOutContent": "Le taux de log médian pour la plage temporelle d'écart-type sélectionnée est inférieur à la référence de base. Le tableau des résultats de l'analyse présente donc des éléments statistiquement significatifs inclus dans la plage temporelle d'écart-type, qui contribuent au pic. La colonne \"doc count\" (décompte de documents) renvoie à la quantité de documents dans la plage temporelle d'écart-type.", + "xpack.aiops.analysis.analysisTypeSpikeCallOutContentFallback": "La plage temporelle de référence de base ne contient aucun document. Les résultats montrent donc les catégories de message des meilleurs logs et les valeurs des champs pour la plage temporelle de déviation.", "xpack.aiops.analysis.analysisTypeSpikeCallOutTitle": "Type d'analyse : Pic du taux de log", + "xpack.aiops.analysis.analysisTypeSpikeFallbackCallOutTitle": "Type d'analyse : Meilleurs éléments pour la plage temporelle de déviation", "xpack.aiops.analysis.fieldSelectorAriaLabel": "Champs de filtre", "xpack.aiops.analysis.fieldSelectorNotEnoughFieldsSelected": "Le regroupement nécessite la sélection d'au moins 2 champs.", "xpack.aiops.analysis.fieldSelectorPlaceholder": "Recherche", "xpack.aiops.analysisCompleteLabel": "Analyse terminée", "xpack.aiops.cancelAnalysisButtonTitle": "Annuler", - "xpack.aiops.categorizeFieldAction.displayName": "Catégoriser le champ", + "xpack.aiops.categorizeFieldAction.displayName": "Analyse du modèle", + "xpack.aiops.categorizeFlyout.findAnomalies": "Trouver les anomalies dans les modèles", "xpack.aiops.categorizeFlyout.loading.title": "Chargement de l'analyse du modèle", "xpack.aiops.changePointDetection.actions.filterForValueAction": "Filtrer sur la valeur", "xpack.aiops.changePointDetection.actions.filterOutValueAction": "Exclure la valeur", @@ -7438,6 +8332,7 @@ "xpack.aiops.changePointDetection.attachChartsLabel": "Attacher les graphiques", "xpack.aiops.changePointDetection.attachSelectedChartsLabel": "Attacher les graphiques sélectionnés", "xpack.aiops.changePointDetection.attachToCaseLabel": "Accéder au cas", + "xpack.aiops.changePointDetection.attachToCaseTitle": "Attacher à un cas", "xpack.aiops.changePointDetection.attachToCaseTooltipContent": "Sélectionner les points de modification à attacher", "xpack.aiops.changePointDetection.attachToDashboardLabel": "Accéder au tableau de bord", "xpack.aiops.changePointDetection.attachToDashboardTitle": "Attacher au tableau de bord", @@ -7462,6 +8357,7 @@ "xpack.aiops.changePointDetection.notResultsWarning": "Avertissement de résultats agrégés d'absence de point de modification", "xpack.aiops.changePointDetection.notSelectedSplitFieldLabel": "--- Non sélectionné ---", "xpack.aiops.changePointDetection.objectTypeLabel": "Graphique de points de modification", + "xpack.aiops.changePointDetection.partitionsDescription": "Si aucune valeur n'est spécifiée, les principaux points de modifications parmi toutes les valeurs des champs divisés seront affichés.", "xpack.aiops.changePointDetection.partitionsLabel": "Partitions", "xpack.aiops.changePointDetection.previewColumn": "Aperçu", "xpack.aiops.changePointDetection.progressBarLabel": "Récupération des points de modification", @@ -7494,9 +8390,12 @@ "xpack.aiops.embeddableChangePointChart.dataViewLabel": "Vue de données", "xpack.aiops.embeddableChangePointChart.dataViewSelectorPlaceholder": "Sélectionner la vue de données", "xpack.aiops.embeddableChangePointChart.functionLabel": "Fonction", - "xpack.aiops.embeddableChangePointChart.modalTitle": "Configuration des graphiques de points de modification", + "xpack.aiops.embeddableChangePointChart.modalTitle": "Modifier la configuration de la détection des points", "xpack.aiops.embeddableChangePointChart.setupModal.cancelButtonLabel": "Annuler", "xpack.aiops.embeddableChangePointChart.setupModal.confirmButtonLabel": "Confirmer les configurations", + "xpack.aiops.embeddableChangePointChart.viewTypeLabel": "Type de vue", + "xpack.aiops.embeddableChangePointChart.viewTypeSelector.chartsLabel": "Graphiques", + "xpack.aiops.embeddableChangePointChart.viewTypeSelector.tableLabel": "Tableau", "xpack.aiops.embeddableChangePointChartDisplayName": "Modifier la détection du point", "xpack.aiops.fieldContextPopover.descriptionTooltipContent": "Afficher les principales valeurs de champ", "xpack.aiops.fieldContextPopover.descriptionTooltipLogPattern": "La valeur du champ pour ce champ montre un exemple du modèle de champ de texte important identifié.", @@ -7507,12 +8406,19 @@ "xpack.aiops.logCategorization.categoryFieldSelect": "Champ de catégorie", "xpack.aiops.logCategorization.chartPointsSplitLabel": "Modèle sélectionné", "xpack.aiops.logCategorization.column.actions": "Actions", + "xpack.aiops.logCategorization.column.collapseRow": "Réduire", "xpack.aiops.logCategorization.column.count": "Décompte", "xpack.aiops.logCategorization.column.examples": "Exemples", + "xpack.aiops.logCategorization.column.expandRow": "Développer", "xpack.aiops.logCategorization.column.logRate": "Taux du log", + "xpack.aiops.logCategorization.column.tokens": "Tokens", + "xpack.aiops.logCategorization.column.tokens.tooltip": "Les exemples de documents ne peuvent pas être affichés si le champ sélectionné est un alias. Affichage des jetons modèles à la place.", "xpack.aiops.logCategorization.emptyPromptBody": "L'analyse de modèle de log regroupe les messages dans des modèles courants.", "xpack.aiops.logCategorization.emptyPromptTitle": "Sélectionner un champ de texte et cliquer sur exécuter l'analyse du modèle pour lancer l'analyse", "xpack.aiops.logCategorization.errorLoadingCategories": "Erreur lors du chargement des catégories", + "xpack.aiops.logCategorization.expandedRow.title.examples": "Exemples", + "xpack.aiops.logCategorization.expandedRow.title.regex": "Regex", + "xpack.aiops.logCategorization.expandedRow.title.tokens": "Tokens", "xpack.aiops.logCategorization.fieldValidationTitle": "Le champ sélectionné est susceptible de ne pas être approprié pour une analyse du modèle", "xpack.aiops.logCategorization.noCategoriesBody": "Assurez-vous que le champ sélectionné est rempli dans la plage temporelle sélectionnée.", "xpack.aiops.logCategorization.noCategoriesTitle": "Aucun modèle n'a été trouvé", @@ -7532,6 +8438,10 @@ "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.randomSamplerPercentageRowLabel": "Pourcentage d'échantillonnage", "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.randomSamplerRowLabel": "Échantillonnage aléatoire", "xpack.aiops.logCategorization.runButton": "Exécuter l'analyse du modèle", + "xpack.aiops.logCategorization.tabs.bucket": "Compartiment", + "xpack.aiops.logCategorization.tabs.bucket.tooltip": "Modèles apparaissant dans le compartiment anormal.", + "xpack.aiops.logCategorization.tabs.fullTimeRange": "Plage temporelle entière", + "xpack.aiops.logCategorization.tabs.fullTimeRange.tooltip": "Modèles apparaissant dans la plage temporelle choisie pour la page.", "xpack.aiops.logCategorizationTimeSeriesWarning.description": "L'analyse du modèle de log ne fonctionne que sur des index temporels.", "xpack.aiops.logRateAnalysis.loadingState.doneMessage": "Terminé.", "xpack.aiops.logRateAnalysis.loadingState.groupingResults": "Transformation de paires champ/valeur significatives en groupes.", @@ -7558,6 +8468,7 @@ "xpack.aiops.logRateAnalysis.resultsTable.discoverNotEnabledErrorMessage": "Discover n'est pas activé", "xpack.aiops.logRateAnalysis.resultsTable.docCountLabel": "Compte du document", "xpack.aiops.logRateAnalysis.resultsTable.expandAriaLabel": "Développer", + "xpack.aiops.logRateAnalysis.resultsTable.expandRowsLabel": "Développer les lignes", "xpack.aiops.logRateAnalysis.resultsTable.fieldNameLabel": "Nom du champ", "xpack.aiops.logRateAnalysis.resultsTable.fieldValueLabel": "Valeur du champ", "xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResults": "Regroupement intelligent", @@ -7568,6 +8479,7 @@ "xpack.aiops.logRateAnalysis.resultsTable.impactLabelColumnTooltip": "Le niveau d'impact du champ sur la différence de taux de messages.", "xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardButtonLabel": "Copier dans le presse-papiers", "xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardGroupMessage": "Copier les éléments de groupe en tant que syntaxe KQL dans le Presse-papiers", + "xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardSignificantItemMessage": "Copier la paire clé-valeur en tant que syntaxe KQL dans le Presse-papiers", "xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInDiscover": "Afficher dans Discover", "xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInLogPatternAnalysis": "Voir dans l'analyse du modèle de log", "xpack.aiops.logRateAnalysis.resultsTable.logPatternLinkNotAvailableTooltipMessage": "Le lien n'est pas disponible si l'élément du tableau est lui-même un modèle de log.", @@ -7594,17 +8506,19 @@ "xpack.aiops.searchPanel.invalidSyntax": "Syntaxe non valide", "xpack.aiops.searchPanel.queryBarPlaceholderText": "Rechercher… (par exemple, status:200 AND extension:\"PHP\")", "xpack.aiops.techPreviewBadge.label": "Version d'évaluation technique", - "xpack.aiops.techPreviewBadge.tooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale.", + "xpack.aiops.techPreviewBadge.tooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera de corriger tout problème, mais les fonctionnalités des versions d'évaluation technique ne sont pas soumises aux SLA de support des fonctionnalités officielles en disponibilité générale.", "xpack.alerting.alertNavigationRegistry.get.missingNavigationError": "La navigation pour le type d'alerte \"{alertType}\" dans \"{consumer}\" n'est pas enregistrée.", "xpack.alerting.alertNavigationRegistry.register.duplicateDefaultError": "La navigation par défaut dans \"{consumer}\" est déjà enregistrée.", "xpack.alerting.alertNavigationRegistry.register.duplicateNavigationError": "La navigation pour le type d'alerte \"{alertType}\" dans \"{consumer}\" est déjà enregistrée.", - "xpack.alerting.maintenanceWindows.createForm.customFrequency.daily": "{interval, plural, one {jour} many {jours} other {jours}}", - "xpack.alerting.maintenanceWindows.createForm.customFrequency.monthly": "{interval, plural, one {mois} many {mois} other {mois}}", - "xpack.alerting.maintenanceWindows.createForm.customFrequency.weekly": "{interval, plural, one {semaine} many {semaines} other {semaines}}", - "xpack.alerting.maintenanceWindows.createForm.customFrequency.yearly": "{interval, plural, one {an} many {années} other {années}}", - "xpack.alerting.maintenanceWindows.createForm.daySummary": "{interval, plural, one {jour} many {# jours} other {# jours}}", + "xpack.alerting.injectActionParams.pagerduty.kibanaLinkText": "Règle Elastic \"{ruleName}\"", + "xpack.alerting.invalidWindowSizeErrorMessage": "Format non valide pour windowSize : \"{window}\"", + "xpack.alerting.maintenanceWindows.createForm.customFrequency.daily": "{interval, plural, one {jour} other {jours}}", + "xpack.alerting.maintenanceWindows.createForm.customFrequency.monthly": "{interval, plural, other {mois}}", + "xpack.alerting.maintenanceWindows.createForm.customFrequency.weekly": "{interval, plural, one {semaine} other {semaines}}", + "xpack.alerting.maintenanceWindows.createForm.customFrequency.yearly": "{interval, plural, one {an} other {ans}}", + "xpack.alerting.maintenanceWindows.createForm.daySummary": "{interval, plural, one {jour} other {# jours}}", "xpack.alerting.maintenanceWindows.createForm.firstShort": "Le premier {dayOfWeek}", - "xpack.alerting.maintenanceWindows.createForm.fourthShort": "Le quatrième {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.fourthShort": "Le 4e {dayOfWeek}", "xpack.alerting.maintenanceWindows.createForm.frequency.first": "Tous les mois le premier {dayOfWeek}", "xpack.alerting.maintenanceWindows.createForm.frequency.fourth": "Tous les mois le quatrième {dayOfWeek}", "xpack.alerting.maintenanceWindows.createForm.frequency.last": "Tous les mois le dernier {dayOfWeek}", @@ -7614,40 +8528,42 @@ "xpack.alerting.maintenanceWindows.createForm.frequency.yearlyOn": "Tous les ans le {date}", "xpack.alerting.maintenanceWindows.createForm.lastShort": "Le dernier {dayOfWeek}", "xpack.alerting.maintenanceWindows.createForm.monthlyByDaySummary": "le {monthday} du mois", - "xpack.alerting.maintenanceWindows.createForm.monthSummary": "{interval, plural, one {mois} many {# mois} other {# mois}}", - "xpack.alerting.maintenanceWindows.createForm.occurrencesSummary": "pour {count, plural, one {# occurrence} many {# occurrences} other {# occurrences}}", - "xpack.alerting.maintenanceWindows.createForm.recurrenceSummary": "chaque {frequencySummary}{on}{until}", + "xpack.alerting.maintenanceWindows.createForm.monthSummary": "{interval, plural, one {mois} other {# mois}}", + "xpack.alerting.maintenanceWindows.createForm.occurrencesSummary": "pour {count, plural, one {# occurrence} other {# occurrences}}", + "xpack.alerting.maintenanceWindows.createForm.recurrenceSummary": "tous les {frequencySummary}{on}{until}", "xpack.alerting.maintenanceWindows.createForm.recurringSummaryPrefix": "Répétition {summary}", "xpack.alerting.maintenanceWindows.createForm.repeatOnMonthlyDay": "Le {dayNumber}", - "xpack.alerting.maintenanceWindows.createForm.secondShort": "Le deuxième {dayOfWeek}", - "xpack.alerting.maintenanceWindows.createForm.thirdShort": "Le troisième {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.secondShort": "Le 2e {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.thirdShort": "Le 3e {dayOfWeek}", "xpack.alerting.maintenanceWindows.createForm.untilDateSummary": "jusqu'au {date}", "xpack.alerting.maintenanceWindows.createForm.weeklySummary": "le {weekdays}", - "xpack.alerting.maintenanceWindows.createForm.weekSummary": "{interval, plural, one {semaine} many {# semaines} other {# semaines}}", + "xpack.alerting.maintenanceWindows.createForm.weekSummary": "{interval, plural, one {semaine} other {# semaines}}", "xpack.alerting.maintenanceWindows.createForm.yearlyBymonthSummary": "le {date}", - "xpack.alerting.maintenanceWindows.createForm.yearSummary": "{interval, plural, one {an} many {# ans} other {# ans}}", + "xpack.alerting.maintenanceWindows.createForm.yearSummary": "{interval, plural, one {an} other {# ans}}", + "xpack.alerting.ruleCircuitBreaker.error.multipleRuleDetail": "Les règles ont {interval, plural, one {{interval} exécuté} other {{interval} exécutés}} par minute ; il n'y a {intervalAvailable, plural, one {qu'un seul {intervalAvailable} exécuté} other {que {intervalAvailable} exécutés}} par minute. Avant de pouvoir modifier ces règles, vous devez désactiver les autres règles ou modifier les intervalles de vérifications pour que celles-ci soient effectuées moins fréquemment.", + "xpack.alerting.ruleCircuitBreaker.error.ruleDetail": "La règle a {interval, plural, one {{interval} exécuté} other {{interval} exécutés}} par minute ; il y a seulement {intervalAvailable, plural, one {{intervalAvailable} exécuté} other {{intervalAvailable} exécutés}} par minute. Avant de pouvoir modifier ces règles, vous devez augmenter la fréquence des intervalles de vérification pour que celles-ci soient effectuées moins fréquemment. Vous pouvez également désactiver d'autres règles ou modifier leurs intervalles de vérification.", "xpack.alerting.rulesClient.invalidDate": "Date non valide pour le {field} de paramètre : \"{dateValue}\"", "xpack.alerting.rulesClient.runSoon.getTaskError": "Erreur lors de l'exécution de la règle : {errMessage}", "xpack.alerting.rulesClient.runSoon.runSoonError": "Erreur lors de l'exécution de la règle : {errMessage}", - "xpack.alerting.rulesClient.validateActions.actionsWithAlertsFilterWithoutSummaryGetter": "Ce type de règle ({ruleType}) ne peut pas avoir une action avec un filtre d'alertes. Actions : [{uuids}]", + "xpack.alerting.rulesClient.validateActions.actionsWithAlertsFilterWithoutSummaryGetter": "Ce type de règle ({ruleType}) ne peut pas avoir d'action avec un filtre d'alertes. Actions : [{uuids}]", "xpack.alerting.rulesClient.validateActions.actionsWithInvalidAlertsFilter": "Le filtre d'alertes de l'action doit avoir \"query\" ou \"timeframe\" : {uuids}", - "xpack.alerting.rulesClient.validateActions.actionsWithInvalidDays": "Les jours du filtre d'alertes de l'action a des valeurs non valides : {uuidAndDays}", + "xpack.alerting.rulesClient.validateActions.actionsWithInvalidDays": "Les jours du filtre d'alertes de l'action ont des valeurs non valides : {uuidAndDays}", "xpack.alerting.rulesClient.validateActions.actionsWithInvalidThrottles": "La fréquence de l'action ne peut pas être inférieure à l'intervalle de planification de {scheduleIntervalText} : {groups}", "xpack.alerting.rulesClient.validateActions.actionsWithInvalidTimeRange": "La plage temporelle du filtre d'alertes de l'action a une valeur non valide : {hours}", "xpack.alerting.rulesClient.validateActions.actionWithInvalidTimeframe": "La durée du filtre d'alertes de l'action a des champs manquants : jours, heures ou fuseau horaire : {uuids}", - "xpack.alerting.rulesClient.validateActions.errorSummary": "Impossible de valider les actions en raison {errorNum, plural, one {de l''erreur suivante :} many {des # erreurs suivantes :\n-} other {des # erreurs suivantes :\n-}} {errorList}", + "xpack.alerting.rulesClient.validateActions.errorSummary": "Impossible de valider les actions en raison {errorNum, plural, one {de l'erreur suivante :} other {des # erreurs suivantes :\n-}} {errorList}", "xpack.alerting.rulesClient.validateActions.invalidGroups": "Groupes d'actions non valides : {groups}", "xpack.alerting.rulesClient.validateActions.misconfiguredConnector": "Connecteurs non valides : {groups}", "xpack.alerting.rulesClient.validateActions.mixAndMatchFreqParams": "Impossible de spécifier des paramètres de fréquence par action lorsque notify_when et throttle sont définis au niveau de la règle : {groups}", "xpack.alerting.rulesClient.validateActions.notAllActionsWithFreq": "Paramètres de fréquence manquants pour les actions : {groups}", - "xpack.alerting.rulesClient.validateLegacyActions.errorSummary": "Échec de la migration des actions héritées pour la règle SIEM {ruleId} : {errorMessage}", + "xpack.alerting.rulesClient.validateLegacyActions.errorSummary": "Échec de la migration des actions existantes pour la règle SIEM {ruleId} : {errorMessage}", "xpack.alerting.ruleTypeRegistry.get.missingRuleTypeError": "Le type de règle \"{id}\" n'est pas enregistré.", "xpack.alerting.ruleTypeRegistry.register.customRecoveryActionGroupUsageError": "Le type de règle [id=\"{id}\"] ne peut pas être enregistré. Le groupe d'actions [{actionGroup}] ne peut pas être utilisé à la fois comme groupe de récupération et comme groupe d'actions actif.", "xpack.alerting.ruleTypeRegistry.register.duplicateRuleTypeError": "Le type de règle \"{id}\" est déjà enregistré.", "xpack.alerting.ruleTypeRegistry.register.invalidDefaultTimeoutRuleTypeError": "Le type de règle \"{id}\" a un intervalle par défaut non valide : {errorMessage}.", - "xpack.alerting.ruleTypeRegistry.register.invalidTimeoutRuleTypeError": "Le type de règle \"{id}\" a un délai d'expiration non valide : {errorMessage}.", + "xpack.alerting.ruleTypeRegistry.register.invalidTimeoutRuleTypeError": "Le type de règle \"{id}\" a un délai d'expiration non valide : {errorMessage}.", "xpack.alerting.ruleTypeRegistry.register.reservedActionGroupUsageError": "Le type de règle [id=\"{id}\"] ne peut pas être enregistré. Les groupes d'actions [{actionGroups}] sont réservés par le framework.", - "xpack.alerting.savedObjects.onImportText": "{rulesSavedObjectsLength} {rulesSavedObjectsLength, plural, one {règle} many {règles} other {règles}} doi(ven)t être activée(s) après l'importation.", + "xpack.alerting.savedObjects.onImportText": "{rulesSavedObjectsLength} {rulesSavedObjectsLength, plural, one {La règle doit être activée} other {Les règles doivent être activées}} après l'importation.", "xpack.alerting.serverSideErrors.expirerdLicenseErrorMessage": "Le type de règle {ruleTypeId} est désactivé, car votre licence {licenseType} a expiré.", "xpack.alerting.serverSideErrors.invalidLicenseErrorMessage": "La règle {ruleTypeId} est désactivée, car elle requiert une licence {licenseType}. Accédez à Gestion des licences pour consulter les options de mise à niveau.", "xpack.alerting.serverSideErrors.unavailableLicenseErrorMessage": "Le type de règle {ruleTypeId} est désactivé, car les informations de licence ne sont pas disponibles actuellement.", @@ -7658,8 +8574,10 @@ "xpack.alerting.breadcrumbs.editMaintenanceWindowsLinkText": "Modifier", "xpack.alerting.breadcrumbs.maintenanceWindowsLinkText": "Fenêtres de maintenance", "xpack.alerting.breadcrumbs.stackManagementLinkText": "Gestion de la Suite", + "xpack.alerting.feature.executionLogAggs.limitationQueryMsg": "Les résultats sont limités à 10 000 documents. Affinez votre recherche pour en voir d'autres.", "xpack.alerting.feature.flappingSettingsSubFeatureName": "Détection de bagotement", "xpack.alerting.feature.maintenanceWindowFeatureName": "Fenêtres de maintenance", + "xpack.alerting.feature.queryDelaySettingsSubFeatureName": "Retard de requête", "xpack.alerting.feature.rulesSettingsFeatureName": "Paramètres des règles", "xpack.alerting.getMaintenanceWindowFailure": "Impossible d'obtenir la fenêtre de maintenance.", "xpack.alerting.hooks.useGetRuleTypes.error": "Impossible de charger les types de règles.", @@ -7669,7 +8587,7 @@ "xpack.alerting.maintenanceWindows.archive.subtitle": "Les événements de fenêtre de maintenance à venir sont annulés et la fenêtre est mise en file d'attente pour suppression.", "xpack.alerting.maintenanceWindows.archive.title": "Archiver la fenêtre de maintenance", "xpack.alerting.maintenanceWindows.archiveCallout.subtitle": "Les modifications que vous avez apportées ici ne seront pas enregistrées. Voulez-vous vraiment abandonner ces modifications non enregistrées et archiver cette fenêtre de maintenance ?", - "xpack.alerting.maintenanceWindows.badge.experimentalDescription": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale.", + "xpack.alerting.maintenanceWindows.badge.experimentalDescription": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera de corriger tout problème, mais les fonctionnalités des versions d'évaluation technique ne sont pas soumises aux SLA de support des fonctionnalités officielles en disponibilité générale.", "xpack.alerting.maintenanceWindows.badge.experimentalLabel": "Version d'évaluation technique", "xpack.alerting.maintenanceWindows.badge.readOnly.text": "Lecture seule", "xpack.alerting.maintenanceWindows.badge.readOnly.tooltip": "Impossible de créer ou de modifier des fenêtres de maintenance", @@ -7709,6 +8627,11 @@ "xpack.alerting.maintenanceWindows.createForm.repeat": "Répéter", "xpack.alerting.maintenanceWindows.createForm.schedule": "Planification", "xpack.alerting.maintenanceWindows.createForm.scheduleInvalid": "La date de fin doit être supérieure ou égale à la date de début.", + "xpack.alerting.maintenanceWindows.createForm.scopedQuery.description": "Ajoutez des filtres pour affiner la portée de la fenêtre de maintenance. Vous ne pouvez sélectionner qu'une seule catégorie quand les filtres sont activés.", + "xpack.alerting.maintenanceWindows.createForm.scopedQuery.emptyErrorMessage": "Une requête ciblée est requise.", + "xpack.alerting.maintenanceWindows.createForm.scopedQuery.invalidErrorMessage": "Requête ciblée non valide.", + "xpack.alerting.maintenanceWindows.createForm.scopedQuery.title": "Filtres", + "xpack.alerting.maintenanceWindows.createForm.scopedQuery.toggleTitle": "Filtrer les alertes", "xpack.alerting.maintenanceWindows.createForm.timezone": "Fuseau horaire", "xpack.alerting.maintenanceWindows.createNewButton": "Créer la fenêtre", "xpack.alerting.maintenanceWindows.description": "Supprimez les notifications de règle pour des périodes planifiées.", @@ -7755,6 +8678,11 @@ "xpack.alerting.maintenanceWindowsUpdateFailure": "Impossible de mettre à jour la fenêtre de maintenance.", "xpack.alerting.maintenanceWindowsUpdateSuccess": "Fenêtre de maintenance mise à jour \"{title}\"", "xpack.alerting.management.section.title": "Fenêtres de maintenance", + "xpack.alerting.ruleCircuitBreaker.error.bulkEditSummary": "Impossible de modifier les règles en bloc. Le nombre maximal de tentatives par minute serait dépassé.", + "xpack.alerting.ruleCircuitBreaker.error.bulkEnableSummary": "Impossible d'activer les règles en bloc. Le nombre maximal de tentatives par minute serait dépassé.", + "xpack.alerting.ruleCircuitBreaker.error.createSummary": "La règle '{name}' ne peut pas être créée. Le nombre maximal de tentatives par minute serait dépassé.", + "xpack.alerting.ruleCircuitBreaker.error.enableSummary": "La règle '{name}' ne peut pas être activée. Le nombre maximal de tentatives par minute serait dépassé.", + "xpack.alerting.ruleCircuitBreaker.error.updateSummary": "La règle '{name}' ne peut pas être mise à jour. Le nombre maximal de tentatives par minute serait dépassé.", "xpack.alerting.rulesClient.runSoon.disabledRuleError": "Erreur lors de l'exécution de la règle : la règle est désactivée", "xpack.alerting.rulesClient.runSoon.ruleIsRunning": "La règle est déjà en cours d'exécution", "xpack.alerting.rulesClient.snoozeSchedule.limitReached": "La règle ne peut pas avoir plus de 5 planifications en répétition", @@ -7767,85 +8695,93 @@ "xpack.alerting.taskRunner.warning.maxExecutableActions": "Le nombre maximal d'actions pour ce type de règle a été atteint ; les actions excédentaires n'ont pas été déclenchées.", "xpack.alerting.taskRunner.warning.maxQueuedActions": "Le nombre maximal d'actions en file d'attente a été atteint ; les actions excédentaires n'ont pas été déclenchées.", "xpack.apm.agentConfig.deleteModal.text": "Vous êtes sur le point de supprimer la configuration du service \"{serviceName}\" et de l'environnement \"{environment}\".", - "xpack.apm.agentConfig.deleteSection.deleteConfigFailedText": "Une erreur est survenue lors de la suppression d'une configuration pour \"{serviceName}\". Erreur : \"{errorMessage}\"", - "xpack.apm.agentConfig.deleteSection.deleteConfigSucceededText": "Vous avez supprimé une configuration de \"{serviceName}\" avec succès. La propagation jusqu'aux agents pourra prendre un certain temps.", - "xpack.apm.agentConfig.range.errorText": "{rangeType, select, between {Doit être compris entre {min} et {max}} gt {Doit être supérieur à {min}} lt {Doit être inférieur à {max}} other {Doit être un nombre entier}}", + "xpack.apm.agentConfig.deleteSection.deleteConfigFailedText": "Une erreur est survenue lors de la suppression d'une configuration de \"{serviceName}\". Erreur : \"{errorMessage}\"", + "xpack.apm.agentConfig.deleteSection.deleteConfigSucceededText": "Vous avez supprimé une configuration de \"{serviceName}\". La propagation jusqu'aux agents pourra prendre un certain temps.", + "xpack.apm.agentConfig.range.errorText": "{rangeType, select,\n between {doit être compris entre {min} et {max}}\n gt {doit être supérieur à {min}}\n lt {doit être inférieur à {max}}\n other {doit être un entier}\n }", "xpack.apm.agentConfig.saveConfig.failed.text": "Une erreur est survenue pendant l'enregistrement de la configuration de \"{serviceName}\". Erreur : \"{errorMessage}\"", "xpack.apm.agentConfig.saveConfig.succeeded.text": "La configuration de \"{serviceName}\" a été enregistrée. La propagation jusqu'aux agents pourra prendre un certain temps.", "xpack.apm.agentExplorer.agentLatestVersion.airGappedMessage": "La dernière version de l'agent {agentName} n'a pas pu être récupérée dans le référentiel. Veuillez contacter votre administrateur pour vérifier les logs de serveur.", - "xpack.apm.agentExplorerInstanceTable.agentVersionColumnLabel.multipleVersions": "{versionsCount, plural, one {1 version} many {# versions} other {# versions}}", + "xpack.apm.agentExplorerInstanceTable.agentVersionColumnLabel.multipleVersions": "{versionsCount, plural, one {1 version} other {# versions}}", "xpack.apm.agentExplorerInstanceTable.noServiceNodeName.tooltip.linkToDocs": "Vous pouvez configurer le nom du nœud de service via {seeDocs}.", - "xpack.apm.agentExplorerTable.agentVersionColumnLabel.multipleVersions": "{versionsCount, plural, one {1 version} many {# versions} other {# versions}}", - "xpack.apm.alertDetails.latencyAlertHistoryChart.error.toastDescription": "Une erreur s’est produite lors de la récupération des données graphiques de l’historique d’alertes de latence pour {serviceName}", - "xpack.apm.alerts.anomalySeverity.scoreDetailsDescription": "Score de {value} {value, select, critical {} other {et supérieur}}", - "xpack.apm.alerts.timeLabelForData": "Dernier {lookback} {timeLabel} de données montrant les groupes {displayedGroups}/{totalGroups}", - "xpack.apm.alertTypes.errorCount.reason": "Le nombre d'erreurs est {measured} dans le dernier {interval} pour {group}. Alerte lorsque > {threshold}.", - "xpack.apm.alertTypes.minimumWindowSize.description": "La valeur minimale recommandée est {sizeValue} {sizeUnit}. Elle permet de s'assurer que l'alerte comporte suffisamment de données à évaluer. Si vous choisissez une valeur trop basse, l'alerte ne se déclenchera peut-être pas comme prévu.", - "xpack.apm.alertTypes.transactionDuration.reason": "La latence de {aggregationType} est {measured} dans le dernier {interval} pour {group}. Alerte lorsque > {threshold}.", - "xpack.apm.alertTypes.transactionErrorRate.reason": "L'échec des transactions est {measured} dans le dernier {interval} pour {group}. Alerte lorsque > {threshold}.", + "xpack.apm.agentExplorerTable.agentVersionColumnLabel.multipleVersions": "{versionsCount, plural, one {1 version} other {# versions}}", + "xpack.apm.alertDetails.latencyAlertHistoryChart.error.toastDescription": "Une erreur s'est produite lors de la récupération des données graphiques de l'historique d'alertes de latence pour {serviceName}", + "xpack.apm.alerts.anomalySeverity.scoreDetailsDescription": "score {value} {value, select, critical {} other {et plus}}", + "xpack.apm.alerts.timeLabelForData": "Dernières {lookback} {timeLabel} de données, ({displayedGroups} groupes affichés sur {totalGroups}", + "xpack.apm.alertTypes.errorCount.reason": "Le nombre d'erreurs est {measured} au cours des derniers/dernières {interval} pour {group}. Alerte lorsque > {threshold}.", + "xpack.apm.alertTypes.minimumWindowSize.description": "La valeur minimale requise est {sizeValue} {sizeUnit}. Elle permet de s'assurer que l'alerte comporte suffisamment de données à évaluer. Si vous choisissez une valeur trop basse, l'alerte ne se déclenchera peut-être pas comme prévu.", + "xpack.apm.alertTypes.transactionDuration.reason": "La latence de {aggregationType} est {measured} au cours des derniers/dernières {interval} pour {group}. Alerte lorsque > {threshold}.", + "xpack.apm.alertTypes.transactionDurationAnomaly.reason": "Une anomalie {severityLevel} {detectorTypeLabel} avec un score de {anomalyScore} a été détectée dans le dernier {interval} pour {serviceName}.", + "xpack.apm.alertTypes.transactionErrorRate.reason": "L'échec des transactions est {measured} au cours des derniers/dernières {interval} pour {group}. Alerte lorsque > {threshold}.", "xpack.apm.anomalyDetection.createJobs.failed.text": "Une erreur est survenue lors de la création d'une ou de plusieurs tâches de détection des anomalies pour les environnements de service APM [{environments}]. Erreur : \"{errorMessage}\"", - "xpack.apm.anomalyDetection.createJobs.succeeded.text": "Tâches de détection des anomalies créées avec succès pour les environnements de service APM [{environments}]. Le démarrage de l'analyse du trafic à la recherche d'anomalies par le Machine Learning va prendre un certain temps.", + "xpack.apm.anomalyDetection.createJobs.succeeded.text": "Tâches de détection des anomalies créées pour les environnements de service APM [{environments}]. Le démarrage de l'analyse du trafic à la recherche d'anomalies par le Machine Learning va prendre un certain temps.", "xpack.apm.anomalyDetectionSetup.notEnabledForEnvironmentText": "La détection des anomalies n'est pas encore activée pour l'environnement \"{currentEnvironment}\". Cliquez pour continuer la configuration.", - "xpack.apm.compositeSpanCallsLabel": ", {count} appels, sur une moyenne de {duration}", - "xpack.apm.correlations.ccsWarningCalloutBody": "Les données pour l'analyse de corrélation n'ont pas pu être totalement récupérées. Cette fonctionnalité est prise en charge uniquement pour {version} et versions ultérieures.", + "xpack.apm.compositeSpanCallsLabel": ", {count} appels, sur une moyenne de {duration}", + "xpack.apm.correlations.ccsWarningCalloutBody": "Les données pour l'analyse de corrélation n'ont pas pu être totalement récupérées. Cette fonctionnalité est prise en charge uniquement à partir des versions {version} et ultérieures.", "xpack.apm.correlations.failedTransactions.helpPopover.basicExplanation": "Les corrélations vous aident à découvrir les attributs qui ont le plus d'influence pour distinguer les échecs et les succès d'une transaction. Les transactions sont considérées comme un échec lorsque leur valeur {field} est {value}.", "xpack.apm.correlations.progressTitle": "Progression : {progress} %", + "xpack.apm.CrashGroupDetails.CrashGroupTitle": "Groupe de panne {errorGroupId}", "xpack.apm.criticalPathFlameGraph.selfTime": "Heure automatique : {value}", "xpack.apm.criticalPathFlameGraph.totalTime": "Temps total : {value}", + "xpack.apm.diagnosticsApmDocuments.from:BadgeLabel": "À partir de : {date}", + "xpack.apm.diagnosticsApmDocuments.to:BadgeLabel": "Jusqu'à : {date}", "xpack.apm.durationDistribution.chart.percentileMarkerLabel": "{markerPercentile}e centile", - "xpack.apm.durationDistributionChart.totalSpansCount": "{totalDocCount} {totalDocCount, plural, one {intervalle} many {intervalles} other {intervalles}} au total", - "xpack.apm.durationDistributionChart.totalTransactionsCount": "{totalDocCount} {totalDocCount, plural, one {transaction} many {transactions} other {transactions}} au total", - "xpack.apm.durationDistributionChartWithScrubber.selectionText": "Sélection : {formattedSelection}", + "xpack.apm.durationDistributionChart.totalSpansCount": "Total : {totalDocCount} {totalDocCount, plural, one {intervalle} other {intervalles}}", + "xpack.apm.durationDistributionChart.totalTransactionsCount": "Total : {totalDocCount} {totalDocCount, plural, one {transaction} other {transactions}}", + "xpack.apm.durationDistributionChartWithScrubber.selectionText": "Selection : {formattedSelection}", "xpack.apm.errorGroupDetails.errorGroupTitle": "Groupe d'erreurs {errorGroupId}", "xpack.apm.errorGroupDetails.occurrencesLabel": "{occurrencesCount} occ", "xpack.apm.errorGroupTopTransactions.column.occurrences.valueLabel": "{occurrences} occ.", - "xpack.apm.errorSampleDetails.viewOccurrencesInDiscoverButtonLabel": "Afficher {occurrencesCount}{occurrencesCount, plural, one {occurrence} many {occurrences} other {occurrences}} dans Discover", + "xpack.apm.errorOverview.treemap.subtitle": "Compartimentage {currentTreemap} affichant le nombre total et les plus affectés", + "xpack.apm.errorOverview.treemap.title": "{currentTreemap} le(s) plus affecté(s)", + "xpack.apm.errorSampleDetails.viewOccurrencesInDiscoverButtonLabel": "Visualiser {occurrencesCount} {occurrencesCount, plural, one {l'occurrence} other {les occurrences}} dans Discover", + "xpack.apm.errorsOverview.treemap.title": "{currentTreemap} le(s) plus affecté(s)", "xpack.apm.errorsTable.occurrences": "{occurrences} occ.", "xpack.apm.exactTransactionRateLabel": "{value} tpm", "xpack.apm.fleet_integration.settings.apmAgent.description": "Configurez l'instrumentation pour les applications {title}.", "xpack.apm.fleet_integration.settings.tailSamplingDocsHelpText": "Pour en savoir plus sur les politiques d'échantillonnage de la queue, consultez notre {link}.", "xpack.apm.fleetIntegration.apmAgent.runtimeAttachment.version.helpText": "Entrez la {versionLink} de l'agent Java Elastic APM qui doit être attachée.", - "xpack.apm.fleetIntegration.javaRuntime.discoveryRulesDescription": "Pour chaque JVM en cours d'exécution, les règles de découverte sont évaluées dans l'ordre où elles sont fournies. La première règle de correspondance détermine le résultat. Pour en savoir plus, consultez la {docLink}.", - "xpack.apm.instancesLatencyDistributionChartTooltipInstancesTitle": "{instancesCount} {instancesCount, plural, one {instance} many {instances} other {instances}}", - "xpack.apm.itemsBadge.placeholder": "{itemsCount, plural, one {1 élément} many {Éléments #} other {Éléments #}}", - "xpack.apm.kueryBar.placeholder": "Rechercher des {event, select, transaction {transactions} metric {indicateurs} error {erreurs} other {transactions, erreurs et indicateurs}} (par exemple {queryExample})", - "xpack.apm.onboarding.apiKey.error.calloutMessage": "Erreur : {errorMessage}", - "xpack.apm.onboarding.apiKey.warning.calloutMessage": "L’utilisateur n’a pas le privilège suivant :{missingPrivilege}. Veuillez ajouter le privilège d’application APM manquant au rôle de l’utilisateur authentifié", - "xpack.apm.onboarding.config_otel.description1": "(1) Les agents et SDK OpenTelemetry doivent prendre en charge les variables {otelExporterOtlpEndpoint}, {otelExporterOtlpHeaders} et {otelResourceAttributes}. Il se peut que certains composants instables ne répondent pas encore à cette exigence.", + "xpack.apm.fleetIntegration.javaRuntime.discoveryRulesDescription": "Pour chaque JVM en cours d'exécution, les règles de découverte sont évaluées dans l'ordre où elles sont fournies. La première règle de correspondance détermine le résultat. Découvrez plus d'informations dans le {docLink}.", + "xpack.apm.instancesLatencyDistributionChartTooltipInstancesTitle": "{instancesCount} {instancesCount, plural, one {instance} other {instances}}", + "xpack.apm.intervalDocCount.TextLabel": "({docCount} {docCount, plural, one {événement} other {événements}})", + "xpack.apm.itemsBadge.placeholder": "{itemsCount, plural, one {1 élément} other {# éléments}}", + "xpack.apm.kueryBar.placeholder": "Rechercher {event, select,\n transaction {des transactions}\n metric {des indicateurs}\n error {des erreurs}\n other {des transactions, des erreurs et des indicateurs}\n } (par ex. {queryExample})", + "xpack.apm.onboarding.apiKey.error.calloutMessage": "Erreur : {errorMessage}.", + "xpack.apm.onboarding.apiKey.warning.calloutMessage": "L'utilisateur n'a pas le privilège suivant - {missingPrivilege}. Veuillez ajouter le privilège d’application APM manquant au rôle de l’utilisateur authentifié", + "xpack.apm.onboarding.config_otel.description1": "(1) Les agents et SDK OpenTelemetry doivent prendre en charge les variables {otelExporterOtlpEndpoint}, {otelExporterOtlpHeaders} et {otelResourceAttributes}. Certains composants instables peuvent ne pas encore répondre à cette exigence.", "xpack.apm.onboarding.config_otel.description3": "La liste exhaustive des variables d'environnement, les paramètres de ligne de commande et les extraits de code de configuration (conformes à la spécification OpenTelemetry) se trouvent dans le {otelInstrumentationGuide}. Certains clients OpenTelemetry instables peuvent ne pas prendre en charge toutes les fonctionnalités et nécessitent peut-être d'autres mécanismes de configuration.", "xpack.apm.onboarding.django.configure.textPost": "Consultez la [documentation]({documentationLink}) pour une utilisation avancée.", - "xpack.apm.onboarding.dotNet.configureAgent.textPost": "Si vous ne transférez pas une instance \"IConfiguration\" à l'agent (par ex., pour les applications non ASP.NET Core) vous pouvez également configurer l'agent par le biais de variables d'environnement. \n Pour une utilisation avancée, consultez [la documentation]({documentationLink}), qui comprend notamment le guide de démarrage rapide pour l'[instrumentation de Profiler Auto]({profilerLink}).", - "xpack.apm.onboarding.dotNet.download.textPre": "Ajoutez le(s) package(s) d'agent depuis [NuGet]({allNuGetPackagesLink}) à votre application .NET. Plusieurs packages NuGet sont disponibles pour différents cas d'utilisation. \n\nPour une application ASP.NET Core avec Entity Framework Core, téléchargez le package [Elastic.Apm.NetCoreAll]({netCoreAllApmPackageLink}). Ce package ajoutera automatiquement chaque composant d'agent à votre application. \n\n Si vous souhaitez minimiser les dépendances, vous pouvez utiliser le package [Elastic.Apm.AspNetCore]({aspNetCorePackageLink}) uniquement pour le monitoring d'ASP.NET Core ou le package [Elastic.Apm.EfCore]({efCorePackageLink}) uniquement pour le monitoring d'Entity Framework Core. \n\n Si vous souhaitez seulement utiliser l'API d'agent publique pour l'instrumentation manuelle, utilisez le package [Elastic.Apm]({elasticApmPackageLink}).", + "xpack.apm.onboarding.dotNet.configureAgent.textPost": "Si vous ne transférez pas une instance `IConfiguration` à l'agent (par ex., pour les applications non ASP.NET Core) vous pouvez également configurer l'agent par le biais de variables d'environnement. \n Pour une utilisation avancée, consultez [the documentation]({documentationLink}), qui comprend notamment le guide de démarrage rapide pour [Profiler Auto instrumentation]({profilerLink}).", + "xpack.apm.onboarding.dotNet.download.textPre": "Ajoutez le ou les packages d'agent depuis [NuGet]({allNuGetPackagesLink}) à votre application .NET. Plusieurs packages NuGet sont disponibles pour différents cas d'utilisation. \n\nPour une application ASP.NET Core avec Entity Framework Core, téléchargez le package [Elastic.Apm.NetCoreAll]({netCoreAllApmPackageLink}). Ce package ajoutera automatiquement chaque composant d'agent à votre application. \n\n Si vous souhaitez minimiser les dépendances, vous pouvez utiliser le package [Elastic.Apm.AspNetCore]({aspNetCorePackageLink}) uniquement pour le monitoring d'ASP.NET Core ou le package [Elastic.Apm.EfCore]({efCorePackageLink}) uniquement pour le monitoring d'Entity Framework Core. \n\n Si vous souhaitez seulement utiliser l'API d'agent publique pour l'instrumentation manuelle, utilisez le package [Elastic.Apm]({elasticApmPackageLink}).", "xpack.apm.onboarding.flask.configure.textPost": "Consultez la [documentation]({documentationLink}) pour une utilisation avancée.", "xpack.apm.onboarding.go.configure.textPost": "Consultez la [documentation]({documentationLink}) pour une configuration avancée.", "xpack.apm.onboarding.go.instrument.textPost": "Consultez la [documentation]({documentationLink}) pour obtenir un guide détaillé pour l'instrumentation du code source Go.", "xpack.apm.onboarding.java.download.textPre": "Téléchargez le fichier jar de l'agent depuis [Maven Central]({mavenCentralLink}). N'ajoutez **pas** l'agent comme dépendance de votre application.", - "xpack.apm.onboarding.java.startApplication.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l’utilisation avancée.", - "xpack.apm.onboarding.java.startApplication.textPre": "Ajoutez l'indicateur \"-javaagent\" et configurez l'agent avec les propriétés du système.\n\n * Définir le nom de service requis (caractères autorisés : a-z, A-Z, 0-9, -, _ et espace)\n * Définir l'URL personnalisée du serveur APM (par défaut : {customApmServerUrl})\n * Définir le token secret du serveur APM\n * Définir l'environnement de service\n * Définir le package de base de votre application", - "xpack.apm.onboarding.node.configure.textPost": "Consultez [la documentation]({documentationLink}) pour une utilisation avancée, notamment pour savoir comment l'utiliser avec [les modules Babel/ES]({babelEsModulesLink}).", + "xpack.apm.onboarding.java.startApplication.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.", + "xpack.apm.onboarding.java.startApplication.textPre": "Ajoutez l'indicateur `-javaagent` et configurez l'agent avec les propriétés du système.\n\n * Définir le nom de service requis (caractères autorisés : a-z, A-Z, 0-9, -, _ et espace)\n * Définir l'URL personnalisée du serveur APM (par défaut : {customApmServerUrl})\n * Définir le token secret du serveur APM\n * Définir l'environnement de service\n * Définir le package de base de votre application", + "xpack.apm.onboarding.node.configure.textPost": "Consultez [the documentation]({documentationLink}) pour une utilisation avancée, notamment pour connaître l'utilisation avec [Babel/ES Modules]({babelEsModulesLink}).", "xpack.apm.onboarding.otel.configureAgent.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.\n\n", "xpack.apm.onboarding.otel.configureAgent.textPre": "Spécifiez les paramètres OpenTelemetry suivants dans le cadre du démarrage de votre application. Notez que les SDK OpenTelemetry exigent du code de démarrage en plus de ces paramètres de configuration. Pour plus de détails, consultez la [documentation OpenTelemetry Elastic]({openTelemetryDocumentationLink}) et les [guides d'instrumentation OpenTelemetry]({openTelemetryInstrumentationLink}).", "xpack.apm.onboarding.otel.download.textPre": "Consultez les [guides d'instrumentation OpenTelemetry]({openTelemetryInstrumentationLink}) pour télécharger l'agent ou le SDK OpenTelemetry pour votre langage.", "xpack.apm.onboarding.php.configureAgent.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.\n\n", - "xpack.apm.onboarding.php.download.textPre": "Téléchargez le package correspondant à votre plateforme depuis les [publications GitHub]({githubReleasesLink}).", + "xpack.apm.onboarding.php.download.textPre": "Téléchargez le package correspondant à votre plateforme depuis [GitHub releases]({githubReleasesLink}).", "xpack.apm.onboarding.php.installPackage.textPost": "Consultez la [documentation]({documentationLink}) pour les commandes d'installation sur les autres plateformes prises en charge et pour l'installation avancée.", "xpack.apm.onboarding.rack.configure.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.\n\n", - "xpack.apm.onboarding.rack.createConfig.textPre": "Créer un fichier de configuration {configFile} :", + "xpack.apm.onboarding.rack.createConfig.textPre": "Créez un fichier config {configFile} :", "xpack.apm.onboarding.rails.configure.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.\n\n", - "xpack.apm.onboarding.rails.configure.textPre": "APM se lance automatiquement au démarrage de l'application. Configurer l'agent, en créant le fichier de configuration {configFile}", + "xpack.apm.onboarding.rails.configure.textPre": "APM se lance automatiquement au démarrage de l'application. Configurer l'agent, en créant le fichier config {configFile}", "xpack.apm.onboarding.shared_clients.configure.commands.serverUrlHint": "Définir l'URL personnalisée du serveur APM (par défaut : {defaultApmServerUrl}). L'URL doit être complète et inclure le protocole (http ou https) et le port.", - "xpack.apm.onboarding.specProvider.longDescription": "Le monitoring des performances applicatives (APM) collecte les indicateurs et les erreurs de performance approfondies depuis votre application. Cela vous permet de monitorer les performances de milliers d'applications en temps réel. [En savoir plus]({learnMoreLink}).", + "xpack.apm.onboarding.specProvider.longDescription": "Le monitoring des performances applicatives (APM) collecte les indicateurs et les erreurs de performance approfondies depuis votre application. Cela vous permet de monitorer les performances de milliers d'applications en temps réel. [Learn more]({learnMoreLink}).", "xpack.apm.profiling.callout.title": "Affichage des informations de profilage de l'hôte ou des hôtes exécutant des services {serviceName}", - "xpack.apm.propertiesTable.agentFeature.noResultFound": "Aucun résultat pour \"{value}\".", - "xpack.apm.runtimeMetricsJsonDashboards.loadFailure.toast.title": "Erreur lors du chargement du tableau de bord pour l’agent \"{agentName}\" sur l’exécution \"{runtimeName}\".", - "xpack.apm.serverlessMetrics.summary.lambdaFunctions": "{serverlessFunctionsTotal, plural, one {fonction} many {Fonctions} other {Fonctions}} lambda", + "xpack.apm.propertiesTable.agentFeature.noResultFound": "Pas de résultats pour \"{value}\".", + "xpack.apm.runtimeMetricsJsonDashboards.loadFailure.toast.title": "Erreur lors du chargement du tableau de bord pour l'agent \"{agentName}\" sur l'exécution \"{runtimeName}\".", + "xpack.apm.serverlessMetrics.summary.lambdaFunctions": "{serverlessFunctionsTotal, plural, one {fonction Lambda} other {fonctions Lambda}}", "xpack.apm.serviceDashboards.addFailure.toast.title": "Erreur lors de l'ajout du tableau de bord \"{dashboardName}\"", "xpack.apm.serviceDashboards.editSuccess.toast.title": "Tableau de bord \"{dashboardName}\" modifié", "xpack.apm.serviceDashboards.linkSuccess.toast.title": "Tableau de bord \"{dashboardName}\" ajouté", "xpack.apm.serviceDashboards.unlinkFailure.toast.title": "Erreur lors de la dissociation du tableau de bord \"{dashboardName}\"", "xpack.apm.serviceDashboards.unlinkSuccess.toast.title": "Tableau de bord \"{dashboardName}\" dissocié", - "xpack.apm.serviceGroups.cardsList.alertCount": "{alertsCount} {alertsCount, plural, one {alerte} many {alertes} other {alertes}}", - "xpack.apm.serviceGroups.cardsList.serviceCount": "{servicesCount} {servicesCount, plural, one {service} many {services correspondent à la requête} other {services}}", + "xpack.apm.serviceGroups.cardsList.alertCount": "{alertsCount} {alertsCount, plural, one {alerte} other {alertes}}", + "xpack.apm.serviceGroups.cardsList.serviceCount": "{servicesCount} {servicesCount, plural, one {service} other {services}}", "xpack.apm.serviceGroups.createFailure.toast.title": "Erreur lors de la création du groupe \"{groupName}\"", "xpack.apm.serviceGroups.createSucess.toast.title": "Groupe \"{groupName}\" créé", "xpack.apm.serviceGroups.deleteFailure.toast.title": "Erreur lors de la suppression du groupe \"{groupName}\"", @@ -7853,110 +8789,114 @@ "xpack.apm.serviceGroups.deleteSuccess.toast.title": "Groupe \"{groupName}\" supprimé", "xpack.apm.serviceGroups.editFailure.toast.title": "Erreur lors de la modification du groupe \"{groupName}\"", "xpack.apm.serviceGroups.editSucess.toast.title": "Groupe \"{groupName}\" modifié", - "xpack.apm.serviceGroups.groupsCount": "{servicesCount} {servicesCount, plural, =0 {groupe} one {regrouper} many {des groupes} other {groupes}}", + "xpack.apm.serviceGroups.groupsCount": "{servicesCount} {servicesCount, plural, =0 {groupe} one {groupe} other {groupes}}", "xpack.apm.serviceGroups.invalidFields.message": "Le filtre de requête pour le groupe de services ne prend pas en charge les champs [{unsupportedFieldNames}]", - "xpack.apm.serviceGroups.selectServicesForm.matchingServiceCount": "{servicesCount} {servicesCount, plural, =0 {service correspond à la requête} one {service correspond à la requête} many {services correspondent à la requête} other {services correspondent à la requête}}", - "xpack.apm.serviceGroups.tour.content.link": "Pour en savoir plus, consultez la {docsLink}.", - "xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, =0 {Zone de disponibilité} one {Zone de disponibilité} many {Zones de disponibilité} other {Zones de disponibilité}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, =0 {Type de déclenchement} one {Type de déclenchement} many {Types de déclenchement} other {Types de déclenchement}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, =0 {Nom de fonction} one {Nom de fonction} many {Noms de fonction} other {Noms de fonction}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, =0 {Type de machine} one {Type de machine} many {Types de machine} other {Types de machine}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.regionLabel": "{regions, plural, =0 {Région} one {Région} many {Régions} other {Régions}} ", + "xpack.apm.serviceGroups.selectServicesForm.matchingServiceCount": "{servicesCount} {servicesCount, plural, =0 {service correspond} one {service correspond} other {services correspondent}} à la requête", + "xpack.apm.serviceGroups.tour.content.link": "Découvrez plus d'informations dans le {docsLink}.", + "xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, =0 {Zone de disponibilité} one {Zone de disponibilité} other {Zones de disponibilité}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, =0 {Type de déclencheur} one {Type de déclencheur} other {Types de déclencheurs}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, =0 {Nom de fonction} one {Nom de fonction} other {Noms de fonction}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, =0{Type de machine} one {Type de machine} other {Types de machines}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.regionLabel": "{regions, plural, =0 {Region} one {Région} other {Régions}} ", "xpack.apm.serviceMap.resourceCountLabel": "{count} ressources", "xpack.apm.serviceNodeMetrics.unidentifiedServiceNodesWarningText": "Nous n'avons pas pu déterminer à quelles JVM ces indicateurs correspondent. Cela provient probablement du fait que vous exécutez une version du serveur APM antérieure à 7.5. La mise à niveau du serveur APM vers la version 7.5 ou supérieure devrait résoudre le problème. Pour plus d'informations sur la mise à niveau, consultez {link}. Vous pouvez également utiliser la barre de recherche de Kibana pour filtrer par nom d'hôte, par ID de conteneur ou en fonction d'autres champs.", "xpack.apm.serviceOveriew.errorsTableOccurrences": "{occurrences} occ.", + "xpack.apm.serviceOverview.crashTableOccurrences": "{occurrences} occ.", "xpack.apm.serviceOverview.embeddedMap.error.toastDescription": "L'usine incorporable ayant l'ID \"{embeddableFactoryId}\" est introuvable.", "xpack.apm.serviceOverview.embeddedMap.subtitle": "Carte affichant le nombre total de {currentMap} en fonction du pays et de la région", - "xpack.apm.servicesTable.environmentCount": "{environmentCount, plural, one {1 environnement} many {# environnements} other {# environnements}}", - "xpack.apm.settings.agentKeys.apiKeysDisabledErrorDescription": "Contactez votre administrateur système et reportez-vous à {link} pour activer les clés d'API.", - "xpack.apm.settings.agentKeys.copyAgentKeyField.title": "Clé \"{name}\" créée", + "xpack.apm.serviceOverview.errorsTableOccurrences": "{occurrences} occ.", + "xpack.apm.serviceOverview.instancesTableTitle": "{count} le plus élevé {count, plural, one {instance} other {instances}}", + "xpack.apm.servicesTable.environmentCount": "{environmentCount, plural, one {1 environnement} other {# environnements}}", + "xpack.apm.settings.agentKeys.apiKeysDisabledErrorDescription": "Contactez votre administrateur système et reportez-vous aux {link} pour activer les clés d'API.", + "xpack.apm.settings.agentKeys.copyAgentKeyField.title": "Création de la clé \"{name}\" effectuée", "xpack.apm.settings.agentKeys.crate.failed": "Erreur lors de la création de la clé de l'agent APM \"{keyName}\". Erreur : \"{message}\"", "xpack.apm.settings.agentKeys.deleteConfirmModal.title": "Supprimer la clé de l'agent APM \"{name}\" ?", "xpack.apm.settings.agentKeys.invalidate.failed": "Erreur lors de la suppression de la clé de l'agent APM \"{name}\"", - "xpack.apm.settings.agentKeys.invalidate.succeeded": "Clé de l'agent APM \"{name}\" supprimée", + "xpack.apm.settings.agentKeys.invalidate.succeeded": "Suppression de la clé de l'agent APM \"{name}\"", "xpack.apm.settings.anomalyDetection.jobList.mlDescriptionText": "Pour ajouter la détection des anomalies à un nouvel environnement, créez une tâche de Machine Learning. Vous pouvez gérer les tâches de Machine Learning existantes dans {mlJobsLink}.", - "xpack.apm.settings.apmIndices.applyChanges.failed.text": "Un problème est survenu lors de l'application des index. Erreur : {errorMessage}", + "xpack.apm.settings.apmIndices.applyChanges.failed.text": "Un problème est survenu lors de l'application des index. Erreur : {errorMessage}.", "xpack.apm.settings.apmIndices.helpText": "Remplace {configurationName} : {defaultValue}", - "xpack.apm.settings.apmIndices.spaceDescription": "Les paramètres d'index s'appliquent à l'espace {spaceName}.", + "xpack.apm.settings.apmIndices.spaceDescription": "Les paramètres des index s'appliquent à l'espace {spaceName}.", "xpack.apm.settings.customLink.create.failed.message": "Un problème est survenu lors de l'enregistrement du lien. Erreur : \"{errorMessage}\"", "xpack.apm.settings.customLink.emptyPromptText": "Nous allons y remédier ! Vous pouvez ajouter des liens personnalisés au menu Actions à partir des détails de transaction de chaque service. Créez un lien utile vers le portail d'assistance de votre société, ou ouvrez un rapport de bug. Besoin d'autres idées ? Consultez {customLinkDocLinkText}.", - "xpack.apm.settings.customLink.flyout.link.url.helpText": "Ajoutez les variables des noms de champ à votre URL pour appliquer des valeurs, par exemple {sample}.", + "xpack.apm.settings.customLink.flyout.link.url.helpText": "Ajoutez les variables des noms de champ à votre URL pour appliquer des valeurs, par ex., {sample}.", "xpack.apm.settings.customLink.preview.contextVariable.noMatch": "Nous n'avons pas trouvé de valeur correspondante pour {variables} dans le document d'exemple de transaction.", - "xpack.apm.settings.customLink.table.noResultFound": "Aucun résultat pour \"{value}\".", - "xpack.apm.settings.schema.descriptionText": "Nous avons créé un processus simple et transparent pour passer du binaire du serveur APM à Elastic Agent. Attention, il s'agit d'une action {irreversibleEmphasis} qui ne peut être réalisée que par un {superuserEmphasis} disposant d'un accès à Fleet. En savoir plus sur {elasticAgentDocLink}.", + "xpack.apm.settings.customLink.table.noResultFound": "Pas de résultats pour \"{value}\".", + "xpack.apm.settings.schema.descriptionText": "Nous avons créé un processus simple et transparent pour passer du binaire du serveur APM à Elastic Agent. Attention, il s'agit d'une action {irreversibleEmphasis} qui ne peut être réalisée que par un {superuserEmphasis} bénéficiant d'un accès à Fleet. En savoir plus sur {elasticAgentDocLink}.", "xpack.apm.settings.schema.disabledReason": "L'option Passer à Elastic Agent n'est pas disponible : {reasons}", - "xpack.apm.settings.schema.success.returnText": "ou revenez simplement à {serviceInventoryLink}.", - "xpack.apm.settings.upgradeAvailable.description": "Même si votre intégration APM est configurée, une nouvelle version de l'intégration APM est disponible pour une mise à niveau avec votre stratégie de package. Consultez {upgradePackagePolicyLink} pour tirer le meilleur parti de votre configuration.", + "xpack.apm.settings.schema.success.returnText": "ou revenez simplement à l'{serviceInventoryLink}.", + "xpack.apm.settings.upgradeAvailable.description": "Même si votre intégration APM est configurée, une nouvelle version de l'intégration APM est disponible pour une mise à niveau avec votre politique de package. Consultez {upgradePackagePolicyLink} pour tirer le meilleur parti de votre configuration.", "xpack.apm.spanLinks.combo.childrenLinks": "Liens entrants ({linkedChildren})", "xpack.apm.spanLinks.combo.parentsLinks": "Liens sortants ({linkedParents})", - "xpack.apm.stacktraceTab.libraryFramesToogleButtonLabel": "{count, plural, one {# cadre de la bibliothèque} many {# cadres de la bibliothèque} other {# cadres de la bibliothèque}}", + "xpack.apm.stacktraceTab.libraryFramesToogleButtonLabel": "{count, plural, one {# cadre de bibliothèque} other {# cadres de bibliothèque}}", "xpack.apm.storageExplorer.longLoadingTimeCalloutText": "Activez le chargement progressif de données et le tri optimisé pour la liste de services dans {kibanaAdvancedSettingsLink}.", - "xpack.apm.tooltip.maxGroup.message": "La cardinalité des données APM collectées est trop élevée. Veuillez consulter {apmServerDocs} pour atténuer la situation.", - "xpack.apm.transactionDetails.errorCount": "{errorCount, number} {errorCount, plural, one {Erreur} many {Erreurs} other {Erreurs}}", - "xpack.apm.transactionDetails.transFlyout.callout.agentDroppedSpansMessage": "L'agent APM qui a signalé cette transaction a abandonné {dropped} intervalles ou plus, d'après sa configuration.", + "xpack.apm.tooltip.maxGroup.message": "La cardinalité des données APM collectées est trop élevée. Veuillez consulter {apmServerDocs} pour atténuer les risques liés à la situation.", + "xpack.apm.transactionDetails.agentMissingTransactionMessage": "Cette trace est incomplète et les éléments {itemsCount} n'ont pas pu être affichés dans la chronologie. Il pourrait s'agir d'un problème temporaire provoqué par un retard d'ingestion ou d'un problème permanent provoqué par l'abandon de certains événements.", + "xpack.apm.transactionDetails.errorCount": "{errorCount, number} {errorCount, plural, one {erreur} other {erreurs}}", + "xpack.apm.transactionDetails.transFlyout.callout.agentDroppedSpansMessage": "L'agent APM qui a signalé cette transaction a abandonné {dropped} intervalles ou plus, d'après sa configuration.", "xpack.apm.transactionOverview.treemap.subtitle": "Compartimentage {currentTreemap} affichant le nombre total et les plus utilisés", - "xpack.apm.transactionOverview.treemap.title": "{currentTreemap} les plus utilisés", + "xpack.apm.transactionOverview.treemap.title": "{currentTreemap} le(s) plus utilisé(s)", "xpack.apm.transactionRateLabel": "{displayedValue} tpm", - "xpack.apm.tutorial.config_otel.description1": "(1) Les agents et SDK OpenTelemetry doivent prendre en charge les variables {otelExporterOtlpEndpoint}, {otelExporterOtlpHeaders} et {otelResourceAttributes}. Il se peut que certains composants instables ne répondent pas encore à cette exigence.", + "xpack.apm.tutorial.config_otel.description1": "(1) Les agents et SDK OpenTelemetry doivent prendre en charge les variables {otelExporterOtlpEndpoint}, {otelExporterOtlpHeaders} et {otelResourceAttributes}. Certains composants instables peuvent ne pas encore répondre à cette exigence.", "xpack.apm.tutorial.config_otel.description3": "La liste exhaustive des variables d'environnement, les paramètres de ligne de commande et les extraits de code de configuration (conformes à la spécification OpenTelemetry) se trouvent dans le {otelInstrumentationGuide}. Certains clients OpenTelemetry instables peuvent ne pas prendre en charge toutes les fonctionnalités et nécessitent peut-être d'autres mécanismes de configuration.", "xpack.apm.tutorial.djangoClient.configure.textPost": "Consultez la [documentation]({documentationLink}) pour une utilisation avancée.", - "xpack.apm.tutorial.dotNetClient.configureAgent.textPost": "Si vous ne transférez pas une instance \"IConfiguration\" à l'agent (par ex., pour les applications non ASP.NET Core) vous pouvez également configurer l'agent par le biais de variables d'environnement. \n Pour une utilisation avancée, consultez [la documentation]({documentationLink}), qui comprend notamment le guide de démarrage rapide pour l'[instrumentation de Profiler Auto]({profilerLink}).", - "xpack.apm.tutorial.dotNetClient.download.textPre": "Ajoutez le(s) package(s) d'agent depuis [NuGet]({allNuGetPackagesLink}) à votre application .NET. Plusieurs packages NuGet sont disponibles pour différents cas d'utilisation. \n\nPour une application ASP.NET Core avec Entity Framework Core, téléchargez le package [Elastic.Apm.NetCoreAll]({netCoreAllApmPackageLink}). Ce package ajoutera automatiquement chaque composant d'agent à votre application. \n\n Si vous souhaitez minimiser les dépendances, vous pouvez utiliser le package [Elastic.Apm.AspNetCore]({aspNetCorePackageLink}) uniquement pour le monitoring d'ASP.NET Core ou le package [Elastic.Apm.EfCore]({efCorePackageLink}) uniquement pour le monitoring d'Entity Framework Core. \n\n Si vous souhaitez seulement utiliser l'API d'agent publique pour l'instrumentation manuelle, utilisez le package [Elastic.Apm]({elasticApmPackageLink}).", - "xpack.apm.tutorial.downloadServerRpm": "Vous cherchez les packages aarch64 ? Consultez la [page de téléchargement]({downloadPageLink}).", - "xpack.apm.tutorial.downloadServerTitle": "Vous cherchez les packages aarch64 ? Consultez la [page de téléchargement]({downloadPageLink}).", - "xpack.apm.tutorial.elasticCloud.textPre": "Pour activer le serveur APM, accédez à [la console Elastic Cloud](https://cloud.elastic.co/deployments/{deploymentId}/edit), et activez APM et Fleet dans la page de modification du déploiement en cliquant sur Ajouter une capacité, puis cliquez sur Enregistrer. Une fois activé, actualisez la page.", + "xpack.apm.tutorial.dotNetClient.configureAgent.textPost": "Si vous ne transférez pas une instance `IConfiguration` à l'agent (par ex., pour les applications non ASP.NET Core) vous pouvez également configurer l'agent par le biais de variables d'environnement. \n Pour une utilisation avancée, consultez [the documentation]({documentationLink}), qui comprend notamment le guide de démarrage rapide pour [Profiler Auto instrumentation]({profilerLink}).", + "xpack.apm.tutorial.dotNetClient.download.textPre": "Ajoutez le ou les packages d'agent depuis [NuGet]({allNuGetPackagesLink}) à votre application .NET. Plusieurs packages NuGet sont disponibles pour différents cas d'utilisation. \n\nPour une application ASP.NET Core avec Entity Framework Core, téléchargez le package [Elastic.Apm.NetCoreAll]({netCoreAllApmPackageLink}). Ce package ajoutera automatiquement chaque composant d'agent à votre application. \n\n Si vous souhaitez minimiser les dépendances, vous pouvez utiliser le package [Elastic.Apm.AspNetCore]({aspNetCorePackageLink}) uniquement pour le monitoring d'ASP.NET Core ou le package [Elastic.Apm.EfCore]({efCorePackageLink}) uniquement pour le monitoring d'Entity Framework Core. \n\n Si vous souhaitez seulement utiliser l'API d'agent publique pour l'instrumentation manuelle, utilisez le package [Elastic.Apm]({elasticApmPackageLink}).", + "xpack.apm.tutorial.downloadServerRpm": "Vous cherchez les packages aarch64 ? Consultez la [Download page]({downloadPageLink}).", + "xpack.apm.tutorial.downloadServerTitle": "Vous cherchez les packages aarch64 ? Consultez la [Download page]({downloadPageLink}).", + "xpack.apm.tutorial.elasticCloud.textPre": "Pour activer le serveur APM, accédez à [the Elastic Cloud console] (https://cloud.elastic.co/deployments/{deploymentId}/edit) et activez APM et Fleet dans la page de modification du déploiement en cliquant sur Ajouter une capacité, puis cliquez sur Enregistrer. Une fois activé, actualisez la page.", "xpack.apm.tutorial.flaskClient.configure.textPost": "Consultez la [documentation]({documentationLink}) pour une utilisation avancée.", "xpack.apm.tutorial.goClient.configure.textPost": "Consultez la [documentation]({documentationLink}) pour une configuration avancée.", "xpack.apm.tutorial.goClient.instrument.textPost": "Consultez la [documentation]({documentationLink}) pour obtenir un guide détaillé pour l'instrumentation du code source Go.", "xpack.apm.tutorial.javaClient.download.textPre": "Téléchargez le fichier jar de l'agent depuis [Maven Central]({mavenCentralLink}). N'ajoutez **pas** l'agent comme dépendance de votre application.", "xpack.apm.tutorial.javaClient.startApplication.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.", - "xpack.apm.tutorial.javaClient.startApplication.textPre": "Ajoutez l'indicateur \"-javaagent\" et configurez l'agent avec les propriétés du système.\n\n * Définir le nom de service requis (caractères autorisés : a-z, A-Z, 0-9, -, _ et espace)\n * Définir l'URL personnalisée du serveur APM (par défaut : {customApmServerUrl})\n * Définir le token secret du serveur APM\n * Définir l'environnement de service\n * Définir le package de base de votre application", + "xpack.apm.tutorial.javaClient.startApplication.textPre": "Ajoutez l'indicateur `-javaagent` et configurez l'agent avec les propriétés du système.\n\n * Définir le nom de service requis (caractères autorisés : a-z, A-Z, 0-9, -, _ et espace)\n * Définir l'URL personnalisée du serveur APM (par défaut : {customApmServerUrl})\n * Définir le token secret du serveur APM\n * Définir l'environnement de service\n * Définir le package de base de votre application", "xpack.apm.tutorial.jsClient.enableRealUserMonitoring.textPre": "Le serveur APM désactive la prise en charge du RUM par défaut. Consultez la [documentation]({documentationLink}) pour obtenir des détails sur l'activation de la prise en charge du RUM. Lorsque vous utilisez l'intégration APM avec Fleet, le support RUM est automatiquement activé.", - "xpack.apm.tutorial.jsClient.installDependency.textPost": "Les intégrations de framework, tel que React ou Angular, ont des dépendances personnalisées. Consultez la [documentation d'intégration]({docLink}) pour plus d'informations.", - "xpack.apm.tutorial.nodeClient.configure.textPost": "Consultez [la documentation]({documentationLink}) pour une utilisation avancée, notamment pour savoir comment l'utiliser avec [les modules Babel/ES]({babelEsModulesLink}).", + "xpack.apm.tutorial.jsClient.installDependency.textPost": "Les intégrations de framework, tel que React ou Angular, ont des dépendances personnalisées. Consultez la [integration documentation]({docLink}) pour plus d'informations.", + "xpack.apm.tutorial.nodeClient.configure.textPost": "Consultez [the documentation]({documentationLink}) pour une utilisation avancée, notamment pour connaître l'utilisation avec [Babel/ES Modules]({babelEsModulesLink}).", "xpack.apm.tutorial.otel.configure.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.\n\n", "xpack.apm.tutorial.otel.configureAgent.textPre": "Spécifiez les paramètres OpenTelemetry suivants dans le cadre du démarrage de votre application. Notez que les SDK OpenTelemetry exigent du code de démarrage en plus de ces paramètres de configuration. Pour plus de détails, consultez la [documentation OpenTelemetry Elastic]({openTelemetryDocumentationLink}) et les [guides d'instrumentation OpenTelemetry]({openTelemetryInstrumentationLink}).", "xpack.apm.tutorial.otel.download.textPre": "Consultez les [guides d'instrumentation OpenTelemetry]({openTelemetryInstrumentationLink}) pour télécharger l'agent ou le SDK OpenTelemetry pour votre langage.", "xpack.apm.tutorial.phpClient.configure.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.\n\n", - "xpack.apm.tutorial.phpClient.download.textPre": "Téléchargez le package correspondant à votre plateforme depuis les [publications GitHub]({githubReleasesLink}).", + "xpack.apm.tutorial.phpClient.download.textPre": "Téléchargez le package correspondant à votre plateforme depuis [GitHub releases]({githubReleasesLink}).", "xpack.apm.tutorial.phpClient.installPackage.textPost": "Consultez la [documentation]({documentationLink}) pour les commandes d'installation sur les autres plateformes prises en charge et pour l'installation avancée.", "xpack.apm.tutorial.rackClient.createConfig.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.\n\n", - "xpack.apm.tutorial.rackClient.createConfig.textPre": "Créer un fichier de configuration {configFile} :", + "xpack.apm.tutorial.rackClient.createConfig.textPre": "Créez un fichier config {configFile} :", "xpack.apm.tutorial.railsClient.configure.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.\n\n", - "xpack.apm.tutorial.railsClient.configure.textPre": "APM se lance automatiquement au démarrage de l'application. Configurer l'agent, en créant le fichier de configuration {configFile}", + "xpack.apm.tutorial.railsClient.configure.textPre": "APM se lance automatiquement au démarrage de l'application. Configurer l'agent, en créant le fichier config {configFile}", "xpack.apm.tutorial.shared_clients.configure.commands.serverUrlHint": "Définir l'URL personnalisée du serveur APM (par défaut : {defaultApmServerUrl}). L'URL doit être complète et inclure le protocole (http ou https) et le port.", - "xpack.apm.tutorial.specProvider.longDescription": "Le monitoring des performances applicatives (APM) collecte les indicateurs et les erreurs de performance approfondies depuis votre application. Cela vous permet de monitorer les performances de milliers d'applications en temps réel. [En savoir plus]({learnMoreLink}).", + "xpack.apm.tutorial.specProvider.longDescription": "Le monitoring des performances applicatives (APM) collecte les indicateurs et les erreurs de performance approfondies depuis votre application. Cela vous permet de monitorer les performances de milliers d'applications en temps réel. [Learn more]({learnMoreLink}).", "xpack.apm.tutorial.windowsServerInstructions.textPost": "Remarque : si l'exécution du script est désactivée dans votre système, vous devez définir la politique d'exécution de la session en cours de sorte que l'exécution du script soit autorisée. Par exemple : {command}.", - "xpack.apm.tutorial.windowsServerInstructions.textPre": "1. Téléchargez le fichier .zip APM Server pour Windows via la [page de téléchargement]({downloadPageLink}).\n2. Extrayez le contenu du fichier compressé (ZIP) dans {zipFileExtractFolder}.\n3. Renommez le répertoire {apmServerDirectory} en \"APM-Server\".\n4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n5. Dans l'invite PowerShell, exécutez les commandes suivantes pour installer le serveur APM en tant que service Windows :", - "xpack.apm.unifiedSearchBar.placeholder": "Rechercher {event, select, transaction {transactions} metric {indicateurs} error {erreurs} other {transactions, erreurs et indicateurs}} (par exemple {queryExample})", - "xpack.apm.waterfall.errorCount": "{errorCount, plural, one {Voir l''erreur associée} many {Voir les # erreurs associées} other {Voir les # erreurs associées}}", - "xpack.apm.waterfall.exceedsMax": "Le nombre d'éléments dans cette trace est de {traceDocsTotal}, ce qui est supérieur à la limite actuelle de {maxTraceItems}. Veuillez augmenter la limite via \"xpack.apm.ui.maxTraceItems\" pour afficher la trace complète", - "xpack.apm.waterfall.spanLinks.badge": "{total} {total, plural, one {Lien d''intervalle} many {Liens d''intervalle} other {Liens d''intervalle}}", + "xpack.apm.tutorial.windowsServerInstructions.textPre": "1. Téléchargez le fichier zip APM Server Windows depuis [Download page]({downloadPageLink}).\n2. Extrayez le contenu du fichier zip dans {zipFileExtractFolder}.\n3. Renommez le répertoire {apmServerDirectory} en `APM-Server`.\n4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n5. Dans l'invite PowerShell, exécutez les commandes suivantes pour installer le serveur APM en tant que service Windows :", + "xpack.apm.unifiedSearchBar.placeholder": "Rechercher {event, select,\n transaction {des transactions}\n metric {des indicateurs}\n error {des erreurs}\n other {des transactions, des erreurs et des indicateurs}\n } (par ex. {queryExample})", + "xpack.apm.waterfall.errorCount": "{errorCount, plural, one {Afficher l'erreur liée} other {Afficher # erreurs liées}}", + "xpack.apm.waterfall.exceedsMax": "Le nombre d'éléments dans cette trace est de {traceDocsTotal}, ce qui est supérieur à la limite actuelle de {maxTraceItems}. Veuillez augmenter la limite via `xpack.apm.ui.maxTraceItems` pour afficher la trace complète", + "xpack.apm.waterfall.spanLinks.badge": "{total} {total, plural, one {lien d'intervalle} other {liens d'intervalle}}", "xpack.apm.waterfall.spanLinks.tooltip.linkedChildren": "{linkedChildren} entrants", "xpack.apm.waterfall.spanLinks.tooltip.linkedParents": "{linkedParents} sortants", - "xpack.apm.waterfall.spanLinks.tooltip.title": "{total} {total, plural, one {Lien d''intervalle} many {Liens d''intervalle} other {Liens d''intervalle}} trouvé(s)", + "xpack.apm.waterfall.spanLinks.tooltip.title": "{total} {total, plural, one {lien d'intervalle trouvé} other {liens d'intervalle trouvés}}", "xpack.apm.a.thresholdMet": "Seuil atteint", "xpack.apm.addDataButtonLabel": "Ajouter des données", "xpack.apm.agent_explorer.error.missing_configuration": "Pour utiliser la toute dernière version de l’agent, vous devez définir xpack.apm.latestAgentVersionsUrl.", "xpack.apm.agentConfig.allOptionLabel": "Tous", - "xpack.apm.agentConfig.apiRequestSize.description": "Taille totale compressée maximale du corps de la requête envoyé à l'API d'ingestion du serveur APM depuis un encodage fragmenté (diffusion HTTP).\nVeuillez noter qu'un léger dépassement est possible.\n\nLes unités d'octets autorisées sont \"b\", \"kb\" et \"mb\". \"1kb\" correspond à \"1024b\".", + "xpack.apm.agentConfig.apiRequestSize.description": "Taille totale compressée maximale du corps de la requête envoyé à l'API d'ingestion du serveur APM depuis un encodage fragmenté (diffusion HTTP).\nVeuillez noter qu'un léger dépassement est possible.\n\nLes unités d'octets autorisées sont `b`, `kb` et `mb`. `1kb` correspond à `1024b`.", "xpack.apm.agentConfig.apiRequestSize.label": "Taille de la requête API", - "xpack.apm.agentConfig.apiRequestTime.description": "Durée maximale de l'ouverture d'une requête HTTP sur le serveur APM.\n\nREMARQUE : cette valeur doit être inférieure à celle du paramètre \"read_timeout\" du serveur APM.", + "xpack.apm.agentConfig.apiRequestTime.description": "Durée maximale de l'ouverture d'une requête HTTP sur le serveur APM.\n\nREMARQUE : cette valeur doit être inférieure à celle du paramètre `read_timeout` du serveur APM.", "xpack.apm.agentConfig.apiRequestTime.label": "Heure de la requête API", - "xpack.apm.agentConfig.applicationPackages.description": "Permet de déterminer si un cadre de trace de pile est un cadre dans l'application ou un cadre de bibliothèque. Cela permet à l'application APM de réduire les cadres de pile du code de la bibliothèque et de mettre en surbrillance les cadres de pile qui proviennent de votre application. Plusieurs packages racine peuvent être définis sous forme de liste séparée par des virgules ; il n'est pas nécessaire de configurer des sous-packages. Étant donné que ce paramètre aide à déterminer les classes à analyser au démarrage, la définition de cette option peut également améliorer le temps de démarrage.\n\nVous devez définir cette option afin d'utiliser les annotations d'API \"@CaptureTransaction\" et \"@CaptureSpan\".", + "xpack.apm.agentConfig.applicationPackages.description": "Permet de déterminer si un cadre de trace de pile est un cadre dans l'application ou un cadre de bibliothèque. Cela permet à l'application APM de réduire les cadres de pile du code de la bibliothèque et de mettre en surbrillance les cadres de pile qui proviennent de votre application. Plusieurs packages racine peuvent être définis sous forme de liste séparée par des virgules ; il n'est pas nécessaire de configurer des sous-packages. Étant donné que ce paramètre aide à déterminer les classes à analyser au démarrage, la définition de cette option peut également améliorer le temps de démarrage.\n\nVous devez définir cette option afin d'utiliser les annotations d'API `@CaptureTransaction` et `@CaptureSpan`.", "xpack.apm.agentConfig.applicationPackages.label": "Packages de l'application", "xpack.apm.agentConfig.captureBody.description": "Pour les transactions qui sont des requêtes HTTP, l'agent peut éventuellement capturer le corps de la requête (par ex., variables POST).\nPour les transactions qui sont initiées par la réception d'un message depuis un agent de message, l'agent peut capturer le corps du message texte.", "xpack.apm.agentConfig.captureBody.label": "Capturer le corps", - "xpack.apm.agentConfig.captureBodyContentTypes.description": "Configure les types de contenu qui doivent être enregistrés.\n\nLes valeurs par défaut se terminent par un caractère générique afin que les types de contenu tels que \"text/plain; charset=utf-8\" soient également capturés.", + "xpack.apm.agentConfig.captureBodyContentTypes.description": "Configure les types de contenu qui doivent être enregistrés.\n\nLes valeurs par défaut se terminent par un caractère générique afin que les types de contenu tels que `text/plain; charset=utf-8` soient également capturés.", "xpack.apm.agentConfig.captureBodyContentTypes.label": "Capturer les types de contenu du corps", - "xpack.apm.agentConfig.captureHeaders.description": "Si cette option est définie sur \"true\", l'agent capturera les en-têtes de la requête HTTP et de la réponse (y compris les cookies), ainsi que les en-têtes/les propriétés du message lors de l'utilisation de frameworks de messagerie (tels que Kafka).\n\nREMARQUE : Si \"false\" est défini, cela permet de réduire la bande passante du réseau, l'espace disque et les allocations d'objets.", + "xpack.apm.agentConfig.captureHeaders.description": "Si cette option est définie sur `true`, l'agent capturera les en-têtes de la requête HTTP et de la réponse (y compris les cookies), ainsi que les en-têtes/les propriétés du message lors de l'utilisation de frameworks de messagerie (tels que Kafka).\n\nREMARQUE : Si `false` est défini, cela permet de réduire la bande passante du réseau, l'espace disque et les allocations d'objets.", "xpack.apm.agentConfig.captureHeaders.label": "Capturer les en-têtes", - "xpack.apm.agentConfig.captureJmxMetrics.description": "Enregistrer les indicateurs de JMX sur le serveur APM\n\nPeut contenir plusieurs définitions d'indicateurs JMX séparées par des virgules :\n\n\"object_name[] attribute[:metric_name=]\"\n\nPour en savoir plus, consultez la documentation de l'agent Java.", + "xpack.apm.agentConfig.captureJmxMetrics.description": "Enregistrer les indicateurs de JMX sur le serveur APM\n\nPeut contenir plusieurs définitions d'indicateurs JMX séparées par des virgules :\n\n`object_name[] attribute[:metric_name=]`\n\nPour en savoir plus, consultez la documentation de l'agent Java.", "xpack.apm.agentConfig.captureJmxMetrics.label": "Capturer les indicateurs JMX", "xpack.apm.agentConfig.chooseService.editButton": "Modifier", "xpack.apm.agentConfig.chooseService.service.environment.label": "Environnement", "xpack.apm.agentConfig.chooseService.service.name.label": "Nom de service", - "xpack.apm.agentConfig.circuitBreakerEnabled.description": "Nombre booléen spécifiant si le disjoncteur doit être activé ou non. Lorsqu'il est activé, l'agent interroge régulièrement les monitorings de tension pour détecter l'état de tension du système/du processus/de la JVM. Si L'UN des monitorings détecte un signe de tension, l'agent s'interrompt, comme si l'option de configuration \"recording\" était définie sur \"false\", réduisant ainsi la consommation des ressources au minimum. Pendant l'interruption, l'agent continue à interroger les mêmes monitorings pour vérifier si l'état de tension a été allégé. Si TOUS les monitorings indiquent que le système, le processus et la JVM ne sont plus en état de tension, l'agent reprend son activité et redevient entièrement fonctionnel.", + "xpack.apm.agentConfig.circuitBreakerEnabled.description": "Nombre booléen spécifiant si le disjoncteur doit être activé ou non. Lorsqu'il est activé, l'agent interroge régulièrement les monitorings de tension pour détecter l'état de tension du système/du processus/de la JVM. Si L'UN des monitorings détecte un signe de tension, l'agent s'interrompt, comme si l'option de configuration `recording` était définie sur `false`, réduisant ainsi la consommation des ressources au minimum. Pendant l'interruption, l'agent continue à interroger les mêmes monitorings pour vérifier si l'état de tension a été allégé. Si TOUS les monitorings indiquent que le système, le processus et la JVM ne sont plus en état de tension, l'agent reprend son activité et redevient entièrement fonctionnel.", "xpack.apm.agentConfig.circuitBreakerEnabled.label": "Disjoncteur activé", "xpack.apm.agentConfig.configTable.appliedTooltipMessage": "Appliqué par au moins un agent", "xpack.apm.agentConfig.configTable.configTable.failurePromptText": "La liste des configurations d'agent n'a pas pu être récupérée. Votre utilisateur ne dispose peut-être pas d'autorisations suffisantes.", @@ -7968,9 +8908,11 @@ "xpack.apm.agentConfig.configTable.serviceNameColumnLabel": "Nom de service", "xpack.apm.agentConfig.configurationsPanelTitle": "Configurations", "xpack.apm.agentConfig.configurationsPanelTitle.noPermissionTooltipLabel": "Votre rôle d'utilisateur ne dispose pas des autorisations nécessaires pour créer des configurations d'agent", + "xpack.apm.agentConfig.context_propagation_only.description": "Si cette option est configurée sur \"true\", l'envoi de log ainsi que la collecte d'indicateurs et de trace sont désactivés. La propagation du contexte de la trace et la corrélation du log reste actives.", + "xpack.apm.agentConfig.context_propagation_only.label": "Propagation du contexte seulement", "xpack.apm.agentConfig.createConfigButtonLabel": "Créer une configuration", "xpack.apm.agentConfig.createConfigTitle": "Créer une configuration", - "xpack.apm.agentConfig.dedotCustomMetrics.description": "Remplace les points par des traits de soulignement dans les noms des indicateurs personnalisés.\n\nAVERTISSEMENT : L'attribution de la valeur \"false\" peut entraîner des conflits de mapping car les points indiquent une imbrication dans Elasticsearch.\nUn tel conflit peut se produire par exemple entre deux indicateurs si l'un se nomme \"foo\" et l'autre \"foo.bar\".\nLe premier mappe \"foo\" sur un nombre, et le second indicateur mappe \"foo\" en tant qu'objet.", + "xpack.apm.agentConfig.dedotCustomMetrics.description": "Remplace les points par des traits de soulignement dans les noms des indicateurs personnalisés.\n\nAVERTISSEMENT : L'attribution de la valeur `false` peut entraîner des conflits de mapping car les points indiquent une imbrication dans Elasticsearch.\nUn tel conflit peut se produire par exemple entre deux indicateurs si l'un se nomme `foo` et l'autre `foo.bar`.\nLe premier mappe `foo` sur un nombre, et le second indicateur mappe `foo` en tant qu'objet.", "xpack.apm.agentConfig.dedotCustomMetrics.label": "Retirer les points des indicateurs personnalisés", "xpack.apm.agentConfig.deleteModal.cancel": "Annuler", "xpack.apm.agentConfig.deleteModal.confirm": "Supprimer", @@ -7979,14 +8921,14 @@ "xpack.apm.agentConfig.deleteSection.deleteConfigSucceededTitle": "La configuration a été supprimée", "xpack.apm.agentConfig.disableInstrumentations.description": "Liste séparée par des virgules de modules pour lesquels désactiver l'instrumentation.\nLorsque l'instrumentation est désactivée pour un module, aucun intervalle n'est collecté pour ce module.\n\nLa liste à jour des modules pour lesquels l'instrumentation peut être désactivée est spécifique du langage et peut être trouvée en cliquant sur les liens suivants : [Java](https://www.elastic.co/guide/en/apm/agent/java/current/config-core.html#config-disable-instrumentations)", "xpack.apm.agentConfig.disableInstrumentations.label": "Désactiver les instrumentations", - "xpack.apm.agentConfig.disableOutgoingTracecontextHeaders.description": "Utilisez cette option pour désactiver l'injection d'en-têtes \"tracecontext\" dans une communication sortante.\n\nAVERTISSEMENT : La désactivation de l'injection d'en-têtes \"tracecontext\" signifie que le traçage distribué ne fonctionnera pas sur les services en aval.", + "xpack.apm.agentConfig.disableOutgoingTracecontextHeaders.description": "Utilisez cette option pour désactiver l'injection d'en-têtes `tracecontext` dans une communication sortante.\n\nAVERTISSEMENT : La désactivation de l'injection d'en-têtes `tracecontext` signifie que le traçage distribué ne fonctionnera pas sur les services en aval.", "xpack.apm.agentConfig.disableOutgoingTracecontextHeaders.label": "Désactiver les en-têtes tracecontext sortants", "xpack.apm.agentConfig.editConfigTitle": "Modifier la configuration", "xpack.apm.agentConfig.enableExperimentalInstrumentations.description": "Indique s'il faut appliquer des instrumentations expérimentales.\n\nREMARQUE : Le fait de modifier cette valeur au moment de l'exécution peut ralentir temporairement l'application. Définir cette valeur sur true active les instrumentations dans le groupe expérimental.", "xpack.apm.agentConfig.enableExperimentalInstrumentations.label": "Activer les instrumentations expérimentales", - "xpack.apm.agentConfig.enableInstrumentations.description": "Une liste des instrumentations qui doivent être activées de façon sélective. Les options valides sont indiquées dans la [documentation de l’agent Java APM](https://www.elastic.co/guide/en/apm/agent/java/current/config-core.html#config-disable-instrumentations).\n\nLorsqu'une valeur non vide est définie, seules les instrumentations répertoriées sont activées si elles ne sont pas désactivées via \"disable_instrumentations\" ou \"enable_experimental_instrumentations\".\nLorsque cette option n'est pas définie ou est vide (par défaut), toutes les instrumentations activées par défaut sont activées, sauf si elles sont désactivées via \"disable_instrumentations\" ou \"enable_experimental_instrumentations\".", + "xpack.apm.agentConfig.enableInstrumentations.description": "Une liste des instrumentations qui doivent être activées de façon sélective. Les options valides sont indiquées dans la [documentation de l’agent Java APM](https://www.elastic.co/guide/en/apm/agent/java/current/config-core.html#config-disable-instrumentations).\n\nLorsqu'une valeur non vide est définie, seules les instrumentations répertoriées sont activées si elles ne sont pas désactivées via `disable_instrumentations` ou `enable_experimental_instrumentations`.\nLorsque cette option n'est pas définie ou est vide (par défaut), toutes les instrumentations activées par défaut sont activées, sauf si elles sont désactivées via `disable_instrumentations` ou `enable_experimental_instrumentations`.", "xpack.apm.agentConfig.enableInstrumentations.label": "Désactiver les instrumentations", - "xpack.apm.agentConfig.enableLogCorrelation.description": "Nombre booléen spécifiant si l'agent doit être intégré au MDC de SLF4J pour activer la corrélation de logs de suivi. Si cette option est configurée sur \"true\", l'agent définira \"trace.id\" et \"transaction.id\" pour les intervalles et transactions actifs sur le MDC. Depuis la version 1.16.0 de l'agent Java, l'agent ajoute également le \"error.id\" de l'erreur capturée au MDC juste avant le logging du message d'erreur. REMARQUE : bien qu'il soit autorisé d'activer ce paramètre au moment de l'exécution, vous ne pouvez pas le désactiver sans redémarrage.", + "xpack.apm.agentConfig.enableLogCorrelation.description": "Nombre booléen spécifiant si l'agent doit être intégré au MDC de SLF4J pour activer la corrélation de logs de suivi. Si cette option est configurée sur `true`, l'agent définira `trace.id` et `transaction.id` pour les intervalles et transactions actifs sur le MDC. Depuis la version 1.16.0 de l'agent Java, l'agent ajoute également le `error.id` de l'erreur capturée au MDC juste avant le logging du message d'erreur. REMARQUE : bien qu'il soit autorisé d'activer ce paramètre au moment de l'exécution, vous ne pouvez pas le désactiver sans redémarrage.", "xpack.apm.agentConfig.enableLogCorrelation.label": "Activer la corrélation de logs", "xpack.apm.agentConfig.exitSpanMinDuration.description": "Les intervalles de sortie sont des intervalles qui représentent un appel à un service externe, tel qu'une base de données. Si de tels appels sont très courts, ils ne sont généralement pas pertinents et ils peuvent être ignorés.\n\nREMARQUE : Si un intervalle propage des ID de traçage distribué, il ne sera pas ignoré, même s'il est plus court que le seuil configuré. Cela permet de s'assurer qu'aucune trace interrompue n'est enregistrée.", "xpack.apm.agentConfig.exitSpanMinDuration.label": "Durée min. d'intervalle de sortie", @@ -7998,16 +8940,16 @@ "xpack.apm.agentConfig.logEcsReformatting.label": "Reformatage ECS des logs", "xpack.apm.agentConfig.logLevel.description": "Définit le niveau de logging pour l'agent", "xpack.apm.agentConfig.logLevel.label": "Niveau du log", - "xpack.apm.agentConfig.logSending.description": "Expérimental, requiert la version la plus récente de l'agent Java.\n\nSi \"true\" est défini,\nL'agent envoie les logs directement au serveur APM.", + "xpack.apm.agentConfig.logSending.description": "Expérimental, requiert la version la plus récente de l'agent Java.\n\nSi `true` est défini,\nL'agent envoie les logs directement au serveur APM.", "xpack.apm.agentConfig.logSending.label": "Envoi de logs (expérimental)", - "xpack.apm.agentConfig.mongodbCaptureStatementCommands.description": "Les noms de commande MongoDB pour lesquels le document de commande est capturé, limité aux opérations en lecture seule courantes par défaut. Définissez cette option sur \"''\" (vide) pour désactiver la capture, et sur \"*\" pour tout capturer (ce qui est déconseillé car cela peut entraîner la capture d'informations sensibles).\n\nCette option prend en charge le caractère générique \"*\" qui correspond à zéro caractère ou plus. Exemples : \"/foo/*/bar/*/baz*\", \"*foo*\". La correspondance n'est pas sensible à la casse par défaut. L'ajout de \"(?-i)\" au début d'un élément rend la correspondance sensible à la casse.", + "xpack.apm.agentConfig.mongodbCaptureStatementCommands.description": "Les noms de commande MongoDB pour lesquels le document de commande est capturé, limité aux opérations en lecture seule courantes par défaut. Définissez cette option sur `\"\"` (vide) pour désactiver la capture, et sur `*` pour tout capturer (ce qui est déconseillé, car cela peut entraîner la capture d'informations sensibles).\n\nCette option prend en charge le caractère générique `*` qui correspond à zéro caractère ou plus. Exemples : `/foo/*/bar/*/baz*`, `*foo*`. La correspondance n'est pas sensible à la casse par défaut. L'ajout de `(?-i)` au début d'un élément rend la correspondance sensible à la casse.", "xpack.apm.agentConfig.mongodbCaptureStatementCommands.label": "Commandes d'instruction pour la capture MongoDB", "xpack.apm.agentConfig.newConfig.description": "Affinez votre configuration d'agent depuis l'application APM. Les modifications sont automatiquement propagées à vos agents APM, ce qui vous évite d'effectuer un redéploiement.", - "xpack.apm.agentConfig.profilingInferredSpansEnabled.description": "Définissez cette option sur \"true\" pour que l'agent crée des intervalles pour des exécutions de méthodes basées sur async-profiler, un profiler d'échantillonnage (ou profiler statistique). En raison de la nature du fonctionnement des profilers d'échantillonnage, la durée des intervalles générés n'est pas exacte, il ne s'agit que d'estimations. \"profiling_inferred_spans_sampling_interval\" vous permet d'ajuster avec exactitude le compromis entre précision et surcharge. Les intervalles générés sont créés à la fin d'une session de profilage. Cela signifie qu'il existe un délai entre les intervalles réguliers et les intervalles générés visibles dans l'interface utilisateur. REMARQUE : cette fonctionnalité n'est pas disponible sous Windows.", + "xpack.apm.agentConfig.profilingInferredSpansEnabled.description": "Définissez cette option sur `true` afin que l'agent crée des intervalles pour des exécutions de méthodes basées sur async-profiler, un profiler d'échantillonnage (ou profiler statistique). En raison de la nature du fonctionnement des profilers d'échantillonnage, la durée des intervalles générés n'est pas exacte, il ne s'agit que d'estimations. `profiling_inferred_spans_sampling_interval` vous permet d'ajuster avec exactitude le compromis entre précision et surcharge. Les intervalles générés sont créés à la fin d'une session de profilage. Cela signifie qu'il existe un délai entre les intervalles réguliers et les intervalles générés visibles dans l'interface utilisateur. REMARQUE : cette fonctionnalité n'est pas disponible sous Windows.", "xpack.apm.agentConfig.profilingInferredSpansEnabled.label": "Intervalles générés par le profilage activés", - "xpack.apm.agentConfig.profilingInferredSpansExcludedClasses.description": "Exclut les classes pour lesquelles aucun intervalle généré par le profiler ne doit être créé. Cette option prend en charge le caractère générique \"*\" qui correspond à zéro caractère ou plus. La correspondance n'est pas sensible à la casse par défaut. L'ajout de \"(?-i)\" au début d'un élément rend la correspondance sensible à la casse.", + "xpack.apm.agentConfig.profilingInferredSpansExcludedClasses.description": "Exclut les classes pour lesquelles aucun intervalle généré par le profiler ne doit être créé. Cette option prend en charge le caractère générique `*` qui correspond à zéro caractère ou plus. La correspondance n'est pas sensible à la casse par défaut. L'ajout de `(?-i)` au début d'un élément rend la correspondance sensible à la casse.", "xpack.apm.agentConfig.profilingInferredSpansExcludedClasses.label": "Classes exclues des intervalles générés par le profilage", - "xpack.apm.agentConfig.profilingInferredSpansIncludedClasses.description": "Si cette option est définie, l'agent ne créera des intervalles générés que pour les méthodes correspondant à cette liste. La définition d'une valeur peut diminuer légèrement la surcharge et réduire l'encombrement en ne créant des intervalles que pour les classes qui vous intéressent. Cette option prend en charge le caractère générique \"*\" qui correspond à zéro caractère ou plus. Par exemple : \"org.example.myapp.*\". La correspondance n'est pas sensible à la casse par défaut. L'ajout de \"(?-i)\" au début d'un élément rend la correspondance sensible à la casse.", + "xpack.apm.agentConfig.profilingInferredSpansIncludedClasses.description": "Si cette option est définie, l'agent ne créera des intervalles générés que pour les méthodes correspondant à cette liste. La définition d'une valeur peut diminuer légèrement la surcharge et réduire l'encombrement en ne créant des intervalles que pour les classes qui vous intéressent. Cette option prend en charge le caractère générique `*` qui correspond à zéro caractère ou plus. Par exemple : `org.example.myapp.*`. La correspondance n'est pas sensible à la casse par défaut. L'ajout de `(?-i)` au début d'un élément rend la correspondance sensible à la casse.", "xpack.apm.agentConfig.profilingInferredSpansIncludedClasses.label": "Classes incluses des intervalles générés par le profilage", "xpack.apm.agentConfig.profilingInferredSpansMinDuration.description": "Durée minimale d'un intervalle généré. Veuillez noter que la durée minimale est également définie de façon implicite par l'intervalle d'échantillonnage. Toutefois, l'augmentation de l'intervalle d'échantillonnage diminue également la précision de la durée des intervalles générés.", "xpack.apm.agentConfig.profilingInferredSpansMinDuration.label": "Durée minimale des intervalles générés par le profilage", @@ -8015,7 +8957,7 @@ "xpack.apm.agentConfig.profilingInferredSpansSamplingInterval.label": "Intervalle d'échantillonnage des intervalles générés par le profilage", "xpack.apm.agentConfig.recording.description": "Lorsque l'enregistrement est activé, l'agent instrumente les requêtes HTTP entrantes, effectue le suivi des erreurs, et collecte et envoie les indicateurs. Lorsque l'enregistrement n'est pas activé, l'agent agit comme un noop, sans collecter de données ni communiquer avec le serveur AMP, sauf pour rechercher la configuration mise à jour. Puisqu'il s'agit d'un commutateur réversible, les threads d'agents ne sont pas détruits lorsque le mode sans enregistrement est défini. Ils restent principalement inactifs, de sorte que la surcharge est négligeable. Vous pouvez utiliser ce paramètre pour contrôler dynamiquement si Elastic APM doit être activé ou désactivé.", "xpack.apm.agentConfig.recording.label": "Enregistrement", - "xpack.apm.agentConfig.sanitizeFiledNames.description": "Il est parfois nécessaire d'effectuer un nettoyage, c'est-à-dire de supprimer les données sensibles envoyées à Elastic APM. Cette configuration accepte une liste de modèles de caractères génériques de champs de noms qui doivent être nettoyés. Ils s'appliquent aux en-têtes HTTP (y compris les cookies) et aux données \"application/x-www-form-urlencoded\" (champs de formulaire POST). La chaîne de la requête et le corps de la requête capturé (comme des données \"application/json\") ne seront pas nettoyés.", + "xpack.apm.agentConfig.sanitizeFiledNames.description": "Il est parfois nécessaire d'effectuer un nettoyage, c'est-à-dire de supprimer les données sensibles envoyées à Elastic APM. Cette configuration accepte une liste de modèles de caractères génériques de champs de noms qui doivent être nettoyés. Ils s'appliquent aux en-têtes HTTP (y compris les cookies) et aux données `application/x-www-form-urlencoded` (champs de formulaire POST). La chaîne de la requête et le corps de la requête capturé (comme des données `application/json`) ne seront pas nettoyés.", "xpack.apm.agentConfig.sanitizeFiledNames.label": "Nettoyer les noms des champs", "xpack.apm.agentConfig.saveConfig.failed.title": "La configuration n'a pas pu être enregistrée", "xpack.apm.agentConfig.saveConfig.succeeded.title": "Configuration enregistrée", @@ -8043,31 +8985,31 @@ "xpack.apm.agentConfig.spanCompressionExactMatchMaxDuration.label": "Durée maximale de compression d'intervalles en correspondance parfaite", "xpack.apm.agentConfig.spanCompressionSameKindMaxDuration.description": "Les intervalles consécutifs qui ont la même destination et qui se trouvent sous ce seuil seront compressés en un seul intervalle composite. Cette option ne s'applique pas aux intervalles composites. Cela réduit la surcharge de collecte, de traitement et de stockage, et supprime l'encombrement dans l'interface utilisateur. Le compromis est que les instructions de base de données de tous les intervalles compressés ne seront pas collectées.", "xpack.apm.agentConfig.spanCompressionSameKindMaxDuration.label": "Durée maximale de compression d'intervalles de même genre", - "xpack.apm.agentConfig.spanFramesMinDuration.description": "(déclassé, utilisez \"span_stack_trace_min_duration\" à la place) Dans ses paramètres par défaut, l'agent APM collectera une trace de la pile avec chaque intervalle enregistré.\nBien qu'il soit très pratique de trouver l'endroit exact dans votre code qui provoque l'intervalle, la collecte de cette trace de la pile provoque une certaine surcharge. \nLorsque cette option est définie sur une valeur négative, telle que \"-1ms\", les traces de pile sont collectées pour tous les intervalles. En choisissant une valeur positive, par ex. \"5ms\", la collecte des traces de pile se limitera aux intervalles dont la durée est égale ou supérieure à la valeur donnée, par ex. 5 millisecondes.\n\nPour désactiver complètement la collecte des traces de pile des intervalles, réglez la valeur sur \"0ms\".", + "xpack.apm.agentConfig.spanFramesMinDuration.description": "(déclassé, utilisez `span_stack_trace_min_duration` à la place) Dans ses paramètres par défaut, l'agent APM collectera une trace de la pile avec chaque intervalle enregistré.\nBien qu'il soit très pratique de trouver l'endroit exact dans votre code qui provoque l'intervalle, la collecte de cette trace de la pile provoque une certaine surcharge. \nLorsque cette option est définie sur une valeur négative, telle que `-1ms`, les traces de pile sont collectées pour tous les intervalles. En choisissant une valeur positive, par ex. `5ms`, la collecte des traces de pile se limitera aux intervalles dont la durée est égale ou supérieure à la valeur donnée, c’est-à-dire 5 millisecondes.\n\nPour désactiver complètement la collecte des traces de pile des intervalles, réglez la valeur sur `0ms`.", "xpack.apm.agentConfig.spanFramesMinDuration.label": "Durée minimale des cadres des intervalles", "xpack.apm.agentConfig.spanMinDuration.description": "Définit la durée minimale des intervalles. Une tentative visant à ignorer les intervalles qui s'exécutent plus rapidement que ce seuil peut avoir lieu.\n\nLa tentative échoue si elle mène à un intervalle qui ne peut pas être ignoré. Les intervalles qui propagent le contexte de trace aux services en aval, tels que les requêtes HTTP sortantes, ne peuvent pas être ignorés. De plus, les intervalles qui conduisent à une erreur ou qui peuvent être le parent d'une opération asynchrone ne peuvent pas être ignorés.\n\nCependant, les appels externes qui ne propagent pas le contexte, tels que les appels à une base de données, peuvent être ignorés à l'aide de ce seuil.", "xpack.apm.agentConfig.spanMinDuration.label": "Durée minimale de l'intervalle", - "xpack.apm.agentConfig.spanStackTraceMinDuration.description": "Bien qu'il soit très pratique de trouver l'endroit exact dans votre code qui provoque l'intervalle, la collecte de cette trace de la pile provoque une certaine surcharge. Lorsque cette option est définie sur la valeur \"0ms\", les traces de pile sont collectées pour tous les intervalles. En choisissant une valeur positive, par ex. \"5ms\", la collecte des traces de pile se limitera aux intervalles dont la durée est égale ou supérieure à la valeur donnée, par ex. 5 millisecondes.\n\nPour désactiver complètement la collecte des traces de pile des intervalles, réglez la valeur sur \"-1ms\".", + "xpack.apm.agentConfig.spanStackTraceMinDuration.description": "Bien qu'il soit très pratique de trouver l'endroit exact dans votre code qui provoque l'intervalle, la collecte de cette trace de la pile provoque une certaine surcharge. Lorsque cette option est définie sur la valeur `0ms`, les traces de pile sont collectées pour tous les intervalles. En choisissant une valeur positive, par ex. `5ms`, la collecte des traces de pile se limitera aux intervalles dont la durée est égale ou supérieure à la valeur donnée, c’est-à-dire 5 millisecondes.\n\nPour désactiver complètement la collecte des traces de pile des intervalles, réglez la valeur sur `-1ms`.", "xpack.apm.agentConfig.spanStackTraceMinDuration.label": "Durée minimale de la trace de pile de l'intervalle", "xpack.apm.agentConfig.stackTraceLimit.description": "En définissant cette option sur 0, la collecte des traces de pile sera désactivée. Toute valeur entière positive sera utilisée comme nombre maximal de cadres à collecter. La valeur -1 signifie que tous les cadres seront collectés.", "xpack.apm.agentConfig.stackTraceLimit.label": "Limite de trace de pile", - "xpack.apm.agentConfig.stressMonitorCpuDurationThreshold.description": "Durée minimale requise pour déterminer si le système est actuellement sous tension ou si la tension précédemment détectée a été allégée. Toutes les mesures réalisées pendant ce laps de temps doivent être cohérentes par rapport au seuil concerné pour pouvoir détecter un changement d'état de tension. La valeur doit être d'au moins \"1m\".", + "xpack.apm.agentConfig.stressMonitorCpuDurationThreshold.description": "Durée minimale requise pour déterminer si le système est actuellement sous tension ou si la tension précédemment détectée a été allégée. Toutes les mesures réalisées pendant ce laps de temps doivent être cohérentes par rapport au seuil concerné pour pouvoir détecter un changement d'état de tension. La valeur doit être d'au moins `1m`.", "xpack.apm.agentConfig.stressMonitorCpuDurationThreshold.label": "Seuil de durée de tension CPU du monitoring", - "xpack.apm.agentConfig.stressMonitorGcReliefThreshold.description": "Seuil utilisé par le monitoring RM pour identifier le moment auquel le tas n'est pas sous tension. Si le \"stress_monitor_gc_stress_threshold\" a été franchi, l'agent le considérera comme un état de tension du tas. Pour déterminer l'état de tension comme terminé, le pourcentage de mémoire occupée dans TOUS les pools de tas doit être inférieur à ce seuil. Le monitoring RM ne se base que sur la consommation de mémoire mesurée après une RM récente.", + "xpack.apm.agentConfig.stressMonitorGcReliefThreshold.description": "Seuil utilisé par le monitoring RM pour identifier le moment auquel le tas n'est pas sous tension. Si le `stress_monitor_gc_stress_threshold` a été franchi, l'agent le considérera comme un état de tension du tas. Pour déterminer l'état de tension comme terminé, le pourcentage de mémoire occupée dans TOUS les pools de tas doit être inférieur à ce seuil. Le monitoring RM ne se base que sur la consommation de mémoire mesurée après une RM récente.", "xpack.apm.agentConfig.stressMonitorGcReliefThreshold.label": "Seuil d'allègement de la tension du monitoring RM", "xpack.apm.agentConfig.stressMonitorGcStressThreshold.description": "Seuil utilisé par le monitoring RM pour identifier la tension du tas. Ce même seuil sera utilisé pour tous les pools de mémoire, de sorte que si L'UN d'entre eux a un pourcentage d'utilisation qui dépasse ce seuil, l'agent l'interprétera comme une tension de segment de mémoire. Le monitoring RM ne se base que sur la consommation de mémoire mesurée après une RM récente.", "xpack.apm.agentConfig.stressMonitorGcStressThreshold.label": "Seuil de tension du monitoring RM", - "xpack.apm.agentConfig.stressMonitorSystemCpuReliefThreshold.description": "Seuil utilisé par le monitoring du CPU système pour déterminer que le système n'est pas sous tension au niveau du processeur. Si le monitor détecte une tension de CPU, le CPU système mesuré doit être inférieur à ce seuil pour une durée d'au moins \"stress_monitor_cpu_duration_threshold\", pour que le monitoring établisse l'allègement de la tension de CPU.", + "xpack.apm.agentConfig.stressMonitorSystemCpuReliefThreshold.description": "Seuil utilisé par le monitoring du CPU système pour déterminer que le système n'est pas sous tension au niveau du processeur. Si le monitor détecte une tension de CPU, le CPU système mesuré doit être inférieur à ce seuil pour une durée d'au moins `stress_monitor_cpu_duration_threshold`, pour que le monitoring établisse l'allègement de la tension de CPU.", "xpack.apm.agentConfig.stressMonitorSystemCpuReliefThreshold.label": "Seuil d'allègement de la tension du monitoring du CPU système", - "xpack.apm.agentConfig.stressMonitorSystemCpuStressThreshold.description": "Seuil utilisé par le monitoring du CPU du système pour détecter la tension du processeur du système. Si le CPU système dépasse ce seuil pour une durée d'au moins \"stress_monitor_cpu_duration_threshold\", le monitoring considère qu'il est en état de tension.", + "xpack.apm.agentConfig.stressMonitorSystemCpuStressThreshold.description": "Seuil utilisé par le monitoring du CPU du système pour détecter la tension du processeur du système. Si le CPU système dépasse ce seuil pour une durée d'au moins `stress_monitor_cpu_duration_threshold`, le monitoring considère qu'il est en état de tension.", "xpack.apm.agentConfig.stressMonitorSystemCpuStressThreshold.label": "Seuil de tension du monitoring du CPU système", - "xpack.apm.agentConfig.traceContinuationStrategy.description": "Cette option permet un certain contrôle sur la façon dont l'agent APM gère les en-tête de contexte de trace W3C dans les requêtes entrantes. Par défaut, les en-têtes \"traceparent\" et \"tracestate\" sont utilisés par les spécifications W3C pour le traçage distribué. Cependant, dans certains cas, il peut être utile de ne pas utiliser l'en-tête \"traceparent\" entrant. Quelques exemples de cas d'utilisation :\n\n* Un service monitoré par Elastic reçoit des requêtes avec les en-têtes \"traceparent\" de services non monitorés.\n* Un service monitoré par Elastic est publiquement exposé, et ne souhaite pas que les données de traçage (ID de traçage, décisions d'échantillonnage) puissent être usurpées par des requêtes d'utilisateur.\n\nLes valeurs valides sont :\n* \"continue\" : comportement par défaut. Une valeur \"traceparent\" entrante est utilisée pour continuer le traçage et déterminer la décision d'échantillonnage.\n* \"restart\" : ignore toujours l'en-tête \"traceparent\" des requêtes entrantes. Un nouveau trace-id sera généré et la décision d'échantillonnage sera prise en fonction de transaction_sample_rate. Une liaison d'intervalle sera effectuée vers le \"traceparent\" entrant.\n* \"restart_external\" : Si une requête entrante inclut le drapeau \"es\" dans \"tracestate\", tout \"traceparent\" sera considéré comme interne et sera géré comme décrit pour \"continue\" ci-dessus. Autrement, tout \"traceparent\" est considéré comme externe et sera géré comme décrit pour \"restart\" ci-dessus.\n\nDepuis Elastic Observability 8.2, les liens d'intervalle sont visibles dans les vues de trace.\n\nCette option ne respecte pas la casse.", + "xpack.apm.agentConfig.traceContinuationStrategy.description": "Cette option permet un certain contrôle sur la façon dont l'agent APM gère les en-tête de contexte de trace W3C dans les requêtes entrantes. Par défaut, les en-têtes `traceparent` et `tracestate` sont utilisés conformément aux spécifications W3C pour le traçage distribué. Cependant, dans certains cas, il peut être utile de ne pas utiliser l'en-tête `traceparent` entrant. Quelques exemples de cas d'utilisation :\n\n* Un service monitoré par Elastic reçoit des requêtes avec les en-têtes `traceparent` de services non monitorés.\n* Un service monitoré par Elastic est publiquement exposé, et ne souhaite pas que les données de traçage (ID de traçage, décisions d'échantillonnage) puissent être usurpées par des requêtes d'utilisateur.\n\nLes valeurs valides sont :\n* \"continue\" : comportement par défaut. Une valeur `traceparent` entrante est utilisée pour continuer le traçage et déterminer la décision d'échantillonnage.\n* \"restart\" : ignore toujours l'en-tête `traceparent` des requêtes entrantes. Un nouveau trace-id sera généré et la décision d'échantillonnage sera prise en fonction de transaction_sample_rate. Une liaison d'intervalle sera effectuée vers le `traceparent` entrant.\n* \"restart_external\" : Si une requête entrante inclut le drapeau de fournisseur `es` dans `tracestate`, tout `traceparent` sera considéré comme interne et sera géré comme décrit pour `continue` ci-dessus. Autrement, tout `traceparent` est considéré comme externe et sera géré comme décrit pour `restart` ci-dessus.\n\nDepuis Elastic Observability 8.2, les liens d'intervalle sont visibles dans les vues de trace.\n\nCette option ne respecte pas la casse.", "xpack.apm.agentConfig.traceContinuationStrategy.label": "Stratégie de poursuite de traçage", - "xpack.apm.agentConfig.traceMethods.description": "Liste de méthodes pour lesquelles une transaction ou un intervalle doit être créé(e).\n\nSi vous souhaitez monitorer un nombre important de méthodes,\nutilisez \"profiling_inferred_spans_enabled\".\n\nCela fonctionne en instrumentant chaque méthode correspondante pour inclure le code qui crée un intervalle pour la méthode.\nSi la création d'un intervalle est très économique en termes de performances,\nl'instrumentation de toute une base de codes ou d'une méthode qui est exécutée dans une boucle serrée entraîne une surcharge significative.\n\nREMARQUE : utilisez les caractères génériques uniquement si cela est nécessaire.\nPlus vous faites correspondre de méthodes, plus l'agent créera une surcharge.\nNotez également qu'il existe une quantité maximale d'intervalles par transaction, \"transaction_max_spans\".\n\nPour en savoir plus, consultez la documentation de l'agent Java.", + "xpack.apm.agentConfig.traceMethods.description": "Liste de méthodes pour lesquelles une transaction ou un intervalle doivent être créés.\n\nSi vous souhaitez monitorer un nombre important de méthodes,\nutilisez `profiling_inferred_spans_enabled`.\n\nCela fonctionne en instrumentant chaque méthode correspondante pour inclure le code qui crée un intervalle pour la méthode.\nSi la création d'un intervalle est très économique en termes de performances,\nl'instrumentation de toute une base de codes ou d'une méthode qui est exécutée dans une boucle serrée entraîne une surcharge significative.\n\nREMARQUE : utilisez les caractères génériques uniquement si cela est nécessaire.\nPlus vous faites correspondre de méthodes, plus l'agent créera une surcharge.\nNotez également qu'il existe une quantité maximale d'intervalles par transaction, `transaction_max_spans`.\n\nPour en savoir plus, consultez la documentation de l'agent Java.", "xpack.apm.agentConfig.traceMethods.label": "Méthodes de traçage", - "xpack.apm.agentConfig.transactionIgnoreUrl.description": "Utilisé pour limiter l'instrumentation des requêtes vers certaines URL. Cette configuration accepte une liste séparée par des virgules de modèles de caractères génériques de chemins d'URL qui doivent être ignorés. Lorsqu'une requête HTTP entrante sera détectée, son chemin de requête sera confronté à chaque élément figurant dans cette liste. Par exemple, l'ajout de \"/home/index\" à cette liste permettrait de faire correspondre et de supprimer l'instrumentation de \"http://localhost/home/index\" ainsi que de \"http://whatever.com/home/index?value1=123\"", + "xpack.apm.agentConfig.transactionIgnoreUrl.description": "Utilisé pour limiter l'instrumentation des requêtes vers certaines URL. Cette configuration accepte une liste séparée par des virgules de modèles de caractères génériques de chemins d'URL qui doivent être ignorés. Lorsqu'une requête HTTP entrante sera détectée, son chemin de requête sera confronté à chaque élément figurant dans cette liste. Par exemple, l'ajout de `/home/index` à cette liste permettrait de faire correspondre et de supprimer l'instrumentation de `http://localhost/home/index` ainsi que de `http://whatever.com/home/index?value1=123`", "xpack.apm.agentConfig.transactionIgnoreUrl.label": "Ignorer les transactions basées sur les URL", - "xpack.apm.agentConfig.transactionIgnoreUserAgents.description": "Utilisé pour limiter l'instrumentation des requêtes de certains agents utilisateurs.\n\nLorsqu'une requête HTTP entrante est détectée,\nl'agent utilisateur des en-têtes de la requête sera testé avec chaque élément de cette liste.\nExemple : \"curl/*\", \"*pingdom*\"", + "xpack.apm.agentConfig.transactionIgnoreUserAgents.description": "Utilisé pour limiter l'instrumentation des requêtes de certains agents utilisateurs.\n\nLorsqu'une requête HTTP entrante est détectée,\nl'agent utilisateur des en-têtes de la requête sera testé avec chaque élément de cette liste.\nExemple : `curl/*`, `*pingdom*`", "xpack.apm.agentConfig.transactionIgnoreUserAgents.label": "La transaction ignore les agents utilisateurs", "xpack.apm.agentConfig.transactionMaxSpans.description": "Limite la quantité d'intervalles enregistrés par transaction.", "xpack.apm.agentConfig.transactionMaxSpans.label": "Nb maxi d'intervalles de transaction", @@ -8078,7 +9020,7 @@ "xpack.apm.agentConfig.unnestExceptions.description": "Lors du reporting d'exceptions,\ndésimbrique les exceptions correspondant au modèle de caractère générique.\nCela peut s'avérer pratique pour Spring avec \"org.springframework.web.util.NestedServletException\",\npar exemple.", "xpack.apm.agentConfig.unnestExceptions.label": "Désimbriquer les exceptions", "xpack.apm.agentConfig.unsavedSetting.tooltip": "Non enregistré", - "xpack.apm.agentConfig.usePathAsTransactionName.description": "Si \"true\" est défini,\nles noms de transaction de frameworks non pris en charge ou partiellement pris en charge seront au format \"$method $path\" au lieu de simplement \"$method unknown route\".\n\nAVERTISSEMENT : si vos URL contiennent des paramètres de chemin tels que \"/user/$userId\",\nsoyez très prudent en activant cet indicateur,\ncar cela peut entraîner une explosion de groupes de transactions.\nConsultez l'option \"transaction_name_groups\" pour savoir comment atténuer ce problème en regroupant les URL ensemble.", + "xpack.apm.agentConfig.usePathAsTransactionName.description": "Si `true` est défini,\nles noms de transaction de frameworks non pris en charge ou partiellement pris en charge seront au format `$method $path` au lieu de simplement `$method unknown route`.\n\nAVERTISSEMENT : si vos URL contiennent des paramètres de chemin tels que `/user/$userId`,\nsoyez très prudent en activant cet indicateur,\ncar cela peut entraîner une explosion de groupes de transactions.\nConsultez l'option `transaction_name_groups` pour savoir comment atténuer ce problème en regroupant les URL ensemble.", "xpack.apm.agentConfig.usePathAsTransactionName.label": "Utiliser le chemin comme nom de transaction", "xpack.apm.agentExplorer.agentLanguageSelect.label": "Langage de l'agent", "xpack.apm.agentExplorer.agentLanguageSelect.placeholder": "Tous", @@ -8159,6 +9101,9 @@ "xpack.apm.alerts.action_variables.transactionType": "Type de transaction pour lequel l'alerte est créée", "xpack.apm.alerts.action_variables.triggerValue": "Valeur ayant dépassé le seuil et déclenché l'alerte", "xpack.apm.alerts.action_variables.viewInAppUrl": "Lien vers la source de l’alerte", + "xpack.apm.alerts.anomalyDetector.failedTransactionRateLabel": "taux d'échecs de transactions", + "xpack.apm.alerts.anomalyDetector.latencyLabel": "latence", + "xpack.apm.alerts.anomalyDetector.throughputLabel": "rendement", "xpack.apm.alerts.anomalySeverity.criticalLabel": "critique", "xpack.apm.alerts.anomalySeverity.majorLabel": "majeur", "xpack.apm.alerts.anomalySeverity.minor": "mineure", @@ -8195,6 +9140,8 @@ "xpack.apm.anomalyDetectionSetup.linkLabel": "Détection des anomalies", "xpack.apm.anomalyDetectionSetup.notEnabledText": "La détection des anomalies n'est pas encore activée. Cliquez pour continuer la configuration.", "xpack.apm.anomalyDetectionSetup.upgradeableJobsText": "Mises à jour disponibles pour les tâches de détection des anomalies existantes.", + "xpack.apm.anomalyRuleType.anomalyDetector": "Types de détecteurs", + "xpack.apm.anomalyRuleType.anomalyDetector.infoLabel": "Vous devez sélectionner au moins un détecteur", "xpack.apm.anomalyScore": "Anomalie {severity, select, minor {mineure} major {majeure} critical {critique}}", "xpack.apm.api.apiKeys.securityRequired": "Le plug-in de sécurité est requis", "xpack.apm.api.fleet.cloud_apm_package_policy.requiredRoleOnCloud": "Opération autorisée uniquement pour les utilisateurs Elastic Cloud disposant du rôle de superutilisateur.", @@ -8285,6 +9232,14 @@ "xpack.apm.correlations.progressAriaLabel": "Progression", "xpack.apm.correlations.refreshButtonTitle": "Actualiser", "xpack.apm.correlations.veryLowImpactText": "Très bas", + "xpack.apm.crashTable.crashMessageAndCulpritColumnLabel": "Message de panne", + "xpack.apm.crashTable.groupIdColumnDescription": "Hachage de la trace de pile. Regroupe les erreurs similaires, même lorsque le message d'erreur est différent en raison des paramètres dynamiques.", + "xpack.apm.crashTable.groupIdColumnLabel": "ID du groupe", + "xpack.apm.crashTable.lastSeenColumnLabel": "Vu en dernier", + "xpack.apm.crashTable.loading": "Chargement...", + "xpack.apm.crashTable.noCrashesLabel": "Pas de pannes trouvées", + "xpack.apm.crashTable.occurrencesColumnLabel": "Occurrences", + "xpack.apm.crashTable.typeColumnLabel": "Type", "xpack.apm.customLink.buttom.create": "Créer un lien personnalisé", "xpack.apm.customLink.buttom.create.title": "Créer", "xpack.apm.customLink.buttom.manage": "Gérer des liens personnalisés", @@ -8292,7 +9247,7 @@ "xpack.apm.dashboard.addDashboard.useContextFilterLabel": "Filtrer par service et par environnement", "xpack.apm.dashboard.addDashboard.useContextFilterLabel.tooltip": "L'activation de cette option applique des filtres au tableau de bord en fonction du service et de l'environnement choisis.", "xpack.apm.data_view.creation_failed": "Une erreur s'est produite lors de la création de la vue de données", - "xpack.apm.dataView.alreadyExistsInActiveSpace": "La vue de données existe déjà dans l'espace actif", + "xpack.apm.dataView.alreadyExistsInActiveSpace": "L'affichage des données existe déjà dans l'espace actif et n'a pas besoin d'être mis à jour", "xpack.apm.dataView.autoCreateDisabled": "La création automatique des vues de données a été désactivée via l'option de configuration \"autoCreateApmDataView\"", "xpack.apm.dataView.noApmData": "Aucune donnée APM", "xpack.apm.dependecyOperationDetailView.header.backLinkLabel": "Toutes les opérations", @@ -8336,6 +9291,8 @@ "xpack.apm.diagnostics.tab.index_templates": "Modèles d'index", "xpack.apm.diagnostics.tab.indices": "Index", "xpack.apm.diagnostics.tab.summary": "Résumé", + "xpack.apm.diagnosticsApmDocuments.em.emptyLabel": "Vide", + "xpack.apm.diagnosticsApmDocuments.filter:BadgeLabel": "Filtrer :", "xpack.apm.durationDistribution.chart.currentEventMarkerLabel": "Échantillon actuel", "xpack.apm.durationDistribution.chart.latencyLabel": "Latence", "xpack.apm.durationDistribution.chart.numberOfSpansLabel": "Intervalles", @@ -8369,9 +9326,12 @@ "xpack.apm.errorGroupTopTransactions.noResults": "Aucune erreur trouvée associée à des transactions", "xpack.apm.errorGroupTopTransactions.title": "5 principales transactions affectées", "xpack.apm.errorKeySelectCustomOptionText": "Ajouter \\{searchValue\\} comme nouvelle clé de groupe d'erreurs", + "xpack.apm.errorOverview.treemap.dropdown.devices.subtitle": "Cet affichage sous forme de compartimentage permet de visualiser plus facilement et rapidement les appareils les plus affectés", + "xpack.apm.errorOverview.treemap.dropdown.versions.subtitle": "Cet affichage sous forme de compartimentage permet de visualiser plus facilement et rapidement les versions les plus affectées.", "xpack.apm.errorRate": "Taux de transactions ayant échoué", "xpack.apm.errorRate.chart.errorRate": "Taux de transactions ayant échoué (moy.)", "xpack.apm.errorRate.tip": "Le pourcentage de transactions ayant échoué pour le service sélectionné. Les transactions du serveur HTTP avec un code du statut 4xx (erreur du client) ne sont pas considérées comme des échecs, car l'appelant, et non le serveur, a provoqué l'échec.", + "xpack.apm.errors.httpErrorRateTitle": "Taux d'erreur HTTP", "xpack.apm.errorSampleDetails.errorOccurrenceTitle": "Exemple d'erreur", "xpack.apm.errorSampleDetails.investigateMenu": "Examiner", "xpack.apm.errorSampleDetails.relatedTransactionSample": "Échantillon de transaction associée", @@ -8383,6 +9343,8 @@ "xpack.apm.errorsTable.columnName": "Nom", "xpack.apm.errorsTable.columnOccurrences": "Occurrences", "xpack.apm.errorsTable.errorMessageAndCulpritColumnLabel": "Message d'erreur et coupable", + "xpack.apm.errorsTable.errorMessageColumnLabel": "Message d'erreur", + "xpack.apm.errorsTable.filterErrorsPlaceholder": "Rechercher les erreurs par message, par type ou par coupable", "xpack.apm.errorsTable.groupIdColumnDescription": "Hachage de la trace de pile. Regroupe les erreurs similaires, même lorsque le message d'erreur est différent en raison des paramètres dynamiques.", "xpack.apm.errorsTable.groupIdColumnLabel": "ID du groupe", "xpack.apm.errorsTable.lastSeenColumnLabel": "Vu en dernier", @@ -8470,7 +9432,7 @@ "xpack.apm.fleet_integration.settings.rum.rumAllowHeaderTitle": "En-têtes personnalisés", "xpack.apm.fleet_integration.settings.rum.rumAllowOriginsHelpText": "En-têtes Origin autorisés pouvant être envoyés par les agents utilisateurs.", "xpack.apm.fleet_integration.settings.rum.rumAllowOriginsLabel": "Origines autorisées", - "xpack.apm.fleet_integration.settings.rum.rumExcludeFromGroupingHelpText": "Exclure les cadres des traces de pile du calcul des groupes d'erreurs en faisant correspondre le \"file_name\" d'un cadre de trace de pile avec ce regexp.", + "xpack.apm.fleet_integration.settings.rum.rumExcludeFromGroupingHelpText": "Exclure les cadres des traces de pile du calcul des groupes d'erreurs en faisant correspondre le `file_name` d'un cadre de trace de pile avec ce regexp.", "xpack.apm.fleet_integration.settings.rum.rumExcludeFromGroupingLabel": "Exclure du regroupement", "xpack.apm.fleet_integration.settings.rum.rumLibraryPatternHelpText": "Identifiez les cadres de la bibliothèque en faisant correspondre le file_name et le abs_path du cadre de la trace de pile avec ce regexp.", "xpack.apm.fleet_integration.settings.rum.rumLibraryPatternLabel": "Modèle du cadre de la bibliothèque", @@ -8544,6 +9506,8 @@ "xpack.apm.formatters.millisTimeUnitLabel": "ms", "xpack.apm.formatters.minutesTimeUnitLabel": "min", "xpack.apm.formatters.secondsTimeUnitLabel": "s", + "xpack.apm.getAgentsColumns.euiButtonIcon.toggleAgentInstancesViewLabel": "Basculer la vue des instances de l'agent", + "xpack.apm.getColumns.euiButtonIcon.editLabel": "Modifier", "xpack.apm.header.badge.readOnly.text": "Lecture seule", "xpack.apm.header.badge.readOnly.tooltip": "Enregistrement impossible", "xpack.apm.helpMenu.upgradeAssistantLink": "Assistant de mise à niveau", @@ -8626,16 +9590,27 @@ "xpack.apm.mobile.charts.nct": "Type de connexion réseau", "xpack.apm.mobile.charts.noResultsFound": "Résultat introuvable", "xpack.apm.mobile.charts.osVersion": "Version du système d'exploitation", + "xpack.apm.mobile.errorOverview.treemap.dropdown.devices": "Appareils", + "xpack.apm.mobile.errorOverview.treemap.dropdown.devices.subtitle": "Compartimentage affichant les appareils les plus affectés.", + "xpack.apm.mobile.errorOverview.treemap.dropdown.osVersions": "Versions du système d'exploitation", + "xpack.apm.mobile.errorOverview.treemap.dropdown.osVersions.subtitle": "Compartimentage affichant les versions du système d'exploitation les plus affectées.", + "xpack.apm.mobile.errorOverview.treemap.dropdown.versions.subtitle": "Compartimentage affichant les applications les plus affectées.", + "xpack.apm.mobile.errorOverview.treemap.versions.devices": "Versions de l'application", + "xpack.apm.mobile.errors.httpErrorRate": "Taux d'erreur HTTP", + "xpack.apm.mobile.errors.httpErrorRateTooltip": "Taux d'erreur HTTP composé de 4xx & 5xx.", + "xpack.apm.mobile.errorsAndCrashes.crashesTab": "Pannes", + "xpack.apm.mobile.errorsAndCrashes.errorsTab": "Erreurs", "xpack.apm.mobile.filters.appVersion": "Version de l'application", "xpack.apm.mobile.filters.device": "Appareil", "xpack.apm.mobile.filters.nct": "NCT", "xpack.apm.mobile.filters.osVersion": "Version du système d'exploitation", "xpack.apm.mobile.location.metrics.http.requests.title": "Le plus utilisé dans", "xpack.apm.mobile.location.metrics.launches": "La plupart des lancements", + "xpack.apm.mobile.location.metrics.mostCrashes": "La plupart des pannes", "xpack.apm.mobile.location.metrics.sessions": "La plupart des sessions", "xpack.apm.mobile.metrics.crash.rate": "Taux de panne", "xpack.apm.mobile.metrics.http.requests": "Requêtes HTTP", - "xpack.apm.mobile.metrics.load.time": "Temps de chargement de l'application le plus lent", + "xpack.apm.mobile.metrics.load.time": "Temps moyen de chargement de l'application", "xpack.apm.mobile.metrics.sessions": "Sessions", "xpack.apm.mobile.stats.table.loading": "Chargement...", "xpack.apm.mobile.stats.table.noDataMessage": "Aucune donnée trouvée", @@ -8648,6 +9623,7 @@ "xpack.apm.mobile.transactions.overview.tabs.os.version": "Version du système d'exploitation", "xpack.apm.mobile.transactions.overview.tabs.transactions": "Transactions", "xpack.apm.mobileServiceDetails.alertsTabLabel": "Alertes", + "xpack.apm.mobileServiceDetails.dashboardsTabLabel": "Tableaux de bord", "xpack.apm.mobileServiceDetails.overviewTabLabel": "Aperçu", "xpack.apm.mobileServiceDetails.serviceMapTabLabel": "Carte des services", "xpack.apm.mobileServiceDetails.transactionsTabLabel": "Transactions", @@ -8688,21 +9664,21 @@ "xpack.apm.onboarding.config_otel.column.configSettings": "Paramètre de configuration (1)", "xpack.apm.onboarding.config_otel.column.configValue": "Valeur de configuration", "xpack.apm.onboarding.config_otel.column.notes": "Notes", - "xpack.apm.onboarding.config_otel.description2": "Les variables d’environnement 'OTEL_METRICS_EXPORTER` et 'OTEL_LOGS_EXPORTER' peuvent ne pas être prises en charge par certains SDK.", + "xpack.apm.onboarding.config_otel.description2": "Les variables d’environnement `OTEL_METRICS_EXPORTER` et `OTEL_LOGS_EXPORTER` peuvent ne pas être prises en charge par certains SDK.", "xpack.apm.onboarding.config_otel.instrumentationGuide": "Guide de l’Instrumentation OpenTelemetry", - "xpack.apm.onboarding.django.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du \"SERVICE_NAME\".", + "xpack.apm.onboarding.django.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du `SERVICE_NAME`.", "xpack.apm.onboarding.django.configure.title": "Configurer l'agent", "xpack.apm.onboarding.django.install.textPre": "Installez l'agent APM pour Python en tant que dépendance.", "xpack.apm.onboarding.django.install.title": "Installer l'agent APM", "xpack.apm.onboarding.djangoClient.configure.commands.addAgentComment": "Ajouter l'agent aux applications installées", "xpack.apm.onboarding.djangoClient.configure.commands.addTracingMiddlewareComment": "Ajoutez notre intergiciel de traçage pour envoyer des indicateurs de performance", "xpack.apm.onboarding.dotNet.configureAgent.title": "Exemple de fichier appsettings.json :", - "xpack.apm.onboarding.dotNet.configureApplication.textPost": "La transmission d'une instance \"IConfiguration\" est facultative mais si cette opération est effectuée, l'agent lira les paramètres de configuration depuis cette instance \"IConfiguration\" (par ex. à partir du fichier \"appsettings.json\").", - "xpack.apm.onboarding.dotNet.configureApplication.textPre": "Si vous utilisez ASP.NET Core avec le package \"Elastic.Apm.NetCoreAll\", appelez la méthode \"UseAllElasticApm\" dans la méthode \"Configure\" dans le fichier \"Startup.cs\".", + "xpack.apm.onboarding.dotNet.configureApplication.textPost": "La transmission d'une instance `IConfiguration` est facultative mais si cette opération est effectuée, l'agent lira les paramètres de configuration depuis cette instance `IConfiguration` (par ex. à partir du fichier `appsettings.json`).", + "xpack.apm.onboarding.dotNet.configureApplication.textPre": "Si vous utilisez ASP.NET Core avec le package `Elastic.Apm.NetCoreAll`, appelez la méthode `UseAllElasticApm` dans la méthode \"Configure\" dans le fichier `Startup.cs`.", "xpack.apm.onboarding.dotNet.configureApplication.title": "Ajouter l'agent à l'application", "xpack.apm.onboarding.dotNet.download.title": "Télécharger l'agent APM", "xpack.apm.onboarding.dotnetClient.createConfig.commands.defaultServiceName": "La valeur par défaut est l'assemblage d'entrée de l'application.", - "xpack.apm.onboarding.flask.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du \"SERVICE_NAME\".", + "xpack.apm.onboarding.flask.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du `SERVICE_NAME`.", "xpack.apm.onboarding.flask.configure.title": "Configurer l'agent", "xpack.apm.onboarding.flask.install.textPre": "Installez l'agent APM pour Python en tant que dépendance.", "xpack.apm.onboarding.flask.install.title": "Installer l'agent APM", @@ -8710,7 +9686,7 @@ "xpack.apm.onboarding.flaskClient.configure.commands.initializeUsingEnvironmentVariablesComment": "Initialisez à l'aide des variables d'environnement", "xpack.apm.onboarding.footer.cta": "Lancer APM", "xpack.apm.onboarding.footer.exploreYourDataDescription": "Une fois toutes les étapes terminées, vous êtes prêt à explorer vos données.", - "xpack.apm.onboarding.go.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du nom du fichier exécutable, ou de la variable d'environnement \"ELASTIC_APM_SERVICE_NAME\".", + "xpack.apm.onboarding.go.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du nom du fichier exécutable, ou de la variable d'environnement `ELASTIC_APM_SERVICE_NAME`.", "xpack.apm.onboarding.go.configure.title": "Configurer l'agent", "xpack.apm.onboarding.go.goClient.title": "Instrumenter votre application", "xpack.apm.onboarding.go.install.textPre": "Installez les packages d'agent APM pour Go.", @@ -8721,7 +9697,7 @@ "xpack.apm.onboarding.introduction.imageAltDescription": "Capture d'écran du tableau de bord principal.", "xpack.apm.onboarding.java.download.title": "Télécharger l'agent APM", "xpack.apm.onboarding.java.startApplication.title": "Lancer votre application avec l'indicateur javaagent", - "xpack.apm.onboarding.node.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du \"serviceName\". Cet agent prend en charge de nombreux frameworks, mais peut également être utilisé avec votre pile personnalisée.", + "xpack.apm.onboarding.node.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du `serviceName`. Cet agent prend en charge de nombreux frameworks, mais peut également être utilisé avec votre pile personnalisée.", "xpack.apm.onboarding.node.configure.title": "Configurer l'agent", "xpack.apm.onboarding.node.install.textPre": "Installez l'agent APM pour Node.js comme dépendance de votre application.", "xpack.apm.onboarding.node.install.title": "Installer l'agent APM", @@ -8730,7 +9706,7 @@ "xpack.apm.onboarding.otel.column.value.copyIconText": "Copier dans le presse-papiers", "xpack.apm.onboarding.otel.configureAgent.title": "Configurer OpenTelemetry dans votre application", "xpack.apm.onboarding.otel.download.title": "Télécharger l’agent APM OpenTelemetry ou le SDK", - "xpack.apm.onboarding.php.Configure the agent.textPre": "APM se lance automatiquement au démarrage de l'application. Configurez l'agent soit depuis le fichier \"php.ini\" :", + "xpack.apm.onboarding.php.Configure the agent.textPre": "APM se lance automatiquement au démarrage de l'application. Configurez l'agent soit depuis le fichier `php.ini` :", "xpack.apm.onboarding.php.configureAgent.title": "Configurer l'agent", "xpack.apm.onboarding.php.download.title": "Télécharger l'agent APM", "xpack.apm.onboarding.php.installPackage.textPre": "Par exemple sur Alpine Linux avec le package APK :", @@ -8756,10 +9732,10 @@ "xpack.apm.pages.alertDetails.alertSummary.serviceEnv": "Environnement de service", "xpack.apm.pages.alertDetails.alertSummary.serviceName": "Nom de service", "xpack.apm.percentOfParent": "({value} de {parentType, select, transaction { transaction } trace {trace} })", - "xpack.apm.profiling.callout.description": "Universal Profiling fournit une visibilité sans précédent du code au milieu du comportement en cours d'exécution de toutes les applications. La fonctionnalité profile chaque ligne de code chez le ou les hôte(s) qui exécute(nt) vos services, y compris votre code applicatif, le kernel et même les bibliothèque tierces.", + "xpack.apm.profiling.callout.description": "Universal Profiling fournit une visibilité sans précédent du code au milieu du comportement en cours d'exécution de toutes les applications. La fonctionnalité profile chaque ligne de code chez le ou les hôtes qui exécutent vos services, y compris votre code applicatif, le kernel et même les bibliothèque tierces.", "xpack.apm.profiling.callout.dismiss": "Rejeter", "xpack.apm.profiling.callout.learnMore": "En savoir plus", - "xpack.apm.profiling.flamegraph.filteredLabel": "Affichage des informations de profilage du ou des hôte(s) des services", + "xpack.apm.profiling.flamegraph.filteredLabel": "Affichage des informations de profilage du ou des hôtes des services", "xpack.apm.profiling.flamegraph.link": "Accéder au flame-graph d'Universal Profiling", "xpack.apm.profiling.flamegraph.noDataFound": "Aucune donnée trouvée", "xpack.apm.profiling.tabs.flamegraph": "Flame-graph", @@ -8821,7 +9797,7 @@ "xpack.apm.serviceDashboards.selectDashboard.modalTitle.edit": "Modifier le tableau de bord", "xpack.apm.serviceDashboards.selectDashboard.modalTitle.link": "Sélectionner le tableau de bord", "xpack.apm.serviceDashboards.selectDashboard.placeholder": "Sélectionner le tableau de bord", - "xpack.apm.serviceDashboards.selectDashboard.prepend": "Tableau de bord", + "xpack.apm.serviceDashboards.selectDashboard.prepend": "Dashboard", "xpack.apm.serviceDashboards.unlinkEmptyButtonLabel": "Dissocier le tableau de bord", "xpack.apm.serviceDashboards.unlinkEmptyButtonLabel.confirm.body": "Vous êtes sur le point de dissocier le tableau de bord de l'environnement du service", "xpack.apm.serviceDashboards.unlinkEmptyButtonLabel.confirm.button": "Dissocier le tableau de bord", @@ -8830,10 +9806,16 @@ "xpack.apm.serviceDetails.dependenciesTabLabel": "Dépendances", "xpack.apm.serviceDetails.errorsTabLabel": "Erreurs", "xpack.apm.serviceDetails.metrics.cpuUsageChartTitle": "Utilisation CPU", + "xpack.apm.serviceDetails.metrics.crashes.title": "Pannes", + "xpack.apm.serviceDetails.metrics.crashOccurrencesChart.title": "Occurrences de panne", + "xpack.apm.serviceDetails.metrics.errorOccurrencesChart.tip": "L'occurrence de panne est mesurée en pannes par minute.", "xpack.apm.serviceDetails.metrics.errorOccurrencesChart.title": "Occurrences d'erreurs", + "xpack.apm.serviceDetails.metrics.errorRateChart.tip": "Le taux d'erreur est mesuré en transactions par minute.", + "xpack.apm.serviceDetails.metrics.errorRateChart.title": "Taux d'erreur", "xpack.apm.serviceDetails.metrics.errorsList.title": "Erreurs", "xpack.apm.serviceDetails.metrics.memoryUsageChartTitle": "Utilisation mémoire système", "xpack.apm.serviceDetails.metricsTabLabel": "Indicateurs", + "xpack.apm.serviceDetails.mobileErrorsTabLabel": "Erreurs & Pannes", "xpack.apm.serviceDetails.overviewTabLabel": "Aperçu", "xpack.apm.serviceDetails.transactionsTabLabel": "Transactions", "xpack.apm.serviceGroup.allServices.title": "Services", @@ -8929,7 +9911,7 @@ "xpack.apm.serviceMap.avgTransDurationPopoverStat": "Latence (moy.)", "xpack.apm.serviceMap.center": "Centre", "xpack.apm.serviceMap.dependencyDetailsButtonText": "Détails des dépendances", - "xpack.apm.serviceMap.disabledDescription": "La carte des services a été désactivée. Elle peut être activée via \"xpack.apm.serviceMapEnabled\"", + "xpack.apm.serviceMap.disabledDescription": "La carte des services a été désactivée. Elle peut être activée via `xpack.apm.serviceMapEnabled`", "xpack.apm.serviceMap.disabledTitle": "Carte des services désactivée", "xpack.apm.serviceMap.download": "Télécharger", "xpack.apm.serviceMap.emptyBanner.docsLink": "En savoir plus dans la documentation", @@ -9023,12 +10005,14 @@ "xpack.apm.servicesGroups.loadingServiceGroups": "Chargement des groupes de services", "xpack.apm.servicesTable.alertsColumnLabel": "Alertes actives", "xpack.apm.servicesTable.environmentColumnLabel": "Environnement", + "xpack.apm.servicesTable.filterServicesPlaceholder": "Rechercher des services par nom", "xpack.apm.servicesTable.healthColumnLabel": "Intégrité", "xpack.apm.servicesTable.latencyAvgColumnLabel": "Latence (moy.)", "xpack.apm.servicesTable.metricsExplanationLabel": "Que sont ces indicateurs ?", "xpack.apm.servicesTable.nameColumnLabel": "Nom", "xpack.apm.servicesTable.notFoundLabel": "Aucun service trouvé", "xpack.apm.servicesTable.throughputColumnLabel": "Rendement", + "xpack.apm.servicesTable.tooltip.maxCountExceededWarning": "Vous avez dépassé la limite de 1 000 services. Veuillez utiliser la barre de requêtes pour affiner les résultats ou créer des groupes de services.", "xpack.apm.servicesTable.tooltip.metricsExplanation": "Les indicateurs du services sont agrégés sur le type de transaction, qui peut être une requête ou un chargement de page. Si ni l'un ni l'autre n'existent, les indicateurs sont agrégés sur le type de transaction disponible en premier.", "xpack.apm.servicesTable.transactionColumnLabel": "Type de transaction", "xpack.apm.servicesTable.transactionErrorRate": "Taux de transactions ayant échoué", @@ -9287,7 +10271,7 @@ "xpack.apm.storageExplorer.table.samplingColumnName": "Taux d’échantillonnage", "xpack.apm.storageExplorer.table.serviceColumnName": "Service", "xpack.apm.storageExplorerLinkLabel": "Explorateur de stockage", - "xpack.apm.technicalPreviewBadgeDescription": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale.", + "xpack.apm.technicalPreviewBadgeDescription": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera de corriger tout problème, mais les fonctionnalités des versions d'évaluation technique ne sont pas soumises aux SLA de support des fonctionnalités officielles en disponibilité générale.", "xpack.apm.technicalPreviewBadgeLabel": "Version d'évaluation technique", "xpack.apm.timeComparison.label": "Comparaison", "xpack.apm.timeComparison.select.dayBefore": "Jour précédent", @@ -9345,6 +10329,7 @@ "xpack.apm.transactionBreakdown.chartTitle": "Temps consacré par type d'intervalle", "xpack.apm.transactionDetail.remainingServices": "Transactions restantes", "xpack.apm.transactionDetail.tooltip": "Infobulle de nombre maximal de groupes de transactions atteint", + "xpack.apm.transactionDetails.agentMissingTransactionLabel": "Trace incomplète", "xpack.apm.transactionDetails.coldstartBadge": "démarrage à froid", "xpack.apm.transactionDetails.distribution.failedTransactionsLatencyDistributionErrorTitle": "Une erreur s'est produite lors de la récupération de la distribution de la latence des transactions ayant échoué.", "xpack.apm.transactionDetails.distribution.latencyDistributionErrorTitle": "Une erreur s'est produite lors de la récupération de la distribution de la latence globale.", @@ -9372,6 +10357,7 @@ "xpack.apm.transactionDetails.tabs.aggregatedCriticalPathLabel": "Chemin critique agrégé", "xpack.apm.transactionDetails.tabs.failedTransactionsCorrelationsLabel": "Corrélations des transactions ayant échoué", "xpack.apm.transactionDetails.tabs.latencyLabel": "Corrélations de latence", + "xpack.apm.transactionDetails.tabs.ProfilingLabel": "Universal Profiling", "xpack.apm.transactionDetails.tabs.traceSamplesLabel": "Échantillons de traces", "xpack.apm.transactionDetails.topErrors.errorMessage": "Impossible de récupérer les erreurs", "xpack.apm.transactionDetails.topErrors.loading": "Chargement...", @@ -9398,16 +10384,18 @@ "xpack.apm.transactionErrorRateAlert.name": "Seuil du taux de transactions ayant échoué", "xpack.apm.transactionErrorRateRuleType.isAbove": "est supérieur à", "xpack.apm.transactionNamesSelectPlaceholder": "Sélectionner le nom de transaction", - "xpack.apm.transactionOverview.treemap.dropdown.devices": "Compartimentage des appareils", + "xpack.apm.transactionOverview.treemap.dropdown.devices": "Appareils", "xpack.apm.transactionOverview.treemap.dropdown.devices.subtitle": "Cette vue sous forme de compartimentage permet de visualiser plus facilement et rapidement les appareils les plus utilisés.", "xpack.apm.transactionOverview.treemap.dropdown.versions.subtitle": "Cette vue sous forme de compartimentage permet de visualiser plus facilement et rapidement les versions les plus utilisées.", "xpack.apm.transactionOverview.treemap.show": "Afficher", - "xpack.apm.transactionOverview.treemap.versions.devices": "Compartimentage des versions", + "xpack.apm.transactionOverview.treemap.versions.devices": "Versions", "xpack.apm.transactions.httpRequestsTitle": "Requêtes HTTP", "xpack.apm.transactions.httpRequestsTooltip": "Total des requêtes HTTP", "xpack.apm.transactions.latency.chart.95thPercentileLabel": "95e centile", "xpack.apm.transactions.latency.chart.99thPercentileLabel": "99e centile", "xpack.apm.transactions.latency.chart.averageLabel": "Moyenne", + "xpack.apm.transactions.profiling.tabs.flamegraph": "Flame-graph", + "xpack.apm.transactions.profiling.tabs.topNFunctions": "Les 10 meilleures fonctions", "xpack.apm.transactions.sessionsCharTooltip": "ID de session unique", "xpack.apm.transactions.sessionsChartTitle": "Sessions", "xpack.apm.transactionsCallout.cardinalityWarning.title": "Le nombre de groupes de transactions dépasse le nombre maximal (1 000) autorisé d'affichages.", @@ -9415,6 +10403,7 @@ "xpack.apm.transactionsTable.linkText": "Afficher les transactions", "xpack.apm.transactionsTable.loading": "Chargement...", "xpack.apm.transactionsTable.noResults": "Aucune transaction trouvée", + "xpack.apm.transactionsTable.tableSearch.placeholder": "Rechercher des transactions par nom", "xpack.apm.transactionsTable.title": "Transactions", "xpack.apm.transactionsTableColumnName.alertsColumnLabel": "Alertes actives", "xpack.apm.transactionTypesSelectCustomOptionText": "Ajouter \\{searchValue\\} en tant que nouveau type de transaction", @@ -9451,17 +10440,17 @@ "xpack.apm.tutorial.config_otel.column.configValue": "Valeur de configuration", "xpack.apm.tutorial.config_otel.column.notes": "Notes", "xpack.apm.tutorial.config_otel.column.value.copyIconText": "Copier dans le presse-papiers", - "xpack.apm.tutorial.config_otel.description2": "Les variables d’environnement 'OTEL_METRICS_EXPORTER` et 'OTEL_LOGS_EXPORTER' peuvent ne pas être prises en charge par certains SDK.", + "xpack.apm.tutorial.config_otel.description2": "Les variables d’environnement `OTEL_METRICS_EXPORTER` et `OTEL_LOGS_EXPORTER` peuvent ne pas être prises en charge par certains SDK.", "xpack.apm.tutorial.config_otel.instrumentationGuide": "Guide de l’Instrumentation OpenTelemetry", "xpack.apm.tutorial.djangoClient.configure.commands.addAgentComment": "Ajouter l'agent aux applications installées", "xpack.apm.tutorial.djangoClient.configure.commands.addTracingMiddlewareComment": "Ajoutez notre intergiciel de traçage pour envoyer des indicateurs de performance", - "xpack.apm.tutorial.djangoClient.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du \"SERVICE_NAME\".", + "xpack.apm.tutorial.djangoClient.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du `SERVICE_NAME`.", "xpack.apm.tutorial.djangoClient.configure.title": "Configurer l'agent", "xpack.apm.tutorial.djangoClient.install.textPre": "Installez l'agent APM pour Python en tant que dépendance.", "xpack.apm.tutorial.djangoClient.install.title": "Installer l'agent APM", "xpack.apm.tutorial.dotNetClient.configureAgent.title": "Exemple de fichier appsettings.json :", - "xpack.apm.tutorial.dotNetClient.configureApplication.textPost": "La transmission d'une instance \"IConfiguration\" est facultative mais si cette opération est effectuée, l'agent lira les paramètres de configuration depuis cette instance \"IConfiguration\" (par ex. à partir du fichier \"appsettings.json\").", - "xpack.apm.tutorial.dotNetClient.configureApplication.textPre": "Si vous utilisez ASP.NET Core avec le package \"Elastic.Apm.NetCoreAll\", appelez la méthode \"UseAllElasticApm\" dans la méthode \"Configure\" dans le fichier \"Startup.cs\".", + "xpack.apm.tutorial.dotNetClient.configureApplication.textPost": "La transmission d'une instance `IConfiguration` est facultative mais si cette opération est effectuée, l'agent lira les paramètres de configuration depuis cette instance `IConfiguration` (par ex. à partir du fichier `appsettings.json`).", + "xpack.apm.tutorial.dotNetClient.configureApplication.textPre": "Si vous utilisez ASP.NET Core avec le package `Elastic.Apm.NetCoreAll`, appelez la méthode `UseAllElasticApm` dans la méthode \"Configure\" dans le fichier `Startup.cs`.", "xpack.apm.tutorial.dotNetClient.configureApplication.title": "Ajouter l'agent à l'application", "xpack.apm.tutorial.dotnetClient.createConfig.commands.defaultServiceName": "La valeur par défaut est l'assemblage d'entrée de l'application.", "xpack.apm.tutorial.dotNetClient.download.title": "Télécharger l'agent APM", @@ -9471,14 +10460,14 @@ "xpack.apm.tutorial.elasticCloudInstructions.title": "Agents APM", "xpack.apm.tutorial.flaskClient.configure.commands.configureElasticApmComment": "Vous pouvez également utiliser ELASTIC_APM dans les paramètres de votre application", "xpack.apm.tutorial.flaskClient.configure.commands.initializeUsingEnvironmentVariablesComment": "Initialisez à l'aide des variables d'environnement", - "xpack.apm.tutorial.flaskClient.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du \"SERVICE_NAME\".", + "xpack.apm.tutorial.flaskClient.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du `SERVICE_NAME`.", "xpack.apm.tutorial.flaskClient.configure.title": "Configurer l'agent", "xpack.apm.tutorial.flaskClient.install.textPre": "Installez l'agent APM pour Python en tant que dépendance.", "xpack.apm.tutorial.flaskClient.install.title": "Installer l'agent APM", "xpack.apm.tutorial.fleet.title": "Fleet", "xpack.apm.tutorial.goClient.configure.commands.initializeUsingEnvironmentVariablesComment": "Initialisez à l'aide des variables d'environnement :", "xpack.apm.tutorial.goClient.configure.commands.usedExecutableNameComment": "En l'absence de spécification, le nom de l'exécutable est utilisé.", - "xpack.apm.tutorial.goClient.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du nom du fichier exécutable, ou de la variable d'environnement \"ELASTIC_APM_SERVICE_NAME\".", + "xpack.apm.tutorial.goClient.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du nom du fichier exécutable, ou de la variable d'environnement `ELASTIC_APM_SERVICE_NAME`.", "xpack.apm.tutorial.goClient.configure.title": "Configurer l'agent", "xpack.apm.tutorial.goClient.install.textPre": "Installez les packages d'agent APM pour Go.", "xpack.apm.tutorial.goClient.install.title": "Installer l'agent APM", @@ -9489,19 +10478,19 @@ "xpack.apm.tutorial.javaClient.startApplication.title": "Lancer votre application avec l'indicateur javaagent", "xpack.apm.tutorial.jsClient.enableRealUserMonitoring.title": "Activer la prise en charge du Real User Monitoring (monitoring des utilisateurs réels) dans le serveur APM", "xpack.apm.tutorial.jsClient.installDependency.commands.setServiceVersionComment": "Définir la version de service (requis pour la fonctionnalité source map)", - "xpack.apm.tutorial.jsClient.installDependency.textPre": "Vous pouvez installer l'Agent comme dépendance de votre application avec \"npm install @elastic/apm-rum --save\".\n\nVous pouvez ensuite initialiser l'agent et le configurer dans votre application de cette façon :", + "xpack.apm.tutorial.jsClient.installDependency.textPre": "Vous pouvez installer l'Agent comme dépendance de votre application avec `npm install @elastic/apm-rum --save`.\n\nVous pouvez ensuite initialiser l'agent et le configurer dans votre application de cette façon :", "xpack.apm.tutorial.jsClient.installDependency.title": "Configurer l'agent comme dépendance", - "xpack.apm.tutorial.jsClient.scriptTags.textPre": "Vous pouvez également utiliser les balises Script pour configurer l'agent. Ajoutez un indicateur \"