vtlengine 1.0.3rc3__py3-none-any.whl → 1.1__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 -61
- vtlengine/API/__init__.py +269 -71
- vtlengine/API/data/schema/json_schema_2.1.json +116 -0
- vtlengine/AST/ASTComment.py +56 -0
- vtlengine/AST/ASTConstructor.py +76 -22
- vtlengine/AST/ASTConstructorModules/Expr.py +238 -120
- vtlengine/AST/ASTConstructorModules/ExprComponents.py +126 -61
- vtlengine/AST/ASTConstructorModules/Terminals.py +97 -42
- vtlengine/AST/ASTConstructorModules/__init__.py +50 -0
- vtlengine/AST/ASTEncoders.py +5 -1
- vtlengine/AST/ASTString.py +608 -0
- vtlengine/AST/ASTTemplate.py +28 -2
- vtlengine/AST/DAG/__init__.py +10 -4
- vtlengine/AST/Grammar/lexer.py +0 -1
- vtlengine/AST/Grammar/parser.py +185 -440
- vtlengine/AST/VtlVisitor.py +0 -1
- vtlengine/AST/__init__.py +127 -14
- vtlengine/DataTypes/TimeHandling.py +50 -15
- vtlengine/DataTypes/__init__.py +79 -7
- vtlengine/Exceptions/__init__.py +3 -5
- vtlengine/Exceptions/messages.py +74 -105
- vtlengine/Interpreter/__init__.py +136 -46
- vtlengine/Model/__init__.py +14 -11
- vtlengine/Operators/Aggregation.py +17 -9
- vtlengine/Operators/Analytic.py +64 -20
- vtlengine/Operators/Assignment.py +0 -1
- vtlengine/Operators/CastOperator.py +44 -44
- vtlengine/Operators/Clause.py +16 -10
- vtlengine/Operators/Comparison.py +20 -12
- vtlengine/Operators/Conditional.py +47 -15
- vtlengine/Operators/General.py +9 -4
- vtlengine/Operators/HROperators.py +4 -14
- vtlengine/Operators/Join.py +15 -14
- vtlengine/Operators/Numeric.py +32 -26
- vtlengine/Operators/RoleSetter.py +6 -2
- vtlengine/Operators/Set.py +12 -8
- vtlengine/Operators/String.py +9 -9
- vtlengine/Operators/Time.py +145 -124
- vtlengine/Operators/Validation.py +10 -4
- vtlengine/Operators/__init__.py +56 -69
- vtlengine/Utils/__init__.py +55 -1
- vtlengine/__extras_check.py +17 -0
- vtlengine/__init__.py +2 -2
- vtlengine/files/output/__init__.py +2 -1
- vtlengine/files/output/_time_period_representation.py +2 -1
- vtlengine/files/parser/__init__.py +52 -46
- vtlengine/files/parser/_time_checking.py +4 -4
- {vtlengine-1.0.3rc3.dist-info → vtlengine-1.1.dist-info}/METADATA +21 -17
- vtlengine-1.1.dist-info/RECORD +61 -0
- {vtlengine-1.0.3rc3.dist-info → vtlengine-1.1.dist-info}/WHEEL +1 -1
- vtlengine/DataTypes/NumericTypesHandling.py +0 -38
- vtlengine-1.0.3rc3.dist-info/RECORD +0 -58
- {vtlengine-1.0.3rc3.dist-info → vtlengine-1.1.dist-info}/LICENSE.md +0 -0
vtlengine/AST/ASTConstructor.py
CHANGED
|
@@ -23,6 +23,7 @@ from vtlengine.AST import (
|
|
|
23
23
|
PersistentAssignment,
|
|
24
24
|
Start,
|
|
25
25
|
)
|
|
26
|
+
from vtlengine.AST.ASTConstructorModules import extract_token_info
|
|
26
27
|
from vtlengine.AST.ASTConstructorModules.Expr import Expr
|
|
27
28
|
from vtlengine.AST.ASTConstructorModules.ExprComponents import ExprComp
|
|
28
29
|
from vtlengine.AST.ASTConstructorModules.Terminals import Terminals
|
|
@@ -64,7 +65,9 @@ class ASTVisitor(VtlVisitor):
|
|
|
64
65
|
for statement in statements:
|
|
65
66
|
statements_nodes.append(self.visitStatement(statement))
|
|
66
67
|
|
|
67
|
-
|
|
68
|
+
token_info = extract_token_info(ctx)
|
|
69
|
+
|
|
70
|
+
start_node = Start(children=statements_nodes, **token_info)
|
|
68
71
|
|
|
69
72
|
return start_node
|
|
70
73
|
|
|
@@ -99,7 +102,8 @@ class ASTVisitor(VtlVisitor):
|
|
|
99
102
|
|
|
100
103
|
right_node = Expr().visitExpr(ctx_list[2])
|
|
101
104
|
|
|
102
|
-
|
|
105
|
+
token_info = extract_token_info(ctx)
|
|
106
|
+
assignment_node = Assignment(left=left_node, op=op_node, right=right_node, **token_info)
|
|
103
107
|
return assignment_node
|
|
104
108
|
|
|
105
109
|
# | varID PUT_SYMBOL expr # persistAssignment
|
|
@@ -114,7 +118,10 @@ class ASTVisitor(VtlVisitor):
|
|
|
114
118
|
|
|
115
119
|
right_node = Expr().visitExpr(ctx_list[2])
|
|
116
120
|
|
|
117
|
-
|
|
121
|
+
token_info = extract_token_info(ctx)
|
|
122
|
+
persistent_assignment_node = PersistentAssignment(
|
|
123
|
+
left=left_node, op=op_node, right=right_node, **token_info
|
|
124
|
+
)
|
|
118
125
|
return persistent_assignment_node
|
|
119
126
|
|
|
120
127
|
"""______________________________________________________________________________________
|
|
@@ -167,8 +174,14 @@ class ASTVisitor(VtlVisitor):
|
|
|
167
174
|
else:
|
|
168
175
|
return_node = return_[0]
|
|
169
176
|
|
|
177
|
+
token_info = extract_token_info(ctx)
|
|
178
|
+
|
|
170
179
|
return Operator(
|
|
171
|
-
op=operator,
|
|
180
|
+
op=operator,
|
|
181
|
+
parameters=parameters,
|
|
182
|
+
output_type=return_node,
|
|
183
|
+
expression=expr,
|
|
184
|
+
**token_info,
|
|
172
185
|
)
|
|
173
186
|
|
|
174
187
|
"""
|
|
@@ -189,11 +202,14 @@ class ASTVisitor(VtlVisitor):
|
|
|
189
202
|
signature_type, ruleset_elements = self.visitRulesetSignature(ctx_list[5])
|
|
190
203
|
ruleset_rules = self.visitRuleClauseDatapoint(ctx_list[8])
|
|
191
204
|
|
|
205
|
+
token_info = extract_token_info(ctx)
|
|
206
|
+
|
|
192
207
|
return DPRuleset(
|
|
193
208
|
name=ruleset_name,
|
|
194
209
|
params=ruleset_elements,
|
|
195
210
|
rules=ruleset_rules,
|
|
196
211
|
signature_type=signature_type,
|
|
212
|
+
**token_info,
|
|
197
213
|
)
|
|
198
214
|
|
|
199
215
|
def visitRulesetSignature(self, ctx: Parser.RulesetSignatureContext):
|
|
@@ -209,6 +225,7 @@ class ASTVisitor(VtlVisitor):
|
|
|
209
225
|
if isinstance(value_domain, TerminalNodeImpl)
|
|
210
226
|
and value_domain.getSymbol().type == Parser.VALUE_DOMAIN
|
|
211
227
|
]
|
|
228
|
+
kind = ""
|
|
212
229
|
if len(value_domains) != 0:
|
|
213
230
|
kind = "ValuedomainID"
|
|
214
231
|
|
|
@@ -269,7 +286,10 @@ class ASTVisitor(VtlVisitor):
|
|
|
269
286
|
]
|
|
270
287
|
|
|
271
288
|
if len(when) != 0:
|
|
272
|
-
|
|
289
|
+
token_info = extract_token_info(when[0].getSymbol())
|
|
290
|
+
rule_node = HRBinOp(
|
|
291
|
+
left=expr_node[0], op=when[0].getSymbol().text, right=expr_node[1], **token_info
|
|
292
|
+
)
|
|
273
293
|
|
|
274
294
|
else:
|
|
275
295
|
rule_node = expr_node[0]
|
|
@@ -287,7 +307,10 @@ class ASTVisitor(VtlVisitor):
|
|
|
287
307
|
]
|
|
288
308
|
er_level = None if len(er_level) == 0 else er_level[0]
|
|
289
309
|
|
|
290
|
-
|
|
310
|
+
token_info = extract_token_info(ctx)
|
|
311
|
+
return DPRule(
|
|
312
|
+
name=rule_name, rule=rule_node, erCode=er_code, erLevel=er_level, **token_info
|
|
313
|
+
)
|
|
291
314
|
|
|
292
315
|
def visitParameterItem(self, ctx: Parser.ParameterItemContext):
|
|
293
316
|
"""
|
|
@@ -314,7 +337,10 @@ class ASTVisitor(VtlVisitor):
|
|
|
314
337
|
|
|
315
338
|
if isinstance(argument_type, (Dataset, Component, Scalar)):
|
|
316
339
|
argument_type.name = argument_name.value
|
|
317
|
-
|
|
340
|
+
token_info = extract_token_info(ctx)
|
|
341
|
+
return Argument(
|
|
342
|
+
name=argument_name.value, type_=argument_type, default=argument_default, **token_info
|
|
343
|
+
)
|
|
318
344
|
|
|
319
345
|
"""
|
|
320
346
|
-----------------------------------
|
|
@@ -342,11 +368,14 @@ class ASTVisitor(VtlVisitor):
|
|
|
342
368
|
if len(ruleset_rules) == 0:
|
|
343
369
|
raise Exception(f"No rules found for the ruleset {ruleset_name}")
|
|
344
370
|
|
|
371
|
+
token_info = extract_token_info(ctx)
|
|
372
|
+
|
|
345
373
|
return HRuleset(
|
|
346
374
|
signature_type=signature_type,
|
|
347
375
|
name=ruleset_name,
|
|
348
376
|
element=ruleset_elements,
|
|
349
377
|
rules=ruleset_rules,
|
|
378
|
+
**token_info,
|
|
350
379
|
)
|
|
351
380
|
|
|
352
381
|
# TODO Add support for value Domains.
|
|
@@ -379,23 +408,30 @@ class ASTVisitor(VtlVisitor):
|
|
|
379
408
|
and identifier.getSymbol().type == Parser.IDENTIFIER
|
|
380
409
|
][0]
|
|
381
410
|
|
|
411
|
+
token_info = extract_token_info(ctx)
|
|
382
412
|
if conditions:
|
|
383
413
|
identifiers_list = [
|
|
384
414
|
DefIdentifier(
|
|
385
|
-
value=elto.alias if getattr(elto, "alias", None) else elto.value,
|
|
415
|
+
value=elto.alias if getattr(elto, "alias", None) else elto.value,
|
|
416
|
+
kind=kind,
|
|
417
|
+
**token_info,
|
|
386
418
|
)
|
|
387
419
|
for elto in conditions[0]
|
|
388
420
|
]
|
|
389
|
-
identifiers_list.append(
|
|
421
|
+
identifiers_list.append(
|
|
422
|
+
DefIdentifier(value=dataset.getSymbol().text, kind=kind, **token_info)
|
|
423
|
+
)
|
|
390
424
|
return signature_type, identifiers_list
|
|
391
425
|
else:
|
|
392
|
-
return signature_type, DefIdentifier(
|
|
426
|
+
return signature_type, DefIdentifier(
|
|
427
|
+
value=dataset.getSymbol().text, kind=kind, **token_info
|
|
428
|
+
)
|
|
393
429
|
|
|
394
430
|
# TODO Support for valueDomainSignature.
|
|
395
431
|
def visitValueDomainSignature(self, ctx: Parser.ValueDomainSignatureContext):
|
|
396
432
|
"""
|
|
397
433
|
valueDomainSignature: CONDITION IDENTIFIER (AS IDENTIFIER)? (',' IDENTIFIER (AS IDENTIFIER)?)* ;
|
|
398
|
-
"""
|
|
434
|
+
""" # noqa E501
|
|
399
435
|
# AST_ASTCONSTRUCTOR.7
|
|
400
436
|
ctx_list = list(ctx.getChildren())
|
|
401
437
|
component_nodes = [
|
|
@@ -452,14 +488,16 @@ class ASTVisitor(VtlVisitor):
|
|
|
452
488
|
]
|
|
453
489
|
er_level = None if len(er_level) == 0 else er_level[0]
|
|
454
490
|
|
|
455
|
-
|
|
491
|
+
token_info = extract_token_info(ctx)
|
|
492
|
+
|
|
493
|
+
return HRule(name=rule_name, rule=rule_node, erCode=er_code, erLevel=er_level, **token_info)
|
|
456
494
|
|
|
457
495
|
def visitCodeItemRelation(self, ctx: Parser.CodeItemRelationContext):
|
|
458
496
|
"""
|
|
459
497
|
codeItemRelation: ( WHEN expr THEN )? codeItemRef codeItemRelationClause (codeItemRelationClause)* ;
|
|
460
498
|
( WHEN exprComponent THEN )? codetemRef=valueDomainValue comparisonOperand? codeItemRelationClause (codeItemRelationClause)*
|
|
461
499
|
|
|
462
|
-
"""
|
|
500
|
+
""" # noqa E501
|
|
463
501
|
|
|
464
502
|
ctx_list = list(ctx.getChildren())
|
|
465
503
|
|
|
@@ -469,22 +507,29 @@ class ASTVisitor(VtlVisitor):
|
|
|
469
507
|
when = ctx_list[0].getSymbol().text
|
|
470
508
|
vd_value = Terminals().visitValueDomainValue(ctx_list[3])
|
|
471
509
|
op = Terminals().visitComparisonOperand(ctx_list[4])
|
|
510
|
+
token_info_value = extract_token_info(ctx_list[3])
|
|
511
|
+
token_info_op = extract_token_info(ctx_list[4])
|
|
472
512
|
else:
|
|
473
513
|
vd_value = Terminals().visitValueDomainValue(ctx_list[0])
|
|
474
514
|
op = Terminals().visitComparisonOperand(ctx_list[1])
|
|
515
|
+
token_info_value = extract_token_info(ctx_list[0])
|
|
516
|
+
token_info_op = extract_token_info(ctx_list[1])
|
|
475
517
|
|
|
476
518
|
rule_node = HRBinOp(
|
|
477
|
-
left=DefIdentifier(value=vd_value, kind="CodeItemID"
|
|
519
|
+
left=DefIdentifier(value=vd_value, kind="CodeItemID", **token_info_value),
|
|
520
|
+
op=op,
|
|
521
|
+
right=None,
|
|
522
|
+
**token_info_op,
|
|
478
523
|
)
|
|
479
524
|
items = [
|
|
480
525
|
item for item in ctx_list if isinstance(item, Parser.CodeItemRelationClauseContext)
|
|
481
526
|
]
|
|
482
|
-
|
|
527
|
+
token_info = extract_token_info(items[0])
|
|
483
528
|
# Means that no concatenations of operations is needed for that rule.
|
|
484
529
|
if len(items) == 1:
|
|
485
530
|
cir_node = self.visitCodeItemRelationClause(items[0])
|
|
486
531
|
if isinstance(cir_node, HRBinOp):
|
|
487
|
-
rule_node.right = HRUnOp(op=cir_node.op, operand=cir_node.right)
|
|
532
|
+
rule_node.right = HRUnOp(op=cir_node.op, operand=cir_node.right, **token_info)
|
|
488
533
|
|
|
489
534
|
elif isinstance(cir_node, DefIdentifier):
|
|
490
535
|
rule_node.right = cir_node
|
|
@@ -493,7 +538,9 @@ class ASTVisitor(VtlVisitor):
|
|
|
493
538
|
else:
|
|
494
539
|
previous_node = self.visitCodeItemRelationClause(items[0])
|
|
495
540
|
if isinstance(previous_node, HRBinOp):
|
|
496
|
-
previous_node = HRUnOp(
|
|
541
|
+
previous_node = HRUnOp(
|
|
542
|
+
op=previous_node.op, operand=previous_node.right, **token_info
|
|
543
|
+
)
|
|
497
544
|
|
|
498
545
|
for item in items[1:]:
|
|
499
546
|
item_node = self.visitCodeItemRelationClause(item)
|
|
@@ -505,14 +552,15 @@ class ASTVisitor(VtlVisitor):
|
|
|
505
552
|
|
|
506
553
|
if when is not None:
|
|
507
554
|
expr_node = ExprComp().visitExprComponent(ctx_list[1])
|
|
508
|
-
|
|
555
|
+
token_when_info = extract_token_info(ctx_list[1])
|
|
556
|
+
rule_node = HRBinOp(left=expr_node, op=when, right=rule_node, **token_when_info)
|
|
509
557
|
|
|
510
558
|
return rule_node
|
|
511
559
|
|
|
512
560
|
def visitCodeItemRelationClause(self, ctx: Parser.CodeItemRelationClauseContext):
|
|
513
561
|
"""
|
|
514
562
|
(opAdd=( PLUS | MINUS ))? rightCodeItem=valueDomainValue ( QLPAREN rightCondition=exprComponent QRPAREN )?
|
|
515
|
-
"""
|
|
563
|
+
""" # noqa E501
|
|
516
564
|
ctx_list = list(ctx.getChildren())
|
|
517
565
|
|
|
518
566
|
expr = [expr for expr in ctx_list if isinstance(expr, Parser.ExprContext)]
|
|
@@ -530,14 +578,20 @@ class ASTVisitor(VtlVisitor):
|
|
|
530
578
|
op = ctx_list[0].getSymbol().text
|
|
531
579
|
value = Terminals().visitValueDomainValue(ctx_list[1])
|
|
532
580
|
|
|
533
|
-
code_item = DefIdentifier(
|
|
581
|
+
code_item = DefIdentifier(
|
|
582
|
+
value=value, kind="CodeItemID", **extract_token_info(ctx_list[1])
|
|
583
|
+
)
|
|
534
584
|
if right_condition:
|
|
535
585
|
code_item._right_condition = right_condition[0]
|
|
536
586
|
|
|
537
|
-
return HRBinOp(
|
|
587
|
+
return HRBinOp(
|
|
588
|
+
left=None, op=op, right=code_item, **extract_token_info(ctx_list[0].getSymbol())
|
|
589
|
+
)
|
|
538
590
|
else:
|
|
539
591
|
value = Terminals().visitValueDomainValue(ctx_list[0])
|
|
540
|
-
code_item = DefIdentifier(
|
|
592
|
+
code_item = DefIdentifier(
|
|
593
|
+
value=value, kind="CodeItemID", **extract_token_info(ctx_list[0])
|
|
594
|
+
)
|
|
541
595
|
if right_condition:
|
|
542
596
|
code_item._right_condition = right_condition[0]
|
|
543
597
|
|