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.

Files changed (108) hide show
  1. {pytrilogy-0.0.2.23/pytrilogy.egg-info → pytrilogy-0.0.2.26}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_models.py +7 -22
  4. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/__init__.py +1 -1
  5. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/constants.py +1 -1
  6. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/env_processor.py +12 -6
  7. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/environment_helpers.py +0 -1
  8. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/models.py +163 -86
  9. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/concept_strategies_v3.py +23 -4
  10. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/common.py +0 -1
  11. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/node_merge_node.py +4 -4
  12. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/select_merge_node.py +49 -22
  13. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/merge_node.py +2 -2
  14. pytrilogy-0.0.2.26/trilogy/core/processing/utility.py +533 -0
  15. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/query_processor.py +47 -39
  16. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/base.py +6 -1
  17. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/common.py +4 -25
  18. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/executor.py +12 -3
  19. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/common.py +4 -6
  20. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/parse_engine.py +3 -2
  21. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/render.py +41 -17
  22. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/trilogy.lark +2 -2
  23. pytrilogy-0.0.2.23/trilogy/core/processing/utility.py +0 -551
  24. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/LICENSE.md +0 -0
  25. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/README.md +0 -0
  26. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pyproject.toml +0 -0
  27. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/SOURCES.txt +0 -0
  28. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/dependency_links.txt +0 -0
  29. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/entry_points.txt +0 -0
  30. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/requires.txt +0 -0
  31. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/pytrilogy.egg-info/top_level.txt +0 -0
  32. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/setup.cfg +0 -0
  33. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/setup.py +0 -0
  34. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_datatypes.py +0 -0
  35. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_declarations.py +0 -0
  36. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_derived_concepts.py +0 -0
  37. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_discovery_nodes.py +0 -0
  38. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_environment.py +0 -0
  39. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_functions.py +0 -0
  40. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_imports.py +0 -0
  41. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_metadata.py +0 -0
  42. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_multi_join_assignments.py +0 -0
  43. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_parsing.py +0 -0
  44. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_partial_handling.py +0 -0
  45. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_query_processing.py +0 -0
  46. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_select.py +0 -0
  47. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_show.py +0 -0
  48. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_statements.py +0 -0
  49. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_undefined_concept.py +0 -0
  50. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/tests/test_where_clause.py +0 -0
  51. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/compiler.py +0 -0
  52. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/__init__.py +0 -0
  53. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/constants.py +0 -0
  54. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/enums.py +0 -0
  55. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/ergonomics.py +0 -0
  56. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/exceptions.py +0 -0
  57. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/functions.py +0 -0
  58. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/graph_models.py +0 -0
  59. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/internal.py +0 -0
  60. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimization.py +0 -0
  61. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/__init__.py +0 -0
  62. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/base_optimization.py +0 -0
  63. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/inline_constant.py +0 -0
  64. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/inline_datasource.py +0 -0
  65. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  66. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/__init__.py +0 -0
  67. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/graph_utils.py +0 -0
  68. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/__init__.py +0 -0
  69. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  70. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  71. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/group_node.py +0 -0
  72. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  73. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  74. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
  75. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/select_node.py +0 -0
  76. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  77. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/node_generators/window_node.py +0 -0
  78. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/__init__.py +0 -0
  79. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/base_node.py +0 -0
  80. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/filter_node.py +0 -0
  81. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/group_node.py +0 -0
  82. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
  83. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  84. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/core/processing/nodes/window_node.py +0 -0
  85. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/__init__.py +0 -0
  86. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/bigquery.py +0 -0
  87. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/config.py +0 -0
  88. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/duckdb.py +0 -0
  89. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/enums.py +0 -0
  90. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/postgres.py +0 -0
  91. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/presto.py +0 -0
  92. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/snowflake.py +0 -0
  93. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/dialect/sql_server.py +0 -0
  94. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/engine.py +0 -0
  95. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/hooks/__init__.py +0 -0
  96. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/hooks/base_hook.py +0 -0
  97. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/hooks/graph_hook.py +0 -0
  98. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/hooks/query_debugger.py +0 -0
  99. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/metadata/__init__.py +0 -0
  100. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parser.py +0 -0
  101. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/__init__.py +0 -0
  102. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/config.py +0 -0
  103. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/exceptions.py +0 -0
  104. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/parsing/helpers.py +0 -0
  105. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/py.typed +0 -0
  106. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/scripts/__init__.py +0 -0
  107. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/scripts/trilogy.py +0 -0
  108. {pytrilogy-0.0.2.23 → pytrilogy-0.0.2.26}/trilogy/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytrilogy
3
- Version: 0.0.2.23
3
+ Version: 0.0.2.26
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.23
3
+ Version: 0.0.2.26
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
 
@@ -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.23"
7
+ __version__ = "0.0.2.26"
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,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(concept: Concept, g: ReferenceGraph):
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 _, pseudonym in concept.pseudonyms.items():
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()), list(environment.datasources.values())
73
+ list(environment.concepts.values())
74
+ + list(environment.alias_origin_lookup.values()),
75
+ list(environment.datasources.values()),
70
76
  )
@@ -191,4 +191,3 @@ def generate_related_concepts(
191
191
  environment.add_concept(auto, meta=meta)
192
192
  if isinstance(value, Concept):
193
193
  environment.merge_concept(auto, value, modifiers=[])
194
- assert value.pseudonyms is not None