pytrilogy 0.0.2.15__tar.gz → 0.0.2.17__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 (105) hide show
  1. {pytrilogy-0.0.2.15/pytrilogy.egg-info → pytrilogy-0.0.2.17}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/__init__.py +1 -1
  4. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/models.py +16 -12
  5. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/base.py +1 -0
  6. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/common.py +65 -10
  7. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/executor.py +5 -0
  8. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/parsing/parse_engine.py +1 -1
  9. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/parsing/render.py +2 -0
  10. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/parsing/trilogy.lark +4 -2
  11. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/LICENSE.md +0 -0
  12. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/README.md +0 -0
  13. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/pyproject.toml +0 -0
  14. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/pytrilogy.egg-info/SOURCES.txt +0 -0
  15. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/pytrilogy.egg-info/dependency_links.txt +0 -0
  16. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/pytrilogy.egg-info/entry_points.txt +0 -0
  17. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/pytrilogy.egg-info/requires.txt +0 -0
  18. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/pytrilogy.egg-info/top_level.txt +0 -0
  19. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/setup.cfg +0 -0
  20. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/setup.py +0 -0
  21. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_datatypes.py +0 -0
  22. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_declarations.py +0 -0
  23. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_derived_concepts.py +0 -0
  24. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_discovery_nodes.py +0 -0
  25. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_environment.py +0 -0
  26. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_functions.py +0 -0
  27. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_imports.py +0 -0
  28. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_metadata.py +0 -0
  29. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_models.py +0 -0
  30. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_multi_join_assignments.py +0 -0
  31. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_parsing.py +0 -0
  32. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_partial_handling.py +0 -0
  33. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_query_processing.py +0 -0
  34. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_select.py +0 -0
  35. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_statements.py +0 -0
  36. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_undefined_concept.py +0 -0
  37. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/tests/test_where_clause.py +0 -0
  38. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/compiler.py +0 -0
  39. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/constants.py +0 -0
  40. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/__init__.py +0 -0
  41. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/constants.py +0 -0
  42. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/enums.py +0 -0
  43. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/env_processor.py +0 -0
  44. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/environment_helpers.py +0 -0
  45. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/ergonomics.py +0 -0
  46. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/exceptions.py +0 -0
  47. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/functions.py +0 -0
  48. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/graph_models.py +0 -0
  49. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/internal.py +0 -0
  50. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/optimization.py +0 -0
  51. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/optimizations/__init__.py +0 -0
  52. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/optimizations/base_optimization.py +0 -0
  53. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/optimizations/inline_constant.py +0 -0
  54. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/optimizations/inline_datasource.py +0 -0
  55. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  56. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/__init__.py +0 -0
  57. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/concept_strategies_v3.py +0 -0
  58. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/graph_utils.py +0 -0
  59. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/__init__.py +0 -0
  60. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  61. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/common.py +0 -0
  62. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  63. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/group_node.py +0 -0
  64. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  65. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  66. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
  67. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
  68. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/select_node.py +0 -0
  69. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  70. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/node_generators/window_node.py +0 -0
  71. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/nodes/__init__.py +0 -0
  72. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/nodes/base_node.py +0 -0
  73. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/nodes/filter_node.py +0 -0
  74. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/nodes/group_node.py +0 -0
  75. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/nodes/merge_node.py +0 -0
  76. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
  77. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  78. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/nodes/window_node.py +0 -0
  79. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/processing/utility.py +0 -0
  80. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/core/query_processor.py +0 -0
  81. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/__init__.py +0 -0
  82. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/bigquery.py +0 -0
  83. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/config.py +0 -0
  84. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/duckdb.py +0 -0
  85. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/enums.py +0 -0
  86. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/postgres.py +0 -0
  87. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/presto.py +0 -0
  88. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/snowflake.py +0 -0
  89. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/dialect/sql_server.py +0 -0
  90. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/engine.py +0 -0
  91. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/hooks/__init__.py +0 -0
  92. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/hooks/base_hook.py +0 -0
  93. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/hooks/graph_hook.py +0 -0
  94. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/hooks/query_debugger.py +0 -0
  95. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/metadata/__init__.py +0 -0
  96. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/parser.py +0 -0
  97. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/parsing/__init__.py +0 -0
  98. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/parsing/common.py +0 -0
  99. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/parsing/config.py +0 -0
  100. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/parsing/exceptions.py +0 -0
  101. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/parsing/helpers.py +0 -0
  102. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/py.typed +0 -0
  103. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/scripts/__init__.py +0 -0
  104. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/scripts/trilogy.py +0 -0
  105. {pytrilogy-0.0.2.15 → pytrilogy-0.0.2.17}/trilogy/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytrilogy
3
- Version: 0.0.2.15
3
+ Version: 0.0.2.17
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.15
3
+ Version: 0.0.2.17
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -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.15"
7
+ __version__ = "0.0.2.17"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -2660,9 +2660,9 @@ class CTE(BaseModel):
2660
2660
  if isinstance(join, InstantiatedUnnestJoin):
2661
2661
  continue
2662
2662
  if join.left_cte.name == parent.name:
2663
- join.left_cte = ds_being_inlined
2663
+ join.inline_cte(parent)
2664
2664
  if join.right_cte.name == parent.name:
2665
- join.right_cte = ds_being_inlined
2665
+ join.inline_cte(parent)
2666
2666
  for k, v in self.source_map.items():
2667
2667
  if isinstance(v, list):
2668
2668
  self.source_map[k] = [
@@ -2885,34 +2885,38 @@ class JoinKey(BaseModel):
2885
2885
 
2886
2886
 
2887
2887
  class Join(BaseModel):
2888
- left_cte: CTE | Datasource
2889
- right_cte: CTE | Datasource
2888
+ left_cte: CTE
2889
+ right_cte: CTE
2890
2890
  jointype: JoinType
2891
2891
  joinkeys: List[JoinKey]
2892
2892
  joinkey_pairs: List[ConceptPair] | None = None
2893
+ inlined_ctes: set[str] = Field(default_factory=set)
2894
+
2895
+ def inline_cte(self, cte: CTE):
2896
+ self.inlined_ctes.add(cte.name)
2893
2897
 
2894
2898
  @property
2895
2899
  def left_name(self) -> str:
2896
- if isinstance(self.left_cte, Datasource):
2897
- return self.left_cte.identifier
2900
+ if self.left_cte.name in self.inlined_ctes:
2901
+ return self.left_cte.source.datasources[0].identifier
2898
2902
  return self.left_cte.name
2899
2903
 
2900
2904
  @property
2901
2905
  def right_name(self) -> str:
2902
- if isinstance(self.right_cte, Datasource):
2903
- return self.right_cte.identifier
2906
+ if self.right_cte.name in self.inlined_ctes:
2907
+ return self.right_cte.source.datasources[0].identifier
2904
2908
  return self.right_cte.name
2905
2909
 
2906
2910
  @property
2907
2911
  def left_ref(self) -> str:
2908
- if isinstance(self.left_cte, Datasource):
2909
- return f"{self.left_cte.safe_location} as {self.left_cte.identifier}"
2912
+ if self.left_cte.name in self.inlined_ctes:
2913
+ return f"{self.left_cte.source.datasources[0].safe_location} as {self.left_cte.source.datasources[0].identifier}"
2910
2914
  return self.left_cte.name
2911
2915
 
2912
2916
  @property
2913
2917
  def right_ref(self) -> str:
2914
- if isinstance(self.right_cte, Datasource):
2915
- return f"{self.right_cte.safe_location} as {self.right_cte.identifier}"
2918
+ if self.right_cte.name in self.inlined_ctes:
2919
+ return f"{self.right_cte.source.datasources[0].safe_location} as {self.right_cte.source.datasources[0].identifier}"
2916
2920
  return self.right_cte.name
2917
2921
 
2918
2922
  @property
@@ -608,6 +608,7 @@ class BaseDialect:
608
608
  join,
609
609
  self.QUOTE_CHARACTER,
610
610
  self.render_concept_sql,
611
+ self.render_expr,
611
612
  cte,
612
613
  self.UNNEST_MODE,
613
614
  )
@@ -1,6 +1,13 @@
1
- from trilogy.core.models import Join, InstantiatedUnnestJoin, CTE, Concept, Datasource
1
+ from trilogy.core.models import (
2
+ Join,
3
+ InstantiatedUnnestJoin,
4
+ CTE,
5
+ Concept,
6
+ Function,
7
+ RawColumnExpr,
8
+ )
2
9
  from trilogy.core.enums import UnnestMode, Modifier
3
- from typing import Optional, Callable
10
+ from typing import Callable
4
11
 
5
12
 
6
13
  def null_wrapper(lval: str, rval: str, modifiers: list[Modifier]) -> str:
@@ -21,19 +28,39 @@ def render_unnest(
21
28
  return f"{render_func(concept, cte, False)} as unnest_wrapper ({quote_character}{concept.safe_address}{quote_character})"
22
29
 
23
30
 
31
+ def render_join_concept(
32
+ name: str,
33
+ quote_character: str,
34
+ cte: CTE,
35
+ concept: Concept,
36
+ render_expr,
37
+ inlined_ctes: set[str],
38
+ ):
39
+ if cte.name in inlined_ctes:
40
+ ds = cte.source.datasources[0]
41
+ raw_content = ds.get_alias(concept)
42
+ if isinstance(raw_content, RawColumnExpr):
43
+ rval = raw_content.text
44
+ return rval
45
+ elif isinstance(raw_content, Function):
46
+ rval = render_expr(raw_content, cte=cte)
47
+ return rval
48
+ return f"{name}.{quote_character}{raw_content}{quote_character}"
49
+ return f"{name}.{quote_character}{concept.safe_address}{quote_character}"
50
+
51
+
24
52
  def render_join(
25
53
  join: Join | InstantiatedUnnestJoin,
26
54
  quote_character: str,
27
- render_func: Optional[Callable[[Concept, CTE, bool], str]] = None,
28
- cte: Optional[CTE] = None,
55
+ render_func: Callable[[Concept, CTE, bool], str],
56
+ render_expr_func: Callable[[Concept, CTE], str],
57
+ cte: CTE,
29
58
  unnest_mode: UnnestMode = UnnestMode.CROSS_APPLY,
30
59
  ) -> str | None:
31
60
  # {% for key in join.joinkeys %}{{ key.inner }} = {{ key.outer}}{% endfor %}
32
61
  if isinstance(join, InstantiatedUnnestJoin):
33
62
  if unnest_mode == UnnestMode.DIRECT:
34
63
  return None
35
- if not render_func:
36
- raise ValueError("must provide a render function to build an unnest joins")
37
64
  if not cte:
38
65
  raise ValueError("must provide a cte to build an unnest joins")
39
66
  if unnest_mode == UnnestMode.CROSS_JOIN:
@@ -46,8 +73,22 @@ def render_join(
46
73
  right_base = join.right_ref
47
74
  base_joinkeys = [
48
75
  null_wrapper(
49
- f"{left_name}.{quote_character}{join.left_cte.get_alias(key.concept) if isinstance(join.left_cte, Datasource) else key.concept.safe_address}{quote_character}",
50
- f"{right_name}.{quote_character}{join.right_cte.get_alias(key.concept) if isinstance(join.right_cte, Datasource) else key.concept.safe_address}{quote_character}",
76
+ render_join_concept(
77
+ left_name,
78
+ quote_character,
79
+ join.left_cte,
80
+ key.concept,
81
+ render_expr_func,
82
+ join.inlined_ctes,
83
+ ),
84
+ render_join_concept(
85
+ right_name,
86
+ quote_character,
87
+ join.right_cte,
88
+ key.concept,
89
+ render_expr_func,
90
+ join.inlined_ctes,
91
+ ),
51
92
  modifiers=key.concept.modifiers or [],
52
93
  )
53
94
  for key in join.joinkeys
@@ -56,8 +97,22 @@ def render_join(
56
97
  base_joinkeys.extend(
57
98
  [
58
99
  null_wrapper(
59
- f"{left_name}.{quote_character}{join.left_cte.get_alias(pair.left) if isinstance(join.left_cte, Datasource) else pair.left.safe_address}{quote_character}",
60
- f"{right_name}.{quote_character}{join.right_cte.get_alias(pair.right) if isinstance(join.right_cte, Datasource) else pair.right.safe_address}{quote_character}",
100
+ render_join_concept(
101
+ left_name,
102
+ quote_character,
103
+ join.left_cte,
104
+ pair.left,
105
+ render_expr_func,
106
+ join.inlined_ctes,
107
+ ),
108
+ render_join_concept(
109
+ right_name,
110
+ quote_character,
111
+ join.right_cte,
112
+ pair.right,
113
+ render_expr_func,
114
+ join.inlined_ctes,
115
+ ),
61
116
  modifiers=pair.modifiers
62
117
  + (pair.left.modifiers or [])
63
118
  + (pair.right.modifiers or []),
@@ -129,6 +129,11 @@ class Executor(object):
129
129
  ["name"],
130
130
  )
131
131
 
132
+ @execute_query.register
133
+ def _(self, query: str) -> CursorResult:
134
+
135
+ return self.execute_text(query)[-1]
136
+
132
137
  @execute_query.register
133
138
  def _(self, query: SelectStatement) -> CursorResult:
134
139
  sql = self.generator.generate_queries(
@@ -600,7 +600,7 @@ class ParseToObjects(Transformer):
600
600
  return args[3:-3]
601
601
 
602
602
  def raw_column_assignment(self, args):
603
- return RawColumnExpr(text=args[0])
603
+ return RawColumnExpr(text=args[1])
604
604
 
605
605
  @v_args(meta=True)
606
606
  def datasource(self, meta: Meta, args):
@@ -328,6 +328,8 @@ class Renderer:
328
328
  inputs = ",".join(self.to_string(c) for c in arg.arguments)
329
329
  if arg.operator == FunctionType.CONSTANT:
330
330
  return f"{inputs}"
331
+ if arg.operator == FunctionType.INDEX_ACCESS:
332
+ return f"{self.to_string(arg.arguments[0])}[{self.to_string(arg.arguments[1])}]"
331
333
  return f"{arg.operator.value}({inputs})"
332
334
 
333
335
  @to_string.register
@@ -47,9 +47,11 @@
47
47
 
48
48
  //column_assignment
49
49
  //figure out if we want static
50
- column_assignment: ((IDENTIFIER | _static_functions | raw_column_assignment ) ":" concept_assignment)
50
+ column_assignment: (raw_column_assignment | IDENTIFIER | _static_functions ) ":" concept_assignment
51
+
52
+ RAW_ENTRY.1: /raw\s*\(/s
51
53
 
52
- raw_column_assignment: "raw" "(" MULTILINE_STRING ")"
54
+ raw_column_assignment: RAW_ENTRY MULTILINE_STRING ")"
53
55
 
54
56
  column_assignment_list : column_assignment ("," column_assignment)* ","?
55
57
 
File without changes
File without changes
File without changes
File without changes