pytrilogy 0.0.2.23__tar.gz → 0.0.2.26__tar.gz
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 pytrilogy might be problematic. Click here for more details.
- {pytrilogy-0.0.2.23/pytrilogy.egg-info → pytrilogy-0.0.2.26}/PKG-INFO +1 -1
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26/pytrilogy.egg-info}/PKG-INFO +1 -1
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_models.py +7 -22
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/__init__.py +1 -1
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/constants.py +1 -1
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/env_processor.py +12 -6
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/environment_helpers.py +0 -1
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/models.py +163 -86
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/concept_strategies_v3.py +23 -4
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/common.py +0 -1
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/node_merge_node.py +4 -4
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/select_merge_node.py +49 -22
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/merge_node.py +2 -2
- pytrilogy-0.0.2.26/trilogy/core/processing/utility.py +533 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/query_processor.py +47 -39
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/base.py +6 -1
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/common.py +4 -25
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/executor.py +12 -3
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/common.py +4 -6
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/parse_engine.py +3 -2
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/render.py +41 -17
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/trilogy.lark +2 -2
- pytrilogy-0.0.2.23/trilogy/core/processing/utility.py +0 -551
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/LICENSE.md +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/README.md +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pyproject.toml +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/SOURCES.txt +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/dependency_links.txt +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/entry_points.txt +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/requires.txt +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/top_level.txt +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/setup.cfg +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/setup.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_datatypes.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_declarations.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_derived_concepts.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_discovery_nodes.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_environment.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_functions.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_imports.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_metadata.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_multi_join_assignments.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_parsing.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_partial_handling.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_query_processing.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_select.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_show.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_statements.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_undefined_concept.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_where_clause.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/compiler.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/constants.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/enums.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/ergonomics.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/exceptions.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/functions.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/graph_models.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/internal.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimization.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/base_optimization.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/inline_constant.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/inline_datasource.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/graph_utils.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/basic_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/filter_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/group_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/select_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/window_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/base_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/filter_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/group_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/unnest_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/window_node.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/bigquery.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/config.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/duckdb.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/enums.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/postgres.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/presto.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/snowflake.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/sql_server.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/engine.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/hooks/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/hooks/base_hook.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/hooks/graph_hook.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/hooks/query_debugger.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/metadata/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parser.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/config.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/exceptions.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/helpers.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/py.typed +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/scripts/__init__.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/scripts/trilogy.py +0 -0
- {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/utility.py +0 -0
|
@@ -11,7 +11,7 @@ from trilogy.core.models import (
|
|
|
11
11
|
BaseJoin,
|
|
12
12
|
Comparison,
|
|
13
13
|
Join,
|
|
14
|
-
|
|
14
|
+
CTEConceptPair,
|
|
15
15
|
Concept,
|
|
16
16
|
AggregateWrapper,
|
|
17
17
|
RowsetItem,
|
|
@@ -190,31 +190,13 @@ def test_base_join(test_environment: Environment):
|
|
|
190
190
|
right_datasource=test_environment.datasources["products"],
|
|
191
191
|
concepts=[
|
|
192
192
|
test_environment.concepts["product_id"],
|
|
193
|
-
test_environment.concepts["category_name"],
|
|
193
|
+
# test_environment.concepts["category_name"],
|
|
194
194
|
],
|
|
195
195
|
join_type=JoinType.RIGHT_OUTER,
|
|
196
|
-
filter_to_mutual=True,
|
|
197
196
|
)
|
|
198
197
|
|
|
199
198
|
assert x.concepts == [test_environment.concepts["product_id"]]
|
|
200
199
|
|
|
201
|
-
exc3: SyntaxError | None = None
|
|
202
|
-
try:
|
|
203
|
-
x = BaseJoin(
|
|
204
|
-
left_datasource=test_environment.datasources["revenue"],
|
|
205
|
-
right_datasource=test_environment.datasources["category"],
|
|
206
|
-
concepts=[
|
|
207
|
-
test_environment.concepts["product_id"],
|
|
208
|
-
test_environment.concepts["category_name"],
|
|
209
|
-
],
|
|
210
|
-
join_type=JoinType.RIGHT_OUTER,
|
|
211
|
-
filter_to_mutual=True,
|
|
212
|
-
)
|
|
213
|
-
except Exception as exc4:
|
|
214
|
-
exc3 = exc4
|
|
215
|
-
pass
|
|
216
|
-
assert isinstance(exc3, SyntaxError)
|
|
217
|
-
|
|
218
200
|
|
|
219
201
|
def test_comparison():
|
|
220
202
|
try:
|
|
@@ -264,13 +246,16 @@ def test_join(test_environment: Environment):
|
|
|
264
246
|
test = Join(
|
|
265
247
|
left_cte=a,
|
|
266
248
|
right_cte=b,
|
|
267
|
-
|
|
249
|
+
joinkey_pairs=[
|
|
250
|
+
CTEConceptPair(left=x, right=x, existing_datasource=a.source, cte=a)
|
|
251
|
+
for x in outputs
|
|
252
|
+
],
|
|
268
253
|
jointype=JoinType.RIGHT_OUTER,
|
|
269
254
|
)
|
|
270
255
|
|
|
271
256
|
assert (
|
|
272
257
|
str(test)
|
|
273
|
-
== "right outer
|
|
258
|
+
== "right outer join testb on test.local.product_id=local.product_id,test.local.category_id=local.category_id"
|
|
274
259
|
), str(test)
|
|
275
260
|
|
|
276
261
|
|
|
@@ -6,17 +6,20 @@ from trilogy.core.graph_models import (
|
|
|
6
6
|
from trilogy.core.models import Environment, Concept, Datasource
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
def add_concept(
|
|
9
|
+
def add_concept(
|
|
10
|
+
concept: Concept, g: ReferenceGraph, concept_mapping: dict[str, Concept]
|
|
11
|
+
):
|
|
10
12
|
g.add_node(concept)
|
|
11
13
|
# if we have sources, recursively add them
|
|
12
14
|
node_name = concept_to_node(concept)
|
|
13
15
|
if concept.concept_arguments:
|
|
14
16
|
for source in concept.concept_arguments:
|
|
15
17
|
generic = source.with_default_grain()
|
|
16
|
-
add_concept(generic, g)
|
|
18
|
+
add_concept(generic, g, concept_mapping)
|
|
17
19
|
|
|
18
20
|
g.add_edge(generic, node_name)
|
|
19
|
-
for
|
|
21
|
+
for ps_address in concept.pseudonyms:
|
|
22
|
+
pseudonym = concept_mapping[ps_address]
|
|
20
23
|
pseudonym = pseudonym.with_default_grain()
|
|
21
24
|
pseudonym_node = concept_to_node(pseudonym)
|
|
22
25
|
if (pseudonym_node, node_name) in g.edges and (
|
|
@@ -28,7 +31,7 @@ def add_concept(concept: Concept, g: ReferenceGraph):
|
|
|
28
31
|
continue
|
|
29
32
|
g.add_edge(pseudonym_node, node_name, pseudonym=True)
|
|
30
33
|
g.add_edge(node_name, pseudonym_node, pseudonym=True)
|
|
31
|
-
add_concept(pseudonym, g)
|
|
34
|
+
add_concept(pseudonym, g, concept_mapping)
|
|
32
35
|
|
|
33
36
|
|
|
34
37
|
def generate_adhoc_graph(
|
|
@@ -37,10 +40,11 @@ def generate_adhoc_graph(
|
|
|
37
40
|
restrict_to_listed: bool = False,
|
|
38
41
|
) -> ReferenceGraph:
|
|
39
42
|
g = ReferenceGraph()
|
|
43
|
+
concept_mapping = {x.address: x for x in concepts}
|
|
40
44
|
|
|
41
45
|
# add all parsed concepts
|
|
42
46
|
for concept in concepts:
|
|
43
|
-
add_concept(concept, g)
|
|
47
|
+
add_concept(concept, g, concept_mapping)
|
|
44
48
|
|
|
45
49
|
for dataset in datasources:
|
|
46
50
|
node = datasource_to_node(dataset)
|
|
@@ -66,5 +70,7 @@ def generate_graph(
|
|
|
66
70
|
) -> ReferenceGraph:
|
|
67
71
|
|
|
68
72
|
return generate_adhoc_graph(
|
|
69
|
-
list(environment.concepts.values())
|
|
73
|
+
list(environment.concepts.values())
|
|
74
|
+
+ list(environment.alias_origin_lookup.values()),
|
|
75
|
+
list(environment.datasources.values()),
|
|
70
76
|
)
|