From 6477e8ee6729cb651da932b962c468cf791e85a5 Mon Sep 17 00:00:00 2001 From: Elena Makarova Date: Fri, 31 May 2024 18:24:05 +0300 Subject: [PATCH 1/4] feat: suggest views and table settings --- package-lock.json | 8 ++--- package.json | 2 +- src/utils/monaco/yql/constants.ts | 12 +++++++ src/utils/monaco/yql/generateSuggestions.ts | 38 ++++++++++++++++----- src/utils/monaco/yql/yqlSuggestions.ts | 6 ++++ 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d07dfd5d1..c4cb130535 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@gravity-ui/paranoid": "^2.0.1", "@gravity-ui/react-data-table": "^2.1.1", "@gravity-ui/uikit": "^6.15.0", - "@gravity-ui/websql-autocomplete": "^8.1.0", + "@gravity-ui/websql-autocomplete": "^8.4.0", "@reduxjs/toolkit": "^2.2.3", "axios": "^1.6.8", "colord": "^2.9.3", @@ -3971,9 +3971,9 @@ } }, "node_modules/@gravity-ui/websql-autocomplete": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/websql-autocomplete/-/websql-autocomplete-8.1.0.tgz", - "integrity": "sha512-KHXOrikdszTfOuoEvtBjrsdjrcYAxgi/rfmCkDV8/dNrbvbtUaxvIlFJHka7cRwgZabh0+j7ImjYWS9Pb3fvFA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/websql-autocomplete/-/websql-autocomplete-8.4.0.tgz", + "integrity": "sha512-I/KyqT3KwTFCzV1oCEzpg2LQlh4til4mZ/845RSrmw9qDaNuiG5f7gRqGsrgM5qy04ctWcvikt5pceeR2HRz6Q==", "dependencies": { "antlr4-c3": "^3.4.1", "antlr4ng": "^3.0.4" diff --git a/package.json b/package.json index bec239df3f..3c1f329937 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@gravity-ui/paranoid": "^2.0.1", "@gravity-ui/react-data-table": "^2.1.1", "@gravity-ui/uikit": "^6.15.0", - "@gravity-ui/websql-autocomplete": "^8.1.0", + "@gravity-ui/websql-autocomplete": "^8.4.0", "@reduxjs/toolkit": "^2.2.3", "axios": "^1.6.8", "colord": "^2.9.3", diff --git a/src/utils/monaco/yql/constants.ts b/src/utils/monaco/yql/constants.ts index 8ccfd075ef..6e10d44918 100644 --- a/src/utils/monaco/yql/constants.ts +++ b/src/utils/monaco/yql/constants.ts @@ -714,3 +714,15 @@ export const WindowFunctions = [ export const TableFunction = []; export const Pragmas = ['TablePathPrefix', 'Warning']; + +export const TableSettings = [ + 'AUTO_PARTITIONING_BY_SIZE', + 'AUTO_PARTITIONING_PARTITION_SIZE_MB', + 'AUTO_PARTITIONING_BY_LOAD', + 'AUTO_PARTITIONING_MIN_PARTITIONS_COUNT', + 'AUTO_PARTITIONING_MAX_PARTITIONS_COUNT', + 'UNIFORM_PARTITIONS', + 'READ_REPLICAS_SETTINGS', + 'TTL', + 'KEY_BLOOM_FILTER', +]; diff --git a/src/utils/monaco/yql/generateSuggestions.ts b/src/utils/monaco/yql/generateSuggestions.ts index b5eb008f9c..2531732f10 100644 --- a/src/utils/monaco/yql/generateSuggestions.ts +++ b/src/utils/monaco/yql/generateSuggestions.ts @@ -14,6 +14,7 @@ import { SimpleFunctions, SimpleTypes, TableFunction, + TableSettings, Udfs, WindowFunctions, } from './constants'; @@ -55,13 +56,13 @@ const re = /[\s'"-/@]/; const suggestionEntityToAutocomplete: Partial> = { externalDataSource: ['external_data_source'], + externalTable: ['external_table'], replication: ['replication'], table: ['table'], tableStore: ['column_store'], topic: ['pers_queue_group'], view: ['view'], - //TODO: add after websql-autocomplete support indexex - // index: ['table_index', 'index'], + tableIndex: ['table_index', 'index'], }; const commonSuggestionEntities: AutocompleteEntityType[] = ['dir', 'unknown']; @@ -124,13 +125,16 @@ const SuggestionsWeight: Record = { suggestEntity: 2, suggestColumns: 3, suggestColumnAliases: 4, - suggestKeywords: 5, - suggestAggregateFunctions: 6, - suggestTableFunctions: 7, - suggestWindowFunctions: 8, - suggestFunctions: 9, - suggestUdfs: 10, - suggestSimpleTypes: 11, + suggestTableIndexes: 5, + suggestTableHints: 6, + suggestTableSettings: 7, + suggestSimpleTypes: 8, + suggestKeywords: 9, + suggestAggregateFunctions: 10, + suggestTableFunctions: 11, + suggestWindowFunctions: 12, + suggestFunctions: 13, + suggestUdfs: 14, }; function getSuggestionIndex(suggestionType: SuggestionType) { @@ -152,6 +156,9 @@ async function getAggregateFunctions() { async function getPragmas() { return Pragmas; } +async function getTableSettings() { + return TableSettings; +} async function getUdfs() { return Udfs; } @@ -406,6 +413,19 @@ export async function generatePragmasSuggestion( sortText: suggestionIndexToWeight(getSuggestionIndex('suggestPragmas')), })); } +export async function generateTableSettingsSuggestion( + rangeToInsertSuggestion: monaco.IRange, +): Promise { + const tableHints = await getTableSettings(); + return tableHints.map((el) => ({ + label: el, + insertText: el, + kind: CompletionItemKind.Property, + detail: 'Setting', + range: rangeToInsertSuggestion, + sortText: suggestionIndexToWeight(getSuggestionIndex('suggestTableSettings')), + })); +} const alphabet = 'abcdefghijklmnopqrstuvwxyz'; diff --git a/src/utils/monaco/yql/yqlSuggestions.ts b/src/utils/monaco/yql/yqlSuggestions.ts index 2684c8f48c..1ae5e8b77e 100644 --- a/src/utils/monaco/yql/yqlSuggestions.ts +++ b/src/utils/monaco/yql/yqlSuggestions.ts @@ -11,6 +11,7 @@ import { generateSimpleFunctionsSuggestion, generateSimpleTypesSuggestion, generateTableFunctionsSuggestion, + generateTableSettingsSuggestion, generateUdfSuggestion, generateWindowFunctionsSuggestion, } from './generateSuggestions'; @@ -69,6 +70,7 @@ async function getSuggestions( let udfsSuggestions: Monaco.languages.CompletionItem[] = []; let simpleTypesSuggestions: Monaco.languages.CompletionItem[] = []; let pragmasSuggestions: Monaco.languages.CompletionItem[] = []; + let tableSettingsSuggestions: Monaco.languages.CompletionItem[] = []; if (parseResult.suggestEntity) { const entityNamePrefix = getEntityNameAtCursor(model, cursorPosition); @@ -103,6 +105,9 @@ async function getSuggestions( if (parseResult.suggestPragmas) { pragmasSuggestions = await generatePragmasSuggestion(rangeToInsertSuggestion); } + if (parseResult.suggestTableSettings) { + tableSettingsSuggestions = await generateTableSettingsSuggestion(rangeToInsertSuggestion); + } const columnAliasSuggestion = await generateColumnAliasesSuggestion( rangeToInsertSuggestion, @@ -132,6 +137,7 @@ async function getSuggestions( ...columnsSuggestions, ...keywordsSuggestions, ...aggregateFunctionsSuggestions, + ...tableSettingsSuggestions, ]; return suggestions; From d008fa6803aef4b6fa92938977e8595d191367fc Mon Sep 17 00:00:00 2001 From: Elena Makarova Date: Mon, 3 Jun 2024 18:56:37 +0300 Subject: [PATCH 2/4] fix: code-review --- src/utils/monaco/yql/constants.ts | 45 ++++++++++++++++----- src/utils/monaco/yql/generateSuggestions.ts | 13 +++--- src/utils/monaco/yql/yqlSuggestions.ts | 33 ++++++++++++--- 3 files changed, 69 insertions(+), 22 deletions(-) diff --git a/src/utils/monaco/yql/constants.ts b/src/utils/monaco/yql/constants.ts index 6e10d44918..4c0b7a3640 100644 --- a/src/utils/monaco/yql/constants.ts +++ b/src/utils/monaco/yql/constants.ts @@ -1,3 +1,5 @@ +import type {YQLEntity} from '@gravity-ui/websql-autocomplete'; + export const LANGUAGE_YQL_ID = 'yql'; export const SimpleTypes = [ @@ -715,14 +717,35 @@ export const TableFunction = []; export const Pragmas = ['TablePathPrefix', 'Warning']; -export const TableSettings = [ - 'AUTO_PARTITIONING_BY_SIZE', - 'AUTO_PARTITIONING_PARTITION_SIZE_MB', - 'AUTO_PARTITIONING_BY_LOAD', - 'AUTO_PARTITIONING_MIN_PARTITIONS_COUNT', - 'AUTO_PARTITIONING_MAX_PARTITIONS_COUNT', - 'UNIFORM_PARTITIONS', - 'READ_REPLICAS_SETTINGS', - 'TTL', - 'KEY_BLOOM_FILTER', -]; +export const EntitySettings: Record = { + table: [ + 'AUTO_PARTITIONING_BY_SIZE', + 'AUTO_PARTITIONING_PARTITION_SIZE_MB', + 'AUTO_PARTITIONING_BY_LOAD', + 'AUTO_PARTITIONING_MIN_PARTITIONS_COUNT', + 'AUTO_PARTITIONING_MAX_PARTITIONS_COUNT', + 'UNIFORM_PARTITIONS', + 'READ_REPLICAS_SETTINGS', + 'TTL', + 'KEY_BLOOM_FILTER', + 'STORE', + ], + view: ['security_invoker'], + topic: [ + 'min_active_partitions', + 'partition_count_limit', + 'retention_period', + 'retention_storage_mb', + 'partition_write_speed_bytes_per_second', + 'partition_write_burst_bytes', + 'metering_mode', + ], + object: [], + user: [], + group: [], + externalDataSource: [], + externalTable: [], + tableStore: [], + replication: [], + tableIndex: [], +}; diff --git a/src/utils/monaco/yql/generateSuggestions.ts b/src/utils/monaco/yql/generateSuggestions.ts index 2531732f10..452db4e43b 100644 --- a/src/utils/monaco/yql/generateSuggestions.ts +++ b/src/utils/monaco/yql/generateSuggestions.ts @@ -10,11 +10,11 @@ import type {AutocompleteEntityType, TAutocompleteEntity} from '../../../types/a import { AggregateFunctions, + EntitySettings, Pragmas, SimpleFunctions, SimpleTypes, TableFunction, - TableSettings, Udfs, WindowFunctions, } from './constants'; @@ -58,7 +58,7 @@ const suggestionEntityToAutocomplete: Partial { - const tableHints = await getTableSettings(); + const tableHints = await getEntitySettings(entityType); return tableHints.map((el) => ({ label: el, insertText: el, diff --git a/src/utils/monaco/yql/yqlSuggestions.ts b/src/utils/monaco/yql/yqlSuggestions.ts index 1ae5e8b77e..6eb2dc1d80 100644 --- a/src/utils/monaco/yql/yqlSuggestions.ts +++ b/src/utils/monaco/yql/yqlSuggestions.ts @@ -1,4 +1,4 @@ -import type {CursorPosition} from '@gravity-ui/websql-autocomplete'; +import type {CursorPosition, YQLEntity} from '@gravity-ui/websql-autocomplete'; import type Monaco from 'monaco-editor'; import { @@ -6,12 +6,12 @@ import { generateColumnAliasesSuggestion, generateColumnsSuggestion, generateEntitiesSuggestion, + generateEntitySettingsSuggestion, generateKeywordsSuggestion, generatePragmasSuggestion, generateSimpleFunctionsSuggestion, generateSimpleTypesSuggestion, generateTableFunctionsSuggestion, - generateTableSettingsSuggestion, generateUdfSuggestion, generateWindowFunctionsSuggestion, } from './generateSuggestions'; @@ -36,6 +36,23 @@ export function createProvideSuggestionsFunction(database: string) { }; } +function getEntityType(stmt: string): YQLEntity | undefined { + switch (stmt) { + case 'create_table_stmt': + return 'table'; + case 'create_view_stmt': + return 'view'; + case 'create_topic_stmt': + return 'topic'; + case 'create_replication_stmt': + return 'replication'; + case 'create_external_data_source_stmt': + return 'externalDataSource'; + default: + return undefined; + } +} + function getEntityNameAtCursor(model: Monaco.editor.ITextModel, cursorPosition: Monaco.Position) { const prevWord = model.findPreviousMatch( '\\s(`?[^\\s]*)', @@ -70,7 +87,7 @@ async function getSuggestions( let udfsSuggestions: Monaco.languages.CompletionItem[] = []; let simpleTypesSuggestions: Monaco.languages.CompletionItem[] = []; let pragmasSuggestions: Monaco.languages.CompletionItem[] = []; - let tableSettingsSuggestions: Monaco.languages.CompletionItem[] = []; + let entitySettingsSuggestions: Monaco.languages.CompletionItem[] = []; if (parseResult.suggestEntity) { const entityNamePrefix = getEntityNameAtCursor(model, cursorPosition); @@ -106,7 +123,13 @@ async function getSuggestions( pragmasSuggestions = await generatePragmasSuggestion(rangeToInsertSuggestion); } if (parseResult.suggestTableSettings) { - tableSettingsSuggestions = await generateTableSettingsSuggestion(rangeToInsertSuggestion); + const entityType = getEntityType(parseResult.suggestTableSettings); + if (entityType) { + entitySettingsSuggestions = await generateEntitySettingsSuggestion( + rangeToInsertSuggestion, + entityType, + ); + } } const columnAliasSuggestion = await generateColumnAliasesSuggestion( @@ -137,7 +160,7 @@ async function getSuggestions( ...columnsSuggestions, ...keywordsSuggestions, ...aggregateFunctionsSuggestions, - ...tableSettingsSuggestions, + ...entitySettingsSuggestions, ]; return suggestions; From a38dd1029a327aa6d45a6053f619377569d0ac11 Mon Sep 17 00:00:00 2001 From: Elena Makarova Date: Tue, 4 Jun 2024 17:08:53 +0300 Subject: [PATCH 3/4] fix: code-review --- package-lock.json | 8 +++--- package.json | 2 +- src/utils/monaco/yql/constants.ts | 3 +- src/utils/monaco/yql/generateSuggestions.ts | 4 +-- src/utils/monaco/yql/yqlSuggestions.ts | 32 ++++----------------- 5 files changed, 15 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4cb130535..4029ab2837 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@gravity-ui/paranoid": "^2.0.1", "@gravity-ui/react-data-table": "^2.1.1", "@gravity-ui/uikit": "^6.15.0", - "@gravity-ui/websql-autocomplete": "^8.4.0", + "@gravity-ui/websql-autocomplete": "^9.0.0", "@reduxjs/toolkit": "^2.2.3", "axios": "^1.6.8", "colord": "^2.9.3", @@ -3971,9 +3971,9 @@ } }, "node_modules/@gravity-ui/websql-autocomplete": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/websql-autocomplete/-/websql-autocomplete-8.4.0.tgz", - "integrity": "sha512-I/KyqT3KwTFCzV1oCEzpg2LQlh4til4mZ/845RSrmw9qDaNuiG5f7gRqGsrgM5qy04ctWcvikt5pceeR2HRz6Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/websql-autocomplete/-/websql-autocomplete-9.0.0.tgz", + "integrity": "sha512-ZjM5T00d2wj6BUASca/WbHwGEcAw9YvAfs2CvPu3rhRy60qujKWpi9zV2Mpj8Ne/y3xEktP6WumGUVJfnBc/aw==", "dependencies": { "antlr4-c3": "^3.4.1", "antlr4ng": "^3.0.4" diff --git a/package.json b/package.json index 3c1f329937..f5a96724bc 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@gravity-ui/paranoid": "^2.0.1", "@gravity-ui/react-data-table": "^2.1.1", "@gravity-ui/uikit": "^6.15.0", - "@gravity-ui/websql-autocomplete": "^8.4.0", + "@gravity-ui/websql-autocomplete": "^9.0.0", "@reduxjs/toolkit": "^2.2.3", "axios": "^1.6.8", "colord": "^2.9.3", diff --git a/src/utils/monaco/yql/constants.ts b/src/utils/monaco/yql/constants.ts index 4c0b7a3640..7e5c91c4ae 100644 --- a/src/utils/monaco/yql/constants.ts +++ b/src/utils/monaco/yql/constants.ts @@ -746,6 +746,7 @@ export const EntitySettings: Record = { externalDataSource: [], externalTable: [], tableStore: [], - replication: [], + replication: ['ENDPOINT', 'DATABASE', 'USER', 'PASSWORD'], tableIndex: [], + topicConsumer: ['important', 'read_from'], }; diff --git a/src/utils/monaco/yql/generateSuggestions.ts b/src/utils/monaco/yql/generateSuggestions.ts index 452db4e43b..7bfe1e91cb 100644 --- a/src/utils/monaco/yql/generateSuggestions.ts +++ b/src/utils/monaco/yql/generateSuggestions.ts @@ -127,7 +127,7 @@ const SuggestionsWeight: Record = { suggestColumnAliases: 4, suggestTableIndexes: 5, suggestTableHints: 6, - suggestTableSettings: 7, + suggestEntitySettings: 7, suggestSimpleTypes: 8, suggestKeywords: 9, suggestAggregateFunctions: 10, @@ -424,7 +424,7 @@ export async function generateEntitySettingsSuggestion( kind: CompletionItemKind.Property, detail: 'Setting', range: rangeToInsertSuggestion, - sortText: suggestionIndexToWeight(getSuggestionIndex('suggestTableSettings')), + sortText: suggestionIndexToWeight(getSuggestionIndex('suggestEntitySettings')), })); } diff --git a/src/utils/monaco/yql/yqlSuggestions.ts b/src/utils/monaco/yql/yqlSuggestions.ts index 6eb2dc1d80..034f748a8c 100644 --- a/src/utils/monaco/yql/yqlSuggestions.ts +++ b/src/utils/monaco/yql/yqlSuggestions.ts @@ -1,4 +1,4 @@ -import type {CursorPosition, YQLEntity} from '@gravity-ui/websql-autocomplete'; +import type {CursorPosition} from '@gravity-ui/websql-autocomplete'; import type Monaco from 'monaco-editor'; import { @@ -36,23 +36,6 @@ export function createProvideSuggestionsFunction(database: string) { }; } -function getEntityType(stmt: string): YQLEntity | undefined { - switch (stmt) { - case 'create_table_stmt': - return 'table'; - case 'create_view_stmt': - return 'view'; - case 'create_topic_stmt': - return 'topic'; - case 'create_replication_stmt': - return 'replication'; - case 'create_external_data_source_stmt': - return 'externalDataSource'; - default: - return undefined; - } -} - function getEntityNameAtCursor(model: Monaco.editor.ITextModel, cursorPosition: Monaco.Position) { const prevWord = model.findPreviousMatch( '\\s(`?[^\\s]*)', @@ -122,14 +105,11 @@ async function getSuggestions( if (parseResult.suggestPragmas) { pragmasSuggestions = await generatePragmasSuggestion(rangeToInsertSuggestion); } - if (parseResult.suggestTableSettings) { - const entityType = getEntityType(parseResult.suggestTableSettings); - if (entityType) { - entitySettingsSuggestions = await generateEntitySettingsSuggestion( - rangeToInsertSuggestion, - entityType, - ); - } + if (parseResult.suggestEntitySettings) { + entitySettingsSuggestions = await generateEntitySettingsSuggestion( + rangeToInsertSuggestion, + parseResult.suggestEntitySettings, + ); } const columnAliasSuggestion = await generateColumnAliasesSuggestion( From f39962b3f0ebdc03cb468da7dc5fdcb0d8a080da Mon Sep 17 00:00:00 2001 From: Elena Makarova Date: Tue, 4 Jun 2024 17:50:57 +0300 Subject: [PATCH 4/4] fix: code-review --- src/utils/monaco/yql/generateSuggestions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/monaco/yql/generateSuggestions.ts b/src/utils/monaco/yql/generateSuggestions.ts index 7bfe1e91cb..bed4cd5fde 100644 --- a/src/utils/monaco/yql/generateSuggestions.ts +++ b/src/utils/monaco/yql/generateSuggestions.ts @@ -417,8 +417,8 @@ export async function generateEntitySettingsSuggestion( rangeToInsertSuggestion: monaco.IRange, entityType: YQLEntity, ): Promise { - const tableHints = await getEntitySettings(entityType); - return tableHints.map((el) => ({ + const entitySettings = await getEntitySettings(entityType); + return entitySettings.map((el) => ({ label: el, insertText: el, kind: CompletionItemKind.Property,