diff --git a/package-lock.json b/package-lock.json index 397d0bf0f3..52e0ad389f 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": "^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.1.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/websql-autocomplete/-/websql-autocomplete-8.1.0.tgz", - "integrity": "sha512-KHXOrikdszTfOuoEvtBjrsdjrcYAxgi/rfmCkDV8/dNrbvbtUaxvIlFJHka7cRwgZabh0+j7ImjYWS9Pb3fvFA==", + "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 6aed7514c9..84bf0f1649 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": "^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 8ccfd075ef..7e5c91c4ae 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 = [ @@ -714,3 +716,37 @@ export const WindowFunctions = [ export const TableFunction = []; export const Pragmas = ['TablePathPrefix', 'Warning']; + +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: ['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 b5eb008f9c..bed4cd5fde 100644 --- a/src/utils/monaco/yql/generateSuggestions.ts +++ b/src/utils/monaco/yql/generateSuggestions.ts @@ -10,6 +10,7 @@ import type {AutocompleteEntityType, TAutocompleteEntity} from '../../../types/a import { AggregateFunctions, + EntitySettings, Pragmas, SimpleFunctions, SimpleTypes, @@ -55,13 +56,13 @@ const re = /[\s'"-/@]/; const suggestionEntityToAutocomplete: Partial> = { externalDataSource: ['external_data_source'], + externalTable: ['external_table'], replication: ['replication'], - table: ['table'], + table: ['table', 'column_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, + suggestEntitySettings: 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 getEntitySettings(entityType: YQLEntity) { + return EntitySettings[entityType]; +} async function getUdfs() { return Udfs; } @@ -406,6 +413,20 @@ export async function generatePragmasSuggestion( sortText: suggestionIndexToWeight(getSuggestionIndex('suggestPragmas')), })); } +export async function generateEntitySettingsSuggestion( + rangeToInsertSuggestion: monaco.IRange, + entityType: YQLEntity, +): Promise { + const entitySettings = await getEntitySettings(entityType); + return entitySettings.map((el) => ({ + label: el, + insertText: el, + kind: CompletionItemKind.Property, + detail: 'Setting', + range: rangeToInsertSuggestion, + sortText: suggestionIndexToWeight(getSuggestionIndex('suggestEntitySettings')), + })); +} const alphabet = 'abcdefghijklmnopqrstuvwxyz'; diff --git a/src/utils/monaco/yql/yqlSuggestions.ts b/src/utils/monaco/yql/yqlSuggestions.ts index 2684c8f48c..034f748a8c 100644 --- a/src/utils/monaco/yql/yqlSuggestions.ts +++ b/src/utils/monaco/yql/yqlSuggestions.ts @@ -6,6 +6,7 @@ import { generateColumnAliasesSuggestion, generateColumnsSuggestion, generateEntitiesSuggestion, + generateEntitySettingsSuggestion, generateKeywordsSuggestion, generatePragmasSuggestion, generateSimpleFunctionsSuggestion, @@ -69,6 +70,7 @@ async function getSuggestions( let udfsSuggestions: Monaco.languages.CompletionItem[] = []; let simpleTypesSuggestions: Monaco.languages.CompletionItem[] = []; let pragmasSuggestions: Monaco.languages.CompletionItem[] = []; + let entitySettingsSuggestions: Monaco.languages.CompletionItem[] = []; if (parseResult.suggestEntity) { const entityNamePrefix = getEntityNameAtCursor(model, cursorPosition); @@ -103,6 +105,12 @@ async function getSuggestions( if (parseResult.suggestPragmas) { pragmasSuggestions = await generatePragmasSuggestion(rangeToInsertSuggestion); } + if (parseResult.suggestEntitySettings) { + entitySettingsSuggestions = await generateEntitySettingsSuggestion( + rangeToInsertSuggestion, + parseResult.suggestEntitySettings, + ); + } const columnAliasSuggestion = await generateColumnAliasesSuggestion( rangeToInsertSuggestion, @@ -132,6 +140,7 @@ async function getSuggestions( ...columnsSuggestions, ...keywordsSuggestions, ...aggregateFunctionsSuggestions, + ...entitySettingsSuggestions, ]; return suggestions;