pytrilogy 0.0.2.25__tar.gz → 0.0.2.27__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.25/pytrilogy.egg-info → pytrilogy-0.0.2.27}/PKG-INFO +1 -1
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27/pytrilogy.egg-info}/PKG-INFO +1 -1
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_models.py +7 -22
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_parsing.py +22 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_partial_handling.py +1 -1
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_query_processing.py +1 -1
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/__init__.py +1 -1
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/constants.py +1 -1
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/graph_models.py +2 -2
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/models.py +205 -140
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/inline_datasource.py +4 -4
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/common.py +0 -1
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/select_merge_node.py +56 -23
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/base_node.py +3 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/merge_node.py +12 -12
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/select_node_v2.py +6 -2
- pytrilogy-0.0.2.27/trilogy/core/processing/utility.py +533 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/query_processor.py +65 -53
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/base.py +1 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/common.py +4 -25
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/executor.py +12 -3
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/hooks/query_debugger.py +5 -1
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/common.py +4 -6
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/parse_engine.py +20 -16
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/render.py +63 -21
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/trilogy.lark +6 -4
- pytrilogy-0.0.2.25/trilogy/core/processing/utility.py +0 -554
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/LICENSE.md +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/README.md +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pyproject.toml +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/SOURCES.txt +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/dependency_links.txt +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/entry_points.txt +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/requires.txt +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/top_level.txt +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/setup.cfg +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/setup.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_datatypes.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_declarations.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_derived_concepts.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_discovery_nodes.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_environment.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_functions.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_imports.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_metadata.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_multi_join_assignments.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_select.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_show.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_statements.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_undefined_concept.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_where_clause.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/compiler.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/constants.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/enums.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/env_processor.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/environment_helpers.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/ergonomics.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/exceptions.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/functions.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/internal.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimization.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/base_optimization.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/inline_constant.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/concept_strategies_v3.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/graph_utils.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/basic_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/filter_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/group_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/select_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/window_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/filter_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/group_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/unnest_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/window_node.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/bigquery.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/config.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/duckdb.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/enums.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/postgres.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/presto.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/snowflake.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/sql_server.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/engine.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/hooks/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/hooks/base_hook.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/hooks/graph_hook.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/metadata/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parser.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/config.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/exceptions.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/helpers.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/py.typed +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/scripts/__init__.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/scripts/trilogy.py +0 -0
- {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/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
|
|
|
@@ -491,6 +491,28 @@ select x;
|
|
|
491
491
|
assert "abcdef as test" in results, results
|
|
492
492
|
|
|
493
493
|
|
|
494
|
+
def test_datasource_where_equivalent():
|
|
495
|
+
|
|
496
|
+
text = """
|
|
497
|
+
key x int;
|
|
498
|
+
key y int;
|
|
499
|
+
|
|
500
|
+
datasource test (
|
|
501
|
+
x:x,
|
|
502
|
+
y:~y)
|
|
503
|
+
grain(x)
|
|
504
|
+
complete where y > 10
|
|
505
|
+
address `abc:def`
|
|
506
|
+
;
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
"""
|
|
510
|
+
env, parsed = parse_text(text)
|
|
511
|
+
|
|
512
|
+
ds = parsed[-1]
|
|
513
|
+
assert ds.non_partial_for.conditional.right == 10
|
|
514
|
+
|
|
515
|
+
|
|
494
516
|
def test_filter_concise():
|
|
495
517
|
|
|
496
518
|
text = """
|
|
@@ -134,7 +134,7 @@ def test_query_aggregation(test_environment, test_environment_graph):
|
|
|
134
134
|
environment=test_environment, graph=test_environment_graph, statement=select
|
|
135
135
|
)
|
|
136
136
|
|
|
137
|
-
assert {datasource.identifier} == {"
|
|
137
|
+
assert {datasource.identifier} == {"revenue_at_local_order_id_at_abstract"}
|
|
138
138
|
check = datasource
|
|
139
139
|
assert len(check.input_concepts) == 2
|
|
140
140
|
assert check.input_concepts[0].name == "revenue"
|
|
@@ -6,7 +6,7 @@ from trilogy.core.models import Concept, Datasource
|
|
|
6
6
|
def concept_to_node(input: Concept) -> str:
|
|
7
7
|
# if input.purpose == Purpose.METRIC:
|
|
8
8
|
# return f"c~{input.namespace}.{input.name}@{input.grain}"
|
|
9
|
-
return f"c~{input.
|
|
9
|
+
return f"c~{input.address}@{input.grain}"
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def datasource_to_node(input: Datasource) -> str:
|
|
@@ -14,7 +14,7 @@ def datasource_to_node(input: Datasource) -> str:
|
|
|
14
14
|
# return "ds~join~" + ",".join(
|
|
15
15
|
# [datasource_to_node(sub) for sub in input.datasources]
|
|
16
16
|
# )
|
|
17
|
-
return f"ds~{input.
|
|
17
|
+
return f"ds~{input.identifier}"
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
class ReferenceGraph(nx.DiGraph):
|