vtlengine 1.1rc2__py3-none-any.whl → 1.2.0__py3-none-any.whl
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.
Potentially problematic release.
This version of vtlengine might be problematic. Click here for more details.
- vtlengine/API/_InternalApi.py +288 -29
- vtlengine/API/__init__.py +277 -70
- vtlengine/AST/ASTComment.py +56 -0
- vtlengine/AST/ASTConstructor.py +71 -18
- vtlengine/AST/ASTConstructorModules/Expr.py +197 -75
- vtlengine/AST/ASTConstructorModules/ExprComponents.py +81 -38
- vtlengine/AST/ASTConstructorModules/Terminals.py +76 -31
- vtlengine/AST/ASTConstructorModules/__init__.py +50 -0
- vtlengine/AST/ASTEncoders.py +4 -0
- vtlengine/AST/ASTString.py +622 -0
- vtlengine/AST/ASTTemplate.py +28 -2
- vtlengine/AST/DAG/__init__.py +44 -6
- vtlengine/AST/DAG/_words.py +1 -0
- vtlengine/AST/Grammar/Vtl.g4 +7 -7
- vtlengine/AST/Grammar/lexer.py +19759 -1112
- vtlengine/AST/Grammar/parser.py +17996 -3199
- vtlengine/AST/__init__.py +127 -14
- vtlengine/Exceptions/messages.py +14 -2
- vtlengine/Interpreter/__init__.py +90 -11
- vtlengine/Model/__init__.py +9 -4
- vtlengine/Operators/Aggregation.py +13 -6
- vtlengine/Operators/Analytic.py +19 -13
- vtlengine/Operators/CastOperator.py +5 -2
- vtlengine/Operators/Clause.py +26 -18
- vtlengine/Operators/Comparison.py +3 -1
- vtlengine/Operators/Conditional.py +40 -18
- vtlengine/Operators/General.py +3 -1
- vtlengine/Operators/HROperators.py +3 -1
- vtlengine/Operators/Join.py +4 -2
- vtlengine/Operators/Time.py +22 -15
- vtlengine/Operators/Validation.py +5 -2
- vtlengine/Operators/__init__.py +15 -8
- vtlengine/Utils/__Virtual_Assets.py +34 -0
- vtlengine/Utils/__init__.py +49 -0
- vtlengine/__init__.py +4 -2
- vtlengine/files/parser/__init__.py +16 -26
- vtlengine/files/parser/_rfc_dialect.py +1 -1
- vtlengine/py.typed +0 -0
- vtlengine-1.2.0.dist-info/METADATA +92 -0
- vtlengine-1.2.0.dist-info/RECORD +63 -0
- {vtlengine-1.1rc2.dist-info → vtlengine-1.2.0.dist-info}/WHEEL +1 -1
- vtlengine-1.1rc2.dist-info/METADATA +0 -248
- vtlengine-1.1rc2.dist-info/RECORD +0 -59
- {vtlengine-1.1rc2.dist-info → vtlengine-1.2.0.dist-info}/LICENSE.md +0 -0
|
@@ -20,6 +20,7 @@ from vtlengine.AST import (
|
|
|
20
20
|
MulOp,
|
|
21
21
|
ParamConstant,
|
|
22
22
|
ParamOp,
|
|
23
|
+
ParFunction,
|
|
23
24
|
RegularAggregation,
|
|
24
25
|
RenameNode,
|
|
25
26
|
TimeAggregation,
|
|
@@ -29,6 +30,7 @@ from vtlengine.AST import (
|
|
|
29
30
|
VarID,
|
|
30
31
|
Windowing,
|
|
31
32
|
)
|
|
33
|
+
from vtlengine.AST.ASTConstructorModules import extract_token_info
|
|
32
34
|
from vtlengine.AST.ASTConstructorModules.ExprComponents import ExprComp
|
|
33
35
|
from vtlengine.AST.ASTConstructorModules.Terminals import Terminals
|
|
34
36
|
from vtlengine.AST.ASTDataExchange import de_ruleset_elements
|
|
@@ -116,7 +118,12 @@ class Expr(VtlVisitor):
|
|
|
116
118
|
then_op_node = self.visitExpr(ctx_list[3])
|
|
117
119
|
else_op_node = self.visitExpr(ctx_list[5])
|
|
118
120
|
|
|
119
|
-
if_node = If(
|
|
121
|
+
if_node = If(
|
|
122
|
+
condition=condition_node,
|
|
123
|
+
thenOp=then_op_node,
|
|
124
|
+
elseOp=else_op_node,
|
|
125
|
+
**extract_token_info(ctx),
|
|
126
|
+
)
|
|
120
127
|
|
|
121
128
|
return if_node
|
|
122
129
|
|
|
@@ -132,10 +139,12 @@ class Expr(VtlVisitor):
|
|
|
132
139
|
for i in range(0, len(ctx_list), 4):
|
|
133
140
|
condition = self.visitExpr(ctx_list[i + 1])
|
|
134
141
|
thenOp = self.visitExpr(ctx_list[i + 3])
|
|
135
|
-
case_obj = CaseObj(
|
|
142
|
+
case_obj = CaseObj(
|
|
143
|
+
condition=condition, thenOp=thenOp, **extract_token_info(ctx_list[i + 1])
|
|
144
|
+
)
|
|
136
145
|
cases.append(case_obj)
|
|
137
146
|
|
|
138
|
-
case_node = Case(cases, else_node)
|
|
147
|
+
case_node = Case(cases=cases, elseOp=else_node, **extract_token_info(ctx))
|
|
139
148
|
|
|
140
149
|
return case_node
|
|
141
150
|
|
|
@@ -159,8 +168,8 @@ class Expr(VtlVisitor):
|
|
|
159
168
|
else:
|
|
160
169
|
op = ctx_list[1].getSymbol().text
|
|
161
170
|
right_node = self.visitExpr(ctx_list[2])
|
|
162
|
-
|
|
163
|
-
bin_op_node = BinOp(left_node, op, right_node)
|
|
171
|
+
token_info = extract_token_info(ctx)
|
|
172
|
+
bin_op_node = BinOp(left=left_node, op=op, right=right_node, **token_info)
|
|
164
173
|
|
|
165
174
|
return bin_op_node
|
|
166
175
|
|
|
@@ -184,7 +193,7 @@ class Expr(VtlVisitor):
|
|
|
184
193
|
right_node = Terminals().visitValueDomainID(ctx_list[2])
|
|
185
194
|
else:
|
|
186
195
|
raise NotImplementedError
|
|
187
|
-
bin_op_node = BinOp(left_node, op, right_node)
|
|
196
|
+
bin_op_node = BinOp(left=left_node, op=op, right=right_node, **extract_token_info(ctx))
|
|
188
197
|
|
|
189
198
|
return bin_op_node
|
|
190
199
|
|
|
@@ -192,14 +201,15 @@ class Expr(VtlVisitor):
|
|
|
192
201
|
return self.bin_op_creator(ctx)
|
|
193
202
|
|
|
194
203
|
def visitParenthesisExpr(self, ctx: Parser.ParenthesisExprContext):
|
|
195
|
-
|
|
204
|
+
operand = self.visitExpr(list(ctx.getChildren())[1])
|
|
205
|
+
return ParFunction(operand=operand, **extract_token_info(ctx))
|
|
196
206
|
|
|
197
207
|
def visitUnaryExpr(self, ctx: Parser.UnaryExprContext):
|
|
198
208
|
c_list = list(ctx.getChildren())
|
|
199
209
|
op = c_list[0].getSymbol().text
|
|
200
210
|
right = self.visitExpr(c_list[1])
|
|
201
211
|
|
|
202
|
-
return UnaryOp(op, right)
|
|
212
|
+
return UnaryOp(op=op, operand=right, **extract_token_info(ctx))
|
|
203
213
|
|
|
204
214
|
def visitMembershipExpr(self, ctx: Parser.MembershipExprContext):
|
|
205
215
|
ctx_list = list(ctx.getChildren())
|
|
@@ -215,7 +225,10 @@ class Expr(VtlVisitor):
|
|
|
215
225
|
# It is only possible to put a membership at the end so go the last one.
|
|
216
226
|
if len(membership) != 0:
|
|
217
227
|
previous_node = BinOp(
|
|
218
|
-
previous_node,
|
|
228
|
+
left=previous_node,
|
|
229
|
+
op="#",
|
|
230
|
+
right=Terminals().visitSimpleComponentId(membership[0]),
|
|
231
|
+
**extract_token_info(ctx),
|
|
219
232
|
)
|
|
220
233
|
|
|
221
234
|
return previous_node
|
|
@@ -316,8 +329,10 @@ class Expr(VtlVisitor):
|
|
|
316
329
|
|
|
317
330
|
body_node = self.visitJoinBody(ctx_list[3])
|
|
318
331
|
|
|
332
|
+
token_info = extract_token_info(ctx)
|
|
333
|
+
|
|
319
334
|
if len(body_node) != 0:
|
|
320
|
-
previous_node = JoinOp(op_node, clause_node, using_node)
|
|
335
|
+
previous_node = JoinOp(op=op_node, clauses=clause_node, using=using_node, **token_info)
|
|
321
336
|
regular_aggregation = None
|
|
322
337
|
for body in body_node:
|
|
323
338
|
regular_aggregation = body
|
|
@@ -330,7 +345,7 @@ class Expr(VtlVisitor):
|
|
|
330
345
|
return regular_aggregation
|
|
331
346
|
|
|
332
347
|
else:
|
|
333
|
-
join_node = JoinOp(op_node, clause_node, using_node)
|
|
348
|
+
join_node = JoinOp(op=op_node, clauses=clause_node, using=using_node, **token_info)
|
|
334
349
|
join_node.isLast = True
|
|
335
350
|
return join_node
|
|
336
351
|
|
|
@@ -340,9 +355,14 @@ class Expr(VtlVisitor):
|
|
|
340
355
|
if len(ctx_list) == 1:
|
|
341
356
|
return left_node
|
|
342
357
|
|
|
358
|
+
token_info = extract_token_info(ctx)
|
|
343
359
|
intop_node = ctx_list[1].getSymbol().text
|
|
344
|
-
right_node = Identifier(
|
|
345
|
-
|
|
360
|
+
right_node = Identifier(
|
|
361
|
+
value=Terminals().visitAlias(ctx_list[2]),
|
|
362
|
+
kind="DatasetID",
|
|
363
|
+
**extract_token_info(ctx_list[1].getSymbol()),
|
|
364
|
+
)
|
|
365
|
+
return BinOp(left=left_node, op=intop_node, right=right_node, **token_info)
|
|
346
366
|
|
|
347
367
|
def visitJoinClause(self, ctx: Parser.JoinClauseContext):
|
|
348
368
|
"""
|
|
@@ -419,7 +439,7 @@ class Expr(VtlVisitor):
|
|
|
419
439
|
op_node = ctx_list[0].getSymbol().text
|
|
420
440
|
operand_nodes = [self.visitExpr(ctx_list[1])]
|
|
421
441
|
|
|
422
|
-
return RegularAggregation(op_node, operand_nodes)
|
|
442
|
+
return RegularAggregation(op=op_node, children=operand_nodes, **extract_token_info(ctx))
|
|
423
443
|
|
|
424
444
|
"""
|
|
425
445
|
-----------------------------------
|
|
@@ -451,7 +471,7 @@ class Expr(VtlVisitor):
|
|
|
451
471
|
if isinstance(element, Parser.ParameterContext)
|
|
452
472
|
]
|
|
453
473
|
|
|
454
|
-
return UDOCall(op=op, params=param_nodes)
|
|
474
|
+
return UDOCall(op=op, params=param_nodes, **extract_token_info(ctx))
|
|
455
475
|
|
|
456
476
|
def visitEvalAtom(self, ctx: Parser.EvalAtomContext):
|
|
457
477
|
"""
|
|
@@ -499,6 +519,7 @@ class Expr(VtlVisitor):
|
|
|
499
519
|
operands=children_nodes,
|
|
500
520
|
output=output_node[0],
|
|
501
521
|
language=language_name[0].getSymbol().text,
|
|
522
|
+
**extract_token_info(ctx),
|
|
502
523
|
)
|
|
503
524
|
|
|
504
525
|
def visitCastExprDataset(self, ctx: Parser.CastExprDatasetContext):
|
|
@@ -528,7 +549,11 @@ class Expr(VtlVisitor):
|
|
|
528
549
|
|
|
529
550
|
if len(ctx_list) > 6:
|
|
530
551
|
param_node = [
|
|
531
|
-
ParamConstant(
|
|
552
|
+
ParamConstant(
|
|
553
|
+
type_="PARAM_CAST",
|
|
554
|
+
value=str_.symbol.text.strip('"'),
|
|
555
|
+
**extract_token_info(str_.getSymbol()),
|
|
556
|
+
)
|
|
532
557
|
for str_ in ctx_list
|
|
533
558
|
if isinstance(str_, TerminalNodeImpl)
|
|
534
559
|
and str_.getSymbol().type == Parser.STRING_CONSTANT
|
|
@@ -539,7 +564,9 @@ class Expr(VtlVisitor):
|
|
|
539
564
|
if len(basic_scalar_type) == 1:
|
|
540
565
|
children_nodes = expr_node + basic_scalar_type
|
|
541
566
|
|
|
542
|
-
return ParamOp(
|
|
567
|
+
return ParamOp(
|
|
568
|
+
op=op, children=children_nodes, params=param_node, **extract_token_info(ctx)
|
|
569
|
+
)
|
|
543
570
|
|
|
544
571
|
else:
|
|
545
572
|
# AST_ASTCONSTRUCTOR.14
|
|
@@ -552,7 +579,9 @@ class Expr(VtlVisitor):
|
|
|
552
579
|
if isinstance(c, Parser.ExprContext):
|
|
553
580
|
return self.visitExpr(c)
|
|
554
581
|
elif isinstance(c, TerminalNodeImpl):
|
|
555
|
-
return ID(
|
|
582
|
+
return ID(
|
|
583
|
+
type_="OPTIONAL", value=c.getSymbol().text, **extract_token_info(c.getSymbol())
|
|
584
|
+
)
|
|
556
585
|
else:
|
|
557
586
|
raise NotImplementedError
|
|
558
587
|
|
|
@@ -581,7 +610,7 @@ class Expr(VtlVisitor):
|
|
|
581
610
|
token = c.getSymbol()
|
|
582
611
|
op_node = token.text
|
|
583
612
|
operand_node = self.visitExpr(ctx_list[2])
|
|
584
|
-
return UnaryOp(op_node, operand_node)
|
|
613
|
+
return UnaryOp(op=op_node, operand=operand_node, **extract_token_info(ctx))
|
|
585
614
|
|
|
586
615
|
def visitSubstrAtom(self, ctx: Parser.SubstrAtomContext):
|
|
587
616
|
ctx_list = list(ctx.getChildren())
|
|
@@ -602,7 +631,9 @@ class Expr(VtlVisitor):
|
|
|
602
631
|
for param in params:
|
|
603
632
|
params_nodes.append(self.visitOptionalExpr(param))
|
|
604
633
|
|
|
605
|
-
return ParamOp(
|
|
634
|
+
return ParamOp(
|
|
635
|
+
op=op_node, children=children_nodes, params=params_nodes, **extract_token_info(ctx)
|
|
636
|
+
)
|
|
606
637
|
|
|
607
638
|
def visitReplaceAtom(self, ctx: Parser.ReplaceAtomContext):
|
|
608
639
|
ctx_list = list(ctx.getChildren())
|
|
@@ -623,7 +654,9 @@ class Expr(VtlVisitor):
|
|
|
623
654
|
children_nodes = [expressions[0]]
|
|
624
655
|
params_nodes = [expressions[1]] + params
|
|
625
656
|
|
|
626
|
-
return ParamOp(
|
|
657
|
+
return ParamOp(
|
|
658
|
+
op=op_node, children=children_nodes, params=params_nodes, **extract_token_info(ctx)
|
|
659
|
+
)
|
|
627
660
|
|
|
628
661
|
def visitInstrAtom(self, ctx: Parser.InstrAtomContext):
|
|
629
662
|
ctx_list = list(ctx.getChildren())
|
|
@@ -644,7 +677,9 @@ class Expr(VtlVisitor):
|
|
|
644
677
|
children_nodes = [expressions[0]]
|
|
645
678
|
params_nodes = [expressions[1]] + params
|
|
646
679
|
|
|
647
|
-
return ParamOp(
|
|
680
|
+
return ParamOp(
|
|
681
|
+
op=op_node, children=children_nodes, params=params_nodes, **extract_token_info(ctx)
|
|
682
|
+
)
|
|
648
683
|
|
|
649
684
|
"""
|
|
650
685
|
-----------------------------------
|
|
@@ -669,7 +704,7 @@ class Expr(VtlVisitor):
|
|
|
669
704
|
token = c.getSymbol()
|
|
670
705
|
op_node = token.text
|
|
671
706
|
operand_node = self.visitExpr(ctx_list[2])
|
|
672
|
-
return UnaryOp(op_node, operand_node)
|
|
707
|
+
return UnaryOp(op=op_node, operand=operand_node, **extract_token_info(ctx))
|
|
673
708
|
|
|
674
709
|
def visitUnaryWithOptionalNumeric(self, ctx: Parser.UnaryWithOptionalNumericContext):
|
|
675
710
|
ctx_list = list(ctx.getChildren())
|
|
@@ -690,7 +725,9 @@ class Expr(VtlVisitor):
|
|
|
690
725
|
for param in params:
|
|
691
726
|
params_nodes.append(self.visitOptionalExpr(param))
|
|
692
727
|
|
|
693
|
-
return ParamOp(
|
|
728
|
+
return ParamOp(
|
|
729
|
+
op=op_node, children=children_nodes, params=params_nodes, **extract_token_info(ctx)
|
|
730
|
+
)
|
|
694
731
|
|
|
695
732
|
def visitBinaryNumeric(self, ctx: Parser.BinaryNumericContext):
|
|
696
733
|
ctx_list = list(ctx.getChildren())
|
|
@@ -701,7 +738,7 @@ class Expr(VtlVisitor):
|
|
|
701
738
|
left_node = self.visitExpr(ctx_list[2])
|
|
702
739
|
op_node = token.text
|
|
703
740
|
right_node = self.visitExpr(ctx_list[4])
|
|
704
|
-
return BinOp(left_node, op_node, right_node)
|
|
741
|
+
return BinOp(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
|
|
705
742
|
|
|
706
743
|
"""
|
|
707
744
|
-----------------------------------
|
|
@@ -734,7 +771,7 @@ class Expr(VtlVisitor):
|
|
|
734
771
|
for children in childrens:
|
|
735
772
|
children_nodes.append(self.visitExpr(children))
|
|
736
773
|
|
|
737
|
-
return MulOp(op_node, children_nodes)
|
|
774
|
+
return MulOp(op=op_node, children=children_nodes, **extract_token_info(ctx))
|
|
738
775
|
|
|
739
776
|
def visitCharsetMatchAtom(self, ctx: Parser.CharsetMatchAtomContext):
|
|
740
777
|
ctx_list = list(ctx.getChildren())
|
|
@@ -744,7 +781,7 @@ class Expr(VtlVisitor):
|
|
|
744
781
|
left_node = self.visitExpr(ctx_list[2])
|
|
745
782
|
op_node = token.text
|
|
746
783
|
right_node = self.visitExpr(ctx_list[4])
|
|
747
|
-
return BinOp(left_node, op_node, right_node)
|
|
784
|
+
return BinOp(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
|
|
748
785
|
|
|
749
786
|
def visitIsNullAtom(self, ctx: Parser.IsNullAtomContext):
|
|
750
787
|
ctx_list = list(ctx.getChildren())
|
|
@@ -752,7 +789,7 @@ class Expr(VtlVisitor):
|
|
|
752
789
|
token = c.getSymbol()
|
|
753
790
|
op_node = token.text
|
|
754
791
|
operand_node = self.visitExpr(ctx_list[2])
|
|
755
|
-
return UnaryOp(op_node, operand_node)
|
|
792
|
+
return UnaryOp(op=op_node, operand=operand_node, **extract_token_info(ctx))
|
|
756
793
|
|
|
757
794
|
def visitExistInAtom(self, ctx: Parser.ExistInAtomContext):
|
|
758
795
|
ctx_list = list(ctx.getChildren())
|
|
@@ -768,7 +805,7 @@ class Expr(VtlVisitor):
|
|
|
768
805
|
if isinstance(retain, Parser.RetainTypeContext)
|
|
769
806
|
]
|
|
770
807
|
|
|
771
|
-
return MulOp(op=op, children=operand_nodes + retain_nodes)
|
|
808
|
+
return MulOp(op=op, children=operand_nodes + retain_nodes, **extract_token_info(ctx))
|
|
772
809
|
|
|
773
810
|
"""
|
|
774
811
|
-----------------------------------
|
|
@@ -803,8 +840,8 @@ class Expr(VtlVisitor):
|
|
|
803
840
|
Parser.DayOfYearAtomContext,
|
|
804
841
|
Parser.DayToYearAtomContext,
|
|
805
842
|
Parser.DayToMonthAtomContext,
|
|
806
|
-
Parser.
|
|
807
|
-
Parser.
|
|
843
|
+
Parser.YearToDayAtomContext,
|
|
844
|
+
Parser.MonthToDayAtomContext,
|
|
808
845
|
),
|
|
809
846
|
):
|
|
810
847
|
return self.visitTimeUnaryAtom(ctx)
|
|
@@ -826,7 +863,7 @@ class Expr(VtlVisitor):
|
|
|
826
863
|
# AST_ASTCONSTRUCTOR.15
|
|
827
864
|
raise NotImplementedError
|
|
828
865
|
|
|
829
|
-
return UnaryOp(op=op, operand=operand_node[0])
|
|
866
|
+
return UnaryOp(op=op, operand=operand_node[0], **extract_token_info(ctx))
|
|
830
867
|
|
|
831
868
|
def visitTimeShiftAtom(self, ctx: Parser.TimeShiftAtomContext):
|
|
832
869
|
"""
|
|
@@ -837,9 +874,13 @@ class Expr(VtlVisitor):
|
|
|
837
874
|
|
|
838
875
|
op = c.getSymbol().text
|
|
839
876
|
left_node = self.visitExpr(ctx_list[2])
|
|
840
|
-
right_node = Constant(
|
|
877
|
+
right_node = Constant(
|
|
878
|
+
type_="INTEGER_CONSTANT",
|
|
879
|
+
value=Terminals().visitSignedInteger(ctx_list[4]),
|
|
880
|
+
**extract_token_info(ctx_list[4]),
|
|
881
|
+
)
|
|
841
882
|
|
|
842
|
-
return BinOp(left=left_node, op=op, right=right_node)
|
|
883
|
+
return BinOp(left=left_node, op=op, right=right_node, **extract_token_info(ctx))
|
|
843
884
|
|
|
844
885
|
def visitFillTimeAtom(self, ctx: Parser.FillTimeAtomContext):
|
|
845
886
|
"""
|
|
@@ -852,11 +893,19 @@ class Expr(VtlVisitor):
|
|
|
852
893
|
children_node = [self.visitExpr(ctx_list[2])]
|
|
853
894
|
|
|
854
895
|
if len(ctx_list) > 4:
|
|
855
|
-
param_constant_node = [
|
|
896
|
+
param_constant_node = [
|
|
897
|
+
ParamConstant(
|
|
898
|
+
type_="PARAM_TIMESERIES",
|
|
899
|
+
value=ctx_list[4].getSymbol().text,
|
|
900
|
+
**extract_token_info(ctx_list[4].getSymbol()),
|
|
901
|
+
)
|
|
902
|
+
]
|
|
856
903
|
else:
|
|
857
904
|
param_constant_node = []
|
|
858
905
|
|
|
859
|
-
return ParamOp(
|
|
906
|
+
return ParamOp(
|
|
907
|
+
op=op, children=children_node, params=param_constant_node, **extract_token_info(ctx)
|
|
908
|
+
)
|
|
860
909
|
|
|
861
910
|
def visitTimeAggAtom(self, ctx: Parser.TimeAggAtomContext):
|
|
862
911
|
"""
|
|
@@ -886,7 +935,7 @@ class Expr(VtlVisitor):
|
|
|
886
935
|
if isinstance(operand_node, ID):
|
|
887
936
|
operand_node = None
|
|
888
937
|
elif isinstance(operand_node, Identifier):
|
|
889
|
-
operand_node = VarID(operand_node.value)
|
|
938
|
+
operand_node = VarID(value=operand_node.value, **extract_token_info(ctx))
|
|
890
939
|
else:
|
|
891
940
|
operand_node = None
|
|
892
941
|
|
|
@@ -899,6 +948,7 @@ class Expr(VtlVisitor):
|
|
|
899
948
|
period_to=period_to,
|
|
900
949
|
period_from=period_from,
|
|
901
950
|
conf=conf,
|
|
951
|
+
**extract_token_info(ctx),
|
|
902
952
|
)
|
|
903
953
|
|
|
904
954
|
def visitFlowAtom(self, ctx: Parser.FlowAtomContext):
|
|
@@ -906,11 +956,11 @@ class Expr(VtlVisitor):
|
|
|
906
956
|
|
|
907
957
|
op_node = ctx_list[0].getSymbol().text
|
|
908
958
|
operand_node = self.visitExpr(ctx_list[2])
|
|
909
|
-
return UnaryOp(op_node, operand_node)
|
|
959
|
+
return UnaryOp(op=op_node, operand=operand_node, **extract_token_info(ctx))
|
|
910
960
|
|
|
911
961
|
def visitCurrentDateAtom(self, ctx: Parser.CurrentDateAtomContext):
|
|
912
962
|
c = list(ctx.getChildren())[0]
|
|
913
|
-
return MulOp(op=c.getSymbol().text, children=[])
|
|
963
|
+
return MulOp(op=c.getSymbol().text, children=[], **extract_token_info(ctx))
|
|
914
964
|
|
|
915
965
|
def visitTimeDiffAtom(self, ctx: Parser.TimeShiftAtomContext):
|
|
916
966
|
""" """
|
|
@@ -921,7 +971,7 @@ class Expr(VtlVisitor):
|
|
|
921
971
|
left_node = self.visitExpr(ctx_list[2])
|
|
922
972
|
right_node = self.visitExpr(ctx_list[4])
|
|
923
973
|
|
|
924
|
-
return BinOp(left=left_node, op=op, right=right_node)
|
|
974
|
+
return BinOp(left=left_node, op=op, right=right_node, **extract_token_info(ctx))
|
|
925
975
|
|
|
926
976
|
def visitTimeAddAtom(self, ctx: Parser.TimeShiftAtomContext):
|
|
927
977
|
""" """
|
|
@@ -939,7 +989,9 @@ class Expr(VtlVisitor):
|
|
|
939
989
|
if len(ctx_list) > 6:
|
|
940
990
|
param_constant_node.append(self.visitExpr(ctx_list[6]))
|
|
941
991
|
|
|
942
|
-
return ParamOp(
|
|
992
|
+
return ParamOp(
|
|
993
|
+
op=op, children=children_node, params=param_constant_node, **extract_token_info(ctx)
|
|
994
|
+
)
|
|
943
995
|
|
|
944
996
|
"""
|
|
945
997
|
-----------------------------------
|
|
@@ -962,7 +1014,7 @@ class Expr(VtlVisitor):
|
|
|
962
1014
|
left_node = self.visitExpr(ctx_list[2])
|
|
963
1015
|
op_node = token.text
|
|
964
1016
|
right_node = self.visitExpr(ctx_list[4])
|
|
965
|
-
return BinOp(left_node, op_node, right_node)
|
|
1017
|
+
return BinOp(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
|
|
966
1018
|
|
|
967
1019
|
"""
|
|
968
1020
|
-----------------------------------
|
|
@@ -991,7 +1043,9 @@ class Expr(VtlVisitor):
|
|
|
991
1043
|
self.visitExpr(expr) for expr in ctx_list if isinstance(expr, Parser.ExprContext)
|
|
992
1044
|
]
|
|
993
1045
|
|
|
994
|
-
return MulOp(
|
|
1046
|
+
return MulOp(
|
|
1047
|
+
op=ctx_list[0].getSymbol().text, children=exprs_nodes, **extract_token_info(ctx)
|
|
1048
|
+
)
|
|
995
1049
|
|
|
996
1050
|
def visitIntersectAtom(self, ctx: Parser.IntersectAtomContext):
|
|
997
1051
|
ctx_list = list(ctx.getChildren())
|
|
@@ -999,7 +1053,9 @@ class Expr(VtlVisitor):
|
|
|
999
1053
|
self.visitExpr(expr) for expr in ctx_list if isinstance(expr, Parser.ExprContext)
|
|
1000
1054
|
]
|
|
1001
1055
|
|
|
1002
|
-
return MulOp(
|
|
1056
|
+
return MulOp(
|
|
1057
|
+
op=ctx_list[0].getSymbol().text, children=exprs_nodes, **extract_token_info(ctx)
|
|
1058
|
+
)
|
|
1003
1059
|
|
|
1004
1060
|
def visitSetOrSYmDiffAtom(self, ctx: Parser.SetOrSYmDiffAtomContext):
|
|
1005
1061
|
ctx_list = list(ctx.getChildren())
|
|
@@ -1007,7 +1063,9 @@ class Expr(VtlVisitor):
|
|
|
1007
1063
|
self.visitExpr(expr) for expr in ctx_list if isinstance(expr, Parser.ExprContext)
|
|
1008
1064
|
]
|
|
1009
1065
|
|
|
1010
|
-
return MulOp(
|
|
1066
|
+
return MulOp(
|
|
1067
|
+
op=ctx_list[0].getSymbol().text, children=exprs_nodes, **extract_token_info(ctx)
|
|
1068
|
+
)
|
|
1011
1069
|
|
|
1012
1070
|
"""
|
|
1013
1071
|
-----------------------------------
|
|
@@ -1024,13 +1082,18 @@ class Expr(VtlVisitor):
|
|
|
1024
1082
|
|
|
1025
1083
|
op = c.getSymbol().text
|
|
1026
1084
|
dataset_node = self.visitExpr(ctx_list[2])
|
|
1027
|
-
rule_name_node = Identifier(
|
|
1085
|
+
rule_name_node = Identifier(
|
|
1086
|
+
value=ctx_list[4].getSymbol().text,
|
|
1087
|
+
kind="RuleID",
|
|
1088
|
+
**extract_token_info(ctx_list[4].getSymbol()),
|
|
1089
|
+
)
|
|
1028
1090
|
|
|
1029
1091
|
conditions = []
|
|
1030
1092
|
modes = "non_null"
|
|
1031
1093
|
inputs = "rule"
|
|
1032
1094
|
retains = "computed"
|
|
1033
1095
|
rule_comp = None
|
|
1096
|
+
|
|
1034
1097
|
for c in ctx_list:
|
|
1035
1098
|
if isinstance(c, Parser.ConditionClauseContext):
|
|
1036
1099
|
conditions.append(Terminals().visitConditionClause(c))
|
|
@@ -1051,9 +1114,15 @@ class Expr(VtlVisitor):
|
|
|
1051
1114
|
raise NotImplementedError("Dataset Priority input mode on HR is not implemented")
|
|
1052
1115
|
param_constant_node = []
|
|
1053
1116
|
|
|
1054
|
-
param_constant_node.append(
|
|
1055
|
-
|
|
1056
|
-
|
|
1117
|
+
param_constant_node.append(
|
|
1118
|
+
ParamConstant(type_="PARAM_MODE", value=modes, **extract_token_info(ctx))
|
|
1119
|
+
)
|
|
1120
|
+
param_constant_node.append(
|
|
1121
|
+
ParamConstant(type_="PARAM_INPUT", value=inputs, **extract_token_info(ctx))
|
|
1122
|
+
)
|
|
1123
|
+
param_constant_node.append(
|
|
1124
|
+
ParamConstant(type_="PARAM_OUTPUT", value=retains, **extract_token_info(ctx))
|
|
1125
|
+
)
|
|
1057
1126
|
|
|
1058
1127
|
if not rule_comp:
|
|
1059
1128
|
if isinstance(de_ruleset_elements[rule_name_node.value], list):
|
|
@@ -1062,7 +1131,9 @@ class Expr(VtlVisitor):
|
|
|
1062
1131
|
rule_element = de_ruleset_elements[rule_name_node.value]
|
|
1063
1132
|
if rule_element.kind == "DatasetID":
|
|
1064
1133
|
check_hierarchy_rule = rule_element.value
|
|
1065
|
-
rule_comp = Identifier(
|
|
1134
|
+
rule_comp = Identifier(
|
|
1135
|
+
value=check_hierarchy_rule, kind="ComponentID", **extract_token_info(ctx)
|
|
1136
|
+
)
|
|
1066
1137
|
else: # ValuedomainID
|
|
1067
1138
|
raise SemanticError("1-1-10-4", op=op)
|
|
1068
1139
|
|
|
@@ -1070,6 +1141,7 @@ class Expr(VtlVisitor):
|
|
|
1070
1141
|
op=op,
|
|
1071
1142
|
children=[dataset_node, rule_comp, rule_name_node, *conditions],
|
|
1072
1143
|
params=param_constant_node,
|
|
1144
|
+
**extract_token_info(ctx),
|
|
1073
1145
|
)
|
|
1074
1146
|
|
|
1075
1147
|
"""
|
|
@@ -1118,7 +1190,12 @@ class Expr(VtlVisitor):
|
|
|
1118
1190
|
if isinstance(ctx_list[-2], Parser.ValidationOutputContext):
|
|
1119
1191
|
output = Terminals().visitValidationOutput(ctx_list[-2])
|
|
1120
1192
|
|
|
1121
|
-
return ParamOp(
|
|
1193
|
+
return ParamOp(
|
|
1194
|
+
op=op,
|
|
1195
|
+
children=[operand_node, rule_name, *components],
|
|
1196
|
+
params=[output],
|
|
1197
|
+
**extract_token_info(ctx),
|
|
1198
|
+
)
|
|
1122
1199
|
|
|
1123
1200
|
# TODO Not fully implemented only basic usage available.
|
|
1124
1201
|
def visitValidateHRruleset(self, ctx: Parser.ValidateHRrulesetContext):
|
|
@@ -1132,7 +1209,11 @@ class Expr(VtlVisitor):
|
|
|
1132
1209
|
op = c.getSymbol().text
|
|
1133
1210
|
|
|
1134
1211
|
dataset_node = self.visitExpr(ctx_list[2])
|
|
1135
|
-
rule_name_node = Identifier(
|
|
1212
|
+
rule_name_node = Identifier(
|
|
1213
|
+
value=ctx_list[4].getSymbol().text,
|
|
1214
|
+
kind="RuleID",
|
|
1215
|
+
**extract_token_info(ctx_list[4].getSymbol()),
|
|
1216
|
+
)
|
|
1136
1217
|
|
|
1137
1218
|
conditions = []
|
|
1138
1219
|
# Default values
|
|
@@ -1140,6 +1221,7 @@ class Expr(VtlVisitor):
|
|
|
1140
1221
|
inputs = "dataset"
|
|
1141
1222
|
retains = "invalid"
|
|
1142
1223
|
rule_comp = None
|
|
1224
|
+
|
|
1143
1225
|
for c in ctx_list:
|
|
1144
1226
|
if isinstance(c, Parser.ConditionClauseContext):
|
|
1145
1227
|
conditions.append(Terminals().visitConditionClause(c))
|
|
@@ -1161,9 +1243,15 @@ class Expr(VtlVisitor):
|
|
|
1161
1243
|
if inputs == DATASET_PRIORITY:
|
|
1162
1244
|
raise NotImplementedError("Dataset Priority input mode on HR is not implemented")
|
|
1163
1245
|
|
|
1164
|
-
param_constant_node.append(
|
|
1165
|
-
|
|
1166
|
-
|
|
1246
|
+
param_constant_node.append(
|
|
1247
|
+
ParamConstant(type_="PARAM_MODE", value=modes, **extract_token_info(ctx))
|
|
1248
|
+
)
|
|
1249
|
+
param_constant_node.append(
|
|
1250
|
+
ParamConstant(type_="PARAM_INPUT", value=inputs, **extract_token_info(ctx))
|
|
1251
|
+
)
|
|
1252
|
+
param_constant_node.append(
|
|
1253
|
+
ParamConstant(type_="PARAM_OUTPUT", value=retains, **extract_token_info(ctx))
|
|
1254
|
+
)
|
|
1167
1255
|
|
|
1168
1256
|
if not rule_comp:
|
|
1169
1257
|
if isinstance(de_ruleset_elements[rule_name_node.value], list):
|
|
@@ -1173,7 +1261,11 @@ class Expr(VtlVisitor):
|
|
|
1173
1261
|
|
|
1174
1262
|
if rule_element.kind == "DatasetID":
|
|
1175
1263
|
check_hierarchy_rule = rule_element.value
|
|
1176
|
-
rule_comp = Identifier(
|
|
1264
|
+
rule_comp = Identifier(
|
|
1265
|
+
value=check_hierarchy_rule,
|
|
1266
|
+
kind="ComponentID",
|
|
1267
|
+
**extract_token_info(ctx),
|
|
1268
|
+
)
|
|
1177
1269
|
else: # ValuedomainID
|
|
1178
1270
|
raise SemanticError("1-1-10-4", op=op)
|
|
1179
1271
|
|
|
@@ -1181,6 +1273,7 @@ class Expr(VtlVisitor):
|
|
|
1181
1273
|
op=op,
|
|
1182
1274
|
children=[dataset_node, rule_comp, rule_name_node, *conditions],
|
|
1183
1275
|
params=param_constant_node,
|
|
1276
|
+
**extract_token_info(ctx),
|
|
1184
1277
|
)
|
|
1185
1278
|
|
|
1186
1279
|
def visitValidationSimple(self, ctx: Parser.ValidationSimpleContext):
|
|
@@ -1214,6 +1307,7 @@ class Expr(VtlVisitor):
|
|
|
1214
1307
|
error_level=error_level,
|
|
1215
1308
|
imbalance=inbalance_node,
|
|
1216
1309
|
invalid=invalid_value,
|
|
1310
|
+
**extract_token_info(ctx),
|
|
1217
1311
|
)
|
|
1218
1312
|
|
|
1219
1313
|
def visitImbalanceExpr(self, ctx: Parser.ImbalanceExprContext):
|
|
@@ -1273,6 +1367,7 @@ class Expr(VtlVisitor):
|
|
|
1273
1367
|
grouping_op=grouping_op,
|
|
1274
1368
|
grouping=group_node,
|
|
1275
1369
|
having_clause=have_node,
|
|
1370
|
+
**extract_token_info(ctx),
|
|
1276
1371
|
)
|
|
1277
1372
|
|
|
1278
1373
|
"""
|
|
@@ -1323,6 +1418,7 @@ class Expr(VtlVisitor):
|
|
|
1323
1418
|
stop=0,
|
|
1324
1419
|
start_mode="preceding",
|
|
1325
1420
|
stop_mode="current",
|
|
1421
|
+
**extract_token_info(ctx),
|
|
1326
1422
|
)
|
|
1327
1423
|
|
|
1328
1424
|
return Analytic(
|
|
@@ -1331,6 +1427,7 @@ class Expr(VtlVisitor):
|
|
|
1331
1427
|
partition_by=partition_by,
|
|
1332
1428
|
order_by=order_by,
|
|
1333
1429
|
window=window,
|
|
1430
|
+
**extract_token_info(ctx),
|
|
1334
1431
|
)
|
|
1335
1432
|
|
|
1336
1433
|
def visitLagOrLeadAn(self, ctx: Parser.LagOrLeadAnContext):
|
|
@@ -1369,6 +1466,7 @@ class Expr(VtlVisitor):
|
|
|
1369
1466
|
partition_by=partition_by,
|
|
1370
1467
|
order_by=order_by,
|
|
1371
1468
|
params=params,
|
|
1469
|
+
**extract_token_info(ctx),
|
|
1372
1470
|
)
|
|
1373
1471
|
|
|
1374
1472
|
def visitRatioToReportAn(self, ctx: Parser.RatioToReportAnContext):
|
|
@@ -1382,7 +1480,13 @@ class Expr(VtlVisitor):
|
|
|
1382
1480
|
|
|
1383
1481
|
partition_by = Terminals().visitPartitionByClause(ctx_list[5])
|
|
1384
1482
|
|
|
1385
|
-
return Analytic(
|
|
1483
|
+
return Analytic(
|
|
1484
|
+
op=op_node,
|
|
1485
|
+
operand=operand,
|
|
1486
|
+
partition_by=partition_by,
|
|
1487
|
+
order_by=order_by,
|
|
1488
|
+
**extract_token_info(ctx),
|
|
1489
|
+
)
|
|
1386
1490
|
|
|
1387
1491
|
"""______________________________________________________________________________________
|
|
1388
1492
|
|
|
@@ -1458,7 +1562,9 @@ class Expr(VtlVisitor):
|
|
|
1458
1562
|
for ctx_rename in renames:
|
|
1459
1563
|
rename_nodes.append(self.visitRenameClauseItem(ctx_rename))
|
|
1460
1564
|
|
|
1461
|
-
return RegularAggregation(
|
|
1565
|
+
return RegularAggregation(
|
|
1566
|
+
op=ctx_list[0].getSymbol().text, children=rename_nodes, **extract_token_info(ctx)
|
|
1567
|
+
)
|
|
1462
1568
|
|
|
1463
1569
|
def visitRenameClauseItem(self, ctx: Parser.RenameClauseItemContext):
|
|
1464
1570
|
"""
|
|
@@ -1474,7 +1580,7 @@ class Expr(VtlVisitor):
|
|
|
1474
1580
|
|
|
1475
1581
|
right_node = Terminals().visitVarID(ctx_list[2]).value
|
|
1476
1582
|
|
|
1477
|
-
return RenameNode(left_node, right_node)
|
|
1583
|
+
return RenameNode(old_name=left_node, new_name=right_node, **extract_token_info(ctx))
|
|
1478
1584
|
|
|
1479
1585
|
"""
|
|
1480
1586
|
-----------------------------------
|
|
@@ -1522,7 +1628,7 @@ class Expr(VtlVisitor):
|
|
|
1522
1628
|
# Cannot find another way with less lines of code
|
|
1523
1629
|
left_node.role = role
|
|
1524
1630
|
|
|
1525
|
-
return Assignment(left_node, op_node, right_node)
|
|
1631
|
+
return Assignment(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
|
|
1526
1632
|
|
|
1527
1633
|
def visitAggrClause(self, ctx: Parser.AggrClauseContext):
|
|
1528
1634
|
"""
|
|
@@ -1555,10 +1661,11 @@ class Expr(VtlVisitor):
|
|
|
1555
1661
|
grouping_op=grouping_op,
|
|
1556
1662
|
grouping=group_node,
|
|
1557
1663
|
having_clause=have_node,
|
|
1664
|
+
**extract_token_info(ctx_list[1]),
|
|
1558
1665
|
)
|
|
1559
1666
|
children.append(copy(element))
|
|
1560
1667
|
|
|
1561
|
-
return RegularAggregation(op=op_node, children=children)
|
|
1668
|
+
return RegularAggregation(op=op_node, children=children, **extract_token_info(ctx))
|
|
1562
1669
|
|
|
1563
1670
|
def visitGroupingClause(self, ctx: Parser.GroupingClauseContext):
|
|
1564
1671
|
"""
|
|
@@ -1612,7 +1719,9 @@ class Expr(VtlVisitor):
|
|
|
1612
1719
|
else:
|
|
1613
1720
|
raise NotImplementedError
|
|
1614
1721
|
|
|
1615
|
-
return ParamOp(
|
|
1722
|
+
return ParamOp(
|
|
1723
|
+
op=op_node, children=None, params=param_nodes, **extract_token_info(ctx)
|
|
1724
|
+
), expr
|
|
1616
1725
|
|
|
1617
1726
|
def visitGroupByOrExcept(self, ctx: Parser.GroupByOrExceptContext):
|
|
1618
1727
|
ctx_list = list(ctx.getChildren())
|
|
@@ -1660,7 +1769,7 @@ class Expr(VtlVisitor):
|
|
|
1660
1769
|
operand_nodes = []
|
|
1661
1770
|
operand_nodes.append(ExprComp().visitExprComponent(ctx_list[1]))
|
|
1662
1771
|
|
|
1663
|
-
return RegularAggregation(op_node, operand_nodes)
|
|
1772
|
+
return RegularAggregation(op=op_node, children=operand_nodes, **extract_token_info(ctx))
|
|
1664
1773
|
|
|
1665
1774
|
"""
|
|
1666
1775
|
-----------------------------------
|
|
@@ -1687,7 +1796,9 @@ class Expr(VtlVisitor):
|
|
|
1687
1796
|
result = self.visitCalcClauseItem(calcClauseItem)
|
|
1688
1797
|
calcClauseItems_nodes.append(result)
|
|
1689
1798
|
|
|
1690
|
-
return RegularAggregation(
|
|
1799
|
+
return RegularAggregation(
|
|
1800
|
+
op=op_node, children=calcClauseItems_nodes, **extract_token_info(ctx)
|
|
1801
|
+
)
|
|
1691
1802
|
|
|
1692
1803
|
def visitCalcClauseItem(self, ctx: Parser.CalcClauseItemContext):
|
|
1693
1804
|
"""
|
|
@@ -1702,17 +1813,25 @@ class Expr(VtlVisitor):
|
|
|
1702
1813
|
left_node = Terminals().visitComponentID(ctx_list[1])
|
|
1703
1814
|
op_node = ":="
|
|
1704
1815
|
right_node = ExprComp().visitExprComponent(ctx_list[3])
|
|
1705
|
-
operand_node = Assignment(
|
|
1816
|
+
operand_node = Assignment(
|
|
1817
|
+
left=left_node, op=op_node, right=right_node, **extract_token_info(ctx)
|
|
1818
|
+
)
|
|
1706
1819
|
if role is None:
|
|
1707
|
-
return UnaryOp(
|
|
1708
|
-
|
|
1820
|
+
return UnaryOp(
|
|
1821
|
+
op=Role.MEASURE.value.lower(), operand=operand_node, **extract_token_info(c)
|
|
1822
|
+
)
|
|
1823
|
+
return UnaryOp(op=role.value.lower(), operand=operand_node, **extract_token_info(c))
|
|
1709
1824
|
else:
|
|
1710
1825
|
left_node = Terminals().visitSimpleComponentId(c)
|
|
1711
1826
|
op_node = ":="
|
|
1712
1827
|
right_node = ExprComp().visitExprComponent(ctx_list[2])
|
|
1713
1828
|
|
|
1714
|
-
operand_node = Assignment(
|
|
1715
|
-
|
|
1829
|
+
operand_node = Assignment(
|
|
1830
|
+
left=left_node, op=op_node, right=right_node, **extract_token_info(ctx)
|
|
1831
|
+
)
|
|
1832
|
+
return UnaryOp(
|
|
1833
|
+
op=Role.MEASURE.value.lower(), operand=operand_node, **extract_token_info(ctx)
|
|
1834
|
+
)
|
|
1716
1835
|
|
|
1717
1836
|
def visitKeepOrDropClause(self, ctx: Parser.KeepOrDropClauseContext):
|
|
1718
1837
|
"""
|
|
@@ -1729,7 +1848,7 @@ class Expr(VtlVisitor):
|
|
|
1729
1848
|
for item in items:
|
|
1730
1849
|
nodes.append(Terminals().visitComponentID(item))
|
|
1731
1850
|
|
|
1732
|
-
return RegularAggregation(op_node, nodes)
|
|
1851
|
+
return RegularAggregation(op=op_node, children=nodes, **extract_token_info(ctx))
|
|
1733
1852
|
|
|
1734
1853
|
"""
|
|
1735
1854
|
-----------------------------------
|
|
@@ -1750,7 +1869,7 @@ class Expr(VtlVisitor):
|
|
|
1750
1869
|
children_nodes.append(Terminals().visitComponentID(ctx_list[1]))
|
|
1751
1870
|
children_nodes.append(Terminals().visitComponentID(ctx_list[3]))
|
|
1752
1871
|
|
|
1753
|
-
return RegularAggregation(op_node, children_nodes)
|
|
1872
|
+
return RegularAggregation(op=op_node, children=children_nodes, **extract_token_info(ctx))
|
|
1754
1873
|
|
|
1755
1874
|
"""
|
|
1756
1875
|
-----------------------------------
|
|
@@ -1775,15 +1894,18 @@ class Expr(VtlVisitor):
|
|
|
1775
1894
|
subspace_nodes.append(self.visitSubspaceClauseItem(subspace))
|
|
1776
1895
|
|
|
1777
1896
|
op_node = c.getSymbol().text
|
|
1778
|
-
return RegularAggregation(op_node, subspace_nodes)
|
|
1897
|
+
return RegularAggregation(op=op_node, children=subspace_nodes, **extract_token_info(ctx))
|
|
1779
1898
|
|
|
1780
1899
|
def visitSubspaceClauseItem(self, ctx: Parser.SubspaceClauseItemContext):
|
|
1781
1900
|
ctx_list = list(ctx.getChildren())
|
|
1782
1901
|
|
|
1783
1902
|
left_node = Terminals().visitVarID(ctx_list[0])
|
|
1784
1903
|
op_node = ctx_list[1].getSymbol().text
|
|
1785
|
-
|
|
1786
|
-
|
|
1904
|
+
if isinstance(ctx_list[2], Parser.ScalarItemContext):
|
|
1905
|
+
right_node = Terminals().visitScalarItem(ctx_list[2])
|
|
1906
|
+
else:
|
|
1907
|
+
right_node = Terminals().visitVarID(ctx_list[2])
|
|
1908
|
+
return BinOp(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
|
|
1787
1909
|
|
|
1788
1910
|
def visitOptionalExpr(self, ctx: Parser.OptionalExprContext):
|
|
1789
1911
|
"""
|
|
@@ -1799,4 +1921,4 @@ class Expr(VtlVisitor):
|
|
|
1799
1921
|
elif isinstance(c, TerminalNodeImpl):
|
|
1800
1922
|
token = c.getSymbol()
|
|
1801
1923
|
opt = token.text
|
|
1802
|
-
return ID("OPTIONAL", opt)
|
|
1924
|
+
return ID(type_="OPTIONAL", value=opt, **extract_token_info(ctx))
|