@cloudcare/codemirror-dql 0.0.57 → 0.0.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/complete/dql.terms.d.ts +6 -0
- package/dist/cjs/complete/dql.terms.js +60 -4
- package/dist/cjs/complete/dql.terms.js.map +1 -1
- package/dist/cjs/complete/hybrid.d.ts +2 -1
- package/dist/cjs/complete/hybrid.js +42 -5
- package/dist/cjs/complete/hybrid.js.map +1 -1
- package/dist/cjs/parser/parser.d.ts +16 -0
- package/dist/cjs/parser/parser.js +618 -30
- package/dist/cjs/parser/parser.js.map +1 -1
- package/dist/esm/complete/dql.terms.d.ts +6 -0
- package/dist/esm/complete/dql.terms.js +22 -1
- package/dist/esm/complete/dql.terms.js.map +1 -1
- package/dist/esm/complete/hybrid.d.ts +2 -1
- package/dist/esm/complete/hybrid.js +44 -7
- package/dist/esm/complete/hybrid.js.map +1 -1
- package/dist/esm/parser/parser.d.ts +16 -0
- package/dist/esm/parser/parser.js +581 -28
- package/dist/esm/parser/parser.js.map +1 -1
- package/package.json +3 -3
|
@@ -75,6 +75,7 @@ var queryClauseLabels = new Map([
|
|
|
75
75
|
['TargetClause', 'projection'],
|
|
76
76
|
['FilterClause', 'WHERE'],
|
|
77
77
|
['TimeClause', 'time range'],
|
|
78
|
+
['ShiftClause', 'SHIFT'],
|
|
78
79
|
['ByClause', 'BY'],
|
|
79
80
|
['HavingClause', 'HAVING'],
|
|
80
81
|
['OrderClause', 'ORDER BY'],
|
|
@@ -84,8 +85,141 @@ var queryClauseLabels = new Map([
|
|
|
84
85
|
['SLimitClause', 'SLIMIT'],
|
|
85
86
|
['SOffsetClause', 'SOFFSET'],
|
|
86
87
|
]);
|
|
87
|
-
var expressionParents = new Set(['BinaryExpr', 'Expr', 'HavingExpr', 'ProjectionExpr']);
|
|
88
|
+
var expressionParents = new Set(['BinaryExpr', 'Expr', 'HavingExpr', 'ProjectionExpr', 'CaseArithmeticExpr']);
|
|
88
89
|
var commaContextBoundaries = new Set(['CaseExpr', 'Query']);
|
|
90
|
+
var documentedFunctionArities = new Map(__spreadArray(__spreadArray([], __read([
|
|
91
|
+
'abs',
|
|
92
|
+
'any',
|
|
93
|
+
'avg',
|
|
94
|
+
'bool',
|
|
95
|
+
'ceil',
|
|
96
|
+
'count',
|
|
97
|
+
'count_distinct',
|
|
98
|
+
'count_series',
|
|
99
|
+
'deriv',
|
|
100
|
+
'derivative',
|
|
101
|
+
'difference',
|
|
102
|
+
'distinct',
|
|
103
|
+
'field_values',
|
|
104
|
+
'first',
|
|
105
|
+
'float',
|
|
106
|
+
'floor',
|
|
107
|
+
'histogram_auto',
|
|
108
|
+
'increase',
|
|
109
|
+
'int',
|
|
110
|
+
'irate',
|
|
111
|
+
'last',
|
|
112
|
+
'last_row',
|
|
113
|
+
'length',
|
|
114
|
+
'log',
|
|
115
|
+
'log2',
|
|
116
|
+
'log10',
|
|
117
|
+
'lower',
|
|
118
|
+
'ltrim',
|
|
119
|
+
'max',
|
|
120
|
+
'md5',
|
|
121
|
+
'median',
|
|
122
|
+
'min',
|
|
123
|
+
'mode',
|
|
124
|
+
'non_negative_derivative',
|
|
125
|
+
'non_negative_difference',
|
|
126
|
+
'rate',
|
|
127
|
+
'rate_over_count',
|
|
128
|
+
'rate_over_sum',
|
|
129
|
+
'rtrim',
|
|
130
|
+
'set',
|
|
131
|
+
'spread',
|
|
132
|
+
'stddev',
|
|
133
|
+
'string',
|
|
134
|
+
'sum',
|
|
135
|
+
'trim',
|
|
136
|
+
'uint',
|
|
137
|
+
'unwrap',
|
|
138
|
+
'upper',
|
|
139
|
+
].map(function (name) { return [name, { min: 1, max: 1 }]; })), false), [
|
|
140
|
+
['bottom', { min: 2, max: 2 }],
|
|
141
|
+
['cidr', { min: 1, max: 2 }],
|
|
142
|
+
['collect', { min: 1, max: 2 }],
|
|
143
|
+
['collect_distinct', { min: 1, max: 2 }],
|
|
144
|
+
['concat', { min: 1, max: Number.POSITIVE_INFINITY }],
|
|
145
|
+
['count_filter', { min: 2, max: 2 }],
|
|
146
|
+
['default', { min: 2, max: 2 }],
|
|
147
|
+
['distinct_by_collapse', { min: 1, max: 2 }],
|
|
148
|
+
['drain', { min: 2, max: 3 }],
|
|
149
|
+
['exists', { min: 0, max: 0 }],
|
|
150
|
+
['fill', { min: 2, max: 2 }],
|
|
151
|
+
['histogram', { min: 4, max: 5 }],
|
|
152
|
+
['histogram_quantile', { min: 2, max: 2 }],
|
|
153
|
+
['match', { min: 1, max: 2 }],
|
|
154
|
+
['now', { min: 0, max: 0 }],
|
|
155
|
+
['query_string', { min: 1, max: 2 }],
|
|
156
|
+
['querystring', { min: 1, max: 2 }],
|
|
157
|
+
['re', { min: 1, max: 2 }],
|
|
158
|
+
['regexp', { min: 1, max: 2 }],
|
|
159
|
+
['regex', { min: 1, max: 2 }],
|
|
160
|
+
['regexp_extract', { min: 2, max: 3 }],
|
|
161
|
+
['regexp_extract_all', { min: 2, max: 3 }],
|
|
162
|
+
['regexp_replace', { min: 3, max: 3 }],
|
|
163
|
+
['round', { min: 1, max: 2 }],
|
|
164
|
+
['search', { min: 1, max: 2 }],
|
|
165
|
+
['substr', { min: 2, max: 3 }],
|
|
166
|
+
['top', { min: 2, max: 2 }],
|
|
167
|
+
['wildcard', { min: 1, max: 2 }],
|
|
168
|
+
], false));
|
|
169
|
+
var stableShiftAggregateFunctions = new Set([
|
|
170
|
+
'any',
|
|
171
|
+
'avg',
|
|
172
|
+
'change_score',
|
|
173
|
+
'collect',
|
|
174
|
+
'collect_distinct',
|
|
175
|
+
'corr',
|
|
176
|
+
'count',
|
|
177
|
+
'count_distinct',
|
|
178
|
+
'count_filter',
|
|
179
|
+
'count_series',
|
|
180
|
+
'deriv',
|
|
181
|
+
'derivative',
|
|
182
|
+
'difference',
|
|
183
|
+
'ewma',
|
|
184
|
+
'first',
|
|
185
|
+
'histogram_quantile',
|
|
186
|
+
'increase',
|
|
187
|
+
'irate',
|
|
188
|
+
'last',
|
|
189
|
+
'last_row',
|
|
190
|
+
'mad_score',
|
|
191
|
+
'max',
|
|
192
|
+
'median',
|
|
193
|
+
'min',
|
|
194
|
+
'mode',
|
|
195
|
+
'moving_average',
|
|
196
|
+
'non_negative_derivative',
|
|
197
|
+
'non_negative_difference',
|
|
198
|
+
'p50',
|
|
199
|
+
'p75',
|
|
200
|
+
'p90',
|
|
201
|
+
'p95',
|
|
202
|
+
'p99',
|
|
203
|
+
'percentile',
|
|
204
|
+
'rate',
|
|
205
|
+
'rate_over_count',
|
|
206
|
+
'rate_over_sum',
|
|
207
|
+
'slope',
|
|
208
|
+
'spread',
|
|
209
|
+
'stddev',
|
|
210
|
+
'sum',
|
|
211
|
+
'zscore',
|
|
212
|
+
]);
|
|
213
|
+
var unstableShiftAggregateFunctions = new Set([
|
|
214
|
+
'distinct',
|
|
215
|
+
'distinct_by_collapse',
|
|
216
|
+
'drain',
|
|
217
|
+
'field_values',
|
|
218
|
+
'histogram',
|
|
219
|
+
'histogram_auto',
|
|
220
|
+
'schema',
|
|
221
|
+
]);
|
|
222
|
+
var caseScalarFunctions = new Set(['int', 'float', 'string', 'md5', 'lower', 'upper', 'trim', 'ltrim', 'rtrim', 'regexp_replace', 'length']);
|
|
89
223
|
exports.dqlSyntaxContexts = {
|
|
90
224
|
DQL: 'DQL query',
|
|
91
225
|
DQLConditions: 'DQL condition',
|
|
@@ -121,8 +255,15 @@ exports.dqlSyntaxContexts = {
|
|
|
121
255
|
OuterArgItem: 'outer function argument',
|
|
122
256
|
Queted: 'quoted query delimiter',
|
|
123
257
|
EvalCallBody: 'eval function arguments',
|
|
258
|
+
EvalArgItem: 'eval expression argument',
|
|
259
|
+
EvalExpression: 'eval expression',
|
|
260
|
+
EvalAtom: 'eval expression value',
|
|
261
|
+
EvalFunctionCall: 'eval function call',
|
|
262
|
+
EvalFunctionCallBody: 'eval function arguments',
|
|
263
|
+
EvalFunctionArg: 'eval function argument',
|
|
124
264
|
FunctionCallBody: 'function arguments',
|
|
125
265
|
ArgItem: 'function argument',
|
|
266
|
+
EvalFieldReference: 'eval field reference',
|
|
126
267
|
InValue: 'argument value list',
|
|
127
268
|
SingleExpr: 'expression value',
|
|
128
269
|
Expr: 'expression',
|
|
@@ -139,6 +280,8 @@ exports.dqlSyntaxContexts = {
|
|
|
139
280
|
ProjectionFieldFragment: 'projection field fragment',
|
|
140
281
|
ProjectionField: 'projection field',
|
|
141
282
|
SingleFieldExpr: 'projection expression value',
|
|
283
|
+
ShiftExpr: 'SHIFT expression',
|
|
284
|
+
ShiftOperand: 'SHIFT operand',
|
|
142
285
|
ProjectionExpr: 'projection expression',
|
|
143
286
|
AsExpr: 'alias',
|
|
144
287
|
FilterClause: 'filter clause',
|
|
@@ -152,10 +295,10 @@ exports.dqlSyntaxContexts = {
|
|
|
152
295
|
CaseCondition: 'CASE condition',
|
|
153
296
|
CaseFilterExpr: 'CASE filter expression',
|
|
154
297
|
CasePredicate: 'CASE predicate',
|
|
298
|
+
CaseComparableValue: 'CASE comparison value',
|
|
155
299
|
CaseValue: 'CASE value',
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
CaseFunctionCallBody: 'CASE function arguments',
|
|
300
|
+
CaseArithmeticAtom: 'CASE arithmetic value',
|
|
301
|
+
CaseArithmeticExpr: 'CASE arithmetic expression',
|
|
159
302
|
FilterFragmentExpr: 'filter fragment',
|
|
160
303
|
ComparisonExpr: 'comparison expression',
|
|
161
304
|
LogicalFragmentExpr: 'logical filter expression',
|
|
@@ -166,6 +309,7 @@ exports.dqlSyntaxContexts = {
|
|
|
166
309
|
FilterExpr: 'filter expression',
|
|
167
310
|
BinaryExpr: 'binary expression',
|
|
168
311
|
TimeClause: 'time range clause',
|
|
312
|
+
ShiftClause: 'SHIFT clause',
|
|
169
313
|
TimeRange: 'time range',
|
|
170
314
|
TimeExpr: 'time range value',
|
|
171
315
|
ByClause: 'BY clause',
|
|
@@ -185,6 +329,7 @@ exports.dqlSyntaxContexts = {
|
|
|
185
329
|
};
|
|
186
330
|
var functionCallBodyParents = new Set([
|
|
187
331
|
'FunctionCallBody',
|
|
332
|
+
'EvalFunctionCallBody',
|
|
188
333
|
'EvalCallBody',
|
|
189
334
|
'OuterFunctionCallBody',
|
|
190
335
|
'RawOuterFunctionCallBody',
|
|
@@ -193,7 +338,6 @@ var functionCallBodyParents = new Set([
|
|
|
193
338
|
'FillOuterFunctionCallBody',
|
|
194
339
|
'VariadicOuterFunctionCallBody',
|
|
195
340
|
'RollupFunctionCallBody',
|
|
196
|
-
'CaseFunctionCallBody',
|
|
197
341
|
]);
|
|
198
342
|
var Parser = /** @class */ (function () {
|
|
199
343
|
function Parser(state, deadline) {
|
|
@@ -211,6 +355,7 @@ var Parser = /** @class */ (function () {
|
|
|
211
355
|
this.quotedQueryDelimiterInfo = undefined;
|
|
212
356
|
this.caseResultDiagnostics = undefined;
|
|
213
357
|
this.caseResultRecoveryErrors = new Set();
|
|
358
|
+
this.caseShiftPresence = new Map();
|
|
214
359
|
}
|
|
215
360
|
Parser.prototype.getDiagnostics = function () {
|
|
216
361
|
var seen = new Set();
|
|
@@ -599,7 +744,7 @@ var Parser = /** @class */ (function () {
|
|
|
599
744
|
this.appendDiagnostics(diagnostics);
|
|
600
745
|
};
|
|
601
746
|
Parser.prototype.describeError = function (node) {
|
|
602
|
-
var _a;
|
|
747
|
+
var _a, _b, _c;
|
|
603
748
|
var delimiterIssue = this.getDelimiterIssue();
|
|
604
749
|
if (delimiterIssue && delimiterIssue.kind !== 'unclosed' && this.isRelatedDelimiterError(node, delimiterIssue)) {
|
|
605
750
|
return null;
|
|
@@ -681,6 +826,26 @@ var Parser = /** @class */ (function () {
|
|
|
681
826
|
}
|
|
682
827
|
return this.makeDiagnostic(node, 'expected "AS" before projection alias', group);
|
|
683
828
|
}
|
|
829
|
+
var projectionField = (_a = this.findAncestor(parent, 'ProjectionField')) !== null && _a !== void 0 ? _a : this.findAncestor(parent, 'ProjectionFieldFragment');
|
|
830
|
+
if (projectionField) {
|
|
831
|
+
var shiftError = this.errorDescendantsWithText(projectionField, 'shift').find(function (error) { return error.from <= node.from; });
|
|
832
|
+
if (shiftError && this.containsNode(projectionField, 'ShiftExpr')) {
|
|
833
|
+
return this.makeDiagnosticAt(shiftError.from, shiftError.to, 'SHIFT expressions cannot be nested', "shift-nested-syntax:".concat(projectionField.from));
|
|
834
|
+
}
|
|
835
|
+
if (shiftError) {
|
|
836
|
+
var rawOperand = this.state.sliceDoc(projectionField.from, shiftError.from);
|
|
837
|
+
var leading = rawOperand.length - rawOperand.trimStart().length;
|
|
838
|
+
var trailing = rawOperand.length - rawOperand.trimEnd().length;
|
|
839
|
+
return this.makeDiagnosticAt(projectionField.from + leading, Math.max(projectionField.from + leading + 1, projectionField.from + rawOperand.length - trailing), 'SHIFT operand must be a stable aggregate or subquery measure', "shift-operand-syntax:".concat(projectionField.from));
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
var invalidShiftContext = (_b = this.findAncestor(parent, 'FilterClause')) !== null && _b !== void 0 ? _b : this.findAncestor(parent, 'HavingClause');
|
|
843
|
+
if (invalidShiftContext) {
|
|
844
|
+
var shiftError = this.errorDescendantsWithText(invalidShiftContext, 'shift').find(function (error) { return error.from <= node.from; });
|
|
845
|
+
if (shiftError) {
|
|
846
|
+
return this.makeDiagnosticAt(shiftError.from, shiftError.to, 'expression-level SHIFT is only allowed in the projection', "shift-context-syntax:".concat(invalidShiftContext.from));
|
|
847
|
+
}
|
|
848
|
+
}
|
|
684
849
|
if (parentName === 'OuterFunctionCall') {
|
|
685
850
|
return this.makeUnexpectedTokenDiagnostic(node, exports.dqlSyntaxContexts.OuterFunctionCall, group);
|
|
686
851
|
}
|
|
@@ -705,7 +870,7 @@ var Parser = /** @class */ (function () {
|
|
|
705
870
|
}
|
|
706
871
|
return this.makeUnexpectedTokenDiagnostic(node, 'function call', group);
|
|
707
872
|
}
|
|
708
|
-
if (parentName === 'ArgItem' && node.from === node.to) {
|
|
873
|
+
if ((parentName === 'ArgItem' || parentName === 'EvalFunctionArg') && node.from === node.to) {
|
|
709
874
|
if ((previous === null || previous === void 0 ? void 0 : previous.name) === 'EqlSingle') {
|
|
710
875
|
return this.makeDiagnostic(node, 'function argument value expected after "="', group);
|
|
711
876
|
}
|
|
@@ -751,20 +916,52 @@ var Parser = /** @class */ (function () {
|
|
|
751
916
|
if (parentName === 'ByExpr' && errorText === ',') {
|
|
752
917
|
return this.makeDiagnostic(node, 'grouping field expected before ","', group);
|
|
753
918
|
}
|
|
754
|
-
if (expressionParents.has(parentName)) {
|
|
755
|
-
if (previous && this.isOperator(previous)) {
|
|
756
|
-
return this.makeDiagnostic(node, "right-hand expression expected after \"".concat(previousText, "\""), group);
|
|
757
|
-
}
|
|
758
|
-
return this.makeUnexpectedTokenDiagnostic(node, 'expression', group);
|
|
759
|
-
}
|
|
760
919
|
var caseWhenClause = this.findAncestor(parent, 'CaseWhenClause');
|
|
761
920
|
if (caseWhenClause) {
|
|
921
|
+
var firstCaseError = this.firstErrorFrom(caseWhenClause);
|
|
762
922
|
var missingCondition = /^\s*when\s+(then)\b/i.exec(this.maskLineComments(this.nodeText(caseWhenClause)));
|
|
763
923
|
if (missingCondition) {
|
|
764
|
-
|
|
765
|
-
|
|
924
|
+
if (node.from === firstCaseError) {
|
|
925
|
+
var thenOffset = missingCondition.index + missingCondition[0].toLowerCase().lastIndexOf('then');
|
|
926
|
+
return this.makeDiagnosticAt(caseWhenClause.from + thenOffset, caseWhenClause.from + thenOffset + 4, 'CASE condition expected after "WHEN"', this.caseGroup(caseWhenClause));
|
|
927
|
+
}
|
|
928
|
+
return null;
|
|
929
|
+
}
|
|
930
|
+
if (!caseWhenClause.getChild('Then')) {
|
|
931
|
+
if (node.from === firstCaseError) {
|
|
932
|
+
return this.makeDiagnostic(node, 'expected "THEN" after CASE condition', this.caseGroup(caseWhenClause));
|
|
933
|
+
}
|
|
934
|
+
return null;
|
|
935
|
+
}
|
|
936
|
+
var missingResult = /\bthen\s+(else)\b/i.exec(this.maskLineComments(this.nodeText(caseWhenClause)));
|
|
937
|
+
if (missingResult) {
|
|
938
|
+
if (node.from === firstCaseError) {
|
|
939
|
+
var keyword = missingResult[1];
|
|
940
|
+
var keywordOffset = missingResult.index + missingResult[0].toLowerCase().lastIndexOf(keyword.toLowerCase());
|
|
941
|
+
return this.makeDiagnosticAt(caseWhenClause.from + keywordOffset, caseWhenClause.from + keywordOffset + keyword.length, 'CASE result expected after "THEN"', this.caseGroup(caseWhenClause));
|
|
942
|
+
}
|
|
943
|
+
return errorText ? this.makeUnexpectedTokenDiagnostic(node, exports.dqlSyntaxContexts.CaseExpr, group) : null;
|
|
766
944
|
}
|
|
767
945
|
}
|
|
946
|
+
if (parentName === 'EvalAtom' && errorText === '=' && (previous === null || previous === void 0 ? void 0 : previous.name) === 'Identifier') {
|
|
947
|
+
return this.makeDiagnostic(node, 'function argument value expected after "="', group);
|
|
948
|
+
}
|
|
949
|
+
if (parentName === 'EvalExpression' && node.from === node.to && (previous === null || previous === void 0 ? void 0 : previous.name) === 'EvalAtom' && (next === null || next === void 0 ? void 0 : next.name) === 'EvalAtom') {
|
|
950
|
+
return this.makeDiagnostic(node, 'expected "," between function arguments', group);
|
|
951
|
+
}
|
|
952
|
+
if (parentName === 'CaseArithmeticExpr' && errorText && !(previous === null || previous === void 0 ? void 0 : previous.type.isError)) {
|
|
953
|
+
return this.makeUnexpectedTokenDiagnostic(node, exports.dqlSyntaxContexts.CaseExpr, group);
|
|
954
|
+
}
|
|
955
|
+
if (parentName === 'ShiftExpr' || parentName === 'ShiftClause') {
|
|
956
|
+
var message = errorText ? 'SHIFT duration must be a positive fixed duration' : 'duration expected after "SHIFT"';
|
|
957
|
+
return this.makeDiagnostic(node, message, "shift-duration:".concat(parent.from));
|
|
958
|
+
}
|
|
959
|
+
if (expressionParents.has(parentName)) {
|
|
960
|
+
if (previous && this.isOperator(previous)) {
|
|
961
|
+
return this.makeDiagnostic(node, "right-hand expression expected after \"".concat(previousText, "\""), group);
|
|
962
|
+
}
|
|
963
|
+
return this.makeUnexpectedTokenDiagnostic(node, 'expression', group);
|
|
964
|
+
}
|
|
768
965
|
if (parentName === 'CaseCondition') {
|
|
769
966
|
return this.makeDiagnostic(node, 'expected "THEN" after CASE condition', this.caseGroup(parent));
|
|
770
967
|
}
|
|
@@ -812,7 +1009,7 @@ var Parser = /** @class */ (function () {
|
|
|
812
1009
|
}
|
|
813
1010
|
if (parentName === 'RollupIdentifier') {
|
|
814
1011
|
var timeClause_1 = this.findAncestor(parent, 'TimeClause');
|
|
815
|
-
var child = (
|
|
1012
|
+
var child = (_c = timeClause_1 === null || timeClause_1 === void 0 ? void 0 : timeClause_1.firstChild) !== null && _c !== void 0 ? _c : null;
|
|
816
1013
|
while (child) {
|
|
817
1014
|
if (child.type.isError)
|
|
818
1015
|
return null;
|
|
@@ -1382,6 +1579,7 @@ var Parser = /** @class */ (function () {
|
|
|
1382
1579
|
var contexts = {
|
|
1383
1580
|
Projection: 'projection item',
|
|
1384
1581
|
FunctionCallBody: 'function argument',
|
|
1582
|
+
EvalFunctionCallBody: 'function argument',
|
|
1385
1583
|
EvalCallBody: 'function argument',
|
|
1386
1584
|
OuterFunctionCallBody: 'function argument',
|
|
1387
1585
|
RawOuterFunctionCallBody: 'function argument',
|
|
@@ -1390,7 +1588,6 @@ var Parser = /** @class */ (function () {
|
|
|
1390
1588
|
FillOuterFunctionCallBody: 'function argument',
|
|
1391
1589
|
VariadicOuterFunctionCallBody: 'function argument',
|
|
1392
1590
|
RollupFunctionCallBody: 'function argument',
|
|
1393
|
-
CaseFunctionCallBody: 'function argument',
|
|
1394
1591
|
InValue: 'argument value',
|
|
1395
1592
|
InFieldValue: 'filter value',
|
|
1396
1593
|
IndexExpr: 'namespace index',
|
|
@@ -1575,6 +1772,20 @@ var Parser = /** @class */ (function () {
|
|
|
1575
1772
|
}
|
|
1576
1773
|
return false;
|
|
1577
1774
|
};
|
|
1775
|
+
Parser.prototype.firstErrorFrom = function (node) {
|
|
1776
|
+
var first = null;
|
|
1777
|
+
var visit = function (current) {
|
|
1778
|
+
var child = current.firstChild;
|
|
1779
|
+
while (child) {
|
|
1780
|
+
if (child.type.isError && (first === null || child.from < first))
|
|
1781
|
+
first = child.from;
|
|
1782
|
+
visit(child);
|
|
1783
|
+
child = child.nextSibling;
|
|
1784
|
+
}
|
|
1785
|
+
};
|
|
1786
|
+
visit(node);
|
|
1787
|
+
return first;
|
|
1788
|
+
};
|
|
1578
1789
|
Parser.prototype.looksLikeProjectionAfterMissingColon = function (node) {
|
|
1579
1790
|
var querySource = node.getChild('QuerySource');
|
|
1580
1791
|
return Boolean(querySource && this.containsError(querySource) && !this.containsNode(querySource, 'DColon'));
|
|
@@ -2648,6 +2859,8 @@ var Parser = /** @class */ (function () {
|
|
|
2648
2859
|
case 'Query':
|
|
2649
2860
|
case 'QueryFragment':
|
|
2650
2861
|
this.checkDuplicateQueryClauses(node);
|
|
2862
|
+
this.checkQueryShiftPlacement(node);
|
|
2863
|
+
this.checkExpressionShiftOffsets(node);
|
|
2651
2864
|
break;
|
|
2652
2865
|
case 'ShowExpr':
|
|
2653
2866
|
this.checkDuplicateShowClauses(node);
|
|
@@ -2656,6 +2869,19 @@ var Parser = /** @class */ (function () {
|
|
|
2656
2869
|
case 'TimeRange':
|
|
2657
2870
|
this.checkTimeRangeShape(node);
|
|
2658
2871
|
break;
|
|
2872
|
+
case 'ShiftClause':
|
|
2873
|
+
this.checkShiftDuration(node);
|
|
2874
|
+
break;
|
|
2875
|
+
case 'ShiftExpr':
|
|
2876
|
+
this.checkShiftDuration(node);
|
|
2877
|
+
this.checkShiftExpression(node);
|
|
2878
|
+
break;
|
|
2879
|
+
case 'EvalExpr':
|
|
2880
|
+
this.checkEvalReferences(node);
|
|
2881
|
+
break;
|
|
2882
|
+
case 'EvalFieldReference':
|
|
2883
|
+
this.checkEvalFieldReferenceContext(node);
|
|
2884
|
+
break;
|
|
2659
2885
|
case 'RollupIdentifier':
|
|
2660
2886
|
this.checkBareRollup(node);
|
|
2661
2887
|
break;
|
|
@@ -2663,7 +2889,10 @@ var Parser = /** @class */ (function () {
|
|
|
2663
2889
|
this.checkRollupFunctionCall(node);
|
|
2664
2890
|
break;
|
|
2665
2891
|
case 'FunctionCall':
|
|
2892
|
+
case 'EvalFunctionCall':
|
|
2666
2893
|
this.checkFunctionCall(node);
|
|
2894
|
+
if (node.name === 'FunctionCall')
|
|
2895
|
+
this.checkCaseFunction(node);
|
|
2667
2896
|
break;
|
|
2668
2897
|
case 'OuterFunctionCall':
|
|
2669
2898
|
this.checkOuterFunctionCall(node);
|
|
@@ -2683,9 +2912,6 @@ var Parser = /** @class */ (function () {
|
|
|
2683
2912
|
case 'FieldName':
|
|
2684
2913
|
this.checkFieldName(node);
|
|
2685
2914
|
break;
|
|
2686
|
-
case 'CaseFunctionIdentifier':
|
|
2687
|
-
this.checkCaseFunction(node);
|
|
2688
|
-
break;
|
|
2689
2915
|
case 'CaseExpr':
|
|
2690
2916
|
this.checkCaseResults(node);
|
|
2691
2917
|
break;
|
|
@@ -2718,6 +2944,203 @@ var Parser = /** @class */ (function () {
|
|
|
2718
2944
|
child = child.nextSibling;
|
|
2719
2945
|
}
|
|
2720
2946
|
};
|
|
2947
|
+
Parser.prototype.checkQueryShiftPlacement = function (query) {
|
|
2948
|
+
var _a;
|
|
2949
|
+
var clauses = [];
|
|
2950
|
+
var child = query.firstChild;
|
|
2951
|
+
while (child) {
|
|
2952
|
+
if (child.name === 'QueryClause' || child.name === 'QueryFragmentClause') {
|
|
2953
|
+
var clause = child.firstChild;
|
|
2954
|
+
if (clause)
|
|
2955
|
+
clauses.push(clause);
|
|
2956
|
+
}
|
|
2957
|
+
child = child.nextSibling;
|
|
2958
|
+
}
|
|
2959
|
+
var shifts = clauses.filter(function (clause) { return clause.name === 'ShiftClause'; });
|
|
2960
|
+
var timeRanges = clauses.filter(function (clause) { return clause.name === 'TimeClause'; });
|
|
2961
|
+
if (shifts.length !== 1 || timeRanges.length > 1)
|
|
2962
|
+
return;
|
|
2963
|
+
var shift = shifts[0];
|
|
2964
|
+
var shiftIndex = clauses.indexOf(shift);
|
|
2965
|
+
var laterTarget = clauses.slice(shiftIndex + 1).find(function (clause) { return clause.name === 'TargetClause'; });
|
|
2966
|
+
if (laterTarget) {
|
|
2967
|
+
this.pushSemanticDiagnostic(shift, '"SHIFT" must appear after the projection', "shift-placement:".concat(shift.from));
|
|
2968
|
+
return;
|
|
2969
|
+
}
|
|
2970
|
+
var laterFilter = clauses.slice(shiftIndex + 1).find(function (clause) { return clause.name === 'FilterClause'; });
|
|
2971
|
+
if (laterFilter) {
|
|
2972
|
+
this.pushSemanticDiagnostic(shift, '"SHIFT" must appear after "WHERE"', "shift-placement:".concat(shift.from));
|
|
2973
|
+
return;
|
|
2974
|
+
}
|
|
2975
|
+
if (timeRanges.length === 1) {
|
|
2976
|
+
var timeIndex = clauses.indexOf(timeRanges[0]);
|
|
2977
|
+
if (shiftIndex !== timeIndex + 1) {
|
|
2978
|
+
this.pushSemanticDiagnostic(shift, '"SHIFT" must immediately follow the time range', "shift-placement:".concat(shift.from));
|
|
2979
|
+
}
|
|
2980
|
+
return;
|
|
2981
|
+
}
|
|
2982
|
+
var outputClause = clauses
|
|
2983
|
+
.slice(0, shiftIndex)
|
|
2984
|
+
.reverse()
|
|
2985
|
+
.find(function (clause) {
|
|
2986
|
+
return ['ByClause', 'HavingClause', 'OrderClause', 'SOrderClause', 'LimitClause', 'OffsetClause', 'SLimitClause', 'SOffsetClause'].includes(clause.name);
|
|
2987
|
+
});
|
|
2988
|
+
if (outputClause) {
|
|
2989
|
+
var label = (_a = queryClauseLabels.get(outputClause.name)) !== null && _a !== void 0 ? _a : outputClause.name;
|
|
2990
|
+
this.pushSemanticDiagnostic(shift, "\"SHIFT\" must appear before \"".concat(label, "\""), "shift-placement:".concat(shift.from));
|
|
2991
|
+
}
|
|
2992
|
+
};
|
|
2993
|
+
Parser.prototype.checkExpressionShiftOffsets = function (query) {
|
|
2994
|
+
var _this = this;
|
|
2995
|
+
var offsets = new Set();
|
|
2996
|
+
var overflowReported = false;
|
|
2997
|
+
var visit = function (node) {
|
|
2998
|
+
if (overflowReported || Date.now() >= _this.deadline)
|
|
2999
|
+
return;
|
|
3000
|
+
if (node !== query && node.name === 'Query')
|
|
3001
|
+
return;
|
|
3002
|
+
if (node.name === 'ShiftExpr') {
|
|
3003
|
+
var duration = node.getChild('Duration');
|
|
3004
|
+
if (duration) {
|
|
3005
|
+
var rawOffset = _this.nodeText(duration).toLowerCase();
|
|
3006
|
+
var milliseconds = _this.fixedDurationMilliseconds(rawOffset);
|
|
3007
|
+
var offset = milliseconds !== null && Number.isSafeInteger(milliseconds) ? "".concat(milliseconds, "ms") : rawOffset;
|
|
3008
|
+
if (!offsets.has(offset)) {
|
|
3009
|
+
offsets.add(offset);
|
|
3010
|
+
if (offsets.size > 16) {
|
|
3011
|
+
_this.pushSemanticDiagnostic(duration, 'a SELECT can use at most 16 distinct SHIFT offsets', "shift-offsets:".concat(query.from));
|
|
3012
|
+
overflowReported = true;
|
|
3013
|
+
return;
|
|
3014
|
+
}
|
|
3015
|
+
}
|
|
3016
|
+
}
|
|
3017
|
+
}
|
|
3018
|
+
var child = node.firstChild;
|
|
3019
|
+
while (child) {
|
|
3020
|
+
visit(child);
|
|
3021
|
+
child = child.nextSibling;
|
|
3022
|
+
}
|
|
3023
|
+
};
|
|
3024
|
+
visit(query);
|
|
3025
|
+
};
|
|
3026
|
+
Parser.prototype.checkShiftDuration = function (shift) {
|
|
3027
|
+
var duration = shift.getChild('Duration');
|
|
3028
|
+
if (!duration || this.isPositiveFixedDuration(this.nodeText(duration)))
|
|
3029
|
+
return;
|
|
3030
|
+
this.pushSemanticDiagnostic(duration, 'SHIFT duration must be a positive fixed duration', "shift-duration:".concat(shift.from));
|
|
3031
|
+
};
|
|
3032
|
+
Parser.prototype.checkShiftExpression = function (shift) {
|
|
3033
|
+
var _this = this;
|
|
3034
|
+
var _a, _b;
|
|
3035
|
+
var nested = this.findAncestor(shift.parent, 'ShiftExpr');
|
|
3036
|
+
if (nested) {
|
|
3037
|
+
this.pushSemanticDiagnostic(shift, 'SHIFT expressions cannot be nested', "shift-nested:".concat(shift.from));
|
|
3038
|
+
return;
|
|
3039
|
+
}
|
|
3040
|
+
if (!this.findAncestor(shift.parent, 'TargetClause') && !this.findAncestor(shift.parent, 'ProjectionFragment')) {
|
|
3041
|
+
this.pushSemanticDiagnostic(shift, 'expression-level SHIFT is only allowed in the projection', "shift-context:".concat(shift.from));
|
|
3042
|
+
return;
|
|
3043
|
+
}
|
|
3044
|
+
var operand = shift.getChild('ShiftOperand');
|
|
3045
|
+
if (!operand)
|
|
3046
|
+
return;
|
|
3047
|
+
var calls = this.shiftOperandFunctionCalls(operand);
|
|
3048
|
+
var unstable = calls.find(function (call) {
|
|
3049
|
+
var name = _this.functionCallName(call);
|
|
3050
|
+
return name !== null && unstableShiftAggregateFunctions.has(name);
|
|
3051
|
+
});
|
|
3052
|
+
if (unstable) {
|
|
3053
|
+
var name_1 = (_a = this.functionCallName(unstable)) !== null && _a !== void 0 ? _a : 'function';
|
|
3054
|
+
var identifier = (_b = unstable.getChild('FunctionIdentifier')) !== null && _b !== void 0 ? _b : unstable;
|
|
3055
|
+
this.pushSemanticDiagnostic(identifier, "function \"".concat(name_1, "\" cannot be used as a SHIFT operand"), "shift-operand:".concat(shift.from));
|
|
3056
|
+
return;
|
|
3057
|
+
}
|
|
3058
|
+
var hasStableAggregate = calls.some(function (call) {
|
|
3059
|
+
var name = _this.functionCallName(call);
|
|
3060
|
+
return name !== null && stableShiftAggregateFunctions.has(name);
|
|
3061
|
+
});
|
|
3062
|
+
if (!hasStableAggregate) {
|
|
3063
|
+
this.pushSemanticDiagnostic(operand, 'SHIFT operand must be a stable aggregate or subquery measure', "shift-operand:".concat(shift.from));
|
|
3064
|
+
}
|
|
3065
|
+
};
|
|
3066
|
+
Parser.prototype.checkEvalFieldReferenceContext = function (reference) {
|
|
3067
|
+
if (this.findAncestor(reference.parent, 'EvalExpr'))
|
|
3068
|
+
return;
|
|
3069
|
+
this.pushSemanticDiagnostic(reference, 'qualified field references are only supported inside eval', "eval-field-context:".concat(reference.from));
|
|
3070
|
+
};
|
|
3071
|
+
Parser.prototype.checkEvalReferences = function (evalExpr) {
|
|
3072
|
+
var e_24, _a, e_25, _b, e_26, _c;
|
|
3073
|
+
var body = evalExpr.getChild('EvalCallBody');
|
|
3074
|
+
if (!body)
|
|
3075
|
+
return;
|
|
3076
|
+
var aliases = new Set();
|
|
3077
|
+
try {
|
|
3078
|
+
for (var _d = __values(this.directChildren(body, 'OuterArgItem')), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
3079
|
+
var argument = _e.value;
|
|
3080
|
+
var identifier = argument.getChild('Identifier');
|
|
3081
|
+
if (!identifier || !argument.getChild('EqlSingle'))
|
|
3082
|
+
continue;
|
|
3083
|
+
if (!argument.getChild('Query') && !argument.getChild('OuterFunctionCall'))
|
|
3084
|
+
continue;
|
|
3085
|
+
var name_2 = this.nodeText(identifier).toLowerCase();
|
|
3086
|
+
if (aliases.has(name_2)) {
|
|
3087
|
+
this.pushSemanticDiagnostic(identifier, "duplicate eval subquery \"".concat(name_2, "\""), "eval-alias-duplicate:".concat(identifier.from));
|
|
3088
|
+
continue;
|
|
3089
|
+
}
|
|
3090
|
+
aliases.add(name_2);
|
|
3091
|
+
}
|
|
3092
|
+
}
|
|
3093
|
+
catch (e_24_1) { e_24 = { error: e_24_1 }; }
|
|
3094
|
+
finally {
|
|
3095
|
+
try {
|
|
3096
|
+
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
|
|
3097
|
+
}
|
|
3098
|
+
finally { if (e_24) throw e_24.error; }
|
|
3099
|
+
}
|
|
3100
|
+
var expression = body.getChild('EvalArgItem');
|
|
3101
|
+
if (!expression)
|
|
3102
|
+
return;
|
|
3103
|
+
try {
|
|
3104
|
+
for (var _f = __values(this.descendantsNamed(expression, 'EvalFieldReference')), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
3105
|
+
var reference = _g.value;
|
|
3106
|
+
var alias = reference.getChild('Identifier');
|
|
3107
|
+
if (!alias)
|
|
3108
|
+
continue;
|
|
3109
|
+
var name_3 = this.nodeText(alias).toLowerCase();
|
|
3110
|
+
if (!aliases.has(name_3)) {
|
|
3111
|
+
this.pushSemanticDiagnostic(alias, "unknown eval subquery \"".concat(name_3, "\" in field reference"), "eval-field:".concat(reference.from));
|
|
3112
|
+
}
|
|
3113
|
+
}
|
|
3114
|
+
}
|
|
3115
|
+
catch (e_25_1) { e_25 = { error: e_25_1 }; }
|
|
3116
|
+
finally {
|
|
3117
|
+
try {
|
|
3118
|
+
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
|
3119
|
+
}
|
|
3120
|
+
finally { if (e_25) throw e_25.error; }
|
|
3121
|
+
}
|
|
3122
|
+
if (aliases.size > 1) {
|
|
3123
|
+
try {
|
|
3124
|
+
for (var _h = __values(this.descendantsNamed(expression, 'EvalAtom')), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
3125
|
+
var atom = _j.value;
|
|
3126
|
+
var identifier = atom.getChild('Identifier');
|
|
3127
|
+
if (!identifier)
|
|
3128
|
+
continue;
|
|
3129
|
+
var name_4 = this.nodeText(identifier).toLowerCase();
|
|
3130
|
+
if (!aliases.has(name_4)) {
|
|
3131
|
+
this.pushSemanticDiagnostic(identifier, "unknown eval subquery \"".concat(name_4, "\" in expression"), "eval-alias:".concat(identifier.from));
|
|
3132
|
+
}
|
|
3133
|
+
}
|
|
3134
|
+
}
|
|
3135
|
+
catch (e_26_1) { e_26 = { error: e_26_1 }; }
|
|
3136
|
+
finally {
|
|
3137
|
+
try {
|
|
3138
|
+
if (_j && !_j.done && (_c = _h.return)) _c.call(_h);
|
|
3139
|
+
}
|
|
3140
|
+
finally { if (e_26) throw e_26.error; }
|
|
3141
|
+
}
|
|
3142
|
+
}
|
|
3143
|
+
};
|
|
2721
3144
|
Parser.prototype.checkDuplicateShowClauses = function (show) {
|
|
2722
3145
|
var seen = new Set();
|
|
2723
3146
|
var child = show.firstChild;
|
|
@@ -2839,12 +3262,44 @@ var Parser = /** @class */ (function () {
|
|
|
2839
3262
|
}
|
|
2840
3263
|
};
|
|
2841
3264
|
Parser.prototype.checkFunctionCall = function (call) {
|
|
3265
|
+
var _a;
|
|
2842
3266
|
var identifier = call.getChild('FunctionIdentifier');
|
|
2843
|
-
var body = call.getChild('FunctionCallBody');
|
|
3267
|
+
var body = (_a = call.getChild('FunctionCallBody')) !== null && _a !== void 0 ? _a : call.getChild('EvalFunctionCallBody');
|
|
2844
3268
|
if (!identifier || !body)
|
|
2845
3269
|
return;
|
|
2846
3270
|
var name = this.nodeText(identifier).toLowerCase();
|
|
2847
|
-
var
|
|
3271
|
+
var argumentName = body.name === 'EvalFunctionCallBody' ? 'EvalFunctionArg' : 'ArgItem';
|
|
3272
|
+
var args = this.directChildren(body, argumentName);
|
|
3273
|
+
var arity = documentedFunctionArities.get(name);
|
|
3274
|
+
if (arity && (args.length < arity.min || args.length > arity.max)) {
|
|
3275
|
+
this.pushSemanticDiagnostic(body, this.functionArityMessage(name, arity), "function-arity:".concat(call.from));
|
|
3276
|
+
return;
|
|
3277
|
+
}
|
|
3278
|
+
if ((name === 'count_filter' || name === 'distinct_by_collapse') && args.length === 2 && !args[1].getChild('InValue')) {
|
|
3279
|
+
this.pushSemanticDiagnostic(args[1], "function \"".concat(name, "\" expects a value list as its second argument"), "function:".concat(call.from));
|
|
3280
|
+
return;
|
|
3281
|
+
}
|
|
3282
|
+
if (name === 'histogram_quantile' && args.length === 2) {
|
|
3283
|
+
var quantile = this.numericValue(args[1]);
|
|
3284
|
+
if (quantile === null || quantile < 0 || quantile > 1) {
|
|
3285
|
+
this.pushSemanticDiagnostic(args[1], 'function "histogram_quantile" expects a quantile in range [0, 1]', "function:".concat(call.from));
|
|
3286
|
+
return;
|
|
3287
|
+
}
|
|
3288
|
+
}
|
|
3289
|
+
if (name === 'drain' && args.length >= 2) {
|
|
3290
|
+
var threshold = this.numericValue(args[1]);
|
|
3291
|
+
if (threshold === null || threshold <= 0 || threshold > 1) {
|
|
3292
|
+
this.pushSemanticDiagnostic(args[1], 'function "drain" expects a similarity threshold in range (0, 1]', "function:".concat(call.from));
|
|
3293
|
+
return;
|
|
3294
|
+
}
|
|
3295
|
+
if (args.length === 3) {
|
|
3296
|
+
var maxClusters = this.numericValue(args[2]);
|
|
3297
|
+
if (maxClusters === null || !Number.isInteger(maxClusters) || maxClusters < 1 || maxClusters > 10000) {
|
|
3298
|
+
this.pushSemanticDiagnostic(args[2], 'function "drain" expects max_clusters to be an integer in range [1, 10000]', "function:".concat(call.from));
|
|
3299
|
+
return;
|
|
3300
|
+
}
|
|
3301
|
+
}
|
|
3302
|
+
}
|
|
2848
3303
|
if (name === 'ewma') {
|
|
2849
3304
|
var alpha = args.length === 2 ? this.numericValue(args[1]) : null;
|
|
2850
3305
|
if (alpha === null || alpha <= 0 || alpha > 1) {
|
|
@@ -2873,6 +3328,17 @@ var Parser = /** @class */ (function () {
|
|
|
2873
3328
|
this.pushSemanticDiagnostic(body, "function \"".concat(name, "\" expects exactly one input field"), "function:".concat(call.from));
|
|
2874
3329
|
}
|
|
2875
3330
|
};
|
|
3331
|
+
Parser.prototype.functionArityMessage = function (name, arity) {
|
|
3332
|
+
if (arity.min === arity.max) {
|
|
3333
|
+
if (arity.min === 0)
|
|
3334
|
+
return "function \"".concat(name, "\" does not accept arguments");
|
|
3335
|
+
return "function \"".concat(name, "\" expects exactly ").concat(arity.min, " ").concat(arity.min === 1 ? 'argument' : 'arguments');
|
|
3336
|
+
}
|
|
3337
|
+
if (!Number.isFinite(arity.max)) {
|
|
3338
|
+
return "function \"".concat(name, "\" expects at least ").concat(arity.min, " ").concat(arity.min === 1 ? 'argument' : 'arguments');
|
|
3339
|
+
}
|
|
3340
|
+
return "function \"".concat(name, "\" expects between ").concat(arity.min, " and ").concat(arity.max, " arguments");
|
|
3341
|
+
};
|
|
2876
3342
|
Parser.prototype.checkOuterFunctionCall = function (call) {
|
|
2877
3343
|
var identifier = call.firstChild;
|
|
2878
3344
|
if (!identifier || identifier.name === 'FunctionIdentifier')
|
|
@@ -2971,11 +3437,36 @@ var Parser = /** @class */ (function () {
|
|
|
2971
3437
|
this.pushSemanticDiagnostic(field, 'field names containing "-" must be enclosed in backticks', "field-name:".concat(field.from));
|
|
2972
3438
|
}
|
|
2973
3439
|
};
|
|
2974
|
-
Parser.prototype.checkCaseFunction = function (
|
|
3440
|
+
Parser.prototype.checkCaseFunction = function (call) {
|
|
3441
|
+
var caseExpr = this.findAncestor(call.parent, 'CaseExpr');
|
|
3442
|
+
if (!caseExpr)
|
|
3443
|
+
return;
|
|
3444
|
+
var shiftExpr = this.findAncestor(call.parent, 'ShiftExpr');
|
|
3445
|
+
if (shiftExpr && shiftExpr.from >= caseExpr.from && shiftExpr.to <= caseExpr.to)
|
|
3446
|
+
return;
|
|
3447
|
+
var identifier = call.getChild('FunctionIdentifier');
|
|
3448
|
+
var body = call.getChild('FunctionCallBody');
|
|
3449
|
+
if (!identifier || !body)
|
|
3450
|
+
return;
|
|
2975
3451
|
var name = this.nodeText(identifier).toLowerCase();
|
|
2976
|
-
|
|
2977
|
-
|
|
2978
|
-
|
|
3452
|
+
var args = this.directChildren(body, 'ArgItem');
|
|
3453
|
+
var arity = documentedFunctionArities.get(name);
|
|
3454
|
+
if (arity && (args.length < arity.min || args.length > arity.max))
|
|
3455
|
+
return;
|
|
3456
|
+
if (caseScalarFunctions.has(name))
|
|
3457
|
+
return;
|
|
3458
|
+
if (stableShiftAggregateFunctions.has(name) && this.caseContainsShift(caseExpr))
|
|
3459
|
+
return;
|
|
3460
|
+
this.pushSemanticDiagnostic(identifier, "function \"".concat(name, "\" is not supported inside CASE"), "case-function:".concat(identifier.from));
|
|
3461
|
+
};
|
|
3462
|
+
Parser.prototype.caseContainsShift = function (caseExpr) {
|
|
3463
|
+
var key = this.nodeRangeKey(caseExpr);
|
|
3464
|
+
var cached = this.caseShiftPresence.get(key);
|
|
3465
|
+
if (cached !== undefined)
|
|
3466
|
+
return cached;
|
|
3467
|
+
var containsShift = this.containsNode(caseExpr, 'ShiftExpr');
|
|
3468
|
+
this.caseShiftPresence.set(key, containsShift);
|
|
3469
|
+
return containsShift;
|
|
2979
3470
|
};
|
|
2980
3471
|
Parser.prototype.checkCaseResults = function (caseExpr) {
|
|
2981
3472
|
var clause = caseExpr.firstChild;
|
|
@@ -3002,6 +3493,10 @@ var Parser = /** @class */ (function () {
|
|
|
3002
3493
|
var hasFrom = /\bfrom\s*=/.test(bodyText.toLowerCase());
|
|
3003
3494
|
var filter = show.getChild('FilterClause');
|
|
3004
3495
|
var hasSourceFilter = Boolean(filter && /@__source__/.test(this.maskStringsAndLineComments(this.nodeText(filter))));
|
|
3496
|
+
if (/^show_[a-z0-9]+_index$/.test(name)) {
|
|
3497
|
+
this.pushSemanticDiagnostic(identifier, "\"".concat(name, "\" is not supported by the DQL parser"), "show:".concat(show.from, ":unsupported"));
|
|
3498
|
+
return;
|
|
3499
|
+
}
|
|
3005
3500
|
if ((name === 'show_tag_value' || name === 'show_tag_value_cardinality' || name === 'show_series_count_by_tag_value') && !hasKeyin) {
|
|
3006
3501
|
this.pushSemanticDiagnostic(identifier, "\"".concat(name, "\" requires the named argument \"keyin\""), "show:".concat(show.from, ":keyin"));
|
|
3007
3502
|
}
|
|
@@ -3028,13 +3523,106 @@ var Parser = /** @class */ (function () {
|
|
|
3028
3523
|
}
|
|
3029
3524
|
return children;
|
|
3030
3525
|
};
|
|
3526
|
+
Parser.prototype.descendantsNamed = function (node, name) {
|
|
3527
|
+
var descendants = [];
|
|
3528
|
+
var visit = function (current) {
|
|
3529
|
+
var child = current.firstChild;
|
|
3530
|
+
while (child) {
|
|
3531
|
+
if (child.name === name)
|
|
3532
|
+
descendants.push(child);
|
|
3533
|
+
visit(child);
|
|
3534
|
+
child = child.nextSibling;
|
|
3535
|
+
}
|
|
3536
|
+
};
|
|
3537
|
+
visit(node);
|
|
3538
|
+
return descendants;
|
|
3539
|
+
};
|
|
3540
|
+
Parser.prototype.shiftOperandFunctionCalls = function (operand) {
|
|
3541
|
+
var querySource = operand.getChild('QuerySource');
|
|
3542
|
+
if (!querySource)
|
|
3543
|
+
return this.descendantsNamed(operand, 'FunctionCall');
|
|
3544
|
+
var query = querySource.getChild('Query');
|
|
3545
|
+
if (!query)
|
|
3546
|
+
return [];
|
|
3547
|
+
var calls = [];
|
|
3548
|
+
var clause = query.firstChild;
|
|
3549
|
+
while (clause) {
|
|
3550
|
+
if (clause.name === 'QueryClause') {
|
|
3551
|
+
var target = clause.getChild('TargetClause');
|
|
3552
|
+
if (target)
|
|
3553
|
+
calls.push.apply(calls, __spreadArray([], __read(this.descendantsNamed(target, 'FunctionCall')), false));
|
|
3554
|
+
}
|
|
3555
|
+
clause = clause.nextSibling;
|
|
3556
|
+
}
|
|
3557
|
+
return calls;
|
|
3558
|
+
};
|
|
3559
|
+
Parser.prototype.errorDescendantsWithText = function (node, text) {
|
|
3560
|
+
var _this = this;
|
|
3561
|
+
var errors = [];
|
|
3562
|
+
var expected = text.toLowerCase();
|
|
3563
|
+
var visit = function (current) {
|
|
3564
|
+
var child = current.firstChild;
|
|
3565
|
+
while (child) {
|
|
3566
|
+
if (child.type.isError && _this.nodeText(child).toLowerCase() === expected)
|
|
3567
|
+
errors.push(child);
|
|
3568
|
+
visit(child);
|
|
3569
|
+
child = child.nextSibling;
|
|
3570
|
+
}
|
|
3571
|
+
};
|
|
3572
|
+
visit(node);
|
|
3573
|
+
return errors;
|
|
3574
|
+
};
|
|
3575
|
+
Parser.prototype.functionCallName = function (call) {
|
|
3576
|
+
var identifier = call.getChild('FunctionIdentifier');
|
|
3577
|
+
return identifier ? this.nodeText(identifier).toLowerCase() : null;
|
|
3578
|
+
};
|
|
3579
|
+
Parser.prototype.isPositiveFixedDuration = function (text) {
|
|
3580
|
+
var milliseconds = this.fixedDurationMilliseconds(text);
|
|
3581
|
+
return milliseconds !== null && milliseconds > 0;
|
|
3582
|
+
};
|
|
3583
|
+
Parser.prototype.fixedDurationMilliseconds = function (text) {
|
|
3584
|
+
var multipliers = {
|
|
3585
|
+
y: 365 * 24 * 60 * 60 * 1000,
|
|
3586
|
+
w: 7 * 24 * 60 * 60 * 1000,
|
|
3587
|
+
d: 24 * 60 * 60 * 1000,
|
|
3588
|
+
h: 60 * 60 * 1000,
|
|
3589
|
+
m: 60 * 1000,
|
|
3590
|
+
s: 1000,
|
|
3591
|
+
ms: 1,
|
|
3592
|
+
};
|
|
3593
|
+
var normalized = text.toLowerCase();
|
|
3594
|
+
var pattern = /(\d+)(ms|[ywdhms])/g;
|
|
3595
|
+
var total = 0;
|
|
3596
|
+
var consumed = 0;
|
|
3597
|
+
var part = pattern.exec(normalized);
|
|
3598
|
+
while (part) {
|
|
3599
|
+
if (part.index !== consumed)
|
|
3600
|
+
return null;
|
|
3601
|
+
var amount = Number(part[1]);
|
|
3602
|
+
var component = amount * multipliers[part[2]];
|
|
3603
|
+
if (!Number.isSafeInteger(amount) || !Number.isSafeInteger(component) || !Number.isSafeInteger(total + component))
|
|
3604
|
+
return null;
|
|
3605
|
+
total += component;
|
|
3606
|
+
consumed = pattern.lastIndex;
|
|
3607
|
+
part = pattern.exec(normalized);
|
|
3608
|
+
}
|
|
3609
|
+
return consumed === normalized.length ? total : null;
|
|
3610
|
+
};
|
|
3031
3611
|
Parser.prototype.numericValue = function (node) {
|
|
3032
3612
|
if (!node)
|
|
3033
3613
|
return null;
|
|
3034
|
-
var
|
|
3614
|
+
var valueNode = node;
|
|
3615
|
+
if (node.name === 'EvalFunctionArg') {
|
|
3616
|
+
var expression = node.getChild('EvalExpression');
|
|
3617
|
+
var atom = expression === null || expression === void 0 ? void 0 : expression.firstChild;
|
|
3618
|
+
if (!expression || (atom === null || atom === void 0 ? void 0 : atom.name) !== 'EvalAtom' || atom.nextSibling)
|
|
3619
|
+
return null;
|
|
3620
|
+
valueNode = atom;
|
|
3621
|
+
}
|
|
3622
|
+
var number = valueNode.name === 'Number' ? valueNode : valueNode.getChild('Number');
|
|
3035
3623
|
if (!number)
|
|
3036
3624
|
return null;
|
|
3037
|
-
var sign =
|
|
3625
|
+
var sign = valueNode.name !== 'Number' && valueNode.getChild('Sub') ? -1 : 1;
|
|
3038
3626
|
var value = sign * Number(this.nodeText(number).replace(/_/g, ''));
|
|
3039
3627
|
return Number.isFinite(value) ? value : null;
|
|
3040
3628
|
};
|
|
@@ -3083,10 +3671,10 @@ var Parser = /** @class */ (function () {
|
|
|
3083
3671
|
var functionPattern = /\b([A-Za-z_][A-Za-z0-9_-]*)\s*\(/g;
|
|
3084
3672
|
var match = functionPattern.exec(text);
|
|
3085
3673
|
while (match) {
|
|
3086
|
-
var
|
|
3674
|
+
var name_5 = match[1];
|
|
3087
3675
|
var nameFrom = context.from + match.index;
|
|
3088
3676
|
if (!this.containsFunctionCallStartingAt(context, nameFrom)) {
|
|
3089
|
-
return this.makeDiagnosticAt(nameFrom, nameFrom +
|
|
3677
|
+
return this.makeDiagnosticAt(nameFrom, nameFrom + name_5.length, "unknown function \"".concat(name_5, "\""), "unknown-function:".concat(context.from, ":").concat(nameFrom));
|
|
3090
3678
|
}
|
|
3091
3679
|
match = functionPattern.exec(text);
|
|
3092
3680
|
}
|