pytrilogy 0.0.3.0__tar.gz → 0.0.3.1__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 (127) hide show
  1. {pytrilogy-0.0.3.0/pytrilogy.egg-info → pytrilogy-0.0.3.1}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/__init__.py +1 -1
  4. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/models/build.py +41 -27
  5. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/models/environment.py +5 -0
  6. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/concept_strategies_v3.py +0 -2
  7. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/rowset_node.py +4 -6
  8. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/window_node.py +0 -1
  9. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/query_processor.py +6 -1
  10. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/base.py +3 -1
  11. pytrilogy-0.0.3.1/trilogy/hooks/__init__.py +4 -0
  12. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/hooks/query_debugger.py +4 -5
  13. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/parsing/common.py +9 -5
  14. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/parsing/parse_engine.py +15 -2
  15. pytrilogy-0.0.3.0/trilogy/scripts/__init__.py +0 -0
  16. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/LICENSE.md +0 -0
  17. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/README.md +0 -0
  18. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/pyproject.toml +0 -0
  19. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/pytrilogy.egg-info/SOURCES.txt +0 -0
  20. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/pytrilogy.egg-info/dependency_links.txt +0 -0
  21. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/pytrilogy.egg-info/entry_points.txt +0 -0
  22. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/pytrilogy.egg-info/requires.txt +0 -0
  23. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/pytrilogy.egg-info/top_level.txt +0 -0
  24. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/setup.cfg +0 -0
  25. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/setup.py +0 -0
  26. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_datatypes.py +0 -0
  27. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_declarations.py +0 -0
  28. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_derived_concepts.py +0 -0
  29. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_discovery_nodes.py +0 -0
  30. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_enums.py +0 -0
  31. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_environment.py +0 -0
  32. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_executor.py +0 -0
  33. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_functions.py +0 -0
  34. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_imports.py +0 -0
  35. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_metadata.py +0 -0
  36. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_models.py +0 -0
  37. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_multi_join_assignments.py +0 -0
  38. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_parse_engine.py +0 -0
  39. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_parsing.py +0 -0
  40. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_partial_handling.py +0 -0
  41. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_query_processing.py +0 -0
  42. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_select.py +0 -0
  43. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_show.py +0 -0
  44. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_statements.py +0 -0
  45. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_undefined_concept.py +0 -0
  46. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/tests/test_where_clause.py +0 -0
  47. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/compiler.py +0 -0
  48. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/constants.py +0 -0
  49. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/__init__.py +0 -0
  50. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/constants.py +0 -0
  51. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/enums.py +0 -0
  52. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/env_processor.py +0 -0
  53. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/environment_helpers.py +0 -0
  54. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/ergonomics.py +0 -0
  55. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/exceptions.py +0 -0
  56. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/functions.py +0 -0
  57. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/graph_models.py +0 -0
  58. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/internal.py +0 -0
  59. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/models/__init__.py +0 -0
  60. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/models/author.py +0 -0
  61. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/models/build_environment.py +0 -0
  62. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/models/core.py +0 -0
  63. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/models/datasource.py +0 -0
  64. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/models/execute.py +0 -0
  65. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/optimization.py +0 -0
  66. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/optimizations/__init__.py +0 -0
  67. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/optimizations/base_optimization.py +0 -0
  68. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/optimizations/inline_constant.py +0 -0
  69. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/optimizations/inline_datasource.py +0 -0
  70. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  71. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/__init__.py +0 -0
  72. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/graph_utils.py +0 -0
  73. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/__init__.py +0 -0
  74. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  75. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/common.py +0 -0
  76. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  77. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/group_node.py +0 -0
  78. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  79. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  80. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
  81. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/select_helpers/__init__.py +0 -0
  82. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +0 -0
  83. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/select_merge_node.py +0 -0
  84. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/select_node.py +0 -0
  85. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/union_node.py +0 -0
  86. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  87. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/nodes/__init__.py +0 -0
  88. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/nodes/base_node.py +0 -0
  89. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/nodes/filter_node.py +0 -0
  90. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/nodes/group_node.py +0 -0
  91. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/nodes/merge_node.py +0 -0
  92. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
  93. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/nodes/union_node.py +0 -0
  94. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  95. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/nodes/window_node.py +0 -0
  96. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/processing/utility.py +0 -0
  97. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/statements/__init__.py +0 -0
  98. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/statements/author.py +0 -0
  99. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/statements/build.py +0 -0
  100. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/statements/common.py +0 -0
  101. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/core/statements/execute.py +0 -0
  102. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/__init__.py +0 -0
  103. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/bigquery.py +0 -0
  104. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/common.py +0 -0
  105. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/config.py +0 -0
  106. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/duckdb.py +0 -0
  107. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/enums.py +0 -0
  108. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/postgres.py +0 -0
  109. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/presto.py +0 -0
  110. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/snowflake.py +0 -0
  111. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/dialect/sql_server.py +0 -0
  112. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/engine.py +0 -0
  113. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/executor.py +0 -0
  114. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/hooks/base_hook.py +0 -0
  115. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/hooks/graph_hook.py +0 -0
  116. {pytrilogy-0.0.3.0/trilogy/hooks → pytrilogy-0.0.3.1/trilogy/metadata}/__init__.py +0 -0
  117. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/parser.py +0 -0
  118. {pytrilogy-0.0.3.0/trilogy/metadata → pytrilogy-0.0.3.1/trilogy/parsing}/__init__.py +0 -0
  119. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/parsing/config.py +0 -0
  120. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/parsing/exceptions.py +0 -0
  121. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/parsing/helpers.py +0 -0
  122. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/parsing/render.py +0 -0
  123. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/parsing/trilogy.lark +0 -0
  124. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/py.typed +0 -0
  125. {pytrilogy-0.0.3.0/trilogy/parsing → pytrilogy-0.0.3.1/trilogy/scripts}/__init__.py +0 -0
  126. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/scripts/trilogy.py +0 -0
  127. {pytrilogy-0.0.3.0 → pytrilogy-0.0.3.1}/trilogy/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pytrilogy
3
- Version: 0.0.3.0
3
+ Version: 0.0.3.1
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.2
2
2
  Name: pytrilogy
3
- Version: 0.0.3.0
3
+ Version: 0.0.3.1
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -4,6 +4,6 @@ from trilogy.dialect.enums import Dialects
4
4
  from trilogy.executor import Executor
5
5
  from trilogy.parser import parse
6
6
 
7
- __version__ = "0.0.3.0"
7
+ __version__ = "0.0.3.1"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -242,6 +242,9 @@ class BuildGrain(BaseModel):
242
242
  components: set[str] = Field(default_factory=set)
243
243
  where_clause: Optional[BuildWhereClause] = None
244
244
 
245
+ def __init__(self, **kwargs):
246
+ super().__init__(**kwargs)
247
+
245
248
  def without_condition(self):
246
249
  return BuildGrain(components=self.components)
247
250
 
@@ -1171,7 +1174,7 @@ class BuildFilterItem(BuildConceptArgs, BaseModel):
1171
1174
 
1172
1175
  class BuildRowsetLineage(BuildConceptArgs, BaseModel):
1173
1176
  name: str
1174
- derived_concepts: List[BuildConcept]
1177
+ derived_concepts: List[str]
1175
1178
  select: SelectLineage | MultiSelectLineage
1176
1179
 
1177
1180
 
@@ -1222,8 +1225,8 @@ class BuildSelectLineage(BaseModel):
1222
1225
  limit: Optional[int] = None
1223
1226
  meta: Metadata = Field(default_factory=lambda: Metadata())
1224
1227
  grain: BuildGrain = Field(default_factory=BuildGrain)
1225
- where_clause: WhereClause | BuildWhereClause | None = Field(default=None)
1226
- having_clause: HavingClause | BuildHavingClause | None = Field(default=None)
1228
+ where_clause: BuildWhereClause | None = Field(default=None)
1229
+ having_clause: BuildHavingClause | None = Field(default=None)
1227
1230
 
1228
1231
  @property
1229
1232
  def output_components(self) -> List[BuildConcept]:
@@ -1447,7 +1450,9 @@ class Factory:
1447
1450
  ):
1448
1451
  self.grain = grain or Grain()
1449
1452
  self.environment = environment
1450
- self.local_concepts: dict[str, BuildConcept] = local_concepts or {}
1453
+ self.local_concepts: dict[str, BuildConcept] = (
1454
+ {} if local_concepts is None else local_concepts
1455
+ )
1451
1456
 
1452
1457
  @singledispatchmethod
1453
1458
  def build(self, base):
@@ -1494,7 +1499,7 @@ class Factory:
1494
1499
  @build.register
1495
1500
  def _(self, base: Function) -> BuildFunction:
1496
1501
 
1497
- new = BuildFunction(
1502
+ new = BuildFunction.model_construct(
1498
1503
  operator=base.operator,
1499
1504
  arguments=[self.build(c) for c in base.arguments],
1500
1505
  output_datatype=base.output_datatype,
@@ -1515,14 +1520,14 @@ class Factory:
1515
1520
 
1516
1521
  @build.register
1517
1522
  def _(self, base: CaseWhen) -> BuildCaseWhen:
1518
- return BuildCaseWhen(
1523
+ return BuildCaseWhen.model_construct(
1519
1524
  comparison=self.build(base.comparison),
1520
1525
  expr=(self.build(base.expr)),
1521
1526
  )
1522
1527
 
1523
1528
  @build.register
1524
1529
  def _(self, base: CaseElse) -> BuildCaseElse:
1525
- return BuildCaseElse(expr=self.build(base.expr))
1530
+ return BuildCaseElse.model_construct(expr=self.build(base.expr))
1526
1531
 
1527
1532
  @build.register
1528
1533
  def _(self, base: Concept) -> BuildConcept:
@@ -1537,7 +1542,7 @@ class Factory:
1537
1542
  derivation, final_grain, build_lineage
1538
1543
  )
1539
1544
  is_aggregate = Concept.calculate_is_aggregate(build_lineage)
1540
- rval = BuildConcept(
1545
+ rval = BuildConcept.model_construct(
1541
1546
  name=base.name,
1542
1547
  datatype=base.datatype,
1543
1548
  purpose=base.purpose,
@@ -1565,12 +1570,12 @@ class Factory:
1565
1570
  else:
1566
1571
  by = [self.build(x) for x in base.by]
1567
1572
  parent = self.build(base.function)
1568
- return BuildAggregateWrapper(function=parent, by=by)
1573
+ return BuildAggregateWrapper.model_construct(function=parent, by=by)
1569
1574
 
1570
1575
  @build.register
1571
1576
  def _(self, base: ColumnAssignment) -> BuildColumnAssignment:
1572
1577
 
1573
- return BuildColumnAssignment(
1578
+ return BuildColumnAssignment.model_construct(
1574
1579
  alias=(
1575
1580
  self.build(base.alias)
1576
1581
  if isinstance(base.alias, Function)
@@ -1584,26 +1589,31 @@ class Factory:
1584
1589
 
1585
1590
  @build.register
1586
1591
  def _(self, base: OrderBy) -> BuildOrderBy:
1587
- return BuildOrderBy(items=[self.build(x) for x in base.items])
1592
+ return BuildOrderBy.model_construct(items=[self.build(x) for x in base.items])
1588
1593
 
1589
1594
  @build.register
1590
1595
  def _(self, base: OrderItem) -> BuildOrderItem:
1591
- return BuildOrderItem(
1596
+ return BuildOrderItem.model_construct(
1592
1597
  expr=(self.build(base.expr)),
1593
1598
  order=base.order,
1594
1599
  )
1595
1600
 
1596
1601
  @build.register
1597
1602
  def _(self, base: WhereClause) -> BuildWhereClause:
1598
- return BuildWhereClause(conditional=self.build(base.conditional))
1603
+ return BuildWhereClause.model_construct(
1604
+ conditional=self.build(base.conditional)
1605
+ )
1599
1606
 
1600
1607
  @build.register
1601
1608
  def _(self, base: HavingClause) -> BuildHavingClause:
1602
- return BuildHavingClause(conditional=self.build(base.conditional))
1609
+ return BuildHavingClause.model_construct(
1610
+ conditional=self.build(base.conditional)
1611
+ )
1603
1612
 
1604
1613
  @build.register
1605
1614
  def _(self, base: WindowItem) -> BuildWindowItem:
1606
- return BuildWindowItem(
1615
+
1616
+ return BuildWindowItem.model_construct(
1607
1617
  type=base.type,
1608
1618
  content=self.build(base.content),
1609
1619
  order_by=[self.build(x) for x in base.order_by],
@@ -1613,7 +1623,7 @@ class Factory:
1613
1623
 
1614
1624
  @build.register
1615
1625
  def _(self, base: Conditional) -> BuildConditional:
1616
- return BuildConditional(
1626
+ return BuildConditional.model_construct(
1617
1627
  left=(self.build(base.left)),
1618
1628
  right=(self.build(base.right)),
1619
1629
  operator=base.operator,
@@ -1621,7 +1631,7 @@ class Factory:
1621
1631
 
1622
1632
  @build.register
1623
1633
  def _(self, base: SubselectComparison) -> BuildSubselectComparison:
1624
- return BuildSubselectComparison(
1634
+ return BuildSubselectComparison.model_construct(
1625
1635
  left=(self.build(base.left)),
1626
1636
  right=(self.build(base.right)),
1627
1637
  operator=base.operator,
@@ -1629,7 +1639,7 @@ class Factory:
1629
1639
 
1630
1640
  @build.register
1631
1641
  def _(self, base: Comparison) -> BuildComparison:
1632
- return BuildComparison(
1642
+ return BuildComparison.model_construct(
1633
1643
  left=(self.build(base.left)),
1634
1644
  right=(self.build(base.right)),
1635
1645
  operator=base.operator,
@@ -1637,7 +1647,7 @@ class Factory:
1637
1647
 
1638
1648
  @build.register
1639
1649
  def _(self, base: AlignItem) -> BuildAlignItem:
1640
- return BuildAlignItem(
1650
+ return BuildAlignItem.model_construct(
1641
1651
  alias=base.alias,
1642
1652
  concepts=[self.build(x) for x in base.concepts],
1643
1653
  namespace=base.namespace,
@@ -1645,7 +1655,9 @@ class Factory:
1645
1655
 
1646
1656
  @build.register
1647
1657
  def _(self, base: AlignClause) -> BuildAlignClause:
1648
- return BuildAlignClause(items=[self.build(x) for x in base.items])
1658
+ return BuildAlignClause.model_construct(
1659
+ items=[self.build(x) for x in base.items]
1660
+ )
1649
1661
 
1650
1662
  @build.register
1651
1663
  def _(self, base: RowsetItem):
@@ -1663,7 +1675,7 @@ class Factory:
1663
1675
  def _(self, base: RowsetLineage) -> BuildRowsetLineage:
1664
1676
  out = BuildRowsetLineage(
1665
1677
  name=base.name,
1666
- derived_concepts=[],
1678
+ derived_concepts=[x.address for x in base.derived_concepts],
1667
1679
  select=base.select,
1668
1680
  )
1669
1681
  return out
@@ -1675,17 +1687,19 @@ class Factory:
1675
1687
  where = factory.build(base.where_clause)
1676
1688
  else:
1677
1689
  where = None
1678
- return BuildGrain(components=base.components, where_clause=where)
1690
+ return BuildGrain.model_construct(
1691
+ components=base.components, where_clause=where
1692
+ )
1679
1693
 
1680
1694
  @build.register
1681
1695
  def _(self, base: FilterItem) -> BuildFilterItem:
1682
- return BuildFilterItem(
1696
+ return BuildFilterItem.model_construct(
1683
1697
  content=self.build(base.content), where=self.build(base.where)
1684
1698
  )
1685
1699
 
1686
1700
  @build.register
1687
1701
  def _(self, base: Parenthetical) -> BuildParenthetical:
1688
- return BuildParenthetical(content=(self.build(base.content)))
1702
+ return BuildParenthetical.model_construct(content=(self.build(base.content)))
1689
1703
 
1690
1704
  @build.register
1691
1705
  def _(self, base: SelectLineage) -> BuildSelectLineage:
@@ -1753,7 +1767,7 @@ class Factory:
1753
1767
  derived_base = []
1754
1768
  for k in base.derived_concepts:
1755
1769
  base_concept = self.environment.concepts[k]
1756
- x = BuildConcept(
1770
+ x = BuildConcept.model_construct(
1757
1771
  name=base_concept.name,
1758
1772
  datatype=base_concept.datatype,
1759
1773
  purpose=base_concept.purpose,
@@ -1778,7 +1792,7 @@ class Factory:
1778
1792
  local_concepts=local_build_cache,
1779
1793
  )
1780
1794
  where_factory = Factory(environment=self.environment)
1781
- lineage = BuildMultiSelectLineage(
1795
+ lineage = BuildMultiSelectLineage.model_construct(
1782
1796
  # we don't build selects here; they'll be built automatically in query discovery
1783
1797
  selects=base.selects,
1784
1798
  grain=final_grain,
@@ -1831,7 +1845,7 @@ class Factory:
1831
1845
  factory = Factory(
1832
1846
  grain=base.grain, environment=self.environment, local_concepts=local_cache
1833
1847
  )
1834
- return BuildDatasource(
1848
+ return BuildDatasource.model_construct(
1835
1849
  name=base.name,
1836
1850
  columns=[factory.build(c) for c in base.columns],
1837
1851
  address=base.address,
@@ -39,6 +39,7 @@ from trilogy.core.models.author import (
39
39
  Concept,
40
40
  ConceptRef,
41
41
  Function,
42
+ SelectLineage,
42
43
  UndefinedConcept,
43
44
  UndefinedConceptFull,
44
45
  address_with_namespace,
@@ -189,6 +190,7 @@ class Environment(BaseModel):
189
190
  ] = Field(default_factory=EnvironmentDatasourceDict)
190
191
  functions: Dict[str, Function] = Field(default_factory=dict)
191
192
  data_types: Dict[str, DataType] = Field(default_factory=dict)
193
+ named_statements: Dict[str, SelectLineage] = Field(default_factory=dict)
192
194
  imports: Dict[str, list[Import]] = Field(
193
195
  default_factory=lambda: defaultdict(list) # type: ignore
194
196
  )
@@ -217,6 +219,9 @@ class Environment(BaseModel):
217
219
 
218
220
  return Factory(self, local_concepts=local_concepts).build(self)
219
221
 
222
+ def add_rowset(self, name: str, lineage: SelectLineage):
223
+ self.named_statements[name] = lineage
224
+
220
225
  def duplicate(self):
221
226
  return Environment.model_construct(
222
227
  datasources=self.datasources.duplicate(),
@@ -779,8 +779,6 @@ def _search_concepts(
779
779
  else:
780
780
 
781
781
  completion_mandatory = mandatory_list
782
- if "date.month_seq" in completion_mandatory:
783
- raise SyntaxError(completion_mandatory)
784
782
  attempted: set[str] = set()
785
783
 
786
784
  found: set[str] = set()
@@ -54,17 +54,15 @@ def gen_rowset_node(
54
54
  rowset_relevant: list[BuildConcept] = [
55
55
  v
56
56
  for v in environment.concepts.values()
57
- if isinstance(v.lineage, BuildRowsetItem)
58
- and v.lineage.rowset.name == rowset.name
57
+ if v.address in lineage.rowset.derived_concepts
59
58
  ]
60
- # logger.info(
61
- # f"{padding(depth)}{LOGGER_PREFIX} rowset relevant nodes are {rowset_relevant}"
62
- # )
59
+
63
60
  select_hidden = node.hidden_concepts
64
61
  rowset_hidden = [
65
62
  x
66
63
  for x in rowset_relevant
67
- if isinstance(x.lineage, BuildRowsetItem)
64
+ if x.address in lineage.rowset.derived_concepts
65
+ and isinstance(x.lineage, BuildRowsetItem)
68
66
  and x.lineage.content.address in select_hidden
69
67
  ]
70
68
  additional_relevant = [
@@ -19,7 +19,6 @@ def resolve_window_parent_concepts(
19
19
  if not isinstance(concept.lineage, WINDOW_TYPES):
20
20
  raise ValueError
21
21
  base = []
22
- logger.info(concept.lineage)
23
22
  if concept.lineage.over:
24
23
  base += concept.lineage.over
25
24
  if concept.lineage.order_by:
@@ -12,6 +12,8 @@ from trilogy.core.models.build import (
12
12
  BuildConcept,
13
13
  BuildConditional,
14
14
  BuildDatasource,
15
+ BuildMultiSelectLineage,
16
+ BuildSelectLineage,
15
17
  Factory,
16
18
  )
17
19
  from trilogy.core.models.environment import Environment
@@ -373,7 +375,10 @@ def get_query_node(
373
375
  raise ValueError(f"Statement has no output components {statement}")
374
376
 
375
377
  history = history or History(base_environment=environment)
376
- build_statement = Factory(environment=environment).build(statement)
378
+ build_statement: BuildSelectLineage | BuildMultiSelectLineage = Factory(
379
+ environment=environment
380
+ ).build(statement)
381
+
377
382
  # build_statement = statement
378
383
  build_environment = environment.materialize_for_select(
379
384
  build_statement.local_concepts
@@ -84,7 +84,9 @@ CONDITIONAL_ITEMS = (BuildConditional,)
84
84
 
85
85
 
86
86
  def INVALID_REFERENCE_STRING(x: Any, callsite: str = ""):
87
- # raise SyntaxError(x)
87
+ # if CONFIG.validate_missing:
88
+ # raise SyntaxError(f"INVALID_REFERENCE_BUG_{callsite}<{x}>")
89
+
88
90
  return f"INVALID_REFERENCE_BUG_{callsite}<{x}>"
89
91
 
90
92
 
@@ -0,0 +1,4 @@
1
+ from trilogy.hooks.graph_hook import GraphHook
2
+ from trilogy.hooks.query_debugger import DebuggingHook
3
+
4
+ __all__ = ["DebuggingHook", "GraphHook"]
@@ -12,7 +12,6 @@ from trilogy.core.models.execute import (
12
12
  )
13
13
  from trilogy.core.processing.nodes import StrategyNode
14
14
  from trilogy.core.statements.author import SelectStatement
15
- from trilogy.dialect.bigquery import BigqueryDialect
16
15
  from trilogy.hooks.base_hook import BaseHook
17
16
 
18
17
 
@@ -22,9 +21,6 @@ class PrintMode(Enum):
22
21
  FULL = 3
23
22
 
24
23
 
25
- renderer = BigqueryDialect()
26
-
27
-
28
24
  class DebuggingHook(BaseHook):
29
25
  def __init__(
30
26
  self,
@@ -46,6 +42,9 @@ class DebuggingHook(BaseHook):
46
42
  self.process_other = PrintMode(process_other)
47
43
  self.messages: list[str] = []
48
44
  self.uuid = uuid4()
45
+ from trilogy.dialect.bigquery import BigqueryDialect
46
+
47
+ self.renderer = BigqueryDialect()
49
48
 
50
49
  def print(self, *args):
51
50
  merged = " ".join([str(x) for x in args])
@@ -123,7 +122,7 @@ class DebuggingHook(BaseHook):
123
122
  self.print(
124
123
  " " * depth, input.name, "->", input.group_to_grain, "->", select_statement
125
124
  )
126
- sql = renderer.render_cte(input).statement
125
+ sql = self.renderer.render_cte(input).statement
127
126
  for line in sql.split("\n"):
128
127
  logger.debug(" " * (depth) + line)
129
128
  if isinstance(input, CTE):
@@ -503,6 +503,11 @@ def rowset_to_concepts(rowset: RowsetDerivationStatement, environment: Environme
503
503
  if isinstance(orig_concept.lineage, FilterItem):
504
504
  if orig_concept.lineage.where == rowset.select.where_clause:
505
505
  name = environment.concepts[orig_concept.lineage.content.address].name
506
+ base_namespace = (
507
+ f"{rowset.name}.{orig_concept.namespace}"
508
+ if orig_concept.namespace != rowset.namespace
509
+ else rowset.name
510
+ )
506
511
 
507
512
  new_concept = Concept(
508
513
  name=name,
@@ -512,11 +517,7 @@ def rowset_to_concepts(rowset: RowsetDerivationStatement, environment: Environme
512
517
  grain=orig_concept.grain,
513
518
  # TODO: add proper metadata
514
519
  metadata=Metadata(concept_source=ConceptSource.CTE),
515
- namespace=(
516
- f"{rowset.name}.{orig_concept.namespace}"
517
- if orig_concept.namespace != rowset.namespace
518
- else rowset.name
519
- ),
520
+ namespace=base_namespace,
520
521
  keys=orig_concept.keys,
521
522
  derivation=Derivation.ROWSET,
522
523
  granularity=orig_concept.granularity,
@@ -538,6 +539,9 @@ def rowset_to_concepts(rowset: RowsetDerivationStatement, environment: Environme
538
539
  default_grain = Grain.from_concepts([*pre_output])
539
540
  # remap everything to the properties of the rowset
540
541
  for x in pre_output:
542
+ print("xxxx")
543
+ print(x.address)
544
+ print(x.grain)
541
545
  if x.keys:
542
546
  if all([k in orig for k in x.keys]):
543
547
  x.keys = set([orig[k].address if k in orig else k for k in x.keys])
@@ -576,11 +576,24 @@ class ParseToObjects(Transformer):
576
576
  select=select,
577
577
  namespace=self.environment.namespace or DEFAULT_NAMESPACE,
578
578
  )
579
+
580
+ # clean up current definitions
581
+ # to_delete = set()
582
+ # if output.name in self.environment.named_statements:
583
+ # for k, v in self.environment.concepts.items():
584
+ # if v.derivation == Derivation.ROWSET and v.lineage.rowset.name == name:
585
+ # to_delete.add(k)
586
+ # for k in to_delete:
587
+ # self.environment.concepts.pop(k)
588
+
579
589
  for new_concept in rowset_to_concepts(output, self.environment):
580
590
  if new_concept.metadata:
581
591
  new_concept.metadata.line_number = meta.line
582
- # output.select.local_concepts[new_concept.address] = new_concept
583
- self.environment.add_concept(new_concept)
592
+ self.environment.add_concept(new_concept, force=True)
593
+
594
+ self.environment.add_rowset(
595
+ output.name, output.select.as_lineage(self.environment)
596
+ )
584
597
  return output
585
598
 
586
599
  @v_args(meta=True)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes