@steedos/odata-v4-parser 2.2.53-beta.3

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/lib/query.js ADDED
@@ -0,0 +1,903 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Query = void 0;
4
+ var utils_1 = require("./utils");
5
+ var lexer_1 = require("./lexer");
6
+ var primitiveLiteral_1 = require("./primitiveLiteral");
7
+ var nameOrIdentifier_1 = require("./nameOrIdentifier");
8
+ var expressions_1 = require("./expressions");
9
+ var Query;
10
+ (function (Query) {
11
+ function queryOptions(value, index, metadataContext) {
12
+ var token = Query.queryOption(value, index, metadataContext);
13
+ if (!token)
14
+ return;
15
+ var start = index;
16
+ index = token.next;
17
+ var options = [];
18
+ while (token) {
19
+ options.push(token);
20
+ // &
21
+ if (value[index] !== 0x26)
22
+ break;
23
+ index++;
24
+ token = Query.queryOption(value, index, metadataContext);
25
+ if (!token)
26
+ return;
27
+ index = token.next;
28
+ }
29
+ return lexer_1.default.tokenize(value, start, index, { options: options }, lexer_1.default.TokenType.QueryOptions);
30
+ }
31
+ Query.queryOptions = queryOptions;
32
+ function queryOption(value, index, metadataContext) {
33
+ return Query.systemQueryOption(value, index, metadataContext) ||
34
+ Query.aliasAndValue(value, index) ||
35
+ Query.customQueryOption(value, index);
36
+ }
37
+ Query.queryOption = queryOption;
38
+ function systemQueryOption(value, index, metadataContext) {
39
+ return Query.expand(value, index, metadataContext) ||
40
+ Query.filter(value, index) ||
41
+ Query.format(value, index) ||
42
+ Query.id(value, index) ||
43
+ Query.inlinecount(value, index) ||
44
+ Query.orderby(value, index) ||
45
+ Query.search(value, index) ||
46
+ Query.select(value, index) ||
47
+ Query.skip(value, index) ||
48
+ Query.skiptoken(value, index) ||
49
+ Query.top(value, index);
50
+ }
51
+ Query.systemQueryOption = systemQueryOption;
52
+ function customQueryOption(value, index) {
53
+ var key = nameOrIdentifier_1.default.odataIdentifier(value, index);
54
+ if (!key)
55
+ return;
56
+ var start = index;
57
+ index = key.next;
58
+ var eq = lexer_1.default.EQ(value, index);
59
+ if (!eq)
60
+ return;
61
+ index = eq;
62
+ while (value[index] !== 0x26 && index < value.length)
63
+ index++;
64
+ if (index === eq)
65
+ return;
66
+ return lexer_1.default.tokenize(value, start, index, { key: key.raw, value: utils_1.default.stringify(value, eq, index) }, lexer_1.default.TokenType.CustomQueryOption);
67
+ }
68
+ Query.customQueryOption = customQueryOption;
69
+ function id(value, index) {
70
+ var start = index;
71
+ if (utils_1.default.equals(value, index, "%24id")) {
72
+ index += 5;
73
+ }
74
+ else if (utils_1.default.equals(value, index, "$id")) {
75
+ index += 3;
76
+ }
77
+ else
78
+ return;
79
+ var eq = lexer_1.default.EQ(value, index);
80
+ if (!eq)
81
+ return;
82
+ index = eq;
83
+ while (value[index] !== 0x26 && index < value.length)
84
+ index++;
85
+ if (index === eq)
86
+ return;
87
+ return lexer_1.default.tokenize(value, start, index, utils_1.default.stringify(value, eq, index), lexer_1.default.TokenType.Id);
88
+ }
89
+ Query.id = id;
90
+ function expand(value, index, metadataContext) {
91
+ var start = index;
92
+ if (utils_1.default.equals(value, index, "%24expand")) {
93
+ index += 9;
94
+ }
95
+ else if (utils_1.default.equals(value, index, "$expand")) {
96
+ index += 7;
97
+ }
98
+ else
99
+ return;
100
+ var eq = lexer_1.default.EQ(value, index);
101
+ if (!eq)
102
+ return;
103
+ index = eq;
104
+ var items = [];
105
+ var token = Query.expandItem(value, index, metadataContext);
106
+ if (!token)
107
+ return;
108
+ index = token.next;
109
+ while (token) {
110
+ items.push(token);
111
+ var comma = lexer_1.default.COMMA(value, index);
112
+ if (comma) {
113
+ index = comma;
114
+ token = Query.expandItem(value, index, metadataContext);
115
+ if (!token)
116
+ return;
117
+ index = token.next;
118
+ }
119
+ else
120
+ break;
121
+ }
122
+ return lexer_1.default.tokenize(value, start, index, { items: items }, lexer_1.default.TokenType.Expand);
123
+ }
124
+ Query.expand = expand;
125
+ function expandItem(value, index, metadataContext) {
126
+ var start = index;
127
+ var star = lexer_1.default.STAR(value, index);
128
+ if (star) {
129
+ index = star;
130
+ var ref_1 = expressions_1.default.refExpr(value, index);
131
+ if (ref_1) {
132
+ index = ref_1.next;
133
+ return lexer_1.default.tokenize(value, start, index, { path: "*", ref: ref_1 }, lexer_1.default.TokenType.ExpandItem);
134
+ }
135
+ else {
136
+ var open = lexer_1.default.OPEN(value, index);
137
+ if (open) {
138
+ index = open;
139
+ var token = Query.levels(value, index);
140
+ if (!token)
141
+ return;
142
+ index = token.next;
143
+ var close = lexer_1.default.CLOSE(value, index);
144
+ if (!close)
145
+ return;
146
+ index = close;
147
+ return lexer_1.default.tokenize(value, start, index, { path: "*", levels: token }, lexer_1.default.TokenType.ExpandItem);
148
+ }
149
+ }
150
+ }
151
+ var path = Query.expandPath(value, index, metadataContext);
152
+ if (!path)
153
+ return;
154
+ index = path.next;
155
+ var tokenValue = { path: path };
156
+ var ref = expressions_1.default.refExpr(value, index);
157
+ if (ref) {
158
+ index = ref.next;
159
+ tokenValue.ref = ref;
160
+ var open = lexer_1.default.OPEN(value, index);
161
+ if (open) {
162
+ index = open;
163
+ var option = Query.expandRefOption(value, index);
164
+ if (!option)
165
+ return;
166
+ var refOptions = [];
167
+ while (option) {
168
+ refOptions.push(option);
169
+ index = option.next;
170
+ var semi = lexer_1.default.SEMI(value, index);
171
+ if (semi) {
172
+ index = semi;
173
+ option = Query.expandRefOption(value, index);
174
+ if (!option)
175
+ return;
176
+ }
177
+ else
178
+ break;
179
+ }
180
+ var close = lexer_1.default.CLOSE(value, index);
181
+ if (!close)
182
+ return;
183
+ index = close;
184
+ tokenValue.options = refOptions;
185
+ }
186
+ }
187
+ else {
188
+ var count = expressions_1.default.countExpr(value, index);
189
+ if (count) {
190
+ index = count.next;
191
+ tokenValue.count = count;
192
+ var open = lexer_1.default.OPEN(value, index);
193
+ if (open) {
194
+ index = open;
195
+ var option = Query.expandCountOption(value, index);
196
+ if (!option)
197
+ return;
198
+ var countOptions = [];
199
+ while (option) {
200
+ countOptions.push(option);
201
+ index = option.next;
202
+ var semi = lexer_1.default.SEMI(value, index);
203
+ if (semi) {
204
+ index = semi;
205
+ option = Query.expandCountOption(value, index);
206
+ if (!option)
207
+ return;
208
+ }
209
+ else
210
+ break;
211
+ }
212
+ var close = lexer_1.default.CLOSE(value, index);
213
+ if (!close)
214
+ return;
215
+ index = close;
216
+ tokenValue.options = countOptions;
217
+ }
218
+ }
219
+ else {
220
+ var open = lexer_1.default.OPEN(value, index);
221
+ if (open) {
222
+ index = open;
223
+ var option = Query.expandOption(value, index);
224
+ if (!option)
225
+ return;
226
+ var options = [];
227
+ while (option) {
228
+ options.push(option);
229
+ index = option.next;
230
+ var semi = lexer_1.default.SEMI(value, index);
231
+ if (semi) {
232
+ index = semi;
233
+ option = Query.expandOption(value, index);
234
+ if (!option)
235
+ return;
236
+ }
237
+ else
238
+ break;
239
+ }
240
+ var close = lexer_1.default.CLOSE(value, index);
241
+ if (!close)
242
+ return;
243
+ index = close;
244
+ tokenValue.options = options;
245
+ }
246
+ }
247
+ }
248
+ return lexer_1.default.tokenize(value, start, index, tokenValue, lexer_1.default.TokenType.ExpandItem);
249
+ }
250
+ Query.expandItem = expandItem;
251
+ function expandCountOption(value, index) {
252
+ return Query.filter(value, index) ||
253
+ Query.search(value, index);
254
+ }
255
+ Query.expandCountOption = expandCountOption;
256
+ function expandRefOption(value, index) {
257
+ return Query.expandCountOption(value, index) ||
258
+ Query.orderby(value, index) ||
259
+ Query.skip(value, index) ||
260
+ Query.top(value, index) ||
261
+ Query.inlinecount(value, index);
262
+ }
263
+ Query.expandRefOption = expandRefOption;
264
+ function expandOption(value, index) {
265
+ return Query.expandRefOption(value, index) ||
266
+ Query.select(value, index) ||
267
+ Query.expand(value, index) ||
268
+ Query.levels(value, index);
269
+ }
270
+ Query.expandOption = expandOption;
271
+ function expandPath(value, index, metadataContext) {
272
+ var start = index;
273
+ var path = [];
274
+ var token = nameOrIdentifier_1.default.qualifiedEntityTypeName(value, index, metadataContext) ||
275
+ nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index, metadataContext);
276
+ if (token) {
277
+ index = token.next;
278
+ path.push(token);
279
+ if (value[index] !== 0x2f)
280
+ return;
281
+ index++;
282
+ metadataContext = token.value.metadata;
283
+ delete token.value.metadata;
284
+ }
285
+ var complex = nameOrIdentifier_1.default.complexProperty(value, index, metadataContext) ||
286
+ nameOrIdentifier_1.default.complexColProperty(value, index, metadataContext);
287
+ while (complex) {
288
+ if (value[complex.next] === 0x2f) {
289
+ index = complex.next + 1;
290
+ path.push(complex);
291
+ var complexTypeName = nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index, metadataContext);
292
+ if (complexTypeName) {
293
+ if (value[complexTypeName.next] === 0x2f) {
294
+ index = complexTypeName.next + 1;
295
+ path.push(complexTypeName);
296
+ }
297
+ metadataContext = complexTypeName.value.metadata;
298
+ delete complexTypeName.value.metadata;
299
+ }
300
+ complex = nameOrIdentifier_1.default.complexProperty(value, index, metadataContext) ||
301
+ nameOrIdentifier_1.default.complexColProperty(value, index, metadataContext);
302
+ }
303
+ else
304
+ break;
305
+ }
306
+ var nav = nameOrIdentifier_1.default.navigationProperty(value, index, metadataContext);
307
+ if (!nav)
308
+ return;
309
+ index = nav.next;
310
+ path.push(nav);
311
+ metadataContext = nav.metadata;
312
+ delete nav.metadata;
313
+ if (value[index] === 0x2f) {
314
+ var typeName = nameOrIdentifier_1.default.qualifiedEntityTypeName(value, index + 1, metadataContext);
315
+ if (typeName) {
316
+ index = typeName.next;
317
+ path.push(typeName);
318
+ metadataContext = typeName.value.metadata;
319
+ delete typeName.value.metadata;
320
+ }
321
+ }
322
+ return lexer_1.default.tokenize(value, start, index, path, lexer_1.default.TokenType.ExpandPath);
323
+ }
324
+ Query.expandPath = expandPath;
325
+ function search(value, index) {
326
+ var start = index;
327
+ if (utils_1.default.equals(value, index, "%24search")) {
328
+ index += 9;
329
+ }
330
+ else if (utils_1.default.equals(value, index, "$search")) {
331
+ index += 7;
332
+ }
333
+ else
334
+ return;
335
+ var eq = lexer_1.default.EQ(value, index);
336
+ if (!eq)
337
+ return;
338
+ index = eq;
339
+ var expr = Query.searchExpr(value, index);
340
+ if (!expr)
341
+ return;
342
+ index = expr.next;
343
+ return lexer_1.default.tokenize(value, start, index, expr, lexer_1.default.TokenType.Search);
344
+ }
345
+ Query.search = search;
346
+ function searchExpr(value, index) {
347
+ var token = Query.searchParenExpr(value, index) ||
348
+ Query.searchTerm(value, index);
349
+ if (!token)
350
+ return;
351
+ index = token.next;
352
+ var expr = Query.searchAndExpr(value, index) ||
353
+ Query.searchOrExpr(value, index);
354
+ if (expr) {
355
+ var left = lexer_1.default.clone(token);
356
+ token.next = expr.value.next;
357
+ token.value = {
358
+ left: left,
359
+ right: expr.value
360
+ };
361
+ token.type = expr.type;
362
+ token.raw = utils_1.default.stringify(value, token.position, token.next);
363
+ if (token.type === lexer_1.default.TokenType.SearchAndExpression && token.value.right.type === lexer_1.default.TokenType.SearchOrExpression) {
364
+ token.value.left = lexer_1.default.tokenize(value, token.value.left.position, token.value.right.value.left.next, {
365
+ left: token.value.left,
366
+ right: token.value.right.value.left
367
+ }, token.type);
368
+ token.type = token.value.right.type;
369
+ token.value.right = token.value.right.value.right;
370
+ }
371
+ }
372
+ return token;
373
+ }
374
+ Query.searchExpr = searchExpr;
375
+ function searchTerm(value, index) {
376
+ return Query.searchNotExpr(value, index) ||
377
+ Query.searchPhrase(value, index) ||
378
+ Query.searchWord(value, index);
379
+ }
380
+ Query.searchTerm = searchTerm;
381
+ function searchNotExpr(value, index) {
382
+ var rws = lexer_1.default.RWS(value, index);
383
+ if (!utils_1.default.equals(value, rws, "NOT"))
384
+ return;
385
+ var start = index;
386
+ index = rws + 3;
387
+ rws = lexer_1.default.RWS(value, index);
388
+ if (rws === index)
389
+ return;
390
+ index = rws;
391
+ var expr = Query.searchPhrase(value, index) ||
392
+ Query.searchWord(value, index);
393
+ if (!expr)
394
+ return;
395
+ index = expr.next;
396
+ return lexer_1.default.tokenize(value, start, index, expr, lexer_1.default.TokenType.SearchNotExpression);
397
+ }
398
+ Query.searchNotExpr = searchNotExpr;
399
+ function searchOrExpr(value, index) {
400
+ var rws = lexer_1.default.RWS(value, index);
401
+ if (rws === index || !utils_1.default.equals(value, rws, "OR"))
402
+ return;
403
+ var start = index;
404
+ index = rws + 2;
405
+ rws = lexer_1.default.RWS(value, index);
406
+ if (rws === index)
407
+ return;
408
+ index = rws;
409
+ var token = Query.searchExpr(value, index);
410
+ if (!token)
411
+ return;
412
+ index = token.next;
413
+ return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.SearchOrExpression);
414
+ }
415
+ Query.searchOrExpr = searchOrExpr;
416
+ function searchAndExpr(value, index) {
417
+ var rws = lexer_1.default.RWS(value, index);
418
+ if (rws === index || !utils_1.default.equals(value, rws, "AND"))
419
+ return;
420
+ var start = index;
421
+ index = rws + 3;
422
+ rws = lexer_1.default.RWS(value, index);
423
+ if (rws === index)
424
+ return;
425
+ index = rws;
426
+ var token = Query.searchExpr(value, index);
427
+ if (!token)
428
+ return;
429
+ index = token.next;
430
+ return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.SearchAndExpression);
431
+ }
432
+ Query.searchAndExpr = searchAndExpr;
433
+ function searchPhrase(value, index) {
434
+ var mark = lexer_1.default.quotationMark(value, index);
435
+ if (mark === index)
436
+ return;
437
+ var start = index;
438
+ index = mark;
439
+ var valueStart = index;
440
+ var ch = lexer_1.default.qcharNoAMPDQUOTE(value, index);
441
+ while (ch > index && !lexer_1.default.OPEN(value, index) && !lexer_1.default.CLOSE(value, index)) {
442
+ index = ch;
443
+ ch = lexer_1.default.qcharNoAMPDQUOTE(value, index);
444
+ }
445
+ var valueEnd = index;
446
+ mark = lexer_1.default.quotationMark(value, index);
447
+ if (!mark)
448
+ return;
449
+ index = mark;
450
+ return lexer_1.default.tokenize(value, start, index, utils_1.default.stringify(value, valueStart, valueEnd), lexer_1.default.TokenType.SearchPhrase);
451
+ }
452
+ Query.searchPhrase = searchPhrase;
453
+ function searchWord(value, index) {
454
+ var next = utils_1.default.required(value, index, lexer_1.default.ALPHA, 1);
455
+ if (!next)
456
+ return;
457
+ var start = index;
458
+ index = next;
459
+ var token = lexer_1.default.tokenize(value, start, index, null, lexer_1.default.TokenType.SearchWord);
460
+ token.value = token.raw;
461
+ return token;
462
+ }
463
+ Query.searchWord = searchWord;
464
+ function searchParenExpr(value, index) {
465
+ var open = lexer_1.default.OPEN(value, index);
466
+ if (!open)
467
+ return;
468
+ var start = index;
469
+ index = open;
470
+ index = lexer_1.default.BWS(value, index);
471
+ var expr = Query.searchExpr(value, index);
472
+ if (!expr)
473
+ return;
474
+ index = expr.next;
475
+ index = lexer_1.default.BWS(value, index);
476
+ var close = lexer_1.default.CLOSE(value, index);
477
+ if (!close)
478
+ return;
479
+ index = close;
480
+ return lexer_1.default.tokenize(value, start, index, expr, lexer_1.default.TokenType.SearchParenExpression);
481
+ }
482
+ Query.searchParenExpr = searchParenExpr;
483
+ function levels(value, index) {
484
+ var start = index;
485
+ if (utils_1.default.equals(value, index, "%24levels")) {
486
+ index += 9;
487
+ }
488
+ else if (utils_1.default.equals(value, index, "$levels")) {
489
+ index += 7;
490
+ }
491
+ else
492
+ return;
493
+ var eq = lexer_1.default.EQ(value, index);
494
+ if (!eq)
495
+ return;
496
+ index = eq;
497
+ var level;
498
+ if (utils_1.default.equals(value, index, "max")) {
499
+ level = "max";
500
+ index += 3;
501
+ }
502
+ else {
503
+ var token = primitiveLiteral_1.default.int32Value(value, index);
504
+ if (!token)
505
+ return;
506
+ level = token.raw;
507
+ index = token.next;
508
+ }
509
+ return lexer_1.default.tokenize(value, start, index, level, lexer_1.default.TokenType.Levels);
510
+ }
511
+ Query.levels = levels;
512
+ function filter(value, index) {
513
+ var start = index;
514
+ if (utils_1.default.equals(value, index, "%24filter")) {
515
+ index += 9;
516
+ }
517
+ else if (utils_1.default.equals(value, index, "$filter")) {
518
+ index += 7;
519
+ }
520
+ else
521
+ return;
522
+ var eq = lexer_1.default.EQ(value, index);
523
+ if (!eq)
524
+ return;
525
+ index = eq;
526
+ var expr = expressions_1.default.boolCommonExpr(value, index);
527
+ if (!expr)
528
+ return;
529
+ index = expr.next;
530
+ return lexer_1.default.tokenize(value, start, index, expr, lexer_1.default.TokenType.Filter);
531
+ }
532
+ Query.filter = filter;
533
+ function orderby(value, index) {
534
+ var start = index;
535
+ if (utils_1.default.equals(value, index, "%24orderby")) {
536
+ index += 10;
537
+ }
538
+ else if (utils_1.default.equals(value, index, "$orderby")) {
539
+ index += 8;
540
+ }
541
+ else
542
+ return;
543
+ var eq = lexer_1.default.EQ(value, index);
544
+ if (!eq)
545
+ return;
546
+ index = eq;
547
+ var items = [];
548
+ var token = Query.orderbyItem(value, index);
549
+ if (!token)
550
+ return;
551
+ index = token.next;
552
+ while (token) {
553
+ items.push(token);
554
+ var comma = lexer_1.default.COMMA(value, index);
555
+ if (comma) {
556
+ index = comma;
557
+ token = Query.orderbyItem(value, index);
558
+ if (!token)
559
+ return;
560
+ index = token.next;
561
+ }
562
+ else
563
+ break;
564
+ }
565
+ return lexer_1.default.tokenize(value, start, index, { items: items }, lexer_1.default.TokenType.OrderBy);
566
+ }
567
+ Query.orderby = orderby;
568
+ function orderbyItem(value, index) {
569
+ var expr = expressions_1.default.commonExpr(value, index);
570
+ if (!expr)
571
+ return;
572
+ var start = index;
573
+ index = expr.next;
574
+ var direction = 1;
575
+ var rws = lexer_1.default.RWS(value, index);
576
+ if (rws > index) {
577
+ index = rws;
578
+ if (utils_1.default.equals(value, index, "asc"))
579
+ index += 3;
580
+ else if (utils_1.default.equals(value, index, "desc")) {
581
+ index += 4;
582
+ direction = -1;
583
+ }
584
+ else
585
+ return;
586
+ }
587
+ return lexer_1.default.tokenize(value, start, index, { expr: expr, direction: direction }, lexer_1.default.TokenType.OrderByItem);
588
+ }
589
+ Query.orderbyItem = orderbyItem;
590
+ function skip(value, index) {
591
+ var start = index;
592
+ if (utils_1.default.equals(value, index, "%24skip")) {
593
+ index += 7;
594
+ }
595
+ else if (utils_1.default.equals(value, index, "$skip")) {
596
+ index += 5;
597
+ }
598
+ else
599
+ return;
600
+ var eq = lexer_1.default.EQ(value, index);
601
+ if (!eq)
602
+ return;
603
+ index = eq;
604
+ var token = primitiveLiteral_1.default.int32Value(value, index);
605
+ if (!token)
606
+ return;
607
+ index = token.next;
608
+ return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.Skip);
609
+ }
610
+ Query.skip = skip;
611
+ function top(value, index) {
612
+ var start = index;
613
+ if (utils_1.default.equals(value, index, "%24top")) {
614
+ index += 6;
615
+ }
616
+ else if (utils_1.default.equals(value, index, "$top")) {
617
+ index += 4;
618
+ }
619
+ else
620
+ return;
621
+ var eq = lexer_1.default.EQ(value, index);
622
+ if (!eq)
623
+ return;
624
+ index = eq;
625
+ var token = primitiveLiteral_1.default.int32Value(value, index);
626
+ if (!token)
627
+ return;
628
+ index = token.next;
629
+ return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.Top);
630
+ }
631
+ Query.top = top;
632
+ function format(value, index) {
633
+ var start = index;
634
+ if (utils_1.default.equals(value, index, "%24format")) {
635
+ index += 9;
636
+ }
637
+ else if (utils_1.default.equals(value, index, "$format")) {
638
+ index += 7;
639
+ }
640
+ else
641
+ return;
642
+ var eq = lexer_1.default.EQ(value, index);
643
+ if (!eq)
644
+ return;
645
+ index = eq;
646
+ var format;
647
+ if (utils_1.default.equals(value, index, "atom")) {
648
+ format = "atom";
649
+ index += 4;
650
+ }
651
+ else if (utils_1.default.equals(value, index, "json")) {
652
+ format = "json";
653
+ index += 4;
654
+ }
655
+ else if (utils_1.default.equals(value, index, "xml")) {
656
+ format = "xml";
657
+ index += 3;
658
+ }
659
+ if (format)
660
+ return lexer_1.default.tokenize(value, start, index, { format: format }, lexer_1.default.TokenType.Format);
661
+ }
662
+ Query.format = format;
663
+ function inlinecount(value, index) {
664
+ var start = index;
665
+ if (utils_1.default.equals(value, index, "%24count")) {
666
+ index += 8;
667
+ }
668
+ else if (utils_1.default.equals(value, index, "$count")) {
669
+ index += 6;
670
+ }
671
+ else
672
+ return;
673
+ var eq = lexer_1.default.EQ(value, index);
674
+ if (!eq)
675
+ return;
676
+ index = eq;
677
+ var token = primitiveLiteral_1.default.booleanValue(value, index);
678
+ if (!token)
679
+ return;
680
+ index = token.next;
681
+ return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.InlineCount);
682
+ }
683
+ Query.inlinecount = inlinecount;
684
+ function select(value, index) {
685
+ var start = index;
686
+ if (utils_1.default.equals(value, index, "%24select")) {
687
+ index += 9;
688
+ }
689
+ else if (utils_1.default.equals(value, index, "$select")) {
690
+ index += 7;
691
+ }
692
+ else
693
+ return;
694
+ var eq = lexer_1.default.EQ(value, index);
695
+ if (!eq)
696
+ return;
697
+ index = eq;
698
+ var items = [];
699
+ var token = Query.selectItem(value, index);
700
+ if (!token)
701
+ return;
702
+ while (token) {
703
+ items.push(token);
704
+ index = token.next;
705
+ var comma = lexer_1.default.COMMA(value, index);
706
+ if (comma) {
707
+ index = comma;
708
+ token = Query.selectItem(value, index);
709
+ if (!token)
710
+ return;
711
+ }
712
+ else
713
+ break;
714
+ }
715
+ return lexer_1.default.tokenize(value, start, index, { items: items }, lexer_1.default.TokenType.Select);
716
+ }
717
+ Query.select = select;
718
+ function selectItem(value, index) {
719
+ var start = index;
720
+ var item;
721
+ var op = Query.allOperationsInSchema(value, index);
722
+ var star = lexer_1.default.STAR(value, index);
723
+ if (op > index) {
724
+ item = { namespace: utils_1.default.stringify(value, index, op - 2), value: "*" };
725
+ index = op;
726
+ }
727
+ else if (star) {
728
+ item = { value: "*" };
729
+ index = star;
730
+ }
731
+ else {
732
+ item = {};
733
+ var name = nameOrIdentifier_1.default.qualifiedEntityTypeName(value, index) ||
734
+ nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index);
735
+ if (name && value[name.next] !== 0x2f)
736
+ return;
737
+ else if (name && value[name.next] === 0x2f) {
738
+ index++;
739
+ item.name = name;
740
+ }
741
+ var select_1 = Query.selectProperty(value, index) ||
742
+ Query.qualifiedActionName(value, index) ||
743
+ Query.qualifiedFunctionName(value, index);
744
+ if (!select_1)
745
+ return;
746
+ index = select_1.next;
747
+ item = name ? { name: name, select: select_1 } : select_1;
748
+ }
749
+ if (index > start)
750
+ return lexer_1.default.tokenize(value, start, index, item, lexer_1.default.TokenType.SelectItem);
751
+ }
752
+ Query.selectItem = selectItem;
753
+ function allOperationsInSchema(value, index) {
754
+ var namespaceNext = nameOrIdentifier_1.default.namespace(value, index);
755
+ var star = lexer_1.default.STAR(value, namespaceNext + 1);
756
+ if (namespaceNext > index && value[namespaceNext] === 0x2e && star)
757
+ return star;
758
+ return index;
759
+ }
760
+ Query.allOperationsInSchema = allOperationsInSchema;
761
+ function selectProperty(value, index) {
762
+ var token = Query.selectPath(value, index) ||
763
+ nameOrIdentifier_1.default.primitiveProperty(value, index) ||
764
+ nameOrIdentifier_1.default.primitiveColProperty(value, index) ||
765
+ nameOrIdentifier_1.default.navigationProperty(value, index);
766
+ if (!token)
767
+ return;
768
+ var start = index;
769
+ index = token.next;
770
+ if (token.type === lexer_1.default.TokenType.SelectPath) {
771
+ if (value[index] === 0x2f) {
772
+ index++;
773
+ var prop = Query.selectProperty(value, index);
774
+ if (!prop)
775
+ return;
776
+ var path = lexer_1.default.clone(token);
777
+ token.next = prop.next;
778
+ token.raw = utils_1.default.stringify(value, start, token.next);
779
+ token.value = { path: path, next: prop };
780
+ }
781
+ }
782
+ return token;
783
+ }
784
+ Query.selectProperty = selectProperty;
785
+ function selectPath(value, index) {
786
+ var token = nameOrIdentifier_1.default.complexProperty(value, index) ||
787
+ nameOrIdentifier_1.default.complexColProperty(value, index);
788
+ if (!token)
789
+ return;
790
+ var start = index;
791
+ index = token.next;
792
+ var tokenValue = token;
793
+ if (value[index] === 0x2f) {
794
+ var name = nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index + 1);
795
+ if (name) {
796
+ index = name.next;
797
+ tokenValue = { prop: token, name: name };
798
+ }
799
+ }
800
+ return lexer_1.default.tokenize(value, start, index, tokenValue, lexer_1.default.TokenType.SelectPath);
801
+ }
802
+ Query.selectPath = selectPath;
803
+ function qualifiedActionName(value, index) {
804
+ var namespaceNext = nameOrIdentifier_1.default.namespace(value, index);
805
+ if (namespaceNext === index || value[namespaceNext] !== 0x2e)
806
+ return;
807
+ var start = index;
808
+ index = namespaceNext + 1;
809
+ var action = nameOrIdentifier_1.default.action(value, index);
810
+ if (!action)
811
+ return;
812
+ action.value.namespace = utils_1.default.stringify(value, start, namespaceNext);
813
+ return lexer_1.default.tokenize(value, start, action.next, action, lexer_1.default.TokenType.Action);
814
+ }
815
+ Query.qualifiedActionName = qualifiedActionName;
816
+ function qualifiedFunctionName(value, index) {
817
+ var namespaceNext = nameOrIdentifier_1.default.namespace(value, index);
818
+ if (namespaceNext === index || value[namespaceNext] !== 0x2e)
819
+ return;
820
+ var start = index;
821
+ index = namespaceNext + 1;
822
+ var fn = nameOrIdentifier_1.default.odataFunction(value, index);
823
+ if (!fn)
824
+ return;
825
+ fn.value.namespace = utils_1.default.stringify(value, start, namespaceNext);
826
+ index = fn.next;
827
+ var tokenValue = { name: fn };
828
+ var open = lexer_1.default.OPEN(value, index);
829
+ if (open) {
830
+ index = open;
831
+ tokenValue.parameters = [];
832
+ var param = expressions_1.default.parameterName(value, index);
833
+ if (!param)
834
+ return;
835
+ while (param) {
836
+ index = param.next;
837
+ tokenValue.parameters.push(param);
838
+ var comma = lexer_1.default.COMMA(value, index);
839
+ if (comma) {
840
+ index = comma;
841
+ var param_1 = expressions_1.default.parameterName(value, index);
842
+ if (!param_1)
843
+ return;
844
+ }
845
+ else
846
+ break;
847
+ }
848
+ var close = lexer_1.default.CLOSE(value, index);
849
+ if (!close)
850
+ return;
851
+ index = close;
852
+ }
853
+ return lexer_1.default.tokenize(value, start, index, tokenValue, lexer_1.default.TokenType.Function);
854
+ }
855
+ Query.qualifiedFunctionName = qualifiedFunctionName;
856
+ function skiptoken(value, index) {
857
+ var start = index;
858
+ if (utils_1.default.equals(value, index, "%24skiptoken")) {
859
+ index += 12;
860
+ }
861
+ else if (utils_1.default.equals(value, index, "$skiptoken")) {
862
+ index += 10;
863
+ }
864
+ else
865
+ return;
866
+ var eq = lexer_1.default.EQ(value, index);
867
+ if (!eq)
868
+ return;
869
+ index = eq;
870
+ var ch = lexer_1.default.qcharNoAMP(value, index);
871
+ if (!ch)
872
+ return;
873
+ var valueStart = index;
874
+ while (ch > index) {
875
+ index = ch;
876
+ ch = lexer_1.default.qcharNoAMP(value, index);
877
+ }
878
+ return lexer_1.default.tokenize(value, start, index, utils_1.default.stringify(value, valueStart, index), lexer_1.default.TokenType.SkipToken);
879
+ }
880
+ Query.skiptoken = skiptoken;
881
+ function aliasAndValue(value, index) {
882
+ var alias = expressions_1.default.parameterAlias(value, index);
883
+ if (!alias)
884
+ return;
885
+ var start = index;
886
+ index = alias.next;
887
+ var eq = lexer_1.default.EQ(value, index);
888
+ if (!eq)
889
+ return;
890
+ index = eq;
891
+ var paramValue = expressions_1.default.parameterValue(value, index);
892
+ if (!paramValue)
893
+ return;
894
+ index = paramValue.next;
895
+ return lexer_1.default.tokenize(value, start, index, {
896
+ alias: alias,
897
+ value: paramValue
898
+ }, lexer_1.default.TokenType.AliasAndValue);
899
+ }
900
+ Query.aliasAndValue = aliasAndValue;
901
+ })(Query = exports.Query || (exports.Query = {}));
902
+ exports.default = Query;
903
+ //# sourceMappingURL=query.js.map