597 lines
11 KiB
TypeScript
597 lines
11 KiB
TypeScript
import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';
|
|
|
|
interface CloudWatchLanguage extends monacoType.languages.IMonarchLanguage {
|
|
keywords: string[];
|
|
operators: string[];
|
|
builtinFunctions: string[];
|
|
}
|
|
|
|
/* KEYWORDS */
|
|
export const ALL = 'ALL';
|
|
export const AND = 'AND';
|
|
export const ANY = 'ANY';
|
|
export const AS = 'AS';
|
|
export const ASC = 'ASC';
|
|
export const BETWEEN = 'BETWEEN';
|
|
export const BY = 'BY';
|
|
export const CASE = 'CASE';
|
|
export const CUBE = 'CUBE';
|
|
export const DESC = 'DESC';
|
|
export const DISTINCT = 'DISTINCT';
|
|
export const ELSE = 'ELSE';
|
|
export const END = 'END';
|
|
export const ESCAPE = 'ESCAPE';
|
|
export const EXISTS = 'EXISTS';
|
|
export const FALSE = 'FALSE';
|
|
export const FILTER = 'FILTER';
|
|
export const FIRST = 'FIRST';
|
|
export const FROM = 'FROM';
|
|
export const GROUP = 'GROUP';
|
|
export const GROUPING = 'GROUPING';
|
|
export const HAVING = 'HAVING';
|
|
export const ILIKE = 'ILIKE';
|
|
export const IN = 'IN';
|
|
export const INNER = 'INNER';
|
|
export const IS = 'IS';
|
|
export const JOIN = 'JOIN';
|
|
export const LAST = 'LAST';
|
|
export const LEFT = 'LEFT';
|
|
export const LIKE = 'LIKE';
|
|
export const LIMIT = 'LIMIT';
|
|
export const NOT = 'NOT';
|
|
export const NULL = 'NULL';
|
|
export const ON = 'ON';
|
|
export const OR = 'OR';
|
|
export const ORDER = 'ORDER';
|
|
export const OUTER = 'OUTER';
|
|
export const ROLLUP = 'ROLLUP';
|
|
export const SELECT = 'SELECT';
|
|
export const SETS = 'SETS';
|
|
export const SOME = 'SOME';
|
|
export const THEN = 'THEN';
|
|
export const TRUE = 'TRUE';
|
|
export const USING = 'USING';
|
|
export const WHEN = 'WHEN';
|
|
export const WHERE = 'WHERE';
|
|
export const WITH = 'WITH';
|
|
|
|
export const KEYWORDS = [
|
|
ALL,
|
|
AND,
|
|
ANY,
|
|
AS,
|
|
ASC,
|
|
BETWEEN,
|
|
BY,
|
|
CASE,
|
|
CUBE,
|
|
DESC,
|
|
DISTINCT,
|
|
ELSE,
|
|
END,
|
|
ESCAPE,
|
|
EXISTS,
|
|
FALSE,
|
|
FILTER,
|
|
FIRST,
|
|
FROM,
|
|
GROUP,
|
|
GROUPING,
|
|
HAVING,
|
|
ILIKE,
|
|
IN,
|
|
INNER,
|
|
IS,
|
|
JOIN,
|
|
LAST,
|
|
LEFT,
|
|
LIKE,
|
|
LIMIT,
|
|
NOT,
|
|
NULL,
|
|
ON,
|
|
OR,
|
|
ORDER,
|
|
OUTER,
|
|
ROLLUP,
|
|
SELECT,
|
|
SETS,
|
|
SOME,
|
|
THEN,
|
|
TRUE,
|
|
USING,
|
|
WHEN,
|
|
WHERE,
|
|
WITH,
|
|
];
|
|
export const AFTER_SELECT_KEYWORDS = [ALL, DISTINCT];
|
|
|
|
export const ALL_KEYWORDS = [...KEYWORDS, ...AFTER_SELECT_KEYWORDS];
|
|
|
|
/* FUNCTIONS */
|
|
export const AGGREGATE_FUNCTIONS = [
|
|
'any',
|
|
'any_value',
|
|
'approx_count_distinct',
|
|
'approx_percentile',
|
|
'array_agg',
|
|
'avg',
|
|
'bit_and',
|
|
'bit_or',
|
|
'bit_xor',
|
|
'bitmap_construct_agg',
|
|
'bitmap_or_agg',
|
|
'bool_and',
|
|
'bool_or',
|
|
'collect_list',
|
|
'collect_set',
|
|
'count',
|
|
'count_if',
|
|
'count_min_sketch',
|
|
'covar_pop',
|
|
'covar_samp',
|
|
'every',
|
|
'first',
|
|
'first_value',
|
|
'grouping',
|
|
'grouping_id',
|
|
'histogram_numeric',
|
|
'hll_sketch_agg',
|
|
'hll_union_agg',
|
|
'kurtosis',
|
|
'last',
|
|
'last_value',
|
|
'max',
|
|
'max_by',
|
|
'mean',
|
|
'median',
|
|
'min',
|
|
'min_by',
|
|
'mode',
|
|
'percentile',
|
|
'percentile_approx',
|
|
'regr_avgx',
|
|
'regr_avgy',
|
|
'regr_count',
|
|
'regr_intercept',
|
|
'regr_r2',
|
|
'regr_slope',
|
|
'regr_sxx',
|
|
'regr_sxy',
|
|
'regr_syy',
|
|
'skewness',
|
|
'some',
|
|
'std',
|
|
'stddev',
|
|
'stddev_pop',
|
|
'stddev_samp',
|
|
'sum',
|
|
'try_avg',
|
|
'try_sum',
|
|
'var_pop',
|
|
'var_samp',
|
|
'variance',
|
|
];
|
|
export const ARRAY_FUNCTIONS = [
|
|
'array',
|
|
'array_append',
|
|
'array_compact',
|
|
'array_contains',
|
|
'array_distinct',
|
|
'array_except',
|
|
'array_insert',
|
|
'array_intersect',
|
|
'array_join',
|
|
'array_max',
|
|
'array_min',
|
|
'array_position',
|
|
'array_prepend',
|
|
'array_remove',
|
|
'array_repeat',
|
|
'array_union',
|
|
'arrays_overlap',
|
|
'arrays_zip',
|
|
'flatten',
|
|
'get',
|
|
'sequence',
|
|
'shuffle',
|
|
'slice',
|
|
'sort_array',
|
|
];
|
|
export const CONDITIONAL_FUNCTIONS = ['coalesce', 'if', 'ifnull', 'nanvl', 'nullif', 'nvl', 'nvl2'];
|
|
export const CONVERSION_FUNCTIONS = [
|
|
'bigint',
|
|
'binary',
|
|
'boolean',
|
|
'cast',
|
|
'date',
|
|
'decimal',
|
|
'double',
|
|
'float',
|
|
'int',
|
|
'smallint',
|
|
'string',
|
|
'timestamp',
|
|
'tinyint',
|
|
];
|
|
export const DATE_AND_TIMESTAMP_FUNCTIONS = [
|
|
'add_months',
|
|
'convert_timezone',
|
|
'curdate',
|
|
'current_date',
|
|
'current_timestamp',
|
|
'current_timezone',
|
|
'date_add',
|
|
'date_diff',
|
|
'date_format',
|
|
'date_from_unix_date',
|
|
'date_part',
|
|
'date_sub',
|
|
'date_trunc',
|
|
'dateadd',
|
|
'datediff',
|
|
'datepart',
|
|
'day',
|
|
'dayofmonth',
|
|
'dayofweek',
|
|
'dayofyear',
|
|
'extract',
|
|
'from_unixtime',
|
|
'from_utc_timestamp',
|
|
'hour',
|
|
'last_day',
|
|
'localtimestamp',
|
|
'localtimestamp',
|
|
'make_date',
|
|
'make_dt_interval',
|
|
'make_interval',
|
|
'make_timestamp',
|
|
'make_timestamp_ltz',
|
|
'make_timestamp_ntz',
|
|
'make_ym_interval',
|
|
'minute',
|
|
'month',
|
|
'months_between',
|
|
'next_day',
|
|
'now',
|
|
'quarter',
|
|
'second',
|
|
'session_window',
|
|
'timestamp_micros',
|
|
'timestamp_millis',
|
|
'timestamp_seconds',
|
|
'to_date',
|
|
'to_timestamp',
|
|
'to_timestamp_ltz',
|
|
'to_timestamp_ntz',
|
|
'to_unix_timestamp',
|
|
'to_utc_timestamp',
|
|
'trunc',
|
|
'try_to_timestamp',
|
|
'unix_date',
|
|
'unix_micros',
|
|
'unix_millis',
|
|
'unix_seconds',
|
|
'unix_timestamp',
|
|
'weekday',
|
|
'weekofyear',
|
|
'window',
|
|
'window_time',
|
|
'year',
|
|
];
|
|
export const JSON_FUNCTIONS = [
|
|
'from_json',
|
|
'get_json_object',
|
|
'json_array_length',
|
|
'json_object_keys',
|
|
'json_tuple',
|
|
'schema_of_json',
|
|
'to_json',
|
|
];
|
|
export const MATHEMATICAL_FUNCTIONS = [
|
|
'abs',
|
|
'acos',
|
|
'acosh',
|
|
'asin',
|
|
'asinh',
|
|
'atan',
|
|
'atan2',
|
|
'atanh',
|
|
'bin',
|
|
'bround',
|
|
'cbrt',
|
|
'ceil',
|
|
'ceiling',
|
|
'conv',
|
|
'cos',
|
|
'cosh',
|
|
'cot',
|
|
'csc',
|
|
'degrees',
|
|
'e',
|
|
'exp',
|
|
'expm1',
|
|
'factorial',
|
|
'floor',
|
|
'greatest',
|
|
'hex',
|
|
'hypot',
|
|
'least',
|
|
'ln',
|
|
'log',
|
|
'log10',
|
|
'log1p',
|
|
'log2',
|
|
'negative',
|
|
'pi',
|
|
'pmod',
|
|
'positive',
|
|
'pow',
|
|
'power',
|
|
'radians',
|
|
'rand',
|
|
'randn',
|
|
'random',
|
|
'rint',
|
|
'round',
|
|
'sec',
|
|
'shiftleft',
|
|
'sign',
|
|
'signum',
|
|
'sin',
|
|
'sinh',
|
|
'sqrt',
|
|
'tan',
|
|
'tanh',
|
|
'try_add',
|
|
'try_divide',
|
|
'try_multiply',
|
|
'try_subtract',
|
|
'unhex',
|
|
'width_bucket',
|
|
];
|
|
export const PREDICATE_FUNCTIONS = ['isnan', 'isnotnull', 'isnull', 'regexp', 'regexp_like', 'rlike'];
|
|
export const STRING_FUNCTIONS = [
|
|
'ascii',
|
|
'base64',
|
|
'bit_length',
|
|
'btrim',
|
|
'char',
|
|
'char_length',
|
|
'character_length',
|
|
'chr',
|
|
'concat_ws',
|
|
'contains',
|
|
'decode',
|
|
'elt',
|
|
'encode',
|
|
'endswith',
|
|
'find_in_set',
|
|
'format_number',
|
|
'format_string',
|
|
'initcap',
|
|
'instr',
|
|
'lcase',
|
|
'left',
|
|
'len',
|
|
'length',
|
|
'levenshtein',
|
|
'locate',
|
|
'lower',
|
|
'lpad',
|
|
'ltrim',
|
|
'luhn_check',
|
|
'mask',
|
|
'octet_length',
|
|
'overlay',
|
|
'position',
|
|
'printf',
|
|
'regexp_count',
|
|
'regexp_extract',
|
|
'regexp_extract_all',
|
|
'regexp_instr',
|
|
'regexp_replace',
|
|
'regexp_substr',
|
|
'repeat',
|
|
'replace',
|
|
'right',
|
|
'rpad',
|
|
'rtrim',
|
|
'sentences',
|
|
'soundex',
|
|
'space',
|
|
'split',
|
|
'split_part',
|
|
'startswith',
|
|
'substr',
|
|
'substring',
|
|
'substring_index',
|
|
'to_binary',
|
|
'to_char',
|
|
'to_number',
|
|
'to_varchar',
|
|
'translate',
|
|
'trim',
|
|
'try_to_binary',
|
|
'try_to_number',
|
|
'ucase',
|
|
'unbase64',
|
|
'upper',
|
|
];
|
|
export const WINDOW_FUNCTIONS = [
|
|
'cume_dist',
|
|
'dense_rank',
|
|
'lag',
|
|
'lead',
|
|
'nth_value',
|
|
'ntile',
|
|
'percent_rank',
|
|
'rank',
|
|
'row_number',
|
|
];
|
|
|
|
export const ALL_FUNCTIONS = [
|
|
...AGGREGATE_FUNCTIONS,
|
|
...ARRAY_FUNCTIONS,
|
|
...CONDITIONAL_FUNCTIONS,
|
|
...CONVERSION_FUNCTIONS,
|
|
...DATE_AND_TIMESTAMP_FUNCTIONS,
|
|
...JSON_FUNCTIONS,
|
|
...MATHEMATICAL_FUNCTIONS,
|
|
...PREDICATE_FUNCTIONS,
|
|
...STRING_FUNCTIONS,
|
|
...WINDOW_FUNCTIONS,
|
|
];
|
|
|
|
/* OPERATORS */
|
|
export const EQUAL = '=';
|
|
export const DOUBLE_EQUALS = '==';
|
|
export const NULL_SAFE_EQUAL = '<=>';
|
|
export const NOT_EQUAL = '!=';
|
|
export const GREATER_THAN = '>';
|
|
export const GREATER_THAN_EQUAL = '>=';
|
|
export const LESS_THAN = '<';
|
|
export const LESS_THAN_EQUAL = '<=';
|
|
|
|
export const LOGICAL_OPERATORS = [OR, AND];
|
|
export const MATH_OPERATORS = ['*', '/', '+', '-', '%', 'div', 'mod'];
|
|
export const PREDICATE_OPERATORS = [
|
|
NOT,
|
|
IS,
|
|
EQUAL,
|
|
DOUBLE_EQUALS,
|
|
NULL_SAFE_EQUAL,
|
|
NOT_EQUAL,
|
|
GREATER_THAN,
|
|
GREATER_THAN_EQUAL,
|
|
LESS_THAN,
|
|
LESS_THAN_EQUAL,
|
|
LIKE,
|
|
ILIKE,
|
|
IN,
|
|
];
|
|
|
|
export const ALL_OPERATORS = [...MATH_OPERATORS, ...LOGICAL_OPERATORS, ...PREDICATE_OPERATORS];
|
|
|
|
export const language: CloudWatchLanguage = {
|
|
defaultToken: '',
|
|
ignoreCase: true,
|
|
brackets: [
|
|
{ open: '[', close: ']', token: 'delimiter.square' },
|
|
{ open: '(', close: ')', token: 'delimiter.parenthesis' },
|
|
{ open: '{', close: '}', token: 'delimiter.curly' },
|
|
],
|
|
keywords: ALL_KEYWORDS,
|
|
operators: ALL_OPERATORS,
|
|
builtinFunctions: ALL_FUNCTIONS,
|
|
tokenizer: {
|
|
root: [
|
|
{ include: '@comments' },
|
|
{ include: '@whitespace' },
|
|
{ include: '@customParams' },
|
|
{ include: '@numbers' },
|
|
{ include: '@binaries' },
|
|
{ include: '@strings' },
|
|
{ include: '@strings' },
|
|
{ include: '@complexIdentifiers' },
|
|
[/[;,.]/, 'delimiter'],
|
|
[/[\(\)\[\]\{\}]/, '@brackets'],
|
|
[
|
|
/[\w@#$]+/,
|
|
{
|
|
cases: {
|
|
'@operators': 'operator',
|
|
'@builtinFunctions': 'predefined',
|
|
'@keywords': 'keyword',
|
|
'@default': 'identifier',
|
|
},
|
|
},
|
|
],
|
|
[/[<>=!%&+\-*/|~^]/, 'operator'],
|
|
],
|
|
whitespace: [[/[\s\t\r\n]+/, 'white']],
|
|
comments: [
|
|
[/--+.*/, 'comment'],
|
|
[/\/\*/, { token: 'comment.quote', next: '@comment' }],
|
|
],
|
|
comment: [
|
|
[/[^*/]+/, 'comment'],
|
|
[/\*\//, { token: 'comment.quote', next: '@pop' }],
|
|
[/./, 'comment'],
|
|
],
|
|
customParams: [
|
|
[/\${[A-Za-z0-9._-]*}/, 'variable'],
|
|
[/\@\@{[A-Za-z0-9._-]*}/, 'variable'],
|
|
],
|
|
numbers: [
|
|
[/0[xX][0-9a-fA-F]*/, 'number'],
|
|
[/[$][+-]*\d*(\.\d*)?/, 'number'],
|
|
[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/, 'number'],
|
|
],
|
|
binaries: [
|
|
[/X'/i, { token: 'binary', next: '@binarySingle' }],
|
|
[/X"/i, { token: 'binary', next: '@binaryDouble' }],
|
|
],
|
|
binarySingle: [
|
|
[/\d+/, 'binary.escape'],
|
|
[/''/, 'binary'],
|
|
[/'/, { token: 'binary', next: '@pop' }],
|
|
],
|
|
binaryDouble: [
|
|
[/\d+/, 'binary.escape'],
|
|
[/""/, 'binary'],
|
|
[/"/, { token: 'binary', next: '@pop' }],
|
|
],
|
|
strings: [
|
|
[/'/, { token: 'string', next: '@stringSingle' }],
|
|
[/R'/i, { token: 'string', next: '@stringSingle' }],
|
|
[/"/, { token: 'string', next: '@stringDouble' }],
|
|
[/R"/i, { token: 'string', next: '@stringDouble' }],
|
|
],
|
|
stringSingle: [
|
|
[/[^']+/, 'string.escape'],
|
|
[/''/, 'string'],
|
|
[/'/, { token: 'string', next: '@pop' }],
|
|
],
|
|
stringDouble: [
|
|
[/[^"]+/, 'string.escape'],
|
|
[/""/, 'string'],
|
|
[/"/, { token: 'string', next: '@pop' }],
|
|
],
|
|
complexIdentifiers: [[/`/, { token: 'identifier', next: '@quotedIdentifier' }]],
|
|
quotedIdentifier: [
|
|
[/[^`]+/, 'identifier'],
|
|
[/``/, 'identifier'],
|
|
[/`/, { token: 'identifier', next: '@pop' }],
|
|
],
|
|
},
|
|
};
|
|
|
|
export const conf: monacoType.languages.LanguageConfiguration = {
|
|
comments: {
|
|
lineComment: '--',
|
|
blockComment: ['/*', '*/'],
|
|
},
|
|
brackets: [
|
|
['{', '}'],
|
|
['[', ']'],
|
|
['(', ')'],
|
|
],
|
|
autoClosingPairs: [
|
|
{ open: '{', close: '}' },
|
|
{ open: '[', close: ']' },
|
|
{ open: '(', close: ')' },
|
|
{ open: '"', close: '"' },
|
|
{ open: "'", close: "'" },
|
|
{ open: '`', close: '`' },
|
|
],
|
|
surroundingPairs: [
|
|
{ open: '{', close: '}' },
|
|
{ open: '[', close: ']' },
|
|
{ open: '(', close: ')' },
|
|
{ open: '"', close: '"' },
|
|
{ open: "'", close: "'" },
|
|
{ open: '`', close: '`' },
|
|
],
|
|
};
|