pydpm_xl 0.1.39rc32__py3-none-any.whl → 0.2.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.
- py_dpm/__init__.py +1 -1
- py_dpm/api/__init__.py +58 -189
- py_dpm/api/dpm/__init__.py +20 -0
- py_dpm/api/{data_dictionary.py → dpm/data_dictionary.py} +903 -984
- py_dpm/api/dpm/explorer.py +236 -0
- py_dpm/api/dpm/hierarchical_queries.py +142 -0
- py_dpm/api/{migration.py → dpm/migration.py} +16 -19
- py_dpm/api/{operation_scopes.py → dpm/operation_scopes.py} +319 -267
- py_dpm/api/dpm_xl/__init__.py +25 -0
- py_dpm/api/{ast_generator.py → dpm_xl/ast_generator.py} +3 -3
- py_dpm/api/{complete_ast.py → dpm_xl/complete_ast.py} +186 -284
- py_dpm/api/dpm_xl/semantic.py +358 -0
- py_dpm/api/{syntax.py → dpm_xl/syntax.py} +6 -5
- py_dpm/api/explorer.py +4 -0
- py_dpm/api/semantic.py +30 -306
- py_dpm/cli/__init__.py +9 -0
- py_dpm/{client.py → cli/main.py} +12 -10
- py_dpm/dpm/__init__.py +11 -0
- py_dpm/{models.py → dpm/models.py} +112 -88
- py_dpm/dpm/queries/base.py +100 -0
- py_dpm/dpm/queries/basic_objects.py +33 -0
- py_dpm/dpm/queries/explorer_queries.py +352 -0
- py_dpm/dpm/queries/filters.py +139 -0
- py_dpm/dpm/queries/glossary.py +45 -0
- py_dpm/dpm/queries/hierarchical_queries.py +838 -0
- py_dpm/dpm/queries/tables.py +133 -0
- py_dpm/dpm/utils.py +356 -0
- py_dpm/dpm_xl/__init__.py +8 -0
- py_dpm/dpm_xl/ast/__init__.py +14 -0
- py_dpm/{AST/ASTConstructor.py → dpm_xl/ast/constructor.py} +6 -6
- py_dpm/{AST/MLGeneration.py → dpm_xl/ast/ml_generation.py} +137 -87
- py_dpm/{AST/ModuleAnalyzer.py → dpm_xl/ast/module_analyzer.py} +7 -7
- py_dpm/{AST/ModuleDependencies.py → dpm_xl/ast/module_dependencies.py} +56 -41
- py_dpm/{AST/ASTObjects.py → dpm_xl/ast/nodes.py} +1 -1
- py_dpm/{AST/check_operands.py → dpm_xl/ast/operands.py} +16 -13
- py_dpm/{AST/ASTTemplate.py → dpm_xl/ast/template.py} +2 -2
- py_dpm/{AST/WhereClauseChecker.py → dpm_xl/ast/where_clause.py} +2 -2
- py_dpm/dpm_xl/grammar/__init__.py +18 -0
- py_dpm/dpm_xl/operators/__init__.py +19 -0
- py_dpm/{Operators/AggregateOperators.py → dpm_xl/operators/aggregate.py} +7 -7
- py_dpm/{Operators/NumericOperators.py → dpm_xl/operators/arithmetic.py} +6 -6
- py_dpm/{Operators/Operator.py → dpm_xl/operators/base.py} +5 -5
- py_dpm/{Operators/BooleanOperators.py → dpm_xl/operators/boolean.py} +5 -5
- py_dpm/{Operators/ClauseOperators.py → dpm_xl/operators/clause.py} +8 -8
- py_dpm/{Operators/ComparisonOperators.py → dpm_xl/operators/comparison.py} +5 -5
- py_dpm/{Operators/ConditionalOperators.py → dpm_xl/operators/conditional.py} +7 -7
- py_dpm/{Operators/StringOperators.py → dpm_xl/operators/string.py} +5 -5
- py_dpm/{Operators/TimeOperators.py → dpm_xl/operators/time.py} +6 -6
- py_dpm/{semantics/SemanticAnalyzer.py → dpm_xl/semantic_analyzer.py} +168 -68
- py_dpm/{semantics/Symbols.py → dpm_xl/symbols.py} +3 -3
- py_dpm/dpm_xl/types/__init__.py +13 -0
- py_dpm/{DataTypes/TypePromotion.py → dpm_xl/types/promotion.py} +2 -2
- py_dpm/{DataTypes/ScalarTypes.py → dpm_xl/types/scalar.py} +2 -2
- py_dpm/dpm_xl/utils/__init__.py +14 -0
- py_dpm/{data_handlers.py → dpm_xl/utils/data_handlers.py} +2 -2
- py_dpm/{Utils → dpm_xl/utils}/operands_mapping.py +1 -1
- py_dpm/{Utils → dpm_xl/utils}/operator_mapping.py +8 -8
- py_dpm/{OperationScopes/OperationScopeService.py → dpm_xl/utils/scopes_calculator.py} +148 -58
- py_dpm/{Utils/ast_serialization.py → dpm_xl/utils/serialization.py} +3 -4
- py_dpm/dpm_xl/validation/__init__.py +12 -0
- py_dpm/{Utils/ValidationsGenerationUtils.py → dpm_xl/validation/generation_utils.py} +2 -3
- py_dpm/{ValidationsGeneration/PropertiesConstraintsProcessor.py → dpm_xl/validation/property_constraints.py} +56 -21
- py_dpm/{ValidationsGeneration/auxiliary_functions.py → dpm_xl/validation/utils.py} +2 -2
- py_dpm/{ValidationsGeneration/VariantsProcessor.py → dpm_xl/validation/variants.py} +149 -55
- py_dpm/exceptions/__init__.py +23 -0
- py_dpm/{Exceptions → exceptions}/exceptions.py +7 -2
- pydpm_xl-0.2.1.dist-info/METADATA +278 -0
- pydpm_xl-0.2.1.dist-info/RECORD +88 -0
- pydpm_xl-0.2.1.dist-info/entry_points.txt +2 -0
- py_dpm/Exceptions/__init__.py +0 -0
- py_dpm/OperationScopes/__init__.py +0 -0
- py_dpm/Operators/__init__.py +0 -0
- py_dpm/Utils/__init__.py +0 -0
- py_dpm/Utils/utils.py +0 -2
- py_dpm/ValidationsGeneration/Utils.py +0 -364
- py_dpm/ValidationsGeneration/__init__.py +0 -0
- py_dpm/api/data_dictionary_validation.py +0 -614
- py_dpm/db_utils.py +0 -221
- py_dpm/grammar/__init__.py +0 -0
- py_dpm/grammar/dist/__init__.py +0 -0
- py_dpm/grammar/dpm_xlLexer.g4 +0 -437
- py_dpm/grammar/dpm_xlParser.g4 +0 -263
- py_dpm/semantics/DAG/DAGAnalyzer.py +0 -158
- py_dpm/semantics/DAG/__init__.py +0 -0
- py_dpm/semantics/__init__.py +0 -0
- py_dpm/views/data_types.sql +0 -12
- py_dpm/views/datapoints.sql +0 -65
- py_dpm/views/hierarchy_operand_reference.sql +0 -11
- py_dpm/views/hierarchy_preconditions.sql +0 -13
- py_dpm/views/hierarchy_variables.sql +0 -26
- py_dpm/views/hierarchy_variables_context.sql +0 -14
- py_dpm/views/key_components.sql +0 -18
- py_dpm/views/module_from_table.sql +0 -11
- py_dpm/views/open_keys.sql +0 -13
- py_dpm/views/operation_info.sql +0 -27
- py_dpm/views/operation_list.sql +0 -18
- py_dpm/views/operations_versions_from_module_version.sql +0 -30
- py_dpm/views/precondition_info.sql +0 -17
- py_dpm/views/report_type_operand_reference_info.sql +0 -18
- py_dpm/views/subcategory_info.sql +0 -17
- py_dpm/views/table_info.sql +0 -19
- pydpm_xl-0.1.39rc32.dist-info/METADATA +0 -53
- pydpm_xl-0.1.39rc32.dist-info/RECORD +0 -96
- pydpm_xl-0.1.39rc32.dist-info/entry_points.txt +0 -2
- /py_dpm/{AST → cli/commands}/__init__.py +0 -0
- /py_dpm/{migration.py → dpm/migration.py} +0 -0
- /py_dpm/{AST/ASTVisitor.py → dpm_xl/ast/visitor.py} +0 -0
- /py_dpm/{DataTypes → dpm_xl/grammar/generated}/__init__.py +0 -0
- /py_dpm/{grammar/dist → dpm_xl/grammar/generated}/dpm_xlLexer.interp +0 -0
- /py_dpm/{grammar/dist → dpm_xl/grammar/generated}/dpm_xlLexer.py +0 -0
- /py_dpm/{grammar/dist → dpm_xl/grammar/generated}/dpm_xlLexer.tokens +0 -0
- /py_dpm/{grammar/dist → dpm_xl/grammar/generated}/dpm_xlParser.interp +0 -0
- /py_dpm/{grammar/dist → dpm_xl/grammar/generated}/dpm_xlParser.py +0 -0
- /py_dpm/{grammar/dist → dpm_xl/grammar/generated}/dpm_xlParser.tokens +0 -0
- /py_dpm/{grammar/dist → dpm_xl/grammar/generated}/dpm_xlParserListener.py +0 -0
- /py_dpm/{grammar/dist → dpm_xl/grammar/generated}/dpm_xlParserVisitor.py +0 -0
- /py_dpm/{grammar/dist → dpm_xl/grammar/generated}/listeners.py +0 -0
- /py_dpm/{DataTypes/TimeClasses.py → dpm_xl/types/time.py} +0 -0
- /py_dpm/{Utils → dpm_xl/utils}/tokens.py +0 -0
- /py_dpm/{Exceptions → exceptions}/messages.py +0 -0
- {pydpm_xl-0.1.39rc32.dist-info → pydpm_xl-0.2.1.dist-info}/WHEEL +0 -0
- {pydpm_xl-0.1.39rc32.dist-info → pydpm_xl-0.2.1.dist-info}/licenses/LICENSE +0 -0
- {pydpm_xl-0.1.39rc32.dist-info → pydpm_xl-0.2.1.dist-info}/top_level.txt +0 -0
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
from sqlalchemy.orm import Session
|
|
2
2
|
|
|
3
|
-
from py_dpm.
|
|
4
|
-
from py_dpm.
|
|
5
|
-
from py_dpm.
|
|
6
|
-
from py_dpm.models import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
from py_dpm.dpm_xl.ast.nodes import *
|
|
4
|
+
from py_dpm.dpm_xl.ast.template import ASTTemplate
|
|
5
|
+
from py_dpm.exceptions.exceptions import SemanticError
|
|
6
|
+
from py_dpm.dpm.models import (
|
|
7
|
+
ItemCategory,
|
|
8
|
+
OperandReference,
|
|
9
|
+
OperandReferenceLocation,
|
|
10
|
+
OperationNode,
|
|
11
|
+
Operator,
|
|
12
|
+
OperatorArgument,
|
|
13
|
+
VariableVersion,
|
|
14
|
+
)
|
|
15
|
+
from py_dpm.dpm_xl.utils.scopes_calculator import OperationScopeService
|
|
16
|
+
from py_dpm.dpm_xl.utils.data_handlers import filter_all_data, generate_xyz
|
|
17
|
+
from py_dpm.dpm.utils import get_session
|
|
12
18
|
|
|
13
19
|
|
|
14
20
|
def gather_element(node, attribute):
|
|
@@ -39,12 +45,22 @@ class MLGeneration(ASTTemplate):
|
|
|
39
45
|
:var df_arguments: All arguments present in the OperatorArgument table.
|
|
40
46
|
"""
|
|
41
47
|
|
|
42
|
-
def __init__(
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
session,
|
|
51
|
+
data,
|
|
52
|
+
op_version_id,
|
|
53
|
+
release_id,
|
|
54
|
+
operations_data=None,
|
|
55
|
+
store=False,
|
|
56
|
+
):
|
|
43
57
|
super().__init__()
|
|
44
58
|
self.session: Session = get_session() if store else session
|
|
45
59
|
self.session_queries = get_session()
|
|
46
60
|
self.data = data
|
|
47
|
-
self.table_ids =
|
|
61
|
+
self.table_ids = (
|
|
62
|
+
[int(x) for x in data["table_vid"].unique()] if data is not None else []
|
|
63
|
+
)
|
|
48
64
|
self.op_version_id = op_version_id
|
|
49
65
|
self.df_operators = Operator.get_operators(self.session)
|
|
50
66
|
self.df_arguments = OperatorArgument.get_arguments(self.session)
|
|
@@ -62,13 +78,22 @@ class MLGeneration(ASTTemplate):
|
|
|
62
78
|
self.store = store
|
|
63
79
|
|
|
64
80
|
def populate_operation_scope(self):
|
|
65
|
-
operation_scope_service = OperationScopeService(
|
|
66
|
-
|
|
67
|
-
|
|
81
|
+
operation_scope_service = OperationScopeService(
|
|
82
|
+
operation_version_id=self.op_version_id, session=self.session
|
|
83
|
+
)
|
|
84
|
+
self.existing_scopes, self.new_scopes = (
|
|
85
|
+
operation_scope_service.calculate_operation_scope(
|
|
86
|
+
tables_vids=list(self.table_vid_dict.values()),
|
|
87
|
+
precondition_items=self.precondition_items,
|
|
88
|
+
only_last_release=False,
|
|
89
|
+
)
|
|
90
|
+
)
|
|
68
91
|
|
|
69
92
|
def extract_operand_data(self, table, rows, cols, sheets):
|
|
70
93
|
data_filtered = filter_all_data(self.data, table, rows, cols, sheets)
|
|
71
|
-
data_filtered = data_filtered[
|
|
94
|
+
data_filtered = data_filtered[
|
|
95
|
+
["row_code", "column_code", "sheet_code", "variable_id", "cell_id"]
|
|
96
|
+
]
|
|
72
97
|
|
|
73
98
|
list_xyz = generate_xyz(data_filtered)
|
|
74
99
|
|
|
@@ -88,16 +113,18 @@ class MLGeneration(ASTTemplate):
|
|
|
88
113
|
|
|
89
114
|
if fallback_value is not None and isinstance(fallback_value, str):
|
|
90
115
|
if len(fallback_value) == 0:
|
|
91
|
-
fallback_value = '
|
|
116
|
+
fallback_value = '""'
|
|
92
117
|
|
|
93
118
|
operator_id = None
|
|
94
119
|
if not getattr(node, "operator_name", None):
|
|
95
|
-
operator = self.df_operators[self.df_operators[
|
|
120
|
+
operator = self.df_operators[self.df_operators["Symbol"] == op][
|
|
121
|
+
"OperatorID"
|
|
122
|
+
].values
|
|
96
123
|
else:
|
|
97
|
-
operator =
|
|
98
|
-
self.df_operators[
|
|
99
|
-
|
|
100
|
-
|
|
124
|
+
operator = self.df_operators[
|
|
125
|
+
(self.df_operators["Symbol"] == op)
|
|
126
|
+
& (self.df_operators["Name"] == getattr(node, "operator_name", None))
|
|
127
|
+
]["OperatorID"].values
|
|
101
128
|
|
|
102
129
|
if len(operator) > 0:
|
|
103
130
|
operator_id = int(operator[0])
|
|
@@ -105,9 +132,10 @@ class MLGeneration(ASTTemplate):
|
|
|
105
132
|
argument_id = None
|
|
106
133
|
if argument:
|
|
107
134
|
parent_operator_id = parent_node.OperatorID
|
|
108
|
-
argument_info =
|
|
109
|
-
|
|
110
|
-
|
|
135
|
+
argument_info = self.df_arguments[
|
|
136
|
+
(self.df_arguments["Name"] == argument)
|
|
137
|
+
& (self.df_arguments["OperatorID"] == parent_operator_id)
|
|
138
|
+
]["ArgumentID"].values
|
|
111
139
|
if len(argument_info) > 0:
|
|
112
140
|
argument_id = int(argument_info[0])
|
|
113
141
|
|
|
@@ -119,7 +147,7 @@ class MLGeneration(ASTTemplate):
|
|
|
119
147
|
UseIntervalArithmetics=interval,
|
|
120
148
|
FallbackValue=fallback_value,
|
|
121
149
|
IsLeaf=is_leaf,
|
|
122
|
-
ArgumentID=argument_id
|
|
150
|
+
ArgumentID=argument_id,
|
|
123
151
|
)
|
|
124
152
|
|
|
125
153
|
self.session.add(operand_node)
|
|
@@ -172,16 +200,16 @@ class MLGeneration(ASTTemplate):
|
|
|
172
200
|
self.visit(node.expression)
|
|
173
201
|
|
|
174
202
|
def visit_BinOp(self, node: BinOp):
|
|
175
|
-
if node.op ==
|
|
203
|
+
if node.op == "+":
|
|
176
204
|
setattr(node, "operator_name", "Addition")
|
|
177
|
-
elif node.op ==
|
|
205
|
+
elif node.op == "-":
|
|
178
206
|
setattr(node, "operator_name", "Subtraction")
|
|
179
207
|
operand_node = self.create_operation_node(node)
|
|
180
208
|
|
|
181
|
-
if node.op ==
|
|
209
|
+
if node.op == "in":
|
|
182
210
|
setattr(node.left, "argument", "operand")
|
|
183
211
|
setattr(node.right, "argument", "set")
|
|
184
|
-
elif node.op ==
|
|
212
|
+
elif node.op == "match":
|
|
185
213
|
setattr(node.left, "argument", "operand")
|
|
186
214
|
setattr(node.right, "argument", "pattern")
|
|
187
215
|
else:
|
|
@@ -193,9 +221,9 @@ class MLGeneration(ASTTemplate):
|
|
|
193
221
|
self.visit(node.right)
|
|
194
222
|
|
|
195
223
|
def visit_UnaryOp(self, node: UnaryOp):
|
|
196
|
-
if node.op ==
|
|
224
|
+
if node.op == "+":
|
|
197
225
|
setattr(node, "operator_name", "Unary plus")
|
|
198
|
-
elif node.op ==
|
|
226
|
+
elif node.op == "-":
|
|
199
227
|
setattr(node, "operator_name", "Unary minus")
|
|
200
228
|
operand_node = self.create_operation_node(node)
|
|
201
229
|
setattr(node.operand, "argument", "operand")
|
|
@@ -217,10 +245,10 @@ class MLGeneration(ASTTemplate):
|
|
|
217
245
|
self.visit(node.else_expr)
|
|
218
246
|
|
|
219
247
|
def visit_WithExpression(self, node: WithExpression):
|
|
220
|
-
parent = getattr(node,
|
|
248
|
+
parent = getattr(node, "parent", None)
|
|
221
249
|
if parent:
|
|
222
250
|
setattr(node.expression, "parent", parent)
|
|
223
|
-
setattr(node.expression,
|
|
251
|
+
setattr(node.expression, "argument", getattr(node, "argument", None))
|
|
224
252
|
self.visit(node.expression)
|
|
225
253
|
|
|
226
254
|
def visit_AggregationOp(self, node: AggregationOp):
|
|
@@ -242,17 +270,16 @@ class MLGeneration(ASTTemplate):
|
|
|
242
270
|
setattr(element, "argument", "component")
|
|
243
271
|
comp_node = self.create_operation_node(element, is_leaf=True)
|
|
244
272
|
# property_id = ItemCategory.get_property_id_from_code(code=node.component, session=self.session)[0]
|
|
245
|
-
if component in (
|
|
246
|
-
op_ref = OperandReference(
|
|
247
|
-
op_node=comp_node,
|
|
248
|
-
OperandReference=component
|
|
249
|
-
)
|
|
273
|
+
if component in ("r", "c", "s"):
|
|
274
|
+
op_ref = OperandReference(op_node=comp_node, OperandReference=component)
|
|
250
275
|
else:
|
|
251
|
-
property_id = ItemCategory.get_property_id_from_code(
|
|
276
|
+
property_id = ItemCategory.get_property_id_from_code(
|
|
277
|
+
code=component, session=self.session_queries
|
|
278
|
+
)[0]
|
|
252
279
|
op_ref = OperandReference(
|
|
253
280
|
op_node=comp_node,
|
|
254
|
-
OperandReference=
|
|
255
|
-
PropertyID=property_id
|
|
281
|
+
OperandReference="property",
|
|
282
|
+
PropertyID=property_id,
|
|
256
283
|
)
|
|
257
284
|
|
|
258
285
|
self.session.add(op_ref)
|
|
@@ -295,7 +322,7 @@ class MLGeneration(ASTTemplate):
|
|
|
295
322
|
shift_number_node = AST()
|
|
296
323
|
setattr(shift_number_node, "parent", get_node)
|
|
297
324
|
setattr(shift_number_node, "argument", "shift_number")
|
|
298
|
-
setattr(shift_number_node, "scalar", getattr(node,
|
|
325
|
+
setattr(shift_number_node, "scalar", getattr(node, "shift_number", None))
|
|
299
326
|
self.create_operation_node(shift_number_node, is_leaf=True)
|
|
300
327
|
|
|
301
328
|
# component
|
|
@@ -303,18 +330,21 @@ class MLGeneration(ASTTemplate):
|
|
|
303
330
|
setattr(ast_element, "parent", get_node)
|
|
304
331
|
setattr(ast_element, "argument", "dimension")
|
|
305
332
|
setattr(ast_element, "source_reference", "property")
|
|
306
|
-
operand_node = self.create_operation_node(
|
|
333
|
+
operand_node = self.create_operation_node(
|
|
334
|
+
ast_element, is_leaf=True
|
|
335
|
+
) # TODO: Adapt to refPeriod
|
|
307
336
|
if property_ref_period_mangement(node.component):
|
|
308
337
|
op_ref = OperandReference(
|
|
309
|
-
op_node=operand_node,
|
|
310
|
-
OperandReference="refPeriod"
|
|
338
|
+
op_node=operand_node, OperandReference="refPeriod"
|
|
311
339
|
)
|
|
312
340
|
else:
|
|
313
|
-
property_id = ItemCategory.get_property_id_from_code(
|
|
341
|
+
property_id = ItemCategory.get_property_id_from_code(
|
|
342
|
+
code=node.component, session=self.session_queries
|
|
343
|
+
)[0]
|
|
314
344
|
op_ref = OperandReference(
|
|
315
345
|
op_node=operand_node,
|
|
316
346
|
OperandReference=getattr(ast_element, "source_reference"),
|
|
317
|
-
PropertyID=property_id
|
|
347
|
+
PropertyID=property_id,
|
|
318
348
|
)
|
|
319
349
|
self.session.add(op_ref)
|
|
320
350
|
|
|
@@ -343,15 +373,16 @@ class MLGeneration(ASTTemplate):
|
|
|
343
373
|
component_node = self.create_operation_node(element, is_leaf=True)
|
|
344
374
|
if property_ref_period_mangement(node.component):
|
|
345
375
|
op_ref = OperandReference(
|
|
346
|
-
op_node=component_node,
|
|
347
|
-
OperandReference="refPeriod"
|
|
376
|
+
op_node=component_node, OperandReference="refPeriod"
|
|
348
377
|
)
|
|
349
378
|
else:
|
|
350
|
-
property_id = ItemCategory.get_property_id_from_code(
|
|
379
|
+
property_id = ItemCategory.get_property_id_from_code(
|
|
380
|
+
code=node.component, session=self.session_queries
|
|
381
|
+
)[0]
|
|
351
382
|
op_ref = OperandReference(
|
|
352
383
|
op_node=component_node,
|
|
353
384
|
OperandReference=getattr(element, "source_reference"),
|
|
354
|
-
PropertyID=property_id
|
|
385
|
+
PropertyID=property_id,
|
|
355
386
|
)
|
|
356
387
|
self.session.add(op_ref)
|
|
357
388
|
|
|
@@ -375,13 +406,15 @@ class MLGeneration(ASTTemplate):
|
|
|
375
406
|
setattr(old_name, "argument", "old_name")
|
|
376
407
|
setattr(old_name, "source_reference", "property")
|
|
377
408
|
setattr(old_name, "scalar", node.old_name)
|
|
378
|
-
old_property_id = ItemCategory.get_property_id_from_code(
|
|
409
|
+
old_property_id = ItemCategory.get_property_id_from_code(
|
|
410
|
+
code=node.old_name, session=self.session_queries
|
|
411
|
+
)[0]
|
|
379
412
|
old_name_node = self.create_operation_node(old_name, is_leaf=True)
|
|
380
413
|
|
|
381
414
|
old_operand_ref = OperandReference(
|
|
382
415
|
op_node=old_name_node,
|
|
383
416
|
OperandReference=getattr(old_name, "source_reference"),
|
|
384
|
-
PropertyID=old_property_id
|
|
417
|
+
PropertyID=old_property_id,
|
|
385
418
|
)
|
|
386
419
|
|
|
387
420
|
self.session.add(old_operand_ref)
|
|
@@ -396,7 +429,7 @@ class MLGeneration(ASTTemplate):
|
|
|
396
429
|
new_operand_ref = OperandReference(
|
|
397
430
|
op_node=new_name_node,
|
|
398
431
|
OperandReference=getattr(new_name, "source_reference"),
|
|
399
|
-
PropertyID=old_property_id
|
|
432
|
+
PropertyID=old_property_id,
|
|
400
433
|
)
|
|
401
434
|
self.session.add(new_operand_ref)
|
|
402
435
|
|
|
@@ -415,14 +448,18 @@ class MLGeneration(ASTTemplate):
|
|
|
415
448
|
def visit_PreconditionItem(self, node: PreconditionItem):
|
|
416
449
|
operand_node = self.create_operation_node(node, is_leaf=True)
|
|
417
450
|
operand_reference = "PreconditionItem" # "$_{}".format(node.value)
|
|
418
|
-
precondition_var = VariableVersion.check_precondition(
|
|
451
|
+
precondition_var = VariableVersion.check_precondition(
|
|
452
|
+
self.session, node.variable_code, self.release_id
|
|
453
|
+
)
|
|
419
454
|
variable_id = None
|
|
420
455
|
precondition_code = None
|
|
421
456
|
if precondition_var:
|
|
422
457
|
variable_id = precondition_var.VariableID
|
|
423
458
|
precondition_code = precondition_var.Code
|
|
424
459
|
else:
|
|
425
|
-
preconditions_vars = VariableVersion.get_all_preconditions(
|
|
460
|
+
preconditions_vars = VariableVersion.get_all_preconditions(
|
|
461
|
+
self.session, self.release_id
|
|
462
|
+
)
|
|
426
463
|
precondition_found = False
|
|
427
464
|
for precondition in preconditions_vars:
|
|
428
465
|
if precondition.Code in node.variable_code:
|
|
@@ -437,7 +474,7 @@ class MLGeneration(ASTTemplate):
|
|
|
437
474
|
operand_ref = OperandReference(
|
|
438
475
|
op_node=operand_node,
|
|
439
476
|
OperandReference=operand_reference,
|
|
440
|
-
VariableID=variable_id
|
|
477
|
+
VariableID=variable_id,
|
|
441
478
|
)
|
|
442
479
|
|
|
443
480
|
self.session.add(operand_ref)
|
|
@@ -447,7 +484,9 @@ class MLGeneration(ASTTemplate):
|
|
|
447
484
|
setattr(node, "source_reference", "variable")
|
|
448
485
|
op_node = self.create_operation_node(node, is_leaf=True)
|
|
449
486
|
node_value = getattr(node, "value", getattr(node, "variable", None))
|
|
450
|
-
variable_id = VariableVersion.get_VariableID(
|
|
487
|
+
variable_id = VariableVersion.get_VariableID(
|
|
488
|
+
self.session, node_value, self.release_id
|
|
489
|
+
)
|
|
451
490
|
if variable_id:
|
|
452
491
|
variable_id = variable_id[0]
|
|
453
492
|
else:
|
|
@@ -455,7 +494,7 @@ class MLGeneration(ASTTemplate):
|
|
|
455
494
|
operand_ref = OperandReference(
|
|
456
495
|
op_node=op_node,
|
|
457
496
|
OperandReference=getattr(node, "source_reference"),
|
|
458
|
-
VariableID=variable_id
|
|
497
|
+
VariableID=variable_id,
|
|
459
498
|
)
|
|
460
499
|
|
|
461
500
|
self.session.add(operand_ref)
|
|
@@ -465,7 +504,9 @@ class MLGeneration(ASTTemplate):
|
|
|
465
504
|
|
|
466
505
|
op_node = self.create_operation_node(node, is_leaf=True)
|
|
467
506
|
|
|
468
|
-
data_xyz = self.extract_operand_data(
|
|
507
|
+
data_xyz = self.extract_operand_data(
|
|
508
|
+
node.table, node.rows, node.cols, node.sheets
|
|
509
|
+
)
|
|
469
510
|
|
|
470
511
|
# Extracting data
|
|
471
512
|
significant_rows = node.rows is not None and len(node.rows) >= 1
|
|
@@ -475,28 +516,32 @@ class MLGeneration(ASTTemplate):
|
|
|
475
516
|
for e in data_xyz:
|
|
476
517
|
operand_ref = OperandReference(
|
|
477
518
|
op_node=op_node,
|
|
478
|
-
x=e[
|
|
479
|
-
y=e[
|
|
480
|
-
z=e[
|
|
519
|
+
x=e["x"] if significant_rows else None,
|
|
520
|
+
y=e["y"] if significant_cols else None,
|
|
521
|
+
z=e["z"] if significant_sheets else None,
|
|
481
522
|
OperandReference=getattr(node, "source_reference"),
|
|
482
|
-
VariableID=e[
|
|
523
|
+
VariableID=e["variable_id"],
|
|
483
524
|
)
|
|
484
525
|
|
|
485
526
|
self.session.add(operand_ref)
|
|
486
527
|
|
|
487
528
|
operand_ref_loc = OperandReferenceLocation(
|
|
488
529
|
op_reference=operand_ref,
|
|
489
|
-
CellID=e[
|
|
530
|
+
CellID=e["cell_id"],
|
|
490
531
|
Table=node.table,
|
|
491
|
-
Row=e[
|
|
492
|
-
column=e[
|
|
493
|
-
Sheet=e[
|
|
532
|
+
Row=e["row_code"],
|
|
533
|
+
column=e["column_code"],
|
|
534
|
+
Sheet=e["sheet_code"],
|
|
494
535
|
)
|
|
495
536
|
|
|
496
537
|
self.session.add(operand_ref_loc)
|
|
497
538
|
|
|
498
539
|
if node.table not in self.table_vid_dict:
|
|
499
|
-
table_vid = int(
|
|
540
|
+
table_vid = int(
|
|
541
|
+
self.data[self.data["table_code"] == node.table][
|
|
542
|
+
"table_vid"
|
|
543
|
+
].unique()[0]
|
|
544
|
+
)
|
|
500
545
|
self.table_vid_dict[node.table] = table_vid
|
|
501
546
|
|
|
502
547
|
if self.is_scripting:
|
|
@@ -509,11 +554,13 @@ class MLGeneration(ASTTemplate):
|
|
|
509
554
|
def visit_Dimension(self, node: Dimension):
|
|
510
555
|
setattr(node, "source_reference", "property")
|
|
511
556
|
op_node = self.create_operation_node(node, is_leaf=True)
|
|
512
|
-
property = ItemCategory.get_property_from_code(
|
|
557
|
+
property = ItemCategory.get_property_from_code(
|
|
558
|
+
code=node.dimension_code, session=self.session_queries
|
|
559
|
+
)
|
|
513
560
|
operand_ref = OperandReference(
|
|
514
561
|
op_node=op_node,
|
|
515
562
|
OperandReference=getattr(node, "source_reference"),
|
|
516
|
-
PropertyID=property.ItemID
|
|
563
|
+
PropertyID=property.ItemID,
|
|
517
564
|
)
|
|
518
565
|
self.session.add(operand_ref)
|
|
519
566
|
|
|
@@ -529,7 +576,7 @@ class MLGeneration(ASTTemplate):
|
|
|
529
576
|
operand_ref = OperandReference(
|
|
530
577
|
op_node=op_node,
|
|
531
578
|
OperandReference=getattr(node, "source_reference"),
|
|
532
|
-
ItemID=item_id
|
|
579
|
+
ItemID=item_id,
|
|
533
580
|
)
|
|
534
581
|
self.session.add(operand_ref)
|
|
535
582
|
|
|
@@ -542,7 +589,7 @@ class MLGeneration(ASTTemplate):
|
|
|
542
589
|
operand_ref = OperandReference(
|
|
543
590
|
op_node=op_node,
|
|
544
591
|
OperandReference=getattr(node, "source_reference"),
|
|
545
|
-
ItemID=item_id
|
|
592
|
+
ItemID=item_id,
|
|
546
593
|
)
|
|
547
594
|
self.session.add(operand_ref)
|
|
548
595
|
|
|
@@ -552,14 +599,13 @@ class MLGeneration(ASTTemplate):
|
|
|
552
599
|
|
|
553
600
|
op_version_id = self._get_op_version_id(node.operation_code)
|
|
554
601
|
|
|
555
|
-
operand_ref = OperandReference(
|
|
556
|
-
op_node=op_node,
|
|
557
|
-
OperandReference=op_version_id
|
|
558
|
-
)
|
|
602
|
+
operand_ref = OperandReference(op_node=op_node, OperandReference=op_version_id)
|
|
559
603
|
self.session.add(operand_ref)
|
|
560
604
|
|
|
561
605
|
def _get_op_version_id(self, operation_code):
|
|
562
|
-
op_version_id = self.operations_data[
|
|
606
|
+
op_version_id = self.operations_data[
|
|
607
|
+
self.operations_data["Code"] == operation_code
|
|
608
|
+
]["OperationVID"].values[0]
|
|
563
609
|
op_version_id = int(op_version_id)
|
|
564
610
|
return op_version_id
|
|
565
611
|
|
|
@@ -572,16 +618,20 @@ class MLGeneration(ASTTemplate):
|
|
|
572
618
|
def _add_table_vid_to_operation_tables(self, table_code):
|
|
573
619
|
if self.op_version_id not in self.operation_tables:
|
|
574
620
|
self.operation_tables[self.op_version_id] = []
|
|
575
|
-
table_vid = int(
|
|
621
|
+
table_vid = int(
|
|
622
|
+
self.data[self.data["table_code"] == table_code]["table_vid"].unique()[0]
|
|
623
|
+
)
|
|
576
624
|
if table_vid not in self.operation_tables[self.op_version_id]:
|
|
577
625
|
self.operation_tables[self.op_version_id].append(table_vid)
|
|
578
626
|
|
|
579
627
|
def store_objects_as_json(self):
|
|
580
|
-
operation_nodes = [
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
self.result[
|
|
584
|
-
self.result[
|
|
628
|
+
operation_nodes = [
|
|
629
|
+
o for o in self.session.new if isinstance(o, OperationNode) and not o.parent
|
|
630
|
+
]
|
|
631
|
+
self.result["operation_nodes"] = operation_nodes
|
|
632
|
+
self.result["operation_scopes"] = {}
|
|
633
|
+
self.result["operation_scopes"]["new"] = self.new_scopes
|
|
634
|
+
self.result["operation_scopes"]["existing"] = self.existing_scopes
|
|
585
635
|
self.session.expunge_all()
|
|
586
636
|
|
|
587
637
|
def compare_ast(self, reference: OperationNode):
|
|
@@ -589,12 +639,12 @@ class MLGeneration(ASTTemplate):
|
|
|
589
639
|
Compares the ML generated by the AST of the expression provided with the ML generated by the AST generated with the ML stored in the db.
|
|
590
640
|
:return: True if the ASTs are equal, False otherwise.
|
|
591
641
|
"""
|
|
592
|
-
op_nodes = self.result[
|
|
642
|
+
op_nodes = self.result["operation_nodes"]
|
|
593
643
|
|
|
594
644
|
if len(op_nodes) == 0:
|
|
595
645
|
raise Exception("No AST Generated")
|
|
596
646
|
|
|
597
647
|
if op_nodes[0] != reference:
|
|
598
|
-
return False #is_same_ast = False
|
|
648
|
+
return False # is_same_ast = False
|
|
599
649
|
|
|
600
|
-
return True #is_same_ast = True
|
|
650
|
+
return True # is_same_ast = True
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
from py_dpm.
|
|
2
|
-
from py_dpm.
|
|
3
|
-
from py_dpm.models import ViewModules
|
|
4
|
-
from py_dpm.
|
|
5
|
-
from py_dpm.
|
|
1
|
+
from py_dpm.dpm_xl.ast.nodes import Start, VarID, WithExpression
|
|
2
|
+
from py_dpm.dpm_xl.ast.template import ASTTemplate
|
|
3
|
+
from py_dpm.dpm.models import ViewModules
|
|
4
|
+
from py_dpm.dpm_xl.utils.operands_mapping import LabelHandler
|
|
5
|
+
from py_dpm.dpm_xl.utils.tokens import CROSS_MODULE, INTRA_MODULE, REPEATED_INTRA_MODULE
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class ModuleAnalyzer(ASTTemplate):
|
|
@@ -25,7 +25,7 @@ class ModuleAnalyzer(ASTTemplate):
|
|
|
25
25
|
unique_modules = []
|
|
26
26
|
|
|
27
27
|
for operand_info in self.module_info.values():
|
|
28
|
-
if operand_info ==
|
|
28
|
+
if operand_info == "Module not found":
|
|
29
29
|
print(f"Module not found: {self.module_info}")
|
|
30
30
|
return
|
|
31
31
|
unique_modules += operand_info
|
|
@@ -58,7 +58,7 @@ class ModuleAnalyzer(ASTTemplate):
|
|
|
58
58
|
if len(modules) > 0:
|
|
59
59
|
self.module_info[self.new_label()] = modules
|
|
60
60
|
else:
|
|
61
|
-
self.module_info[self.new_label()] =
|
|
61
|
+
self.module_info[self.new_label()] = "Module not found"
|
|
62
62
|
|
|
63
63
|
def find_common_modules(self, unique_modules):
|
|
64
64
|
common_modules = []
|