mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 17:28:26 -04:00
# Backport This will backport the following commits from `main` to `8.x`: - [[ES|QL] Renames the textbased editor to esql editor (#193521)](https://github.com/elastic/kibana/pull/193521) <!--- Backport version: 8.9.8 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) <!--BACKPORT [{"author":{"name":"Stratoula Kalafateli","email":"efstratia.kalafateli@elastic.co"},"sourceCommit":{"committedDate":"2024-09-23T10:06:53Z","message":"[ES|QL] Renames the textbased editor to esql editor (#193521)\n\n## Summary\r\n\r\nRenames the text-based-editor to esql-editor\r\n\r\nI tried to also rename components, data-test-subj, classNames and files.\r\nMy focus is mostly on the plugin and package of the esql editor\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>","sha":"d56a1bbbbafee958abf7583e7a867bd1ac8187a6","branchLabelMapping":{"^v9.0.0$":"main","^v8.16.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","v9.0.0","backport:prev-minor","Feature:ES|QL","ci:project-deploy-observability","Team:ESQL","v8.16.0"],"number":193521,"url":"https://github.com/elastic/kibana/pull/193521","mergeCommit":{"message":"[ES|QL] Renames the textbased editor to esql editor (#193521)\n\n## Summary\r\n\r\nRenames the text-based-editor to esql-editor\r\n\r\nI tried to also rename components, data-test-subj, classNames and files.\r\nMy focus is mostly on the plugin and package of the esql editor\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>","sha":"d56a1bbbbafee958abf7583e7a867bd1ac8187a6"}},"sourceBranch":"main","suggestedTargetBranches":["8.x"],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","labelRegex":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/193521","number":193521,"mergeCommit":{"message":"[ES|QL] Renames the textbased editor to esql editor (#193521)\n\n## Summary\r\n\r\nRenames the text-based-editor to esql-editor\r\n\r\nI tried to also rename components, data-test-subj, classNames and files.\r\nMy focus is mostly on the plugin and package of the esql editor\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>","sha":"d56a1bbbbafee958abf7583e7a867bd1ac8187a6"}},{"branch":"8.x","label":"v8.16.0","labelRegex":"^v8.16.0$","isSourceBranch":false,"state":"NOT_CREATED"}]}] BACKPORT-->
This commit is contained in:
parent
b3311a9e5e
commit
0895634081
65 changed files with 336 additions and 901 deletions
|
@ -54,7 +54,7 @@ const STORYBOOKS = [
|
|||
'language_documentation_popover',
|
||||
'unified_search',
|
||||
'random_sampling',
|
||||
'text_based_editor',
|
||||
'esql_editor',
|
||||
];
|
||||
|
||||
const GITHUB_CONTEXT = 'Build and Publish Storybooks';
|
||||
|
|
|
@ -98,7 +98,7 @@
|
|||
"presentationUtil": "src/plugins/presentation_util",
|
||||
"randomSampling": "x-pack/packages/kbn-random-sampling",
|
||||
"reactPackages": "packages/react",
|
||||
"textBasedEditor": "packages/kbn-text-based-editor",
|
||||
"esqlEditor": "packages/kbn-esql-editor",
|
||||
"esqlUtils": "packages/kbn-esql-utils",
|
||||
"reporting": "packages/kbn-reporting",
|
||||
"savedObjects": "src/plugins/saved_objects",
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"@kbn/esql-ast": "link:packages/kbn-esql-ast",
|
||||
"@kbn/esql-ast-inspector-plugin": "link:examples/esql_ast_inspector",
|
||||
"@kbn/esql-datagrid": "link:src/plugins/esql_datagrid",
|
||||
"@kbn/esql-editor": "link:packages/kbn-esql-editor",
|
||||
"@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",
|
||||
|
@ -919,7 +920,6 @@
|
|||
"@kbn/telemetry-test-plugin": "link:test/plugin_functional/plugins/telemetry",
|
||||
"@kbn/test-feature-usage-plugin": "link:x-pack/test/licensing_plugin/plugins/test_feature_usage",
|
||||
"@kbn/testing-embedded-lens-plugin": "link:x-pack/examples/testing_embedded_lens",
|
||||
"@kbn/text-based-editor": "link:packages/kbn-text-based-editor",
|
||||
"@kbn/third-party-lens-navigation-prompt-plugin": "link:x-pack/examples/third_party_lens_navigation_prompt",
|
||||
"@kbn/third-party-vis-lens-example-plugin": "link:x-pack/examples/third_party_vis_lens_example",
|
||||
"@kbn/threat-intelligence-plugin": "link:x-pack/plugins/threat_intelligence",
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
# @kbn/text-based-editor
|
||||
# @kbn/esql-editor
|
||||
|
||||
Contains the editor for text based languages. Specifically for:
|
||||
- ESQL, with autocomplete and syntax highlighting
|
||||
- SQL, with syntax highlighting
|
||||
|
||||
---
|
||||
|
||||
|
@ -10,7 +9,7 @@ Contains the ESQL editor with the autocomplete and the autosuggest functionality
|
|||
The antlr code can be found in packages/kbn-monaco/src/esql
|
||||
|
||||
A **monaco** based editor that is part of the unified search experience. It is rendered for all the applications that support text-based languages.
|
||||
In order to enable text based languages on your unified search bar add `textBasedLanguages: ['SQL', 'ESQL', '...']` to the dataViewPicker properties.
|
||||
In order to enable text based languages on your unified search bar add `textBasedLanguages: ['ESQL', '...']` to the dataViewPicker properties.
|
||||
|
||||
|
||||
## Languages supported
|
|
@ -7,10 +7,10 @@
|
|||
* License v3.0 only", or the "Server Side Public License, v 1".
|
||||
*/
|
||||
|
||||
export type { TextBasedLanguagesEditorProps } from './src/types';
|
||||
export type { ESQLEditorProps } from './src/types';
|
||||
export { fetchFieldsFromESQL } from './src/fetch_fields_from_esql';
|
||||
import { TextBasedLanguagesEditor } from './src/text_based_languages_editor';
|
||||
import { ESQLEditor } from './src/esql_editor';
|
||||
|
||||
// React.lazy support
|
||||
// eslint-disable-next-line import/no-default-export
|
||||
export default TextBasedLanguagesEditor;
|
||||
export default ESQLEditor;
|
|
@ -10,6 +10,6 @@
|
|||
module.exports = {
|
||||
preset: '@kbn/test',
|
||||
rootDir: '../..',
|
||||
roots: ['<rootDir>/packages/kbn-text-based-editor'],
|
||||
setupFilesAfterEnv: ['<rootDir>/packages/kbn-text-based-editor/setup_tests.ts'],
|
||||
roots: ['<rootDir>/packages/kbn-esql-editor'],
|
||||
setupFilesAfterEnv: ['<rootDir>/packages/kbn-esql-editor/setup_tests.ts'],
|
||||
};
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"type": "shared-browser",
|
||||
"id": "@kbn/text-based-editor",
|
||||
"id": "@kbn/esql-editor",
|
||||
"owner": "@elastic/kibana-esql",
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "@kbn/text-based-editor",
|
||||
"name": "@kbn/esql-editor",
|
||||
"private": true,
|
||||
"version": "1.0.0",
|
||||
"license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0",
|
|
@ -1,7 +1,7 @@
|
|||
import { Canvas, Meta, Story, ArgsTable } from '@storybook/addon-docs/blocks';
|
||||
import { I18nProvider } from '@kbn/i18n-react';
|
||||
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
|
||||
import { TextBasedLanguagesEditor } from '../text_based_languages_editor';
|
||||
import { ESQLEditor } from '../esql_editor';
|
||||
|
||||
|
||||
export const Template = (args) =>
|
||||
|
@ -12,19 +12,19 @@ export const Template = (args) =>
|
|||
uiSettings: { get: () => {} },
|
||||
}}
|
||||
>
|
||||
<TextBasedLanguagesEditor {...args} />
|
||||
<ESQLEditor {...args} />
|
||||
</KibanaContextProvider>
|
||||
</I18nProvider>;
|
||||
|
||||
<Meta
|
||||
title="Text based languages editor"
|
||||
component={TextBasedLanguagesEditor}
|
||||
component={ESQLEditor}
|
||||
/>
|
||||
|
||||
|
||||
# Overview
|
||||
|
||||
The TextBasedLanguagesEditor component is a reusable component and can be used to support text based languages in your application (SQL, ESQL):
|
||||
The ESQLEditor component is a reusable component and can be used to support text based languages in your application (SQL, ESQL):
|
||||
|
||||
<Canvas>
|
||||
<Story
|
||||
|
@ -71,4 +71,4 @@ When there are errors to the query the UI displays the errors to the editor:
|
|||
|
||||
The component exposes the following properties:
|
||||
|
||||
<ArgsTable story="expanded mode"/>
|
||||
<ArgsTable story="expanded mode"/>../esql_editor
|
|
@ -26,22 +26,22 @@ const getConstsByType = (type: 'error' | 'warning', count: number) => {
|
|||
if (type === 'error') {
|
||||
return {
|
||||
color: 'danger',
|
||||
message: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.errorCount', {
|
||||
message: i18n.translate('esqlEditor.query.errorCount', {
|
||||
defaultMessage: '{count} {count, plural, one {error} other {errors}}',
|
||||
values: { count },
|
||||
}),
|
||||
label: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.errorsTitle', {
|
||||
label: i18n.translate('esqlEditor.query.errorsTitle', {
|
||||
defaultMessage: 'Errors',
|
||||
}),
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
color: 'warning',
|
||||
message: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.warningCount', {
|
||||
message: i18n.translate('esqlEditor.query.warningCount', {
|
||||
defaultMessage: '{count} {count, plural, one {warning} other {warnings}}',
|
||||
values: { count },
|
||||
}),
|
||||
label: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.warningsTitle', {
|
||||
label: i18n.translate('esqlEditor.query.warningsTitle', {
|
||||
defaultMessage: 'Warnings',
|
||||
}),
|
||||
};
|
||||
|
@ -79,14 +79,14 @@ function ErrorsWarningsContent({
|
|||
<EuiIcon type={type} color={color} size="s" />
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem style={{ whiteSpace: 'nowrap' }}>
|
||||
{i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.lineNumber', {
|
||||
{i18n.translate('esqlEditor.query.lineNumber', {
|
||||
defaultMessage: 'Line {lineNumber}',
|
||||
values: { lineNumber: item.startLineNumber },
|
||||
})}
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem grow={false} className="TextBasedLangEditor_errorMessage">
|
||||
<EuiFlexItem grow={false} className="ESQLEditor_errorMessage">
|
||||
{item.message}
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
|
@ -23,11 +23,11 @@ export function SubmitFeedbackComponent({ isSpaceReduced }: { isSpaceReduced?: b
|
|||
href={FEEDBACK_LINK}
|
||||
external={false}
|
||||
target="_blank"
|
||||
data-test-subj="TextBasedLangEditor-feedback-link"
|
||||
data-test-subj="ESQLEditor-feedback-link"
|
||||
>
|
||||
<EuiToolTip
|
||||
position="top"
|
||||
content={i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.feedback', {
|
||||
content={i18n.translate('esqlEditor.query.feedback', {
|
||||
defaultMessage: 'Feedback',
|
||||
})}
|
||||
>
|
||||
|
@ -57,9 +57,9 @@ export function SubmitFeedbackComponent({ isSpaceReduced }: { isSpaceReduced?: b
|
|||
font-size: 12px;
|
||||
margin-right: ${euiTheme.size.m};
|
||||
`}
|
||||
data-test-subj="TextBasedLangEditor-feedback-link"
|
||||
data-test-subj="ESQLEditor-feedback-link"
|
||||
>
|
||||
{i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.submitFeedback', {
|
||||
{i18n.translate('esqlEditor.query.submitFeedback', {
|
||||
defaultMessage: 'Submit feedback',
|
||||
})}
|
||||
</EuiLink>
|
|
@ -30,7 +30,7 @@ import { ErrorsWarningsFooterPopover } from './errors_warnings_popover';
|
|||
import { QueryHistoryAction, QueryHistory } from './query_history';
|
||||
import { SubmitFeedbackComponent } from './feedback_component';
|
||||
import { QueryWrapComponent } from './query_wrap_component';
|
||||
import type { TextBasedEditorDeps } from '../types';
|
||||
import type { ESQLEditorDeps } from '../types';
|
||||
|
||||
const isMac = navigator.platform.toLowerCase().indexOf('mac') >= 0;
|
||||
const COMMAND_KEY = isMac ? '⌘' : '^';
|
||||
|
@ -81,7 +81,7 @@ export const EditorFooter = memo(function EditorFooter({
|
|||
measuredContainerWidth,
|
||||
code,
|
||||
}: EditorFooterProps) {
|
||||
const kibana = useKibana<TextBasedEditorDeps>();
|
||||
const kibana = useKibana<ESQLEditorDeps>();
|
||||
const { docLinks } = kibana.services;
|
||||
const [isErrorPopoverOpen, setIsErrorPopoverOpen] = useState(false);
|
||||
const [isLanguageComponentOpen, setIsLanguageComponentOpen] = useState(false);
|
||||
|
@ -126,7 +126,7 @@ export const EditorFooter = memo(function EditorFooter({
|
|||
<EuiFlexGroup
|
||||
gutterSize="s"
|
||||
justifyContent="spaceBetween"
|
||||
data-test-subj="TextBasedLangEditor-footer"
|
||||
data-test-subj="ESQLEditor-footer"
|
||||
css={styles.bottomContainer}
|
||||
responsive={false}
|
||||
>
|
||||
|
@ -141,13 +141,9 @@ export const EditorFooter = memo(function EditorFooter({
|
|||
>
|
||||
<QueryWrapComponent code={code} updateQuery={updateQuery} />
|
||||
<EuiFlexItem grow={false}>
|
||||
<EuiText
|
||||
size="xs"
|
||||
color="subdued"
|
||||
data-test-subj="TextBasedLangEditor-footer-lines"
|
||||
>
|
||||
<EuiText size="xs" color="subdued" data-test-subj="ESQLEditor-footer-lines">
|
||||
<p>
|
||||
{i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.lineCount', {
|
||||
{i18n.translate('esqlEditor.query.lineCount', {
|
||||
defaultMessage: '{count} {count, plural, one {line} other {lines}}',
|
||||
values: { count: lines },
|
||||
})}
|
||||
|
@ -159,28 +155,18 @@ export const EditorFooter = memo(function EditorFooter({
|
|||
<EuiFlexItem grow={false}>
|
||||
<EuiFlexGroup gutterSize="xs" responsive={false} alignItems="center">
|
||||
<EuiFlexItem grow={false}>
|
||||
<EuiText
|
||||
size="xs"
|
||||
color="subdued"
|
||||
data-test-subj="TextBasedLangEditor-date-info"
|
||||
>
|
||||
<EuiText size="xs" color="subdued" data-test-subj="ESQLEditor-date-info">
|
||||
<p>
|
||||
{isSpaceReduced
|
||||
? '@timestamp'
|
||||
: detectedTimestamp
|
||||
? i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.timestampDetected',
|
||||
{
|
||||
defaultMessage: '{detectedTimestamp} found',
|
||||
values: { detectedTimestamp },
|
||||
}
|
||||
)
|
||||
: i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.timestampNotDetected',
|
||||
{
|
||||
defaultMessage: '@timestamp not found',
|
||||
}
|
||||
)}
|
||||
? i18n.translate('esqlEditor.query.timestampDetected', {
|
||||
defaultMessage: '{detectedTimestamp} found',
|
||||
values: { detectedTimestamp },
|
||||
})
|
||||
: i18n.translate('esqlEditor.query.timestampNotDetected', {
|
||||
defaultMessage: '@timestamp not found',
|
||||
})}
|
||||
</p>
|
||||
</EuiText>
|
||||
</EuiFlexItem>
|
||||
|
@ -190,27 +176,17 @@ export const EditorFooter = memo(function EditorFooter({
|
|||
<EuiFlexItem grow={false}>
|
||||
<EuiFlexGroup gutterSize="xs" responsive={false} alignItems="center">
|
||||
<EuiFlexItem grow={false}>
|
||||
<EuiText
|
||||
size="xs"
|
||||
color="subdued"
|
||||
data-test-subj="TextBasedLangEditor-limit-info"
|
||||
>
|
||||
<EuiText size="xs" color="subdued" data-test-subj="ESQLEditor-limit-info">
|
||||
<p>
|
||||
{isSpaceReduced
|
||||
? i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.limitInfoReduced',
|
||||
{
|
||||
defaultMessage: 'LIMIT {limit}',
|
||||
values: { limit },
|
||||
}
|
||||
)
|
||||
: i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.limitInfo',
|
||||
{
|
||||
defaultMessage: 'LIMIT {limit} rows',
|
||||
values: { limit },
|
||||
}
|
||||
)}
|
||||
? i18n.translate('esqlEditor.query.limitInfoReduced', {
|
||||
defaultMessage: 'LIMIT {limit}',
|
||||
values: { limit },
|
||||
})
|
||||
: i18n.translate('esqlEditor.query.limitInfo', {
|
||||
defaultMessage: 'LIMIT {limit} rows',
|
||||
values: { limit },
|
||||
})}
|
||||
</p>
|
||||
</EuiText>
|
||||
</EuiFlexItem>
|
||||
|
@ -263,18 +239,11 @@ export const EditorFooter = memo(function EditorFooter({
|
|||
<EuiFlexItem grow={false}>
|
||||
<EuiFlexGroup gutterSize="xs" responsive={false} alignItems="center">
|
||||
<EuiFlexItem grow={false}>
|
||||
<EuiText
|
||||
size="xs"
|
||||
color="subdued"
|
||||
data-test-subj="TextBasedLangEditor-run-query"
|
||||
>
|
||||
<EuiText size="xs" color="subdued" data-test-subj="ESQLEditor-run-query">
|
||||
<p>
|
||||
{i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.runQuery',
|
||||
{
|
||||
defaultMessage: 'Run query',
|
||||
}
|
||||
)}
|
||||
{i18n.translate('esqlEditor.query.runQuery', {
|
||||
defaultMessage: 'Run query',
|
||||
})}
|
||||
</p>
|
||||
</EuiText>
|
||||
</EuiFlexItem>
|
||||
|
@ -294,7 +263,7 @@ export const EditorFooter = memo(function EditorFooter({
|
|||
<EuiButtonEmpty
|
||||
iconType="documentation"
|
||||
color="text"
|
||||
data-test-subj="TextBasedLangEditor-documentation"
|
||||
data-test-subj="ESQLEditor-documentation"
|
||||
size="m"
|
||||
onClick={() => toggleLanguageComponent()}
|
||||
css={css`
|
|
@ -32,19 +32,17 @@ describe('QueryHistory', () => {
|
|||
it('should render the history action component as a button if is spaceReduced is undefined', () => {
|
||||
render(<QueryHistoryAction toggleHistory={jest.fn()} isHistoryOpen />);
|
||||
expect(
|
||||
screen.getByTestId('TextBasedLangEditor-toggle-query-history-button-container')
|
||||
screen.getByTestId('ESQLEditor-toggle-query-history-button-container')
|
||||
).toBeInTheDocument();
|
||||
|
||||
expect(
|
||||
screen.getByTestId('TextBasedLangEditor-toggle-query-history-button-container')
|
||||
screen.getByTestId('ESQLEditor-toggle-query-history-button-container')
|
||||
).toHaveTextContent('Hide recent queries');
|
||||
});
|
||||
|
||||
it('should render the history action component as an icon if is spaceReduced is true', () => {
|
||||
render(<QueryHistoryAction toggleHistory={jest.fn()} isHistoryOpen isSpaceReduced />);
|
||||
expect(
|
||||
screen.getByTestId('TextBasedLangEditor-toggle-query-history-icon')
|
||||
).toBeInTheDocument();
|
||||
expect(screen.getByTestId('ESQLEditor-toggle-query-history-icon')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -134,7 +132,7 @@ describe('QueryHistory', () => {
|
|||
/>
|
||||
);
|
||||
expect(
|
||||
screen.queryByTestId('TextBasedLangEditor-queryHistory-queryString-expanded')
|
||||
screen.queryByTestId('ESQLEditor-queryHistory-queryString-expanded')
|
||||
).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
|
@ -155,7 +153,7 @@ describe('QueryHistory', () => {
|
|||
/>
|
||||
);
|
||||
expect(
|
||||
screen.getByTestId('TextBasedLangEditor-queryHistory-queryString-expanded')
|
||||
screen.getByTestId('ESQLEditor-queryHistory-queryString-expanded')
|
||||
).toBeInTheDocument();
|
||||
});
|
||||
});
|
|
@ -47,23 +47,17 @@ export function QueryHistoryAction({
|
|||
return (
|
||||
<>
|
||||
{isSpaceReduced && (
|
||||
<EuiFlexItem grow={false} data-test-subj="TextBasedLangEditor-toggle-query-history-icon">
|
||||
<EuiFlexItem grow={false} data-test-subj="ESQLEditor-toggle-query-history-icon">
|
||||
<EuiToolTip
|
||||
position="top"
|
||||
content={
|
||||
isHistoryOpen
|
||||
? i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.hideQueriesLabel',
|
||||
{
|
||||
defaultMessage: 'Hide recent queries',
|
||||
}
|
||||
)
|
||||
: i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.showQueriesLabel',
|
||||
{
|
||||
defaultMessage: 'Show recent queries',
|
||||
}
|
||||
)
|
||||
? i18n.translate('esqlEditor.query.hideQueriesLabel', {
|
||||
defaultMessage: 'Hide recent queries',
|
||||
})
|
||||
: i18n.translate('esqlEditor.query.showQueriesLabel', {
|
||||
defaultMessage: 'Show recent queries',
|
||||
})
|
||||
}
|
||||
>
|
||||
<EuiIcon
|
||||
|
@ -80,10 +74,7 @@ export function QueryHistoryAction({
|
|||
</EuiFlexItem>
|
||||
)}
|
||||
{!isSpaceReduced && (
|
||||
<EuiFlexItem
|
||||
grow={false}
|
||||
data-test-subj="TextBasedLangEditor-toggle-query-history-button-container"
|
||||
>
|
||||
<EuiFlexItem grow={false} data-test-subj="ESQLEditor-toggle-query-history-button-container">
|
||||
<EuiButtonEmpty
|
||||
size="xs"
|
||||
color="primary"
|
||||
|
@ -92,13 +83,13 @@ export function QueryHistoryAction({
|
|||
padding-inline: 0;
|
||||
`}
|
||||
iconType="clockCounter"
|
||||
data-test-subj="TextBasedLangEditor-toggle-query-history-button"
|
||||
data-test-subj="ESQLEditor-toggle-query-history-button"
|
||||
>
|
||||
{isHistoryOpen
|
||||
? i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.hideQueriesLabel', {
|
||||
? i18n.translate('esqlEditor.query.hideQueriesLabel', {
|
||||
defaultMessage: 'Hide recent queries',
|
||||
})
|
||||
: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.showQueriesLabel', {
|
||||
: i18n.translate('esqlEditor.query.showQueriesLabel', {
|
||||
defaultMessage: 'Show recent queries',
|
||||
})}
|
||||
</EuiButtonEmpty>
|
||||
|
@ -126,18 +117,15 @@ export const getTableColumns = (
|
|||
return (
|
||||
<EuiToolTip
|
||||
position="top"
|
||||
content={i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.querieshistory.success',
|
||||
{
|
||||
defaultMessage: 'Query ran successfully',
|
||||
}
|
||||
)}
|
||||
content={i18n.translate('esqlEditor.query.querieshistory.success', {
|
||||
defaultMessage: 'Query ran successfully',
|
||||
})}
|
||||
>
|
||||
<EuiIcon
|
||||
type="checkInCircleFilled"
|
||||
color="success"
|
||||
size="m"
|
||||
data-test-subj="TextBasedLangEditor-queryHistory-success"
|
||||
data-test-subj="ESQLEditor-queryHistory-success"
|
||||
/>
|
||||
</EuiToolTip>
|
||||
);
|
||||
|
@ -145,18 +133,15 @@ export const getTableColumns = (
|
|||
return (
|
||||
<EuiToolTip
|
||||
position="top"
|
||||
content={i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.querieshistory.error',
|
||||
{
|
||||
defaultMessage: 'Query failed',
|
||||
}
|
||||
)}
|
||||
content={i18n.translate('esqlEditor.query.querieshistory.error', {
|
||||
defaultMessage: 'Query failed',
|
||||
})}
|
||||
>
|
||||
<EuiIcon
|
||||
type="error"
|
||||
color="danger"
|
||||
size="m"
|
||||
data-test-subj="TextBasedLangEditor-queryHistory-error"
|
||||
data-test-subj="ESQLEditor-queryHistory-error"
|
||||
/>
|
||||
</EuiToolTip>
|
||||
);
|
||||
|
@ -164,18 +149,15 @@ export const getTableColumns = (
|
|||
return (
|
||||
<EuiToolTip
|
||||
position="top"
|
||||
content={i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.querieshistory.error',
|
||||
{
|
||||
defaultMessage: 'Query failed',
|
||||
}
|
||||
)}
|
||||
content={i18n.translate('esqlEditor.query.querieshistory.error', {
|
||||
defaultMessage: 'Query failed',
|
||||
})}
|
||||
>
|
||||
<EuiIcon
|
||||
type="warning"
|
||||
color="warning"
|
||||
size="m"
|
||||
data-test-subj="TextBasedLangEditor-queryHistory-warning"
|
||||
data-test-subj="ESQLEditor-queryHistory-warning"
|
||||
/>
|
||||
</EuiToolTip>
|
||||
);
|
||||
|
@ -187,12 +169,9 @@ export const getTableColumns = (
|
|||
{
|
||||
field: 'queryString',
|
||||
'data-test-subj': 'queryString',
|
||||
name: i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.recentQueriesColumnLabel',
|
||||
{
|
||||
defaultMessage: 'Recent queries',
|
||||
}
|
||||
),
|
||||
name: i18n.translate('esqlEditor.query.recentQueriesColumnLabel', {
|
||||
defaultMessage: 'Recent queries',
|
||||
}),
|
||||
render: (queryString: QueryHistoryItem['queryString']) => (
|
||||
<QueryColumn
|
||||
queryString={queryString}
|
||||
|
@ -204,7 +183,7 @@ export const getTableColumns = (
|
|||
{
|
||||
field: 'timeRan',
|
||||
'data-test-subj': 'timeRan',
|
||||
name: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.timeRanColumnLabel', {
|
||||
name: i18n.translate('esqlEditor.query.timeRanColumnLabel', {
|
||||
defaultMessage: 'Time ran',
|
||||
}),
|
||||
sortable: true,
|
||||
|
@ -248,22 +227,16 @@ export function QueryHistory({
|
|||
<EuiFlexItem grow={false}>
|
||||
<EuiToolTip
|
||||
position="top"
|
||||
content={i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.querieshistoryRun',
|
||||
{
|
||||
defaultMessage: 'Run query',
|
||||
}
|
||||
)}
|
||||
content={i18n.translate('esqlEditor.query.querieshistoryRun', {
|
||||
defaultMessage: 'Run query',
|
||||
})}
|
||||
>
|
||||
<EuiButtonIcon
|
||||
iconType="play"
|
||||
aria-label={i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.querieshistoryRun',
|
||||
{
|
||||
defaultMessage: 'Run query',
|
||||
}
|
||||
)}
|
||||
data-test-subj="TextBasedLangEditor-queryHistory-runQuery-button"
|
||||
aria-label={i18n.translate('esqlEditor.query.querieshistoryRun', {
|
||||
defaultMessage: 'Run query',
|
||||
})}
|
||||
data-test-subj="ESQLEditor-queryHistory-runQuery-button"
|
||||
role="button"
|
||||
iconSize="m"
|
||||
onClick={() => onUpdateAndSubmit(item.queryString)}
|
||||
|
@ -276,12 +249,9 @@ export function QueryHistory({
|
|||
<EuiFlexItem grow={false}>
|
||||
<EuiCopy
|
||||
textToCopy={item.queryString}
|
||||
content={i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.querieshistoryCopy',
|
||||
{
|
||||
defaultMessage: 'Copy query to clipboard',
|
||||
}
|
||||
)}
|
||||
content={i18n.translate('esqlEditor.query.querieshistoryCopy', {
|
||||
defaultMessage: 'Copy query to clipboard',
|
||||
})}
|
||||
>
|
||||
{(copy) => (
|
||||
<EuiButtonIcon
|
||||
|
@ -291,12 +261,9 @@ export function QueryHistory({
|
|||
css={css`
|
||||
cursor: pointer;
|
||||
`}
|
||||
aria-label={i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.querieshistoryCopy',
|
||||
{
|
||||
defaultMessage: 'Copy query to clipboard',
|
||||
}
|
||||
)}
|
||||
aria-label={i18n.translate('esqlEditor.query.querieshistoryCopy', {
|
||||
defaultMessage: 'Copy query to clipboard',
|
||||
})}
|
||||
/>
|
||||
)}
|
||||
</EuiCopy>
|
||||
|
@ -349,14 +316,11 @@ export function QueryHistory({
|
|||
`;
|
||||
|
||||
return (
|
||||
<div data-test-subj="TextBasedLangEditor-queryHistory" css={containerCSS}>
|
||||
<div data-test-subj="ESQLEditor-queryHistory" css={containerCSS}>
|
||||
<EuiInMemoryTable
|
||||
tableCaption={i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.querieshistoryTable',
|
||||
{
|
||||
defaultMessage: 'Queries history table',
|
||||
}
|
||||
)}
|
||||
tableCaption={i18n.translate('esqlEditor.query.querieshistoryTable', {
|
||||
defaultMessage: 'Queries history table',
|
||||
})}
|
||||
responsiveBreakpoint={false}
|
||||
items={historyItems}
|
||||
columns={columns}
|
||||
|
@ -398,13 +362,13 @@ export function QueryColumn({
|
|||
onClick={() => {
|
||||
setIsRowExpanded(!isRowExpanded);
|
||||
}}
|
||||
data-test-subj="TextBasedLangEditor-queryHistory-queryString-expanded"
|
||||
data-test-subj="ESQLEditor-queryHistory-queryString-expanded"
|
||||
aria-label={
|
||||
isRowExpanded
|
||||
? i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.collapseLabel', {
|
||||
? i18n.translate('esqlEditor.query.collapseLabel', {
|
||||
defaultMessage: 'Collapse',
|
||||
})
|
||||
: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.expandLabel', {
|
||||
: i18n.translate('esqlEditor.query.expandLabel', {
|
||||
defaultMessage: 'Expand',
|
||||
})
|
||||
}
|
|
@ -29,13 +29,10 @@ export function QueryWrapComponent({
|
|||
position="top"
|
||||
content={
|
||||
isWrappedByPipes
|
||||
? i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel',
|
||||
{
|
||||
defaultMessage: 'Remove line breaks on pipes',
|
||||
}
|
||||
)
|
||||
: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel', {
|
||||
? i18n.translate('esqlEditor.query.disableWordWrapLabel', {
|
||||
defaultMessage: 'Remove line breaks on pipes',
|
||||
})
|
||||
: i18n.translate('esqlEditor.query.EnableWordWrapLabel', {
|
||||
defaultMessage: 'Add line breaks on pipes',
|
||||
})
|
||||
}
|
||||
|
@ -44,21 +41,15 @@ export function QueryWrapComponent({
|
|||
iconType={isWrappedByPipes ? 'pipeNoBreaks' : 'pipeBreaks'}
|
||||
color="text"
|
||||
size="xs"
|
||||
data-test-subj="TextBasedLangEditor-toggleWordWrap"
|
||||
data-test-subj="ESQLEditor-toggleWordWrap"
|
||||
aria-label={
|
||||
isWrappedByPipes
|
||||
? i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel',
|
||||
{
|
||||
defaultMessage: 'Remove line breaks on pipes',
|
||||
}
|
||||
)
|
||||
: i18n.translate(
|
||||
'textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel',
|
||||
{
|
||||
defaultMessage: 'Add line breaks on pipes',
|
||||
}
|
||||
)
|
||||
? i18n.translate('esqlEditor.query.disableWordWrapLabel', {
|
||||
defaultMessage: 'Remove line breaks on pipes',
|
||||
})
|
||||
: i18n.translate('esqlEditor.query.EnableWordWrapLabel', {
|
||||
defaultMessage: 'Add line breaks on pipes',
|
||||
})
|
||||
}
|
||||
onClick={() => {
|
||||
const updatedCode = prettifyQuery(code, isWrappedByPipes);
|
|
@ -14,7 +14,7 @@ export const EDITOR_INITIAL_HEIGHT_INLINE_EDITING = 140;
|
|||
export const EDITOR_MIN_HEIGHT = 40;
|
||||
export const EDITOR_MAX_HEIGHT = 400;
|
||||
|
||||
export const textBasedLanguageEditorStyles = (
|
||||
export const esqlEditorStyles = (
|
||||
euiTheme: EuiThemeComputed,
|
||||
editorHeight: number,
|
||||
hasErrors: boolean,
|
|
@ -13,12 +13,12 @@ import { IUiSettingsClient } from '@kbn/core/public';
|
|||
import { mountWithIntl as mount } from '@kbn/test-jest-helpers';
|
||||
import { findTestSubject } from '@elastic/eui/lib/test';
|
||||
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
|
||||
import { TextBasedLanguagesEditor } from './text_based_languages_editor';
|
||||
import type { TextBasedLanguagesEditorProps } from './types';
|
||||
import { ESQLEditor } from './esql_editor';
|
||||
import type { ESQLEditorProps } from './types';
|
||||
import { ReactWrapper } from 'enzyme';
|
||||
import { of } from 'rxjs';
|
||||
|
||||
describe('TextBasedLanguagesEditor', () => {
|
||||
describe('ESQLEditor', () => {
|
||||
const uiConfig: Record<string, any> = {};
|
||||
const uiSettings = {
|
||||
get: (key: string) => uiConfig[key],
|
||||
|
@ -35,14 +35,14 @@ describe('TextBasedLanguagesEditor', () => {
|
|||
theme,
|
||||
};
|
||||
|
||||
function renderTextBasedLanguagesEditorComponent(testProps: TextBasedLanguagesEditorProps) {
|
||||
function renderESQLEditorComponent(testProps: ESQLEditorProps) {
|
||||
return (
|
||||
<KibanaContextProvider services={services}>
|
||||
<TextBasedLanguagesEditor {...testProps} />
|
||||
<ESQLEditor {...testProps} />
|
||||
</KibanaContextProvider>
|
||||
);
|
||||
}
|
||||
let props: TextBasedLanguagesEditorProps;
|
||||
let props: ESQLEditorProps;
|
||||
|
||||
beforeEach(() => {
|
||||
props = {
|
||||
|
@ -52,22 +52,20 @@ describe('TextBasedLanguagesEditor', () => {
|
|||
};
|
||||
});
|
||||
it('should render the editor component', async () => {
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor"]').length).not.toBe(0);
|
||||
const component = mount(renderESQLEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor"]').length).not.toBe(0);
|
||||
});
|
||||
|
||||
it('should render the date info with no @timestamp found', async () => {
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...props }));
|
||||
expect(
|
||||
component.find('[data-test-subj="TextBasedLangEditor-date-info"]').at(0).text()
|
||||
).toStrictEqual('@timestamp not found');
|
||||
const component = mount(renderESQLEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-date-info"]').at(0).text()).toStrictEqual(
|
||||
'@timestamp not found'
|
||||
);
|
||||
});
|
||||
|
||||
it('should render the feedback link', async () => {
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor-feedback-link"]').length).not.toBe(
|
||||
0
|
||||
);
|
||||
const component = mount(renderESQLEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-feedback-link"]').length).not.toBe(0);
|
||||
});
|
||||
|
||||
it('should not render the date info if hideTimeFilterInfo is set to true', async () => {
|
||||
|
@ -75,8 +73,8 @@ describe('TextBasedLanguagesEditor', () => {
|
|||
...props,
|
||||
hideTimeFilterInfo: true,
|
||||
};
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps }));
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor-date-info"]').length).toBe(0);
|
||||
const component = mount(renderESQLEditorComponent({ ...newProps }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-date-info"]').length).toBe(0);
|
||||
});
|
||||
|
||||
it('should render the date info with @timestamp found if detectedTimestamp is given', async () => {
|
||||
|
@ -84,17 +82,17 @@ describe('TextBasedLanguagesEditor', () => {
|
|||
...props,
|
||||
detectedTimestamp: '@timestamp',
|
||||
};
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps }));
|
||||
expect(
|
||||
component.find('[data-test-subj="TextBasedLangEditor-date-info"]').at(0).text()
|
||||
).toStrictEqual('@timestamp found');
|
||||
const component = mount(renderESQLEditorComponent({ ...newProps }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-date-info"]').at(0).text()).toStrictEqual(
|
||||
'@timestamp found'
|
||||
);
|
||||
});
|
||||
|
||||
it('should render the limit information', async () => {
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...props }));
|
||||
expect(
|
||||
component.find('[data-test-subj="TextBasedLangEditor-limit-info"]').at(0).text()
|
||||
).toStrictEqual('LIMIT 1000 rows');
|
||||
const component = mount(renderESQLEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-limit-info"]').at(0).text()).toStrictEqual(
|
||||
'LIMIT 1000 rows'
|
||||
);
|
||||
});
|
||||
|
||||
it('should not render the query history action if hideQueryHistory is set to true', async () => {
|
||||
|
@ -102,40 +100,37 @@ describe('TextBasedLanguagesEditor', () => {
|
|||
...props,
|
||||
hideQueryHistory: true,
|
||||
};
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps }));
|
||||
const component = mount(renderESQLEditorComponent({ ...newProps }));
|
||||
expect(
|
||||
component.find('[data-test-subj="TextBasedLangEditor-toggle-query-history-button-container"]')
|
||||
.length
|
||||
component.find('[data-test-subj="ESQLEditor-toggle-query-history-button-container"]').length
|
||||
).toBe(0);
|
||||
});
|
||||
|
||||
it('should render the correct buttons for the expanded code editor mode', async () => {
|
||||
let component: ReactWrapper;
|
||||
await act(async () => {
|
||||
component = mount(renderTextBasedLanguagesEditorComponent({ ...props }));
|
||||
component = mount(renderESQLEditorComponent({ ...props }));
|
||||
});
|
||||
component!.update();
|
||||
expect(
|
||||
component!.find('[data-test-subj="TextBasedLangEditor-toggleWordWrap"]').length
|
||||
).not.toBe(0);
|
||||
expect(component!.find('[data-test-subj="ESQLEditor-toggleWordWrap"]').length).not.toBe(0);
|
||||
});
|
||||
|
||||
it('should render the resize for the expanded code editor mode', async () => {
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor-resize"]').length).not.toBe(0);
|
||||
const component = mount(renderESQLEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-resize"]').length).not.toBe(0);
|
||||
});
|
||||
|
||||
it('should render the footer for the expanded code editor mode', async () => {
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor-footer"]').length).not.toBe(0);
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor-footer-lines"]').at(0).text()).toBe(
|
||||
const component = mount(renderESQLEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-footer"]').length).not.toBe(0);
|
||||
expect(component.find('[data-test-subj="ESQLEditor-footer-lines"]').at(0).text()).toBe(
|
||||
'1 line'
|
||||
);
|
||||
});
|
||||
|
||||
it('should render the run query text', async () => {
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor-run-query"]').length).not.toBe(0);
|
||||
const component = mount(renderESQLEditorComponent({ ...props }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-run-query"]').length).not.toBe(0);
|
||||
});
|
||||
|
||||
it('should render the doc icon if the displayDocumentationAsFlyout is true', async () => {
|
||||
|
@ -144,10 +139,8 @@ describe('TextBasedLanguagesEditor', () => {
|
|||
displayDocumentationAsFlyout: true,
|
||||
editorIsInline: false,
|
||||
};
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps }));
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor-documentation"]').length).not.toBe(
|
||||
0
|
||||
);
|
||||
const component = mount(renderESQLEditorComponent({ ...newProps }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-documentation"]').length).not.toBe(0);
|
||||
});
|
||||
|
||||
it('should not render the run query text if the hideRunQueryText prop is set to true', async () => {
|
||||
|
@ -155,8 +148,8 @@ describe('TextBasedLanguagesEditor', () => {
|
|||
...props,
|
||||
hideRunQueryText: true,
|
||||
};
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps }));
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor-run-query"]').length).toBe(0);
|
||||
const component = mount(renderESQLEditorComponent({ ...newProps }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-run-query"]').length).toBe(0);
|
||||
});
|
||||
|
||||
it('should render correctly if editorIsInline prop is set to true', async () => {
|
||||
|
@ -167,12 +160,10 @@ describe('TextBasedLanguagesEditor', () => {
|
|||
editorIsInline: true,
|
||||
onTextLangQuerySubmit,
|
||||
};
|
||||
const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps }));
|
||||
expect(component.find('[data-test-subj="TextBasedLangEditor-run-query"]').length).toBe(0);
|
||||
expect(
|
||||
component.find('[data-test-subj="TextBasedLangEditor-run-query-button"]').length
|
||||
).not.toBe(1);
|
||||
findTestSubject(component, 'TextBasedLangEditor-run-query-button').simulate('click');
|
||||
const component = mount(renderESQLEditorComponent({ ...newProps }));
|
||||
expect(component.find('[data-test-subj="ESQLEditor-run-query"]').length).toBe(0);
|
||||
expect(component.find('[data-test-subj="ESQLEditor-run-query-button"]').length).not.toBe(1);
|
||||
findTestSubject(component, 'ESQLEditor-run-query-button').simulate('click');
|
||||
expect(onTextLangQuerySubmit).toHaveBeenCalled();
|
||||
});
|
||||
});
|
|
@ -49,9 +49,9 @@ import {
|
|||
EDITOR_INITIAL_HEIGHT_INLINE_EDITING,
|
||||
EDITOR_MAX_HEIGHT,
|
||||
EDITOR_MIN_HEIGHT,
|
||||
textBasedLanguageEditorStyles,
|
||||
} from './text_based_languages_editor.styles';
|
||||
import type { TextBasedLanguagesEditorProps, TextBasedEditorDeps } from './types';
|
||||
esqlEditorStyles,
|
||||
} from './esql_editor.styles';
|
||||
import type { ESQLEditorProps, ESQLEditorDeps } from './types';
|
||||
|
||||
import './overwrite.scss';
|
||||
|
||||
|
@ -61,7 +61,7 @@ const KEYCODE_ARROW_DOWN = 40;
|
|||
// for editor width smaller than this value we want to start hiding some text
|
||||
const BREAKPOINT_WIDTH = 540;
|
||||
|
||||
export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
||||
export const ESQLEditor = memo(function ESQLEditor({
|
||||
query,
|
||||
onTextLangQueryChange,
|
||||
onTextLangQuerySubmit,
|
||||
|
@ -79,11 +79,11 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
|||
hideQueryHistory,
|
||||
hasOutline,
|
||||
displayDocumentationAsFlyout,
|
||||
}: TextBasedLanguagesEditorProps) {
|
||||
}: ESQLEditorProps) {
|
||||
const popoverRef = useRef<HTMLDivElement>(null);
|
||||
const datePickerOpenStatusRef = useRef<boolean>(false);
|
||||
const { euiTheme } = useEuiTheme();
|
||||
const kibana = useKibana<TextBasedEditorDeps>();
|
||||
const kibana = useKibana<ESQLEditorDeps>();
|
||||
const {
|
||||
dataViews,
|
||||
expressions,
|
||||
|
@ -235,7 +235,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
|||
openTimePickerPopover();
|
||||
});
|
||||
|
||||
const styles = textBasedLanguageEditorStyles(
|
||||
const styles = esqlEditorStyles(
|
||||
euiTheme,
|
||||
editorHeight,
|
||||
Boolean(editorMessages.errors.length),
|
||||
|
@ -396,7 +396,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
|||
const queryRunButtonProperties = useMemo(() => {
|
||||
if (allowQueryCancellation && isLoading) {
|
||||
return {
|
||||
label: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.cancel', {
|
||||
label: i18n.translate('esqlEditor.query.cancel', {
|
||||
defaultMessage: 'Cancel',
|
||||
}),
|
||||
iconType: 'cross',
|
||||
|
@ -405,7 +405,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
|||
}
|
||||
if (code !== codeWhenSubmitted) {
|
||||
return {
|
||||
label: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.runQuery', {
|
||||
label: i18n.translate('esqlEditor.query.runQuery', {
|
||||
defaultMessage: 'Run query',
|
||||
}),
|
||||
iconType: 'play',
|
||||
|
@ -413,7 +413,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
|||
};
|
||||
}
|
||||
return {
|
||||
label: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.refreshLabel', {
|
||||
label: i18n.translate('esqlEditor.query.refreshLabel', {
|
||||
defaultMessage: 'Refresh',
|
||||
}),
|
||||
iconType: 'refresh',
|
||||
|
@ -611,7 +611,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
|||
<EuiFlexItem grow={false}>
|
||||
<EuiToolTip
|
||||
position="top"
|
||||
content={i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.runQuery', {
|
||||
content={i18n.translate('esqlEditor.query.runQuery', {
|
||||
defaultMessage: 'Run query',
|
||||
})}
|
||||
>
|
||||
|
@ -622,7 +622,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
|||
size="s"
|
||||
isLoading={isLoading && !allowQueryCancellation}
|
||||
isDisabled={Boolean(disableSubmitAction && !allowQueryCancellation)}
|
||||
data-test-subj="TextBasedLangEditor-run-query-button"
|
||||
data-test-subj="ESQLEditor-run-query-button"
|
||||
aria-label={queryRunButtonProperties.label}
|
||||
>
|
||||
{queryRunButtonProperties.label}
|
||||
|
@ -639,8 +639,8 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
|||
>
|
||||
<div css={styles.resizableContainer}>
|
||||
<EuiFlexItem
|
||||
data-test-subj={dataTestSubj ?? 'TextBasedLangEditor'}
|
||||
className="TextBasedLangEditor"
|
||||
data-test-subj={dataTestSubj ?? 'ESQLEditor'}
|
||||
className="ESQLEditor"
|
||||
css={css`
|
||||
max-width: 100%;
|
||||
position: relative;
|
||||
|
@ -757,7 +757,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({
|
|||
overflow: 'auto',
|
||||
}}
|
||||
ref={popoverRef}
|
||||
data-test-subj="TextBasedLangEditor-timepicker-popover"
|
||||
data-test-subj="ESQLEditor-timepicker-popover"
|
||||
>
|
||||
<EuiDatePicker
|
||||
selected={timePickerDate}
|
|
@ -138,7 +138,7 @@ export const parseErrors = (errors: Error[], code: string): MonacoMessage[] => {
|
|||
};
|
||||
} else if (error.message.includes('expression was aborted')) {
|
||||
return {
|
||||
message: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.aborted', {
|
||||
message: i18n.translate('esqlEditor.query.aborted', {
|
||||
defaultMessage: 'Request was aborted',
|
||||
}),
|
||||
startColumn: 1,
|
|
@ -1,40 +1,40 @@
|
|||
/* Editor styles for any layout mode */
|
||||
/* NOTE: Much of this is overriding Monaco styles so the specificity is intentional */
|
||||
|
||||
.TextBasedLangEditor .monaco-editor .monaco-hover {
|
||||
.ESQLEditor .monaco-editor .monaco-hover {
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
.TextBasedLangEditor .monaco-editor .margin-view-overlays .line-numbers {
|
||||
.ESQLEditor .monaco-editor .margin-view-overlays .line-numbers {
|
||||
color: $euiColorDisabledText;
|
||||
}
|
||||
|
||||
// Currently focused line(s)
|
||||
.TextBasedLangEditor .monaco-editor .current-line ~ .line-numbers {
|
||||
.ESQLEditor .monaco-editor .current-line ~ .line-numbers {
|
||||
color: $euiTextSubduedColor;
|
||||
}
|
||||
|
||||
// Suggest (autocomplete) menu
|
||||
.TextBasedLangEditor .monaco-editor .suggest-widget, .TextBasedLangEditor .monaco-editor .suggest-details-container {
|
||||
.ESQLEditor .monaco-editor .suggest-widget, .ESQLEditor .monaco-editor .suggest-details-container {
|
||||
@include euiBottomShadow;
|
||||
border-radius: $euiBorderRadius;
|
||||
}
|
||||
|
||||
.TextBasedLangEditor .monaco-editor .suggest-details-container {
|
||||
.ESQLEditor .monaco-editor .suggest-details-container {
|
||||
background-color: $euiColorEmptyShade;
|
||||
line-height: 1.5rem;
|
||||
}
|
||||
|
||||
.TextBasedLangEditor_errorMessage {
|
||||
.ESQLEditor_errorMessage {
|
||||
@include euiTextBreakWord;
|
||||
}
|
||||
|
||||
// All scrollable containers (e.g. main container and suggest menu)
|
||||
.TextBasedLangEditor .monaco-editor .monaco-scrollable-element {
|
||||
.ESQLEditor .monaco-editor .monaco-scrollable-element {
|
||||
margin-left: $euiSizeS;
|
||||
}
|
||||
|
||||
.TextBasedLangEditor .monaco-editor .monaco-list .monaco-scrollable-element {
|
||||
.ESQLEditor .monaco-editor .monaco-list .monaco-scrollable-element {
|
||||
margin-left: 0;
|
||||
|
||||
.monaco-list-row.focused {
|
|
@ -24,7 +24,7 @@ export function ResizableButton({
|
|||
}) {
|
||||
return (
|
||||
<EuiResizableButton
|
||||
data-test-subj="TextBasedLangEditor-resize"
|
||||
data-test-subj="ESQLEditor-resize"
|
||||
onMouseDown={onMouseDownResizeHandler}
|
||||
onKeyDown={onKeyDownResizeHandler}
|
||||
onTouchStart={onMouseDownResizeHandler}
|
|
@ -14,7 +14,7 @@ import type { ExpressionsStart } from '@kbn/expressions-plugin/public';
|
|||
import type { IndexManagementPluginSetup } from '@kbn/index-management-shared-types';
|
||||
import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public';
|
||||
|
||||
export interface TextBasedLanguagesEditorProps {
|
||||
export interface ESQLEditorProps {
|
||||
/** The aggregate type query */
|
||||
query: AggregateQuery;
|
||||
/** Callback running everytime the query changes */
|
||||
|
@ -66,7 +66,7 @@ export interface TextBasedLanguagesEditorProps {
|
|||
displayDocumentationAsFlyout?: boolean;
|
||||
}
|
||||
|
||||
export interface TextBasedEditorDeps {
|
||||
export interface ESQLEditorDeps {
|
||||
core: CoreStart;
|
||||
dataViews: DataViewsPublicPluginStart;
|
||||
expressions: ExpressionsStart;
|
|
@ -58,7 +58,7 @@ export const storybookAliases = {
|
|||
observability_slo: 'x-pack/plugins/observability_solution/slo/.storybook',
|
||||
presentation: 'src/plugins/presentation_util/storybook',
|
||||
random_sampling: 'x-pack/packages/kbn-random-sampling/.storybook',
|
||||
text_based_editor: 'packages/kbn-text-based-editor/.storybook',
|
||||
esql_editor: 'packages/kbn-esql-editor/.storybook',
|
||||
security_solution: 'x-pack/plugins/security_solution/.storybook',
|
||||
security_solution_packages: 'x-pack/packages/security-solution/storybook/config',
|
||||
serverless: 'packages/serverless/storybook/config',
|
||||
|
|
|
@ -11,9 +11,9 @@ The editor accepts the following properties:
|
|||
```
|
||||
|
||||
To use it on your application, you need to add the textBasedLanguages to your requiredBundles and the @kbn/esql to your tsconfig.json and use the component like that:
|
||||
import { TextBasedLangEditor } from '@kbn/esql/public';
|
||||
import { ESQLLangEditor } from '@kbn/esql/public';
|
||||
|
||||
<TextBasedLangEditor
|
||||
<ESQLLangEditor
|
||||
query={query}
|
||||
onTextLangQueryChange={onTextLangQueryChange}
|
||||
errors={props.textBasedLanguageModeErrors}
|
||||
|
@ -23,7 +23,7 @@ import { TextBasedLangEditor } from '@kbn/esql/public';
|
|||
```
|
||||
|
||||
## Usage so far
|
||||
The TextBasedLanguagesEditor is currently part of the unified search component.
|
||||
The ESQLEditor is currently part of the unified search component.
|
||||
If your application uses the dataview picker then it can be enabled by adding
|
||||
|
||||
```
|
||||
|
|
|
@ -11,20 +11,20 @@ import React from 'react';
|
|||
import { EuiLoadingSpinner } from '@elastic/eui';
|
||||
import useAsync from 'react-use/lib/useAsync';
|
||||
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
|
||||
import { TextBasedLanguagesEditorProps } from '@kbn/text-based-editor';
|
||||
import { ESQLEditorProps } from '@kbn/esql-editor';
|
||||
import { untilPluginStartServicesReady } from './kibana_services';
|
||||
|
||||
export const TextBasedLangEditor = (props: TextBasedLanguagesEditorProps) => {
|
||||
export const ESQLLangEditor = (props: ESQLEditorProps) => {
|
||||
const { loading, value } = useAsync(() => {
|
||||
const startServicesPromise = untilPluginStartServicesReady();
|
||||
const modulePromise = import('@kbn/text-based-editor');
|
||||
const modulePromise = import('@kbn/esql-editor');
|
||||
return Promise.all([startServicesPromise, modulePromise]);
|
||||
}, []);
|
||||
|
||||
const TextBasedLanguagesEditor = value?.[1]?.default;
|
||||
const ESQLEditor = value?.[1]?.default;
|
||||
const deps = value?.[0];
|
||||
|
||||
if (loading || !deps || !TextBasedLanguagesEditor) return <EuiLoadingSpinner />;
|
||||
if (loading || !deps || !ESQLEditor) return <EuiLoadingSpinner />;
|
||||
|
||||
return (
|
||||
<KibanaContextProvider
|
||||
|
@ -32,7 +32,7 @@ export const TextBasedLangEditor = (props: TextBasedLanguagesEditorProps) => {
|
|||
...deps,
|
||||
}}
|
||||
>
|
||||
<TextBasedLanguagesEditor {...props} />
|
||||
<ESQLEditor {...props} />
|
||||
</KibanaContextProvider>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
*/
|
||||
|
||||
import { EsqlPlugin } from './plugin';
|
||||
export type { TextBasedLanguagesEditorProps } from '@kbn/text-based-editor';
|
||||
export type { ESQLEditorProps } from '@kbn/esql-editor';
|
||||
export type { EsqlPluginStart } from './types';
|
||||
export { TextBasedLangEditor } from './create_editor';
|
||||
export { ESQLLangEditor } from './create_editor';
|
||||
|
||||
export function plugin() {
|
||||
return new EsqlPlugin();
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
* License v3.0 only", or the "Server Side Public License, v 1".
|
||||
*/
|
||||
|
||||
import { TextBasedLanguagesEditorProps } from '@kbn/text-based-editor';
|
||||
import { ESQLEditorProps } from '@kbn/esql-editor';
|
||||
|
||||
export interface EsqlPluginStart {
|
||||
Editor: React.ComponentType<TextBasedLanguagesEditorProps>;
|
||||
Editor: React.ComponentType<ESQLEditorProps>;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
"server/**/*",
|
||||
],
|
||||
"kbn_references": [
|
||||
"@kbn/text-based-editor",
|
||||
"@kbn/esql-editor",
|
||||
"@kbn/kibana-react-plugin",
|
||||
"@kbn/core",
|
||||
"@kbn/expressions-plugin",
|
||||
|
|
|
@ -14,7 +14,7 @@ import { resolve } from 'path';
|
|||
const mockConfig = {
|
||||
resolve: {
|
||||
alias: {
|
||||
'@kbn/esql/public': resolve(__dirname, '../public/mocks/text_based_languages_editor.tsx'),
|
||||
'@kbn/esql/public': resolve(__dirname, '../public/mocks/esql_editor.tsx'),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
@ -9,14 +9,14 @@
|
|||
|
||||
import React from 'react';
|
||||
import { withSuspense } from '@kbn/shared-ux-utility';
|
||||
import { TextBasedLanguagesEditorProps } from '@kbn/text-based-editor';
|
||||
import { ESQLEditorProps } from '@kbn/esql-editor';
|
||||
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
|
||||
|
||||
const TextBasedLanguagesEditorLazy = React.lazy(() => import('@kbn/text-based-editor'));
|
||||
const TextBasedLanguagesEditor = withSuspense(TextBasedLanguagesEditorLazy);
|
||||
const ESQLEditorLazy = React.lazy(() => import('@kbn/esql-editor'));
|
||||
const ESQLEditor = withSuspense(ESQLEditorLazy);
|
||||
|
||||
function createEditor() {
|
||||
return (props: TextBasedLanguagesEditorProps) => {
|
||||
return (props: ESQLEditorProps) => {
|
||||
return (
|
||||
<KibanaContextProvider
|
||||
services={{
|
||||
|
@ -24,10 +24,10 @@ function createEditor() {
|
|||
uiSettings: { get: () => {} },
|
||||
}}
|
||||
>
|
||||
<TextBasedLanguagesEditor {...props} />
|
||||
<ESQLEditor {...props} />
|
||||
</KibanaContextProvider>
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
export const TextBasedLangEditor = createEditor();
|
||||
export const ESQLLangEditor = createEditor();
|
|
@ -20,7 +20,7 @@ import {
|
|||
isOfAggregateQueryType,
|
||||
getLanguageDisplayName,
|
||||
} from '@kbn/es-query';
|
||||
import { TextBasedLangEditor } from '@kbn/esql/public';
|
||||
import { ESQLLangEditor } from '@kbn/esql/public';
|
||||
import { EMPTY } from 'rxjs';
|
||||
import { map } from 'rxjs';
|
||||
import { throttle } from 'lodash';
|
||||
|
@ -728,7 +728,7 @@ export const QueryBarTopRow = React.memo(
|
|||
isQueryLangSelected &&
|
||||
props.query &&
|
||||
isOfAggregateQueryType(props.query) && (
|
||||
<TextBasedLangEditor
|
||||
<ESQLLangEditor
|
||||
query={props.query}
|
||||
onTextLangQueryChange={props.onTextLangQueryChange}
|
||||
errors={props.textBasedLanguageModeErrors}
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
"@kbn/ui-theme",
|
||||
"@kbn/saved-objects-management-plugin",
|
||||
"@kbn/esql",
|
||||
"@kbn/text-based-editor",
|
||||
"@kbn/esql-editor",
|
||||
"@kbn/core-doc-links-browser",
|
||||
"@kbn/core-lifecycle-browser",
|
||||
"@kbn/ml-string-hash",
|
||||
|
|
|
@ -64,7 +64,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await dashboard.waitForRenderComplete();
|
||||
|
||||
await monacoEditor.setCodeEditorValue('from logstash-* | stats maxB = max(bytes)');
|
||||
await testSubjects.click('TextBasedLangEditor-run-query-button');
|
||||
await testSubjects.click('ESQLEditor-run-query-button');
|
||||
await header.waitUntilLoadingHasFinished();
|
||||
|
||||
await testSubjects.click('applyFlyoutButton');
|
||||
|
|
|
@ -83,7 +83,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await unifiedFieldList.waitUntilSidebarHasLoaded();
|
||||
|
||||
expect(await testSubjects.exists('fieldListFiltersFieldSearch')).to.be(true);
|
||||
expect(await testSubjects.exists('TextBasedLangEditor')).to.be(true);
|
||||
expect(await testSubjects.exists('ESQLEditor')).to.be(true);
|
||||
expect(await testSubjects.exists('superDatePickerToggleQuickMenuButton')).to.be(true);
|
||||
|
||||
expect(await testSubjects.exists('showQueryBarMenu')).to.be(false);
|
||||
|
@ -113,7 +113,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await header.waitUntilLoadingHasFinished();
|
||||
await discover.waitUntilSearchingHasFinished();
|
||||
|
||||
expect(await testSubjects.exists('TextBasedLangEditor')).to.be(true);
|
||||
expect(await testSubjects.exists('ESQLEditor')).to.be(true);
|
||||
// I am not rendering the histogram for indices with no @timestamp field
|
||||
expect(await testSubjects.exists('unifiedHistogramChart')).to.be(false);
|
||||
});
|
||||
|
@ -133,7 +133,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
const toTime = 'Nov 15, 2018 @ 00:00:00.000';
|
||||
await timePicker.setAbsoluteRange(fromTime, toTime);
|
||||
|
||||
expect(await testSubjects.exists('TextBasedLangEditor')).to.be(true);
|
||||
expect(await testSubjects.exists('ESQLEditor')).to.be(true);
|
||||
expect(await testSubjects.exists('unifiedHistogramChart')).to.be(true);
|
||||
});
|
||||
|
||||
|
@ -378,7 +378,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await discover.waitUntilSearchingHasFinished();
|
||||
await unifiedFieldList.waitUntilSidebarHasLoaded();
|
||||
|
||||
await testSubjects.click('TextBasedLangEditor-toggle-query-history-button');
|
||||
await testSubjects.click('ESQLEditor-toggle-query-history-button');
|
||||
const historyItems = await esql.getHistoryItems();
|
||||
log.debug(historyItems);
|
||||
const queryAdded = historyItems.some((item) => {
|
||||
|
@ -400,7 +400,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await header.waitUntilLoadingHasFinished();
|
||||
await discover.waitUntilSearchingHasFinished();
|
||||
|
||||
await testSubjects.click('TextBasedLangEditor-toggle-query-history-button');
|
||||
await testSubjects.click('ESQLEditor-toggle-query-history-button');
|
||||
const historyItems = await esql.getHistoryItems();
|
||||
log.debug(historyItems);
|
||||
const queryAdded = historyItems.some((item) => {
|
||||
|
@ -416,7 +416,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await discover.waitUntilSearchingHasFinished();
|
||||
await unifiedFieldList.waitUntilSidebarHasLoaded();
|
||||
|
||||
await testSubjects.click('TextBasedLangEditor-toggle-query-history-button');
|
||||
await testSubjects.click('ESQLEditor-toggle-query-history-button');
|
||||
// click a history item
|
||||
await esql.clickHistoryItem(1);
|
||||
|
||||
|
@ -441,9 +441,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await header.waitUntilLoadingHasFinished();
|
||||
await discover.waitUntilSearchingHasFinished();
|
||||
|
||||
await testSubjects.click('TextBasedLangEditor-toggle-query-history-button');
|
||||
await testSubjects.click('ESQLEditor-toggle-query-history-button');
|
||||
const historyItem = await esql.getHistoryItem(0);
|
||||
await historyItem.findByTestSubject('TextBasedLangEditor-queryHistory-error');
|
||||
await historyItem.findByTestSubject('ESQLEditor-queryHistory-error');
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
|
||||
await header.waitUntilLoadingHasFinished();
|
||||
await discover.waitUntilSearchingHasFinished();
|
||||
await testSubjects.existOrFail('TextBasedLangEditor');
|
||||
await testSubjects.existOrFail('ESQLEditor');
|
||||
await testSubjects.existOrFail('unifiedHistogramChart');
|
||||
const rows = await dataGrid.getDocTableRows();
|
||||
expect(rows.length).to.be.above(0);
|
||||
|
|
|
@ -14,7 +14,7 @@ export class ESQLService extends FtrService {
|
|||
private readonly testSubjects = this.ctx.getService('testSubjects');
|
||||
|
||||
public async getHistoryItems(): Promise<string[][]> {
|
||||
const queryHistory = await this.testSubjects.find('TextBasedLangEditor-queryHistory');
|
||||
const queryHistory = await this.testSubjects.find('ESQLEditor-queryHistory');
|
||||
const tableBody = await this.retry.try(async () => queryHistory.findByTagName('tbody'));
|
||||
const $ = await tableBody.parseDomContent();
|
||||
return $('tr')
|
||||
|
@ -38,7 +38,7 @@ export class ESQLService extends FtrService {
|
|||
}
|
||||
|
||||
public async getHistoryItem(rowIndex = 0) {
|
||||
const queryHistory = await this.testSubjects.find('TextBasedLangEditor-queryHistory');
|
||||
const queryHistory = await this.testSubjects.find('ESQLEditor-queryHistory');
|
||||
const tableBody = await this.retry.try(async () => queryHistory.findByTagName('tbody'));
|
||||
const rows = await this.retry.try(async () => tableBody.findAllByTagName('tr'));
|
||||
|
||||
|
@ -47,7 +47,7 @@ export class ESQLService extends FtrService {
|
|||
|
||||
public async clickHistoryItem(rowIndex = 0) {
|
||||
const row = await this.getHistoryItem(rowIndex);
|
||||
const toggle = await row.findByTestSubject('TextBasedLangEditor-queryHistory-runQuery-button');
|
||||
const toggle = await row.findByTestSubject('ESQLEditor-queryHistory-runQuery-button');
|
||||
await toggle.click();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -852,6 +852,8 @@
|
|||
"@kbn/esql-ast-inspector-plugin/*": ["examples/esql_ast_inspector/*"],
|
||||
"@kbn/esql-datagrid": ["src/plugins/esql_datagrid"],
|
||||
"@kbn/esql-datagrid/*": ["src/plugins/esql_datagrid/*"],
|
||||
"@kbn/esql-editor": ["packages/kbn-esql-editor"],
|
||||
"@kbn/esql-editor/*": ["packages/kbn-esql-editor/*"],
|
||||
"@kbn/esql-utils": ["packages/kbn-esql-utils"],
|
||||
"@kbn/esql-utils/*": ["packages/kbn-esql-utils/*"],
|
||||
"@kbn/esql-validation-autocomplete": ["packages/kbn-esql-validation-autocomplete"],
|
||||
|
@ -1832,8 +1834,6 @@
|
|||
"@kbn/test-suites-xpack-performance/*": ["x-pack/performance/*"],
|
||||
"@kbn/testing-embedded-lens-plugin": ["x-pack/examples/testing_embedded_lens"],
|
||||
"@kbn/testing-embedded-lens-plugin/*": ["x-pack/examples/testing_embedded_lens/*"],
|
||||
"@kbn/text-based-editor": ["packages/kbn-text-based-editor"],
|
||||
"@kbn/text-based-editor/*": ["packages/kbn-text-based-editor/*"],
|
||||
"@kbn/third-party-lens-navigation-prompt-plugin": ["x-pack/examples/third_party_lens_navigation_prompt"],
|
||||
"@kbn/third-party-lens-navigation-prompt-plugin/*": ["x-pack/examples/third_party_lens_navigation_prompt/*"],
|
||||
"@kbn/third-party-vis-lens-example-plugin": ["x-pack/examples/third_party_vis_lens_example"],
|
||||
|
|
|
@ -12,7 +12,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|||
import { usePageUrlState } from '@kbn/ml-url-state';
|
||||
|
||||
import { FullTimeRangeSelector, DatePickerWrapper } from '@kbn/ml-date-picker';
|
||||
import { TextBasedLangEditor } from '@kbn/esql/public';
|
||||
import { ESQLLangEditor } from '@kbn/esql/public';
|
||||
import type { AggregateQuery } from '@kbn/es-query';
|
||||
|
||||
import {
|
||||
|
@ -268,7 +268,7 @@ export const IndexDataVisualizerESQL: FC<IndexDataVisualizerESQLProps> = (dataVi
|
|||
borderRight: euiTheme.euiBorderThin,
|
||||
})}
|
||||
>
|
||||
<TextBasedLangEditor
|
||||
<ESQLLangEditor
|
||||
query={localQuery}
|
||||
onTextLangQueryChange={onTextLangQueryChange}
|
||||
onTextLangQuerySubmit={onTextLangQuerySubmit}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* 2.0.
|
||||
*/
|
||||
import React, { useRef, useState, useCallback } from 'react';
|
||||
import { TextBasedLangEditor } from '@kbn/esql/public';
|
||||
import { ESQLLangEditor } from '@kbn/esql/public';
|
||||
import { EuiFlexItem } from '@elastic/eui';
|
||||
import type { AggregateQuery } from '@kbn/es-query';
|
||||
|
||||
|
@ -39,7 +39,7 @@ export const FieldStatsESQLEditor = ({
|
|||
|
||||
return (
|
||||
<EuiFlexItem grow={false} data-test-subj="InlineEditingESQLEditor">
|
||||
<TextBasedLangEditor
|
||||
<ESQLLangEditor
|
||||
query={query}
|
||||
onTextLangQueryChange={(q) => {
|
||||
setQuery(q);
|
||||
|
|
|
@ -258,7 +258,7 @@ describe('LensEditConfigurationFlyout', () => {
|
|||
await renderConfigFlyout({
|
||||
canEditTextBasedQuery: false,
|
||||
});
|
||||
expect(screen.queryByTestId('TextBasedLangEditor')).toBeNull();
|
||||
expect(screen.queryByTestId('ESQLEditor')).toBeNull();
|
||||
});
|
||||
|
||||
it('should not display the editor if canEditTextBasedQuery prop is true but the query is not text based', async () => {
|
||||
|
@ -275,7 +275,7 @@ describe('LensEditConfigurationFlyout', () => {
|
|||
},
|
||||
},
|
||||
});
|
||||
expect(screen.queryByTestId('TextBasedLangEditor')).toBeNull();
|
||||
expect(screen.queryByTestId('ESQLEditor')).toBeNull();
|
||||
});
|
||||
|
||||
it('should not display the suggestions if hidesSuggestions prop is true', async () => {
|
||||
|
|
|
@ -26,7 +26,7 @@ import {
|
|||
getLanguageDisplayName,
|
||||
} from '@kbn/es-query';
|
||||
import type { AggregateQuery, Query } from '@kbn/es-query';
|
||||
import { TextBasedLangEditor } from '@kbn/esql/public';
|
||||
import { ESQLLangEditor } from '@kbn/esql/public';
|
||||
import { DefaultInspectorAdapters } from '@kbn/expressions-plugin/common';
|
||||
import { buildExpression } from '../../../editor_frame_service/editor_frame/expression_helpers';
|
||||
import { MAX_NUM_OF_COLUMNS } from '../../../datasources/text_based/utils';
|
||||
|
@ -477,7 +477,7 @@ export function LensEditConfigurationFlyout({
|
|||
>
|
||||
{isOfAggregateQueryType(query) && canEditTextBasedQuery && (
|
||||
<EuiFlexItem grow={false} data-test-subj="InlineEditingESQLEditor">
|
||||
<TextBasedLangEditor
|
||||
<ESQLLangEditor
|
||||
query={query}
|
||||
onTextLangQueryChange={(q) => {
|
||||
setQuery(q);
|
||||
|
|
|
@ -849,7 +849,7 @@ export function FormulaEditor({
|
|||
buttonProps={{
|
||||
color: 'text',
|
||||
className: 'lnsFormula__editorHelp lnsFormula__editorHelp--overlay',
|
||||
'data-test-subj': 'TextBasedLangEditor-documentation',
|
||||
'data-test-subj': 'ESQLEditor-documentation',
|
||||
'aria-label': i18n.translate(
|
||||
'xpack.lens.formula.editorHelpInlineShowToolTip',
|
||||
{
|
||||
|
|
|
@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n';
|
|||
import { EuiFormRow } from '@elastic/eui';
|
||||
import { euiThemeVars } from '@kbn/ui-theme';
|
||||
import type { ExpressionsStart } from '@kbn/expressions-plugin/public';
|
||||
import { fetchFieldsFromESQL } from '@kbn/text-based-editor';
|
||||
import { fetchFieldsFromESQL } from '@kbn/esql-editor';
|
||||
import type { DatasourceDimensionEditorProps, DataType } from '../../../types';
|
||||
import { FieldSelect, type FieldOptionCompatible } from './field_select';
|
||||
import type { TextBasedPrivateState } from '../types';
|
||||
|
|
|
@ -101,7 +101,7 @@
|
|||
"@kbn/test-eui-helpers",
|
||||
"@kbn/shared-ux-utility",
|
||||
"@kbn/esql-utils",
|
||||
"@kbn/text-based-editor",
|
||||
"@kbn/esql-editor",
|
||||
"@kbn/managed-content-badge",
|
||||
"@kbn/sort-predicates",
|
||||
"@kbn/presentation-publishing",
|
||||
|
|
|
@ -11,7 +11,7 @@ import { isEqual } from 'lodash';
|
|||
import useMountedState from 'react-use/lib/useMountedState';
|
||||
import type { AggregateQuery } from '@kbn/es-query';
|
||||
import type { ESQLColumn } from '@kbn/es-types';
|
||||
import { TextBasedLangEditor } from '@kbn/esql/public';
|
||||
import { ESQLLangEditor } from '@kbn/esql/public';
|
||||
import { getESQLMeta, verifyGeometryColumn } from './esql_utils';
|
||||
|
||||
interface Props {
|
||||
|
@ -41,7 +41,7 @@ export function ESQLEditor(props: Props) {
|
|||
|
||||
return (
|
||||
<>
|
||||
<TextBasedLangEditor
|
||||
<ESQLLangEditor
|
||||
query={localQuery}
|
||||
onTextLangQueryChange={setLocalQuery}
|
||||
onTextLangQuerySubmit={async (query) => {
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiPanel, EuiTitle } from '@elastic/eui';
|
||||
import { css } from '@emotion/css';
|
||||
import { TextBasedLangEditor } from '@kbn/esql/public';
|
||||
import { ESQLLangEditor } from '@kbn/esql/public';
|
||||
import { i18n } from '@kbn/i18n';
|
||||
import React from 'react';
|
||||
import { AddFromLibraryButton } from '../add_from_library_button';
|
||||
|
@ -67,7 +67,7 @@ export function AddInvestigationItem() {
|
|||
<EuiPanel color="subdued" hasShadow={false}>
|
||||
<EuiFlexGroup gutterSize="m">
|
||||
<EuiFlexItem>
|
||||
<TextBasedLangEditor
|
||||
<ESQLLangEditor
|
||||
query={query}
|
||||
onTextLangQueryChange={setQuery}
|
||||
onTextLangQuerySubmit={async (nextSubmittedQuery) => {
|
||||
|
|
|
@ -21,10 +21,10 @@ jest.mock('../validation', () => ({
|
|||
}));
|
||||
const { hasExpressionValidationErrors } = jest.requireMock('../validation');
|
||||
|
||||
jest.mock('@kbn/text-based-editor', () => ({
|
||||
jest.mock('@kbn/esql-editor', () => ({
|
||||
fetchFieldsFromESQL: jest.fn(),
|
||||
}));
|
||||
const { fetchFieldsFromESQL } = jest.requireMock('@kbn/text-based-editor');
|
||||
const { fetchFieldsFromESQL } = jest.requireMock('@kbn/esql-editor');
|
||||
const { getFields } = jest.requireMock('@kbn/triggers-actions-ui-plugin/public');
|
||||
|
||||
const AppWrapper = React.memo<PropsWithChildren<unknown>>(({ children }) => (
|
||||
|
|
|
@ -16,8 +16,8 @@ import {
|
|||
EuiSpacer,
|
||||
} from '@elastic/eui';
|
||||
import { getFields, RuleTypeParamsExpressionProps } from '@kbn/triggers-actions-ui-plugin/public';
|
||||
import { TextBasedLangEditor } from '@kbn/esql/public';
|
||||
import { fetchFieldsFromESQL } from '@kbn/text-based-editor';
|
||||
import { ESQLLangEditor } from '@kbn/esql/public';
|
||||
import { fetchFieldsFromESQL } from '@kbn/esql-editor';
|
||||
import { getESQLAdHocDataview } from '@kbn/esql-utils';
|
||||
import type { AggregateQuery } from '@kbn/es-query';
|
||||
import { parseDuration } from '@kbn/alerting-plugin/common';
|
||||
|
@ -187,7 +187,7 @@ export const EsqlQueryExpression: React.FC<
|
|||
/>
|
||||
}
|
||||
>
|
||||
<TextBasedLangEditor
|
||||
<ESQLLangEditor
|
||||
query={query}
|
||||
onTextLangQueryChange={(q: AggregateQuery) => {
|
||||
setQuery(q);
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
"@kbn/rule-data-utils",
|
||||
"@kbn/alerts-as-data-utils",
|
||||
"@kbn/esql",
|
||||
"@kbn/text-based-editor",
|
||||
"@kbn/esql-editor",
|
||||
"@kbn/expressions-plugin",
|
||||
"@kbn/core-http-browser",
|
||||
"@kbn/core-doc-links-browser",
|
||||
|
|
|
@ -7083,13 +7083,13 @@
|
|||
"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.aborted": "La demande a été annulée",
|
||||
"esqlEditor.query.aborted": "La demande a été annulée",
|
||||
"languageDocumentation.documentationESQL.aggregationFunctions": "Fonctions d'agrégation",
|
||||
"languageDocumentation.documentationESQL.aggregationFunctionsDocumentationESQLDescription": "Ces fonctions peuvent être utilisées avec STATS...BY :",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.cancel": "Annuler",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.collapseLabel": "Réduire",
|
||||
"esqlEditor.query.cancel": "Annuler",
|
||||
"esqlEditor.query.collapseLabel": "Réduire",
|
||||
"languageDocumentation.documentationESQL.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": "Supprimer les sauts de ligne des barres verticales",
|
||||
"esqlEditor.query.disableWordWrapLabel": "Supprimer les sauts de ligne des barres verticales",
|
||||
"languageDocumentation.documentationESQL.abs": "ABS",
|
||||
"languageDocumentation.documentationESQL.abs.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ABS\n Renvoie la valeur absolue.\n\n ````\n Numéro ROW = -1.0 \n | EVAL abs_number = ABS(number)\n ````\n ",
|
||||
"languageDocumentation.documentationESQL.acos": "ACOS",
|
||||
|
@ -7315,36 +7315,36 @@
|
|||
"languageDocumentation.documentationESQL.trim.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TRIM\n Supprime les espaces de début et de fin d'une chaîne.\n\n ````\n ROW message = \" some text \", color = \" red \"\n | EVAL message = TRIM(message)\n | EVAL color = TRIM(color)\n ````\n ",
|
||||
"languageDocumentation.documentationESQL.where": "WHERE",
|
||||
"languageDocumentation.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.EnableWordWrapLabel": "Ajouter des sauts de ligne aux barres verticales",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.errorCount": "{count} {count, plural, one {erreur} other {erreurs}}",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.errorsTitle": "Erreurs",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.expandLabel": "Développer",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.feedback": "Commentaires",
|
||||
"esqlEditor.query.EnableWordWrapLabel": "Ajouter des sauts de ligne aux barres verticales",
|
||||
"esqlEditor.query.errorCount": "{count} {count, plural, one {erreur} other {erreurs}}",
|
||||
"esqlEditor.query.errorsTitle": "Erreurs",
|
||||
"esqlEditor.query.expandLabel": "Développer",
|
||||
"esqlEditor.query.feedback": "Commentaires",
|
||||
"languageDocumentation.documentationESQL.functions": "Fonctions",
|
||||
"languageDocumentation.documentationESQL.functionsDocumentationESQLDescription": "Les fonctions sont compatibles avec \"ROW\" (Ligne), \"EVAL\" (Évaluation) et \"WHERE\" (Où).",
|
||||
"languageDocumentation.documentationESQL.groupingFunctions": "Fonctions de groupage",
|
||||
"languageDocumentation.documentationESQL.groupingFunctionsDocumentationESQLDescription": "Ces fonctions de regroupement peuvent être utilisées avec `STATS...BY` :",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.hideQueriesLabel": "Masquer les recherches récentes",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.lineCount": "{count} {count, plural, one {ligne} other {lignes}}",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.lineNumber": "Ligne {lineNumber}",
|
||||
"esqlEditor.query.hideQueriesLabel": "Masquer les recherches récentes",
|
||||
"esqlEditor.query.lineCount": "{count} {count, plural, one {ligne} other {lignes}}",
|
||||
"esqlEditor.query.lineNumber": "Ligne {lineNumber}",
|
||||
"languageDocumentation.documentationESQL.operators": "Opérateurs",
|
||||
"languageDocumentation.documentationESQL.operatorsDocumentationESQLDescription": "ES|QL est compatible avec les opérateurs suivants :",
|
||||
"languageDocumentation.documentationESQL.processingCommands": "Traitement des commandes",
|
||||
"languageDocumentation.documentationESQL.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.querieshistory.error": "La requête a échouée",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.querieshistory.success": "La requête a été exécuté avec succès",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.querieshistoryCopy": "Copier la requête dans le presse-papier",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.querieshistoryRun": "Exécuter la requête",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.querieshistoryTable": "Tableau d'historique des recherches",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.recentQueriesColumnLabel": "Recherches récentes",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.runQuery": "Exécuter la requête",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.showQueriesLabel": "Afficher les recherches récentes",
|
||||
"esqlEditor.query.querieshistory.error": "La requête a échouée",
|
||||
"esqlEditor.query.querieshistory.success": "La requête a été exécuté avec succès",
|
||||
"esqlEditor.query.querieshistoryCopy": "Copier la requête dans le presse-papier",
|
||||
"esqlEditor.query.querieshistoryRun": "Exécuter la requête",
|
||||
"esqlEditor.query.querieshistoryTable": "Tableau d'historique des recherches",
|
||||
"esqlEditor.query.recentQueriesColumnLabel": "Recherches récentes",
|
||||
"esqlEditor.query.runQuery": "Exécuter la requête",
|
||||
"esqlEditor.query.showQueriesLabel": "Afficher les recherches récentes",
|
||||
"languageDocumentation.documentationESQL.sourceCommands": "Commandes sources",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.submitFeedback": "Soumettre un commentaire",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.timeRanColumnLabel": "Temps exécuté",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.timestampNotDetected": "@timestamp non trouvé",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.warningCount": "{count} {count, plural, one {avertissement} other {avertissements}}",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.warningsTitle": "Avertissements",
|
||||
"esqlEditor.query.submitFeedback": "Soumettre un commentaire",
|
||||
"esqlEditor.query.timeRanColumnLabel": "Temps exécuté",
|
||||
"esqlEditor.query.timestampNotDetected": "@timestamp non trouvé",
|
||||
"esqlEditor.query.warningCount": "{count} {count, plural, one {avertissement} other {avertissements}}",
|
||||
"esqlEditor.query.warningsTitle": "Avertissements",
|
||||
"timelion.emptyExpressionErrorMessage": "Erreur Timelion : aucune expression fournie",
|
||||
"timelion.expressionSuggestions.argument.description.acceptsText": "Accepte",
|
||||
"timelion.expressionSuggestions.func.description.chainableHelpText": "Enchaînable",
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -7089,268 +7089,31 @@
|
|||
"telemetry.telemetryOptedInNoticeTitle": "帮助我们改进 Elastic Stack",
|
||||
"telemetry.usageCollectionConstant": "使用情况收集",
|
||||
"telemetry.usageDataTitle": "使用情况收集",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.aborted": "请求已中止",
|
||||
"languageDocumentation.documentationESQL.aggregationFunctions": "聚合函数",
|
||||
"languageDocumentation.documentationESQL.aggregationFunctionsDocumentationESQLDescription": "这些函数可以与 STATS...BY 搭配使用:",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.cancel": "取消",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.collapseLabel": "折叠",
|
||||
"languageDocumentation.documentationESQL.commandsDescription": "源命令会生成一个表,其中通常包含来自 Elasticsearch 的数据。ES|QL 支持以下源命令。",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel": "移除管道符上的换行符",
|
||||
"languageDocumentation.documentationESQL.abs": "ABS",
|
||||
"languageDocumentation.documentationESQL.abs.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ABS\n 返回绝对值。\n\n ```\n ROW number = -1.0 \n | EVAL abs_number = ABS(number)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.acos": "ACOS",
|
||||
"languageDocumentation.documentationESQL.acos.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ACOS\n 返回 `n` 的反余弦作为角度,以弧度表示。\n\n ```\n ROW a=.9\n | EVAL acos=ACOS(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.asin": "ASIN",
|
||||
"languageDocumentation.documentationESQL.asin.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ASIN\n 返回输入数字表达式的反正弦\n 作为角度,以弧度表示。\n\n ```\n ROW a=.9\n | EVAL asin=ASIN(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.atan": "ATAN",
|
||||
"languageDocumentation.documentationESQL.atan.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ATAN\n 返回输入数字表达式的反正切\n 作为角度,以弧度表示。\n\n ```\n ROW a=12.9\n | EVAL atan=ATAN(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.atan2": "ATAN2",
|
||||
"languageDocumentation.documentationESQL.atan2.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ATAN2\n 笛卡儿平面中正 x 轴\n 与从原点到点 (x , y) 构成的射线之间的角度,以弧度表示。\n\n ```\n ROW y=12.9, x=.6\n | EVAL atan2=ATAN2(y, x)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.autoBucketFunction": "BUCKET",
|
||||
"languageDocumentation.documentationESQL.autoBucketFunction.markdown": "### BUCKET\n用日期时间或数字输入创建值(存储桶)的分组。存储桶的大小可以直接提供,或基于建议的计数和值范围进行选择。\n\n`BUCKET` 以两种模式运行:\n\n1.在此模式下基于存储桶计数建议(四个参数)和范围计算存储桶的大小。\n2.在此模式下直接提供存储桶大小(两个参数)。\n\n使用存储桶的目标数量、起始范围和结束范围,`BUCKET` 将选取适当的存储桶大小以生成目标数量或更小数量的存储桶。\n\n例如,一年请求多达 20 个存储桶会按每月时间间隔组织数据:\n\n```\nFROM employees\n| WHERE hire_date >= \"1985-01-01T00:00:00Z\" AND hire_date < \"1986-01-01T00:00:00Z\"\n| STATS hire_date = MV_SORT(VALUES(hire_date)) BY month = BUCKET(hire_date, 20, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n| SORT hire_date\n```\n\n**注意**:目标并不是提供存储桶的确切目标数量,而是选择一个范围,最多提供存储桶的目标数量。\n\n可以组合 `BUCKET` 与聚合以创建直方图:\n\n```\nFROM employees\n| WHERE hire_date >= \"1985-01-01T00:00:00Z\" AND hire_date < \"1986-01-01T00:00:00Z\"\n| STATS hires_per_month = COUNT(*) BY month = BUCKET(hire_date, 20, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n| SORT month\n```\n\n**注意**:`BUCKET` 不会创建未匹配任何文档的存储桶。因此,上一示例缺少 `1985-03-01` 和其他日期。\n\n如果需要更多存储桶,可能导致更小的范围。例如,如果一年内最多请求 100 个存储桶,会导致周期为周的存储桶:\n\n```\nFROM employees\n| WHERE hire_date >= \"1985-01-01T00:00:00Z\" AND hire_date < \"1986-01-01T00:00:00Z\"\n| STATS hires_per_week = COUNT(*) BY week = BUCKET(hire_date, 100, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n| SORT week\n```\n\n**注意**:`AUTO_BUCKET` 不筛选任何行。它只会使用提供的范围来选取适当的存储桶大小。对于值超出范围的行,它会返回与超出范围的存储桶对应的存储桶值。组合 `BUCKET` 与 `WHERE` 可筛选行。\n\n如果提前已知所需存储桶大小,则只需提供它作为第二个参数,而忽略范围:\n\n```\nFROM employees\n| WHERE hire_date >= \"1985-01-01T00:00:00Z\" AND hire_date < \"1986-01-01T00:00:00Z\"\n| STATS hires_per_week = COUNT(*) BY week = BUCKET(hire_date, 1 week)\n| SORT week\n```\n\n**注意**:提供存储桶大小作为第二个参数时,它必须为持续时间或日期期间。\n\n`BUCKET` 还可对数字字段执行操作。例如,要创建工资直方图:\n\n```\nFROM employees\n| STATS COUNT(*) by bs = BUCKET(salary, 20, 25324, 74999)\n| SORT bs\n```\n\n与前面的有意筛选日期范围示例不同,您极少想要筛选数值范围。您必须分别查找最小值和最大值。ES|QL 尚未提供简便方法来自动执行此操作。\n\n如果提前已知所需存储桶大小,则可以忽略该范围。只需提供它作为第二个参数即可:\n\n```\nFROM employees\n| WHERE hire_date >= \"1985-01-01T00:00:00Z\" AND hire_date < \"1986-01-01T00:00:00Z\"\n| STATS c = COUNT(1) BY b = BUCKET(salary, 5000.)\n| SORT b\n```\n\n**注意**:提供存储桶大小作为第二个参数时,它必须为 **浮点类型**。\n\n这里提供了一个示例,用于为过去 24 小时创建小时存储桶,并计算每小时的事件数:\n\n```\nFROM sample_data\n| WHERE @timestamp >= NOW() - 1 day and @timestamp < NOW()\n| STATS COUNT(*) BY bucket = BUCKET(@timestamp, 25, NOW() - 1 day, NOW())\n```\n\n这里提供了一个示例,用于为 1985 年创建月度存储桶,并按聘用月份计算平均工资:\n\n```\nFROM employees\n| WHERE hire_date >= \"1985-01-01T00:00:00Z\" AND hire_date < \"1986-01-01T00:00:00Z\"\n| STATS AVG(salary) BY bucket = BUCKET(hire_date, 20, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n| SORT bucket\n```\n\n`BUCKET` 可用在 `STATS … BY …` 命令的聚合和分组部分, 前提是在聚合部分中,该函数 **由在分组部分中定义的别名引用**,或使用完全相同的表达式调用。\n\n例如:\n\n```\nFROM employees\n| STATS s1 = b1 + 1, s2 = BUCKET(salary / 1000 + 999, 50.) + 2 BY b1 = BUCKET(salary / 100 + 99, 50.), b2 = BUCKET(salary / 1000 + 999, 50.)\n| SORT b1, b2\n| KEEP s1, b1, s2, b2\n```\n ",
|
||||
"languageDocumentation.documentationESQL.binaryOperators": "二进制运算符",
|
||||
"languageDocumentation.documentationESQL.binaryOperators.markdown": "### 二进制运算符\n支持这些二进制比较运算符:\n\n* 等于:`==`\n* 不等于:`!=`\n* 小于:`<`\n* 小于或等于:`<=`\n* 大于:`>`\n* 大于或等于:`>=`\n* 加:`+`\n* 减:`-`\n* 乘:`*`\n* 除:`/`\n* 取模:`%`\n ",
|
||||
"languageDocumentation.documentationESQL.booleanOperators": "布尔运算符",
|
||||
"languageDocumentation.documentationESQL.booleanOperators.markdown": "### 布尔运算符\n支持以下布尔运算符:\n\n* `AND`\n* `OR`\n* `NOT`\n ",
|
||||
"languageDocumentation.documentationESQL.bucket": "BUCKET",
|
||||
"languageDocumentation.documentationESQL.bucket.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### BUCKET\n 用日期时间或数字输入创建值(存储桶)的分组。\n 存储桶的大小可以直接提供,或基于建议的计数和值范围进行选择。\n\n ```\n FROM employees\n | WHERE hire_date >= \"1985-01-01T00:00:00Z\" AND hire_date < \"1986-01-01T00:00:00Z\"\n | STATS hire_date = MV_SORT(VALUES(hire_date)) BY month = BUCKET(hire_date, 20, \"1985-01-01T00:00:00Z\", \"1986-01-01T00:00:00Z\")\n | SORT hire_date\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.case": "CASE",
|
||||
"languageDocumentation.documentationESQL.case.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### CASE\n 接受成对的条件和值。此函数返回属于第一个\n 评估为 `true` 的条件的值。\n\n 如果参数数量为奇数,则最后一个参数为\n 在无条件匹配时返回的默认值。如果参数数量为偶数,且\n 无任何条件匹配,则此函数返回 `null`。\n\n ```\n FROM employees\n | EVAL type = CASE(\n languages <= 1, \"monolingual\",\n languages <= 2, \"bilingual\",\n \"polyglot\")\n | KEEP emp_no, languages, type\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.castOperator": "Cast (::)",
|
||||
"languageDocumentation.documentationESQL.castOperator.markdown": "### CAST (`::`)\n`::` 运算符为 `TO_<type>` 类型转换函数提供了实用的替代语法。\n\n例如:\n```\nROW ver = CONCAT((\"0\"::INT + 1)::STRING, \".2.3\")::VERSION\n```\n ",
|
||||
"languageDocumentation.documentationESQL.cbrt": "CBRT",
|
||||
"languageDocumentation.documentationESQL.cbrt.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### CBRT\n 返回数字的立方根。输入可以为任何数字值,返回值始终为双精度值。\n 无穷大的立方根为 null。\n\n ```\n ROW d = 1000.0\n | EVAL c = cbrt(d)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.ceil": "CEIL",
|
||||
"languageDocumentation.documentationESQL.ceil.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### CEIL\n 将数字四舍五入为最近的整数。\n\n ```\n ROW a=1.8\n | EVAL a=CEIL(a)\n ```\n 注意:对于 `long`(包括无符号值)和 `integer`,这相当于“无操作”。对于 `double`,这会提取最接近整数的 `double` 值,类似于 Math.ceil。\n ",
|
||||
"languageDocumentation.documentationESQL.cidr_match": "CIDR_MATCH",
|
||||
"languageDocumentation.documentationESQL.cidr_match.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### CIDR_MATCH\n 如果提供的 IP 包含在所提供的其中一个 CIDR 块中,则返回 true。\n\n ```\n FROM hosts \n | WHERE CIDR_MATCH(ip1, \"127.0.0.2/32\", \"127.0.0.3/32\") \n | KEEP card, host, ip0, ip1\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.coalesce": "COALESCE",
|
||||
"languageDocumentation.documentationESQL.coalesce.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### COALESCE\n 返回它的第一个不为 null 的参数。如果所有参数均为 null,则返回 `null`。\n\n ```\n ROW a=null, b=\"b\"\n | EVAL COALESCE(a, b)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.concat": "CONCAT",
|
||||
"languageDocumentation.documentationESQL.concat.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### CONCAT\n 串联两个或多个字符串。\n\n ```\n FROM employees\n | KEEP first_name, last_name\n | EVAL fullname = CONCAT(first_name, \" \", last_name)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.cos": "COS",
|
||||
"languageDocumentation.documentationESQL.cos.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### COS\n 返回角度的余弦。\n\n ```\n ROW a=1.8 \n | EVAL cos=COS(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.cosh": "COSH",
|
||||
"languageDocumentation.documentationESQL.cosh.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### COSH\n 返回角度的双曲余弦。\n\n ```\n ROW a=1.8 \n | EVAL cosh=COSH(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.date_diff": "DATE_DIFF",
|
||||
"languageDocumentation.documentationESQL.date_diff.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### DATE_DIFF\n 从 `endTimestamp` 中减去 `startTimestamp`,并以倍数 `unit` 返回差异。\n 如果 `startTimestamp` 晚于 `endTimestamp`,则返回负值。\n\n ```\n ROW 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 ",
|
||||
"languageDocumentation.documentationESQL.date_extract": "DATE_EXTRACT",
|
||||
"languageDocumentation.documentationESQL.date_extract.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### DATE_EXTRACT\n 提取日期的某些部分,如年、月、日、小时。\n\n ```\n ROW date = DATE_PARSE(\"yyyy-MM-dd\", \"2022-05-06\")\n | EVAL year = DATE_EXTRACT(\"year\", date)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.date_format": "DATE_FORMAT",
|
||||
"languageDocumentation.documentationESQL.date_format.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### DATE_FORMAT\n 以提供的格式返回日期的字符串表示形式。\n\n ```\n FROM employees\n | KEEP first_name, last_name, hire_date\n | EVAL hired = DATE_FORMAT(\"YYYY-MM-dd\", hire_date)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.date_parse": "DATE_PARSE",
|
||||
"languageDocumentation.documentationESQL.date_parse.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### DATE_PARSE\n 通过使用在第一个参数中指定的格式来解析第二个参数,从而返回日期。\n\n ```\n ROW date_string = \"2022-05-06\"\n | EVAL date = DATE_PARSE(\"yyyy-MM-dd\", date_string)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.date_trunc": "DATE_TRUNC",
|
||||
"languageDocumentation.documentationESQL.date_trunc.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### DATE_TRUNC\n 将日期向下舍入到最近的时间间隔。\n\n ```\n FROM employees\n | KEEP first_name, last_name, hire_date\n | EVAL year_hired = DATE_TRUNC(1 year, hire_date)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.dissect": "DISSECT",
|
||||
"languageDocumentation.documentationESQL.dissect.markdown": "### DISSECT\n使用 `DISSECT`,您可以从字符串中提取结构化数据。`DISSECT` 将根据基于分隔符的模式来匹配字符串,并提取指定键作为列。\n\n请参阅[分解处理器文档](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``` ",
|
||||
"languageDocumentation.documentationESQL.drop": "DROP",
|
||||
"languageDocumentation.documentationESQL.drop.markdown": "### DROP\n使用 `DROP` 可从表中移除列:\n \n```\nFROM employees\n| DROP height\n```\n\n您不必按名称指定每个列,而可以使用通配符丢弃名称匹配某种模式的所有列:\n\n```\nFROM employees\n| DROP height*\n```\n ",
|
||||
"languageDocumentation.documentationESQL.e": "E",
|
||||
"languageDocumentation.documentationESQL.e.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### E\n 返回 Euler 函数的编号。\n\n ```\n ROW E()\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.ends_with": "ENDS_WITH",
|
||||
"languageDocumentation.documentationESQL.ends_with.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ENDS_WITH\n 返回布尔值,指示关键字字符串是否以另一个字符串结尾。\n\n ```\n FROM employees\n | KEEP last_name\n | EVAL ln_E = ENDS_WITH(last_name, \"d\")\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.enrich": "ENRICH",
|
||||
"languageDocumentation.documentationESQL.enrich.markdown": "### ENRICH\n您可以使用 `ENRICH` 将来自现有索引的数据添加到传入记录中。它类似于[采集扩充](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-enriching-data.html),但作用于查询时间。\n\n```\nROW language_code = \"1\"\n| ENRICH languages_policy\n```\n\n执行 `ENRICH` 需要[扩充策略](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-enriching-data.html#enrich-policy)。扩充策略定义一个匹配字段(键字段)和一组扩充字段。\n\n`ENRICH` 将根据匹配字段值在[扩充索引](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-enriching-data.html#enrich-index)中查找记录。输入数据集中的匹配键可以使用 `ON <field-name>` 来定义;如果未指定,将对字段名称与在扩充策略中定义的匹配字段相同的字段执行匹配。\n\n```\nROW a = \"1\"\n| ENRICH languages_policy ON a\n```\n\n您可以使用 `WITH <field1>, <field2>...` 语法指定必须将哪些属性(在那些在策略中定义为扩充字段的字段之间)添加到结果中。\n\n```\nROW a = \"1\"\n| ENRICH languages_policy ON a WITH language_name\n```\n\n还可以使用 `WITH new_name=<field1>` 重命名属性\n\n```\nROW a = \"1\"\n| ENRICH languages_policy ON a WITH name = language_name\n```\n\n默认情况下(如果未定义任何 `WITH`),`ENRICH` 会将在扩充策略中定义的所有扩充字段添加到结果中。\n\n如果出现名称冲突,新创建的字段将覆盖现有字段。\n ",
|
||||
"languageDocumentation.documentationESQL.eval": "EVAL",
|
||||
"languageDocumentation.documentationESQL.eval.markdown": "### EVAL\n`EVAL` 允许您添加新列:\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL height_feet = height * 3.281, height_cm = height * 100\n```\n\n如果指定列已存在,将丢弃现有列,并将新列追加到表后面:\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| EVAL height = height * 3.281\n```\n\n#### 函数\n`EVAL` 支持各种用于计算值的函数。请参阅“函数”了解更多信息。\n ",
|
||||
"languageDocumentation.documentationESQL.floor": "FLOOR",
|
||||
"languageDocumentation.documentationESQL.floor.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### FLOOR\n 将数字向下舍入到最近的整数。\n\n ```\n ROW a=1.8\n | EVAL a=FLOOR(a)\n ```\n 注意:对于 `long`(包括无符号值)和 `integer`,这相当于“无操作”。\n 对于 `double`,这会提取最接近整数的 `double` 值,\n 类似于 Math.floor。\n ",
|
||||
"languageDocumentation.documentationESQL.from": "FROM",
|
||||
"languageDocumentation.documentationESQL.from_base64": "FROM_BASE64",
|
||||
"languageDocumentation.documentationESQL.from_base64.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### FROM_BASE64\n 解码 base64 字符串。\n\n ```\n row a = \"ZWxhc3RpYw==\" \n | eval d = from_base64(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.from.markdown": "### FROM\n`FROM` 源命令返回一个表,其中最多包含 10,000 个来自数据流、索引或别名的文档。生成的表中的每一行代表一个文档。每一列对应一个字段,并可以通过该字段的名称进行访问。\n\n```\nFROM employees\n```\n\n您可以使用[日期数学表达式](https://www.elastic.co/guide/en/elasticsearch/reference/current/api-conventions.html#api-date-math-index-names)来引用索引、别名和数据流。这可能对时间序列数据非常有用。\n\n使用逗号分隔列表或通配符可查询多个数据流、索引或别名:\n\n```\nFROM employees-00001,employees-*\n```\n\n#### 元数据\n\nES|QL 可访问以下元数据字段:\n\n* `_index`:文档所属的索引。字段类型为 `keyword`.\n* `_id`:源文档的 ID。字段类型为 `keyword`.\n* `_version`:源文档的版本。字段类型为 `long`。\n\n使用 `METADATA` 指令可启用元数据字段:\n\n```\nFROM index [METADATA _index, _id]\n```\n\n元数据字段仅在数据源为索引时可用。因此,`FROM` 是唯一支持 `METADATA` 指令的源命令。\n\n启用后,这些字段将可用于后续处理命令,就像其他索引字段一样:\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\n此外,与索引字段类似,一旦执行了聚合,后续命令将无法再访问元数据字段,除非它用作分组字段:\n\n```\nFROM employees [METADATA _index, _id]\n| STATS max = MAX(emp_no) BY _index\n```\n ",
|
||||
"languageDocumentation.documentationESQL.greatest": "GREATEST",
|
||||
"languageDocumentation.documentationESQL.greatest.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### GREATEST\n 返回多个列中的最大值。除了可一次对多个列运行以外,\n 此函数与 `MV_MAX` 类似。\n\n ```\n ROW a = 10, b = 20\n | EVAL g = GREATEST(a, b)\n ```\n 注意:对 `keyword` 或 `text` 字段运行时,此函数将按字母顺序返回最后一个字符串。对 `boolean` 列运行时,如果任何值为 `true`,此函数将返回 `true`。\n ",
|
||||
"languageDocumentation.documentationESQL.grok": "GROK",
|
||||
"languageDocumentation.documentationESQL.grok.markdown": "### GROK\n使用 `GROK`,您可以从字符串中提取结构化数据。`GROK` 将基于正则表达式根据模式来匹配字符串,并提取指定模式作为列。\n\n请参阅 [grok 处理器文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/grok-processor.html)了解 grok 模式的语法。\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 ",
|
||||
"languageDocumentation.documentationESQL.inOperator": "IN",
|
||||
"languageDocumentation.documentationESQL.inOperator.markdown": "### IN\n`IN` 运算符允许测试字段或表达式是否等于文本、字段或表达式列表中的元素:\n\n```\nROW a = 1, b = 4, c = 3\n| WHERE c-a IN (3, b / 2, a)\n```\n ",
|
||||
"languageDocumentation.documentationESQL.ip_prefix": "IP_PREFIX",
|
||||
"languageDocumentation.documentationESQL.ip_prefix.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### IP_PREFIX\n 截短 IP 至给定的前缀长度。\n\n ```\n row ip4 = to_ip(\"1.2.3.4\"), ip6 = to_ip(\"fe80::cae2:65ff:fece:feb9\")\n | eval ip4_prefix = ip_prefix(ip4, 24, 0), ip6_prefix = ip_prefix(ip6, 0, 112);\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.keep": "KEEP",
|
||||
"languageDocumentation.documentationESQL.keep.markdown": "### KEEP\n使用 `KEEP` 命令,您可以指定将返回哪些列以及返回这些列的顺序。\n\n要限制返回的列数,请使用列名的逗号分隔列表。将按指定顺序返回这些列:\n \n```\nFROM employees\n| KEEP first_name, last_name, height\n```\n\n您不必按名称指定每个列,而可以使用通配符返回名称匹配某种模式的所有列:\n\n```\nFROM employees\n| KEEP h*\n```\n\n星号通配符 (`*`) 自身将转换为不与其他参数匹配的所有列。此查询将首先返回所有名称以 h 开头的所有列,随后返回所有其他列:\n\n```\nFROM employees\n| KEEP h*, *\n```\n ",
|
||||
"languageDocumentation.documentationESQL.least": "LEAST",
|
||||
"languageDocumentation.documentationESQL.least.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### LEAST\n 返回多个列中的最小值。除了可一次对多个列运行以外,此函数与 `MV_MIN` 类似。\n\n ```\n ROW a = 10, b = 20\n | EVAL l = LEAST(a, b)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.left": "LEFT",
|
||||
"languageDocumentation.documentationESQL.left.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### LEFT\n 返回从“字符串”中提取“长度”字符的子字符串,从左侧开始。\n\n ```\n FROM employees\n | KEEP last_name\n | EVAL left = LEFT(last_name, 3)\n | SORT last_name ASC\n | LIMIT 5\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.length": "LENGTH",
|
||||
"languageDocumentation.documentationESQL.length.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### LENGTH\n 返回字符串的字符长度。\n\n ```\n FROM employees\n | KEEP first_name, last_name\n | EVAL fn_length = LENGTH(first_name)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.limit": "LIMIT",
|
||||
"languageDocumentation.documentationESQL.limit.markdown": "### LIMIT\n`LIMIT` 处理命令允许您限制行数:\n \n```\nFROM employees\n| LIMIT 5\n```\n ",
|
||||
"languageDocumentation.documentationESQL.locate": "LOCATE",
|
||||
"languageDocumentation.documentationESQL.locate.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### LOCATE\n 返回一个整数,指示关键字子字符串在另一字符串中的位置\n\n ```\n row a = \"hello\"\n | eval a_ll = locate(a, \"ll\")\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.log": "LOG",
|
||||
"languageDocumentation.documentationESQL.log.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### LOG\n 以某底数返回值的对数。输入可以为任何数字值,返回值始终为双精度值。\n\n 求零、负数的对数,以及底数为一时将返回 `null`,并显示警告。\n\n ```\n ROW base = 2.0, value = 8.0\n | EVAL s = LOG(base, value)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.log10": "LOG10",
|
||||
"languageDocumentation.documentationESQL.log10.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### LOG10\n 以底数 10 返回值的对数。输入可以为任何数字值,返回值始终为双精度值。\n\n 求 0 和负数的对数时将返回 `null`,并显示警告。\n\n ```\n ROW d = 1000.0 \n | EVAL s = LOG10(d)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.ltrim": "LTRIM",
|
||||
"languageDocumentation.documentationESQL.ltrim.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### LTRIM\n 从字符串中移除前导空格。\n\n ```\n ROW 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 ",
|
||||
"languageDocumentation.documentationESQL.markdown": "## ES|QL\n\nES|QL(Elasticsearch 查询语言)查询包含一系列命令,它们用管道字符分隔:`|`。每个查询以**源命令**开头,它会生成一个表,其中通常包含来自 Elasticsearch 的数据。\n\n源命令可后接一个或多个**处理命令**。处理命令可通过添加、移除以及更改行和列来更改前一个命令的输出表。\n\n```\nsource-command\n| processing-command1\n| processing-command2\n```\n\n查询的结果为由最后的处理命令生成的表。 \n ",
|
||||
"languageDocumentation.documentationESQL.mv_append": "MV_APPEND",
|
||||
"languageDocumentation.documentationESQL.mv_append.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_APPEND\n 串联两个多值字段的值。\n\n ",
|
||||
"languageDocumentation.documentationESQL.mv_avg": "MV_AVG",
|
||||
"languageDocumentation.documentationESQL.mv_avg.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_AVG\n 将多值字段转换为包含所有值的平均值的单值字段。\n\n ```\n ROW a=[3, 5, 1, 6]\n | EVAL avg_a = MV_AVG(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_concat": "MV_CONCAT",
|
||||
"languageDocumentation.documentationESQL.mv_concat.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_CONCAT\n 将多值字符串表达式转换为单值列,其中包含由分隔符分隔的所有值的串联形式。\n\n ```\n ROW a=[\"foo\", \"zoo\", \"bar\"]\n | EVAL j = MV_CONCAT(a, \", \")\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_count": "MV_COUNT",
|
||||
"languageDocumentation.documentationESQL.mv_count.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_COUNT\n 将多值表达式转换为包含值计数的单值列。\n\n ```\n ROW a=[\"foo\", \"zoo\", \"bar\"]\n | EVAL count_a = MV_COUNT(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_dedupe": "MV_DEDUPE",
|
||||
"languageDocumentation.documentationESQL.mv_dedupe.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_DEDUPE\n 移除多值字段中的重复值。\n\n ```\n ROW a=[\"foo\", \"foo\", \"bar\", \"foo\"]\n | EVAL dedupe_a = MV_DEDUPE(a)\n ```\n 注意:`MV_DEDUPE` 可能但不会始终对列中的值进行排序。\n ",
|
||||
"languageDocumentation.documentationESQL.mv_first": "MV_FIRST",
|
||||
"languageDocumentation.documentationESQL.mv_first.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_FIRST\n 将多值表达式转换为包含第一个值的\n 单值列。这在从按已知顺序发出多值列的\n 函数(如 `SPLIT`)中读取数据时尤其有用。\n\n 无法保证从底层存储\n 读取多值字段的顺序。它 *通常* 为升序,但不应\n 依赖于此。如果需要最小值,请使用 `MV_MIN` 而不是\n `MV_FIRST`。`MV_MIN` 针对排序值进行了优化,因此\n 对 `MV_FIRST` 没有性能优势。\n\n ```\n ROW a=\"foo;bar;baz\"\n | EVAL first_a = MV_FIRST(SPLIT(a, \";\"))\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_last": "MV_LAST",
|
||||
"languageDocumentation.documentationESQL.mv_last.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_LAST\n 将多值表达式转换为包含最后一个值的单值\n 列。这在从按已知顺序发出多值列的函数\n (如 `SPLIT`)中读取数据时尤其有用。\n\n 无法保证从底层存储\n 读取多值字段的顺序。它 *通常* 为升序,但不应\n 依赖于此。如果需要最大值,请使用 `MV_MAX` 而不是\n `MV_LAST`。`MV_MAX` 针对排序值进行了优化,因此\n 对 `MV_LAST` 没有性能优势。\n\n ```\n ROW a=\"foo;bar;baz\"\n | EVAL last_a = MV_LAST(SPLIT(a, \";\"))\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_max": "MV_MAX",
|
||||
"languageDocumentation.documentationESQL.mv_max.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_MAX\n 将多值表达式转换为包含最大值的单值列。\n\n ```\n ROW a=[3, 5, 1]\n | EVAL max_a = MV_MAX(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_median": "MV_MEDIAN",
|
||||
"languageDocumentation.documentationESQL.mv_median.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_MEDIAN\n 将多值字段转换为包含中位数值的单值字段。\n\n ```\n ROW a=[3, 5, 1]\n | EVAL median_a = MV_MEDIAN(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_min": "MV_MIN",
|
||||
"languageDocumentation.documentationESQL.mv_min.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_MIN\n 将多值表达式转换为包含最小值的单值列。\n\n ```\n ROW a=[2, 1]\n | EVAL min_a = MV_MIN(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_slice": "MV_SLICE",
|
||||
"languageDocumentation.documentationESQL.mv_slice.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_SLICE\n 使用起始和结束索引值返回多值字段的子集。\n\n ```\n row a = [1, 2, 2, 3]\n | eval a1 = mv_slice(a, 1), a2 = mv_slice(a, 2, 3)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_sort": "MV_SORT",
|
||||
"languageDocumentation.documentationESQL.mv_sort.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_SORT\n 按字典顺序对多值字段排序。\n\n ```\n ROW a = [4, 2, -3, 2]\n | EVAL sa = mv_sort(a), sd = mv_sort(a, \"DESC\")\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_sum": "MV_SUM",
|
||||
"languageDocumentation.documentationESQL.mv_sum.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_SUM\n 将多值字段转换为包含所有值的总和的单值字段。\n\n ```\n ROW a=[3, 5, 6]\n | EVAL sum_a = MV_SUM(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mv_zip": "MV_ZIP",
|
||||
"languageDocumentation.documentationESQL.mv_zip.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### MV_ZIP\n 组合两个使用分隔符联接在一起的多值字段中的值。\n\n ```\n ROW a = [\"x\", \"y\", \"z\"], b = [\"1\", \"2\"]\n | EVAL c = mv_zip(a, b, \"-\")\n | KEEP a, b, c\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.mvExpand": "MV_EXPAND",
|
||||
"languageDocumentation.documentationESQL.mvExpand.markdown": "### MV_EXPAND\n`MV_EXPAND` 处理命令将多值字段扩展成每个值一行,从而复制其他字段: \n```\nROW a=[1,2,3], b=\"b\", j=[\"a\",\"b\"]\n| MV_EXPAND a\n```\n ",
|
||||
"languageDocumentation.documentationESQL.now": "NOW",
|
||||
"languageDocumentation.documentationESQL.now.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### NOW\n 返回当前日期和时间。\n\n ```\n ROW current_date = NOW()\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.pi": "PI",
|
||||
"languageDocumentation.documentationESQL.pi.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### PI\n 返回 Pi,即圆的周长与其直径的比率。\n\n ```\n ROW PI()\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.pow": "POW",
|
||||
"languageDocumentation.documentationESQL.pow.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### POW\n 返回提升为 `exponent` 幂的 `base` 的值。\n\n ```\n ROW base = 2.0, exponent = 2\n | EVAL result = POW(base, exponent)\n ```\n 注意:此处仍可能使双精度结果溢出;在该情况下,将返回 null。\n ",
|
||||
"languageDocumentation.documentationESQL.predicates": "Null 值",
|
||||
"languageDocumentation.documentationESQL.predicates.markdown": "### NULL 值\n对于 NULL 比较,请使用 `IS NULL` 和 `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 ",
|
||||
"languageDocumentation.documentationESQL.rename": "RENAME",
|
||||
"languageDocumentation.documentationESQL.rename.markdown": "### RENAME\n请使用 `RENAME` 通过以下语法对列重命名:\n\n```\nRENAME <old-name> AS <new-name>\n```\n\n例如:\n\n```\nFROM employees\n| KEEP first_name, last_name, still_hired\n| RENAME still_hired AS employed\n```\n\n如果使用新名称的列已存在,将用新列替换该列。\n\n可以使用单个 `RENAME` 命令对多个列重命名:\n\n```\nFROM employees\n| KEEP first_name, last_name\n| RENAME first_name AS fn, last_name AS ln\n```\n ",
|
||||
"languageDocumentation.documentationESQL.repeat": "REPEAT",
|
||||
"languageDocumentation.documentationESQL.repeat.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### REPEAT\n 返回通过串联 `string` 自身与指定次数 `number` 构造而成的字符串。\n\n ```\n ROW a = \"Hello!\"\n | EVAL triple_a = REPEAT(a, 3);\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.replace": "REPLACE",
|
||||
"languageDocumentation.documentationESQL.replace.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### REPLACE\n 此函数将字符串 `str` 中正则表达式 `regex` 的任何匹配项\n 替换为替代字符串 `newStr`。\n\n ```\n ROW str = \"Hello World\"\n | EVAL str = REPLACE(str, \"World\", \"Universe\")\n | KEEP str\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.right": "RIGHT",
|
||||
"languageDocumentation.documentationESQL.right.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### RIGHT\n 返回从“字符串”中提取“长度”字符的子字符串,从右侧开始。\n\n ```\n FROM employees\n | KEEP last_name\n | EVAL right = RIGHT(last_name, 3)\n | SORT last_name ASC\n | LIMIT 5\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.round": "ROUND",
|
||||
"languageDocumentation.documentationESQL.round.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ROUND\n 将数字舍入到指定小数位数。\n 默认值为 0,即返回最近的整数。如果\n 精确度为负数,则将数字舍入到\n 小数点左侧的位数。\n\n ```\n FROM employees\n | KEEP first_name, last_name, height\n | EVAL height_ft = ROUND(height * 3.281, 1)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.row": "ROW",
|
||||
"languageDocumentation.documentationESQL.row.markdown": "### ROW\n`ROW` 源命令会生成一个行,其中包含一个或多个含有您指定的值的列。这可以用于测试。\n \n```\nROW a = 1, b = \"two\", c = null\n```\n\n请使用方括号创建多值列:\n\n```\nROW a = [2, 1]\n```\n\nROW 支持使用函数:\n\n```\nROW a = ROUND(1.23, 0)\n```\n ",
|
||||
"languageDocumentation.documentationESQL.rtrim": "RTRIM",
|
||||
"languageDocumentation.documentationESQL.rtrim.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### RTRIM\n 从字符串中移除尾随空格。\n\n ```\n ROW 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 ",
|
||||
"languageDocumentation.documentationESQL.show": "SHOW",
|
||||
"languageDocumentation.documentationESQL.show.markdown": "### SHOW\n`SHOW <item>` 源命令返回有关部署及其功能的信息:\n\n* 使用 `SHOW INFO` 可返回部署的版本、构建日期和哈希。\n* 使用 `SHOW FUNCTIONS` 可返回所有受支持函数的列表和每个函数的概要。\n ",
|
||||
"languageDocumentation.documentationESQL.signum": "SIGNUM",
|
||||
"languageDocumentation.documentationESQL.signum.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### SIGNUM\n 返回给定数字的符号。\n 它对负数返回 `-1`,对 `0` 返回 `0`,对正数返回 `1`。\n\n ```\n ROW d = 100.0\n | EVAL s = SIGNUM(d)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.sin": "SIN",
|
||||
"languageDocumentation.documentationESQL.sin.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### SIN\n 返回角度的正弦三角函数。\n\n ```\n ROW a=1.8 \n | EVAL sin=SIN(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.sinh": "SINH",
|
||||
"languageDocumentation.documentationESQL.sinh.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### SINH\n 返回角度的双曲正弦。\n\n ```\n ROW a=1.8 \n | EVAL sinh=SINH(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.sort": "SORT",
|
||||
"languageDocumentation.documentationESQL.sort.markdown": "### SORT\n使用 `SORT` 命令可对一个或多个字段上的行排序:\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height\n```\n\n默认排序顺序为升序。请使用 `ASC` 或 `DESC` 设置显式排序顺序:\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height DESC\n```\n\n如果两个行具有相同的排序键,则保留原始顺序。您可以提供其他排序表达式充当连接断路器:\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height DESC, first_name ASC\n```\n\n#### `null` 值\n默认情况下,会将 `null` 值视为大于任何其他值。使用升序排序顺序时,会最后对 `null` 值排序,而使用降序排序顺序时,会首先对 `null` 值排序。您可以通过提供 `NULLS FIRST` 或 `NULLS LAST` 来更改该排序:\n\n```\nFROM employees\n| KEEP first_name, last_name, height\n| SORT first_name ASC NULLS FIRST\n```\n ",
|
||||
"languageDocumentation.documentationESQL.split": "SPLIT",
|
||||
"languageDocumentation.documentationESQL.split.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### SPLIT\n 将单值字符串拆分成多个字符串。\n\n ```\n ROW words=\"foo;bar;baz;qux;quux;corge\"\n | EVAL word = SPLIT(words, \";\")\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.sqrt": "SQRT",
|
||||
"languageDocumentation.documentationESQL.sqrt.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### SQRT\n 返回数字的平方根。输入可以为任何数字值,返回值始终为双精度值。\n 负数和无穷大的平方根为 null。\n\n ```\n ROW d = 100.0\n | EVAL s = SQRT(d)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.st_contains": "ST_CONTAINS",
|
||||
"languageDocumentation.documentationESQL.st_contains.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ST_CONTAINS\n 返回第一个几何形状是否包含第二个几何形状。\n 这是 `ST_WITHIN` 函数的反向函数。\n\n ```\n FROM airport_city_boundaries\n | WHERE ST_CONTAINS(city_boundary, TO_GEOSHAPE(\"POLYGON((109.35 18.3, 109.45 18.3, 109.45 18.4, 109.35 18.4, 109.35 18.3))\"))\n | KEEP abbrev, airport, region, city, city_location\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.st_disjoint": "ST_DISJOINT",
|
||||
"languageDocumentation.documentationESQL.st_disjoint.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ST_DISJOINT\n 返回两个几何图形或几何图形列是否不相交。\n 这是 `ST_INTERSECTS` 函数的反向函数。\n 从数学上讲:ST_Disjoint(A, B) ⇔ A ⋂ B = ∅\n\n ```\n FROM airport_city_boundaries\n | WHERE ST_DISJOINT(city_boundary, TO_GEOSHAPE(\"POLYGON((-10 -60, 120 -60, 120 60, -10 60, -10 -60))\"))\n | KEEP abbrev, airport, region, city, city_location\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.st_distance": "ST_DISTANCE",
|
||||
"languageDocumentation.documentationESQL.st_distance.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ST_DISTANCE\n 计算两点之间的距离。\n 对于笛卡尔几何形状,这是以相同单位作为原始坐标时的毕达哥拉斯距离。\n 对于地理几何形状而言,这是沿着地球大圆的圆周距离(以米为单位)。\n\n ```\n FROM airports\n | WHERE abbrev == \"CPH\"\n | EVAL distance = ST_DISTANCE(location, city_location)\n | KEEP abbrev, name, location, city_location, distance\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.st_intersects": "ST_INTERSECTS",
|
||||
"languageDocumentation.documentationESQL.st_intersects.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ST_INTERSECTS\n 如果两个几何形状相交,则返回 true。\n 如果它们有任何共同点,包括其内点\n (沿线的点或多边形内的点),则表示它们相交。\n 这是 `ST_DISJOINT` 函数的反向函数。\n 从数学上讲:ST_Intersects(A, B) ⇔ A ⋂ B ≠ ∅\n\n ```\n FROM airports\n | WHERE ST_INTERSECTS(location, TO_GEOSHAPE(\"POLYGON((42 14, 43 14, 43 15, 42 15, 42 14))\"))\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.st_within": "ST_WITHIN",
|
||||
"languageDocumentation.documentationESQL.st_within.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ST_WITHIN\n 返回第一个几何形状是否在第二个几何形状内。\n 这是 `ST_CONTAINS` 函数的反向函数。\n\n ```\n FROM airport_city_boundaries\n | WHERE ST_WITHIN(city_boundary, TO_GEOSHAPE(\"POLYGON((109.1 18.15, 109.6 18.15, 109.6 18.65, 109.1 18.65, 109.1 18.15))\"))\n | KEEP abbrev, airport, region, city, city_location\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.st_x": "ST_X",
|
||||
"languageDocumentation.documentationESQL.st_x.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ST_X\n 从提供的点中提取 `x` 坐标。\n 如果点的类型为 `geo_point`,则这等同于提取 `longitude` 值。\n\n ```\n ROW point = TO_GEOPOINT(\"POINT(42.97109629958868 14.7552534006536)\")\n | EVAL x = ST_X(point), y = ST_Y(point)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.st_y": "ST_Y",
|
||||
"languageDocumentation.documentationESQL.st_y.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### ST_Y\n 从提供的点中提取 `y` 坐标。\n 如果点的类型为 `geo_point`,则这等同于提取 `latitude` 值。\n\n ```\n ROW point = TO_GEOPOINT(\"POINT(42.97109629958868 14.7552534006536)\")\n | EVAL x = ST_X(point), y = ST_Y(point)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.starts_with": "STARTS_WITH",
|
||||
"languageDocumentation.documentationESQL.starts_with.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### STARTS_WITH\n 返回指示关键字字符串是否以另一个字符串开头的布尔值。\n\n ```\n FROM employees\n | KEEP last_name\n | EVAL ln_S = STARTS_WITH(last_name, \"B\")\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.statsby": "STATS ...BY",
|
||||
"languageDocumentation.documentationESQL.statsby.markdown": "### STATS ...BY\n使用 `STATS ...BY` 可根据公共值对行分组,并计算已分组行中的一个或多个聚合值。\n\n**示例**:\n\n```\nFROM employees\n| STATS count = COUNT(emp_no) BY languages\n| SORT languages\n```\n\n如果省略 `BY`,输出表实际将包含一行,其中为应用于整个数据集的聚合:\n\n```\nFROM employees\n| STATS avg_lang = AVG(languages)\n```\n\n可以计算多个值:\n\n```\nFROM employees\n| STATS avg_lang = AVG(languages), max_lang = MAX(languages)\n```\n\n也可以按多个值分组(仅长整型和关键字家族字段支持):\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\n请参阅**聚合函数**获取可与 `STATS ...BY` 搭配使用的函数列表。\n\n聚合函数和分组表达式均接受其他函数。这在对多值列使用 `STATS...BY` 时有用。例如,要计算平均工资变动,可以首先使用 `MV_AVG` 对每名员工的多个值求平均值,然后将结果用于 `AVG` 函数:\n\n```\nFROM employees\n| STATS avg_salary_change = AVG(MV_AVG(salary_change))\n```\n\n按表达式分组的示例为根据员工姓氏的第一个字母对其进行分组:\n\n```\nFROM employees\n| STATS my_count = COUNT() BY LEFT(last_name, 1)\n| SORT `LEFT(last_name, 1)`\n```\n\n指定输出列名称为可选操作。如果未指定,新列名称等于该表达式。以下查询将返回名为 `AVG(salary)` 的列:\n\n```\nFROM employees\n| STATS AVG(salary)\n```\n\n由于此名称包含特殊字符,在后续命令中使用该名称时,需要用反撇号 (`) 引用它:\n\n```\nFROM employees\n| STATS AVG(salary)\n| EVAL avg_salary_rounded = ROUND(`AVG(salary)`)\n```\n\n**注意**:不包含任何组的 `STATS` 比添加组更快。\n\n**注意**:当前,根据单一表达式进行分组比根据许多表达式进行分组更为优化。\n ",
|
||||
"languageDocumentation.documentationESQL.stringOperators": "LIKE 和 RLIKE",
|
||||
"languageDocumentation.documentationESQL.stringOperators.markdown": "### LIKE 和 RLIKE\n使用通配符或正则表达式比较字符串时,请使用 `LIKE` 或 `RLIKE`:\n\n使用 `LIKE` 时,可使用通配符来匹配字符串。支持以下通配符字符:\n\n* `*` 匹配零个或更多字符。\n* `?` 匹配一个字符。\n\n```\nFROM employees\n| WHERE first_name LIKE \"?b*\"\n| KEEP first_name, last_name\n```\n\n使用 `RLIKE` 时,可使用正则表达式来匹配字符串:\n\n```\nFROM employees\n| WHERE first_name RLIKE \".leja.*\"\n| KEEP first_name, last_name\n```\n ",
|
||||
"languageDocumentation.documentationESQL.substring": "SUBSTRING",
|
||||
"languageDocumentation.documentationESQL.substring.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### SUBSTRING\n 返回字符串的子字符串,用起始位置和可选长度指定\n\n ```\n FROM employees\n | KEEP last_name\n | EVAL ln_sub = SUBSTRING(last_name, 1, 3)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.tan": "TAN",
|
||||
"languageDocumentation.documentationESQL.tan.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TAN\n 返回角度的正切三角函数。\n\n ```\n ROW a=1.8 \n | EVAL tan=TAN(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.tanh": "TANH",
|
||||
"languageDocumentation.documentationESQL.tanh.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TANH\n 返回角度的双曲正切函数。\n\n ```\n ROW a=1.8 \n | EVAL tanh=TANH(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.tau": "TAU",
|
||||
"languageDocumentation.documentationESQL.tau.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TAU\n 返回圆的圆周长与其半径的比率。\n\n ```\n ROW TAU()\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_base64": "TO_BASE64",
|
||||
"languageDocumentation.documentationESQL.to_base64.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_BASE64\n 将字符串编码为 base64 字符串。\n\n ```\n row a = \"elastic\" \n | eval e = to_base64(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_boolean": "TO_BOOLEAN",
|
||||
"languageDocumentation.documentationESQL.to_boolean.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_BOOLEAN\n 将输入值转换为布尔值。\n 字符串值 *true* 将不区分大小写并被转换为布尔值 *true*。\n 对于任何其他值,包括空字符串,此函数将返回 *false*。\n 数字值 *0* 将转换为 *false*,任何其他值将转换为 *true*。\n\n ```\n ROW str = [\"true\", \"TRuE\", \"false\", \"\", \"yes\", \"1\"]\n | EVAL bool = TO_BOOLEAN(str)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_cartesianpoint": "TO_CARTESIANPOINT",
|
||||
"languageDocumentation.documentationESQL.to_cartesianpoint.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_CARTESIANPOINT\n 将输入值转换为 `cartesian_point` 值。\n 字符串只有符合 WKT 点格式时,才能成功转换。\n\n ```\n ROW wkt = [\"POINT(4297.11 -1475.53)\", \"POINT(7580.93 2272.77)\"]\n | MV_EXPAND wkt\n | EVAL pt = TO_CARTESIANPOINT(wkt)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_cartesianshape": "TO_CARTESIANSHAPE",
|
||||
"languageDocumentation.documentationESQL.to_cartesianshape.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_CARTESIANSHAPE\n 将输入值转换为 `cartesian_shape` 值。\n 字符串只有符合 WKT 格式时,才能成功转换。\n\n ```\n ROW 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 ",
|
||||
"languageDocumentation.documentationESQL.to_datetime": "TO_DATETIME",
|
||||
"languageDocumentation.documentationESQL.to_datetime.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_DATETIME\n 将输入值转换为日期值。\n 仅当字符串采用 `yyyy-MM-dd'T'HH:mm:ss.SSS'Z'` 格式时,才可进行成功转换。\n 要转换其他格式的日期,请使用 `DATE_PARSE`。\n\n ```\n ROW 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 ",
|
||||
"languageDocumentation.documentationESQL.to_degrees": "TO_DEGREES",
|
||||
"languageDocumentation.documentationESQL.to_degrees.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_DEGREES\n 将弧度转换为度数。\n\n ```\n ROW rad = [1.57, 3.14, 4.71]\n | EVAL deg = TO_DEGREES(rad)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_double": "TO_DOUBLE",
|
||||
"languageDocumentation.documentationESQL.to_double.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_DOUBLE\n 将输入值转换为双精度值。如果输入参数为日期类型,\n 会将其值解析为自 Unix epoch 以来的毫秒数,\n 并转换为双精度值。布尔值 *true* 将转换为双精度值 *1.0*,*false* 转换为 *0.0*。\n\n ```\n ROW str1 = \"5.20128E11\", str2 = \"foo\"\n | EVAL dbl = TO_DOUBLE(\"520128000000\"), dbl1 = TO_DOUBLE(str1), dbl2 = TO_DOUBLE(str2)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_geopoint": "TO_GEOPOINT",
|
||||
"languageDocumentation.documentationESQL.to_geopoint.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_GEOPOINT\n 将输入值转换为 `geo_point` 值。\n 字符串只有符合 WKT 点格式时,才能成功转换。\n\n ```\n ROW wkt = \"POINT(42.97109630194 14.7552534413725)\"\n | EVAL pt = TO_GEOPOINT(wkt)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_geoshape": "TO_GEOSHAPE",
|
||||
"languageDocumentation.documentationESQL.to_geoshape.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_GEOSHAPE\n 将输入值转换为 `geo_shape` 值。\n 字符串只有符合 WKT 格式时,才能成功转换。\n\n ```\n ROW wkt = \"POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))\"\n | EVAL geom = TO_GEOSHAPE(wkt)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_integer": "TO_INTEGER",
|
||||
"languageDocumentation.documentationESQL.to_integer.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_INTEGER\n 将输入值转换为整数值。\n 如果输入参数为日期类型,会将其值解析为自 Unix epoch 以来\n 的毫秒数,并转换为整数。\n 布尔值 *true* 将转换为整数 *1*,*false* 转换为 *0*。\n\n ```\n ROW long = [5013792, 2147483647, 501379200000]\n | EVAL int = TO_INTEGER(long)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_ip": "TO_IP",
|
||||
"languageDocumentation.documentationESQL.to_ip.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_IP\n 将输入字符串转换为 IP 值。\n\n ```\n ROW 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 ",
|
||||
"languageDocumentation.documentationESQL.to_long": "TO_LONG",
|
||||
"languageDocumentation.documentationESQL.to_long.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_LONG\n 将输入值转换为长整型值。如果输入参数为日期类型,\n 会将其值解析为自 Unix epoch 以来的毫秒数,并转换为长整型值。\n 布尔值 *true* 将转换为长整型值 *1*,*false* 转换为 *0*。\n\n ```\n ROW str1 = \"2147483648\", str2 = \"2147483648.2\", str3 = \"foo\"\n | EVAL long1 = TO_LONG(str1), long2 = TO_LONG(str2), long3 = TO_LONG(str3)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_lower": "TO_LOWER",
|
||||
"languageDocumentation.documentationESQL.to_lower.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_LOWER\n 返回一个新字符串,表示已将输入字符串转为小写。\n\n ```\n ROW message = \"Some Text\"\n | EVAL message_lower = TO_LOWER(message)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_radians": "TO_RADIANS",
|
||||
"languageDocumentation.documentationESQL.to_radians.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_RADIANS\n 将度数转换为弧度。\n\n ```\n ROW deg = [90.0, 180.0, 270.0]\n | EVAL rad = TO_RADIANS(deg)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_string": "TO_STRING",
|
||||
"languageDocumentation.documentationESQL.to_string.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_STRING\n 将输入值转换为字符串。\n\n ```\n ROW a=10\n | EVAL j = TO_STRING(a)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_unsigned_long": "TO_UNSIGNED_LONG",
|
||||
"languageDocumentation.documentationESQL.to_unsigned_long.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_UNSIGNED_LONG\n 将输入值转换为无符号长整型值。如果输入参数为日期类型,\n 会将其值解析为自 Unix epoch 以来的毫秒数,并转换为无符号长整型值。\n 布尔值 *true* 将转换为无符号长整型值 *1*,*false* 转换为 *0*。\n\n ```\n ROW str1 = \"2147483648\", str2 = \"2147483648.2\", str3 = \"foo\"\n | EVAL long1 = TO_UNSIGNED_LONG(str1), long2 = TO_ULONG(str2), long3 = TO_UL(str3)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_upper": "TO_UPPER",
|
||||
"languageDocumentation.documentationESQL.to_upper.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_UPPER\n 返回一个新字符串,表示已将输入字符串转为大写。\n\n ```\n ROW message = \"Some Text\"\n | EVAL message_upper = TO_UPPER(message)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.to_version": "TO_VERSION",
|
||||
"languageDocumentation.documentationESQL.to_version.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TO_VERSION\n 将输入字符串转换为版本值。\n\n ```\n ROW v = TO_VERSION(\"1.2.3\")\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.trim": "TRIM",
|
||||
"languageDocumentation.documentationESQL.trim.markdown": "<!--\n This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.\n -->\n\n ### TRIM\n 从字符串中移除前导和尾随空格。\n\n ```\n ROW message = \" some text \", color = \" red \"\n | EVAL message = TRIM(message)\n | EVAL color = TRIM(color)\n ```\n ",
|
||||
"languageDocumentation.documentationESQL.where": "WHERE",
|
||||
"languageDocumentation.documentationESQL.where.markdown": "### WHERE\n使用 `WHERE` 可生成一个表,其中包含输入表中所提供的条件评估为 `true` 的所有行:\n \n```\nFROM employees\n| KEEP first_name, last_name, still_hired\n| WHERE still_hired == true\n```\n\n#### 运算符\n\n请参阅**运算符**了解所支持的运算符的概览。\n\n#### 函数\n`WHERE` 支持各种用于计算值的函数。请参阅**函数**了解更多信息。\n ",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel": "在管道符上添加换行符",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.errorCount": "{count} 个{count, plural, other {错误}}",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.errorsTitle": "错误",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.expandLabel": "展开",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.feedback": "反馈",
|
||||
"languageDocumentation.documentationESQL.functions": "函数",
|
||||
"languageDocumentation.documentationESQL.functionsDocumentationESQLDescription": "ROW、EVAL 和 WHERE 支持的函数。",
|
||||
"languageDocumentation.documentationESQL.groupingFunctions": "分组函数",
|
||||
"languageDocumentation.documentationESQL.groupingFunctionsDocumentationESQLDescription": "这些分组函数可以与 `STATS...BY` 搭配使用:",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.hideQueriesLabel": "隐藏最近查询",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.lineCount": "{count} {count, plural, other {行}}",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.lineNumber": "第 {lineNumber} 行",
|
||||
"languageDocumentation.documentationESQL.operators": "运算符",
|
||||
"languageDocumentation.documentationESQL.operatorsDocumentationESQLDescription": "ES|QL 支持以下运算符:",
|
||||
"languageDocumentation.documentationESQL.processingCommands": "处理命令",
|
||||
"languageDocumentation.documentationESQL.processingCommandsDescription": "处理命令会通过添加、移除或更改行和列来更改输入表。ES|QL 支持以下处理命令。",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.querieshistory.error": "查询失败",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.querieshistory.success": "已成功运行查询",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.querieshistoryCopy": "复制查询到剪贴板",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.querieshistoryRun": "运行查询",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.querieshistoryTable": "查询历史记录表",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.recentQueriesColumnLabel": "最近查询",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.runQuery": "运行查询",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.showQueriesLabel": "显示最近查询",
|
||||
"languageDocumentation.documentationESQL.sourceCommands": "源命令",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.submitFeedback": "提交反馈",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.timeRanColumnLabel": "运行时间",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.timestampNotDetected": "未找到 @timestamp",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.warningCount": "{count} 个{count, plural, other {警告}}",
|
||||
"textBasedEditor.query.textBasedLanguagesEditor.warningsTitle": "警告",
|
||||
"esqlEditor.query.aborted": "请求已中止",
|
||||
"esqlEditor.query.cancel": "取消",
|
||||
"esqlEditor.query.collapseLabel": "折叠",
|
||||
"esqlEditor.query.disableWordWrapLabel": "移除管道符上的换行符",
|
||||
"esqlEditor.query.EnableWordWrapLabel": "在管道符上添加换行符",
|
||||
"esqlEditor.query.errorCount": "{count} 个{count, plural, other {错误}}",
|
||||
"esqlEditor.query.errorsTitle": "错误",
|
||||
"esqlEditor.query.expandLabel": "展开",
|
||||
"esqlEditor.query.feedback": "反馈",
|
||||
"esqlEditor.query.hideQueriesLabel": "隐藏最近查询",
|
||||
"esqlEditor.query.lineCount": "{count} {count, plural, other {行}}",
|
||||
"esqlEditor.query.lineNumber": "第 {lineNumber} 行",
|
||||
"esqlEditor.query.querieshistory.error": "查询失败",
|
||||
"esqlEditor.query.querieshistory.success": "已成功运行查询",
|
||||
"esqlEditor.query.querieshistoryCopy": "复制查询到剪贴板",
|
||||
"esqlEditor.query.querieshistoryRun": "运行查询",
|
||||
"esqlEditor.query.querieshistoryTable": "查询历史记录表",
|
||||
"esqlEditor.query.recentQueriesColumnLabel": "最近查询",
|
||||
"esqlEditor.query.runQuery": "运行查询",
|
||||
"esqlEditor.query.showQueriesLabel": "显示最近查询",
|
||||
"esqlEditor.query.submitFeedback": "提交反馈",
|
||||
"esqlEditor.query.timeRanColumnLabel": "运行时间",
|
||||
"esqlEditor.query.timestampNotDetected": "未找到 @timestamp",
|
||||
"esqlEditor.query.warningCount": "{count} 个{count, plural, other {警告}}",
|
||||
"esqlEditor.query.warningsTitle": "警告",
|
||||
"timelion.emptyExpressionErrorMessage": "Timelion 错误:未提供表达式",
|
||||
"timelion.expressionSuggestions.argument.description.acceptsText": "接受",
|
||||
"timelion.expressionSuggestions.func.description.chainableHelpText": "可串接",
|
||||
|
|
|
@ -265,14 +265,14 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
|
|||
|
||||
// change the query
|
||||
await monacoEditor.setCodeEditorValue('from logstash-* | stats maxB = max(bytes)');
|
||||
await testSubjects.click('TextBasedLangEditor-run-query-button');
|
||||
await testSubjects.click('ESQLEditor-run-query-button');
|
||||
await header.waitUntilLoadingHasFinished();
|
||||
|
||||
expect((await lens.getMetricVisualizationData()).length).to.be.equal(1);
|
||||
|
||||
// change the query to display a datatabler
|
||||
await monacoEditor.setCodeEditorValue('from logstash-* | limit 10');
|
||||
await testSubjects.click('TextBasedLangEditor-run-query-button');
|
||||
await testSubjects.click('ESQLEditor-run-query-button');
|
||||
await lens.waitForVisualization();
|
||||
expect(await testSubjects.exists('lnsDataTable')).to.be(true);
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded();
|
||||
|
||||
await testSubjects.existOrFail('fieldListFiltersFieldSearch');
|
||||
await testSubjects.existOrFail('TextBasedLangEditor');
|
||||
await testSubjects.existOrFail('ESQLEditor');
|
||||
await testSubjects.existOrFail('superDatePickerToggleQuickMenuButton');
|
||||
|
||||
await testSubjects.missingOrFail('showQueryBarMenu');
|
||||
|
@ -113,7 +113,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await PageObjects.header.waitUntilLoadingHasFinished();
|
||||
await PageObjects.discover.waitUntilSearchingHasFinished();
|
||||
|
||||
expect(await testSubjects.exists('TextBasedLangEditor')).to.be(true);
|
||||
expect(await testSubjects.exists('ESQLEditor')).to.be(true);
|
||||
// I am not rendering the histogram for indices with no @timestamp field
|
||||
expect(await testSubjects.exists('unifiedHistogramChart')).to.be(false);
|
||||
});
|
||||
|
@ -133,7 +133,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
const toTime = 'Nov 15, 2018 @ 00:00:00.000';
|
||||
await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime);
|
||||
|
||||
expect(await testSubjects.exists('TextBasedLangEditor')).to.be(true);
|
||||
expect(await testSubjects.exists('ESQLEditor')).to.be(true);
|
||||
expect(await testSubjects.exists('unifiedHistogramChart')).to.be(true);
|
||||
});
|
||||
|
||||
|
@ -352,7 +352,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await PageObjects.discover.waitUntilSearchingHasFinished();
|
||||
await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded();
|
||||
|
||||
await testSubjects.click('TextBasedLangEditor-toggle-query-history-button');
|
||||
await testSubjects.click('ESQLEditor-toggle-query-history-button');
|
||||
const historyItems = await esql.getHistoryItems();
|
||||
log.debug(historyItems);
|
||||
const queryAdded = historyItems.some((item) => {
|
||||
|
@ -374,7 +374,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await PageObjects.header.waitUntilLoadingHasFinished();
|
||||
await PageObjects.discover.waitUntilSearchingHasFinished();
|
||||
|
||||
await testSubjects.click('TextBasedLangEditor-toggle-query-history-button');
|
||||
await testSubjects.click('ESQLEditor-toggle-query-history-button');
|
||||
const historyItems = await esql.getHistoryItems();
|
||||
log.debug(historyItems);
|
||||
const queryAdded = historyItems.some((item) => {
|
||||
|
@ -390,7 +390,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await PageObjects.discover.waitUntilSearchingHasFinished();
|
||||
await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded();
|
||||
|
||||
await testSubjects.click('TextBasedLangEditor-toggle-query-history-button');
|
||||
await testSubjects.click('ESQLEditor-toggle-query-history-button');
|
||||
// click a history item
|
||||
await esql.clickHistoryItem(1);
|
||||
|
||||
|
@ -415,10 +415,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
|||
await PageObjects.header.waitUntilLoadingHasFinished();
|
||||
await PageObjects.discover.waitUntilSearchingHasFinished();
|
||||
await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded();
|
||||
await testSubjects.click('TextBasedLangEditor-toggle-query-history-button');
|
||||
await testSubjects.click('TextBasedLangEditor-queryHistory-runQuery-button');
|
||||
await testSubjects.click('ESQLEditor-toggle-query-history-button');
|
||||
await testSubjects.click('ESQLEditor-queryHistory-runQuery-button');
|
||||
const historyItem = await esql.getHistoryItem(0);
|
||||
await historyItem.findByTestSubject('TextBasedLangEditor-queryHistory-error');
|
||||
await historyItem.findByTestSubject('ESQLEditor-queryHistory-error');
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -4971,6 +4971,10 @@
|
|||
version "0.0.0"
|
||||
uid ""
|
||||
|
||||
"@kbn/esql-editor@link:packages/kbn-esql-editor":
|
||||
version "0.0.0"
|
||||
uid ""
|
||||
|
||||
"@kbn/esql-utils@link:packages/kbn-esql-utils":
|
||||
version "0.0.0"
|
||||
uid ""
|
||||
|
@ -6935,10 +6939,6 @@
|
|||
version "0.0.0"
|
||||
uid ""
|
||||
|
||||
"@kbn/text-based-editor@link:packages/kbn-text-based-editor":
|
||||
version "0.0.0"
|
||||
uid ""
|
||||
|
||||
"@kbn/third-party-lens-navigation-prompt-plugin@link:x-pack/examples/third_party_lens_navigation_prompt":
|
||||
version "0.0.0"
|
||||
uid ""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue