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.

Files changed (108) hide show
  1. {pytrilogy-0.0.2.25/pytrilogy.egg-info → pytrilogy-0.0.2.27}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_models.py +7 -22
  4. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_parsing.py +22 -0
  5. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_partial_handling.py +1 -1
  6. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_query_processing.py +1 -1
  7. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/__init__.py +1 -1
  8. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/constants.py +1 -1
  9. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/graph_models.py +2 -2
  10. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/models.py +205 -140
  11. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/inline_datasource.py +4 -4
  12. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/common.py +0 -1
  13. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/select_merge_node.py +56 -23
  14. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/base_node.py +3 -0
  15. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/merge_node.py +12 -12
  16. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/select_node_v2.py +6 -2
  17. pytrilogy-0.0.2.27/trilogy/core/processing/utility.py +533 -0
  18. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/query_processor.py +65 -53
  19. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/base.py +1 -0
  20. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/common.py +4 -25
  21. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/executor.py +12 -3
  22. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/hooks/query_debugger.py +5 -1
  23. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/common.py +4 -6
  24. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/parse_engine.py +20 -16
  25. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/render.py +63 -21
  26. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/trilogy.lark +6 -4
  27. pytrilogy-0.0.2.25/trilogy/core/processing/utility.py +0 -554
  28. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/LICENSE.md +0 -0
  29. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/README.md +0 -0
  30. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pyproject.toml +0 -0
  31. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/SOURCES.txt +0 -0
  32. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/dependency_links.txt +0 -0
  33. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/entry_points.txt +0 -0
  34. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/requires.txt +0 -0
  35. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/pytrilogy.egg-info/top_level.txt +0 -0
  36. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/setup.cfg +0 -0
  37. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/setup.py +0 -0
  38. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_datatypes.py +0 -0
  39. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_declarations.py +0 -0
  40. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_derived_concepts.py +0 -0
  41. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_discovery_nodes.py +0 -0
  42. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_environment.py +0 -0
  43. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_functions.py +0 -0
  44. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_imports.py +0 -0
  45. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_metadata.py +0 -0
  46. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_multi_join_assignments.py +0 -0
  47. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_select.py +0 -0
  48. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_show.py +0 -0
  49. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_statements.py +0 -0
  50. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_undefined_concept.py +0 -0
  51. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/tests/test_where_clause.py +0 -0
  52. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/compiler.py +0 -0
  53. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/__init__.py +0 -0
  54. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/constants.py +0 -0
  55. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/enums.py +0 -0
  56. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/env_processor.py +0 -0
  57. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/environment_helpers.py +0 -0
  58. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/ergonomics.py +0 -0
  59. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/exceptions.py +0 -0
  60. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/functions.py +0 -0
  61. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/internal.py +0 -0
  62. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimization.py +0 -0
  63. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/__init__.py +0 -0
  64. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/base_optimization.py +0 -0
  65. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/inline_constant.py +0 -0
  66. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  67. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/__init__.py +0 -0
  68. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/concept_strategies_v3.py +0 -0
  69. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/graph_utils.py +0 -0
  70. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/__init__.py +0 -0
  71. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  72. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  73. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/group_node.py +0 -0
  74. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  75. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  76. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
  77. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
  78. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/select_node.py +0 -0
  79. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  80. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/node_generators/window_node.py +0 -0
  81. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/__init__.py +0 -0
  82. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/filter_node.py +0 -0
  83. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/group_node.py +0 -0
  84. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  85. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/core/processing/nodes/window_node.py +0 -0
  86. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/__init__.py +0 -0
  87. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/bigquery.py +0 -0
  88. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/config.py +0 -0
  89. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/duckdb.py +0 -0
  90. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/enums.py +0 -0
  91. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/postgres.py +0 -0
  92. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/presto.py +0 -0
  93. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/snowflake.py +0 -0
  94. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/dialect/sql_server.py +0 -0
  95. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/engine.py +0 -0
  96. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/hooks/__init__.py +0 -0
  97. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/hooks/base_hook.py +0 -0
  98. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/hooks/graph_hook.py +0 -0
  99. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/metadata/__init__.py +0 -0
  100. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parser.py +0 -0
  101. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/__init__.py +0 -0
  102. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/config.py +0 -0
  103. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/exceptions.py +0 -0
  104. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/parsing/helpers.py +0 -0
  105. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/py.typed +0 -0
  106. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/scripts/__init__.py +0 -0
  107. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/scripts/trilogy.py +0 -0
  108. {pytrilogy-0.0.2.25 → pytrilogy-0.0.2.27}/trilogy/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytrilogy
3
- Version: 0.0.2.25
3
+ Version: 0.0.2.27
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytrilogy
3
- Version: 0.0.2.25
3
+ Version: 0.0.2.27
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -11,7 +11,7 @@ from trilogy.core.models import (
11
11
  BaseJoin,
12
12
  Comparison,
13
13
  Join,
14
- JoinKey,
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
- joinkeys=[JoinKey(concept=x) for x in outputs],
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 JOIN test and testb on local.product_id<local.product_id>,local.category_id<local.category_id>"
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 = """
@@ -74,7 +74,7 @@ def setup_titanic(env: Environment):
74
74
 
75
75
  env.add_datasource(
76
76
  Datasource(
77
- identifier="raw_data",
77
+ name="raw_data",
78
78
  address="raw_titanic",
79
79
  columns=[
80
80
  ColumnAssignment(alias="passengerid", concept=id),
@@ -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} == {"local_revenue_at_local_order_id_at_abstract"}
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"
@@ -4,6 +4,6 @@ from trilogy.executor import Executor
4
4
  from trilogy.parser import parse
5
5
  from trilogy.constants import CONFIG
6
6
 
7
- __version__ = "0.0.2.25"
7
+ __version__ = "0.0.2.27"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -7,7 +7,7 @@ logger = getLogger("trilogy")
7
7
 
8
8
  DEFAULT_NAMESPACE = "local"
9
9
 
10
- VIRTUAL_CONCEPT_PREFIX = "_virtual"
10
+ VIRTUAL_CONCEPT_PREFIX = "_virt"
11
11
 
12
12
  ENV_CACHE_NAME = ".preql_cache.json"
13
13
 
@@ -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.namespace}.{input.name}@{input.grain}"
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.namespace}.{input.identifier}"
17
+ return f"ds~{input.identifier}"
18
18
 
19
19
 
20
20
  class ReferenceGraph(nx.DiGraph):