pytrilogy 0.0.3.39__tar.gz → 0.0.3.40__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 (139) hide show
  1. {pytrilogy-0.0.3.39/pytrilogy.egg-info → pytrilogy-0.0.3.40}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_parsing.py +28 -1
  4. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/__init__.py +1 -1
  5. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/environment_helpers.py +5 -5
  6. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/models/environment.py +2 -2
  7. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/parsing/common.py +6 -0
  8. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/LICENSE.md +0 -0
  9. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/README.md +0 -0
  10. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/pyproject.toml +0 -0
  11. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/pytrilogy.egg-info/SOURCES.txt +0 -0
  12. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/pytrilogy.egg-info/dependency_links.txt +0 -0
  13. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/pytrilogy.egg-info/entry_points.txt +0 -0
  14. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/pytrilogy.egg-info/requires.txt +0 -0
  15. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/pytrilogy.egg-info/top_level.txt +0 -0
  16. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/setup.cfg +0 -0
  17. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/setup.py +0 -0
  18. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_datatypes.py +0 -0
  19. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_declarations.py +0 -0
  20. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_derived_concepts.py +0 -0
  21. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_discovery_nodes.py +0 -0
  22. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_enums.py +0 -0
  23. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_environment.py +0 -0
  24. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_executor.py +0 -0
  25. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_functions.py +0 -0
  26. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_imports.py +0 -0
  27. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_metadata.py +0 -0
  28. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_models.py +0 -0
  29. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_multi_join_assignments.py +0 -0
  30. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_parse_engine.py +0 -0
  31. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_partial_handling.py +0 -0
  32. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_query_processing.py +0 -0
  33. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_query_render.py +0 -0
  34. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_select.py +0 -0
  35. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_show.py +0 -0
  36. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_statements.py +0 -0
  37. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_typing.py +0 -0
  38. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_undefined_concept.py +0 -0
  39. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_user_functions.py +0 -0
  40. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/tests/test_where_clause.py +0 -0
  41. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/authoring/__init__.py +0 -0
  42. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/compiler.py +0 -0
  43. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/constants.py +0 -0
  44. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/__init__.py +0 -0
  45. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/constants.py +0 -0
  46. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/enums.py +0 -0
  47. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/env_processor.py +0 -0
  48. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/ergonomics.py +0 -0
  49. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/exceptions.py +0 -0
  50. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/functions.py +0 -0
  51. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/graph_models.py +0 -0
  52. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/internal.py +0 -0
  53. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/models/__init__.py +0 -0
  54. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/models/author.py +0 -0
  55. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/models/build.py +0 -0
  56. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/models/build_environment.py +0 -0
  57. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/models/core.py +0 -0
  58. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/models/datasource.py +0 -0
  59. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/models/execute.py +0 -0
  60. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/optimization.py +0 -0
  61. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/optimizations/__init__.py +0 -0
  62. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/optimizations/base_optimization.py +0 -0
  63. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/optimizations/inline_constant.py +0 -0
  64. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/optimizations/inline_datasource.py +0 -0
  65. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  66. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/__init__.py +0 -0
  67. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/concept_strategies_v3.py +0 -0
  68. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/graph_utils.py +0 -0
  69. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/__init__.py +0 -0
  70. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  71. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/common.py +0 -0
  72. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  73. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/group_node.py +0 -0
  74. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  75. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  76. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
  77. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
  78. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/select_helpers/__init__.py +0 -0
  79. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +0 -0
  80. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/select_merge_node.py +0 -0
  81. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/select_node.py +0 -0
  82. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/synonym_node.py +0 -0
  83. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/union_node.py +0 -0
  84. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  85. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/node_generators/window_node.py +0 -0
  86. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/nodes/__init__.py +0 -0
  87. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/nodes/base_node.py +0 -0
  88. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/nodes/filter_node.py +0 -0
  89. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/nodes/group_node.py +0 -0
  90. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/nodes/merge_node.py +0 -0
  91. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
  92. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/nodes/union_node.py +0 -0
  93. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  94. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/nodes/window_node.py +0 -0
  95. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/processing/utility.py +0 -0
  96. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/query_processor.py +0 -0
  97. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/statements/__init__.py +0 -0
  98. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/statements/author.py +0 -0
  99. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/statements/build.py +0 -0
  100. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/statements/common.py +0 -0
  101. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/core/statements/execute.py +0 -0
  102. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/__init__.py +0 -0
  103. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/base.py +0 -0
  104. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/bigquery.py +0 -0
  105. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/common.py +0 -0
  106. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/config.py +0 -0
  107. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/dataframe.py +0 -0
  108. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/duckdb.py +0 -0
  109. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/enums.py +0 -0
  110. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/postgres.py +0 -0
  111. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/presto.py +0 -0
  112. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/snowflake.py +0 -0
  113. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/dialect/sql_server.py +0 -0
  114. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/engine.py +0 -0
  115. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/executor.py +0 -0
  116. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/hooks/__init__.py +0 -0
  117. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/hooks/base_hook.py +0 -0
  118. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/hooks/graph_hook.py +0 -0
  119. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/hooks/query_debugger.py +0 -0
  120. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/metadata/__init__.py +0 -0
  121. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/parser.py +0 -0
  122. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/parsing/__init__.py +0 -0
  123. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/parsing/config.py +0 -0
  124. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/parsing/exceptions.py +0 -0
  125. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/parsing/helpers.py +0 -0
  126. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/parsing/parse_engine.py +0 -0
  127. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/parsing/render.py +0 -0
  128. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/parsing/trilogy.lark +0 -0
  129. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/py.typed +0 -0
  130. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/render.py +0 -0
  131. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/scripts/__init__.py +0 -0
  132. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/scripts/trilogy.py +0 -0
  133. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/std/__init__.py +0 -0
  134. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/std/date.preql +0 -0
  135. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/std/display.preql +0 -0
  136. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/std/geography.preql +0 -0
  137. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/std/money.preql +0 -0
  138. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/std/report.preql +0 -0
  139. {pytrilogy-0.0.3.39 → pytrilogy-0.0.3.40}/trilogy/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.39
3
+ Version: 0.0.3.40
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.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.39
3
+ Version: 0.0.3.40
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -3,6 +3,7 @@ from pytest import raises
3
3
  from trilogy import Dialects
4
4
  from trilogy.constants import MagicConstants, Parsing
5
5
  from trilogy.core.enums import BooleanOperator, ComparisonOperator, Purpose
6
+ from trilogy.core.exceptions import InvalidSyntaxException
6
7
  from trilogy.core.functions import argument_to_purpose, function_args_to_output_purpose
7
8
  from trilogy.core.models.author import Comparison
8
9
  from trilogy.core.models.core import (
@@ -730,10 +731,36 @@ select [5,6,7,8] as int_array, 4 as scalar
730
731
 
731
732
  SELECT
732
733
  int_array,
733
- sum(scalar)->scalar
734
+ 1+2->scalar
734
735
  ;
735
736
  """
736
737
  with raises(ParseError):
737
738
  env, parsed = parse_text(
738
739
  x, parse_config=Parsing(strict_name_shadow_enforcement=True)
739
740
  )
741
+ x = """
742
+ key scalar int;
743
+ property scalar.int_array list<int>;
744
+
745
+ key split <- unnest(int_array);
746
+
747
+ datasource avalues (
748
+ int_array: int_array,
749
+ scalar: scalar
750
+ )
751
+ grain (scalar)
752
+ query '''(
753
+ select [1,2,3,4] as int_array, 2 as scalar
754
+ union all
755
+ select [5,6,7,8] as int_array, 4 as scalar
756
+ )''';
757
+
758
+ SELECT
759
+ int_array,
760
+ sum(scalar)->scalar
761
+ ;
762
+ """
763
+ with raises(InvalidSyntaxException):
764
+ env, parsed = parse_text(
765
+ x, parse_config=Parsing(strict_name_shadow_enforcement=True)
766
+ )
@@ -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.39"
7
+ __version__ = "0.0.3.40"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -67,7 +67,7 @@ def generate_date_concepts(concept: Concept, environment: Environment):
67
67
  [concept.address],
68
68
  ),
69
69
  metadata=Metadata(
70
- description=f"Auto-derived from {base_description}. {FUNCTION_DESCRIPTION_MAPS.get(ftype, ftype.value)}. ",
70
+ description=f"Auto-derived from {base_description}. {FUNCTION_DESCRIPTION_MAPS.get(ftype, ftype.value)}",
71
71
  line_number=base_line_number,
72
72
  concept_source=ConceptSource.AUTO_DERIVED,
73
73
  ),
@@ -89,7 +89,7 @@ def generate_date_concepts(concept: Concept, environment: Environment):
89
89
  datatype=DataType.DATE,
90
90
  purpose=Purpose.PROPERTY,
91
91
  lineage=function,
92
- grain=concept.grain,
92
+ grain=concept.grain.model_copy(),
93
93
  namespace=concept.namespace,
94
94
  keys=set(
95
95
  [concept.address],
@@ -137,16 +137,16 @@ def generate_datetime_concepts(concept: Concept, environment: Environment):
137
137
  )
138
138
  new_concept = Concept.model_construct(
139
139
  name=f"{concept.name}.{fname}",
140
- datatype=const_function.output_datatype,
140
+ datatype=datatype,
141
141
  purpose=default_type,
142
142
  lineage=const_function,
143
- grain=concept.grain,
143
+ grain=concept.grain.model_copy(),
144
144
  namespace=concept.namespace,
145
145
  keys=set(
146
146
  [concept.address],
147
147
  ),
148
148
  metadata=Metadata(
149
- description=f"Auto-derived from {base_description}. {FUNCTION_DESCRIPTION_MAPS.get(ftype, ftype.value)}.",
149
+ description=f"Auto-derived from {base_description}. {FUNCTION_DESCRIPTION_MAPS.get(ftype, ftype.value)}",
150
150
  line_number=base_line_number,
151
151
  concept_source=ConceptSource.AUTO_DERIVED,
152
152
  ),
@@ -420,9 +420,9 @@ class Environment(BaseModel):
420
420
  if INTERNAL_NAMESPACE in concept.address:
421
421
  continue
422
422
  if same_namespace:
423
- new = self.add_concept(concept)
423
+ new = self.add_concept(concept, add_derived=False)
424
424
  else:
425
- new = self.add_concept(concept.with_namespace(alias))
425
+ new = self.add_concept(concept.with_namespace(alias), add_derived=False)
426
426
 
427
427
  k = address_with_namespace(k, alias)
428
428
  # set this explicitly, to handle aliasing
@@ -577,6 +577,7 @@ def agg_wrapper_to_concept(
577
577
  # derivation = Concept.calculate_derivation(parent, Purpose.PROPERTY)
578
578
  grain = Grain.from_concepts(parent.by, environment) if parent.by else Grain()
579
579
  granularity = Concept.calculate_granularity(Derivation.AGGREGATE, grain, parent)
580
+
580
581
  out = Concept(
581
582
  name=name,
582
583
  datatype=aggfunction.output_datatype,
@@ -590,6 +591,11 @@ def agg_wrapper_to_concept(
590
591
  derivation=Derivation.AGGREGATE,
591
592
  granularity=granularity,
592
593
  )
594
+ for x in parent.function.concept_arguments:
595
+ if x.address == out.address:
596
+ raise InvalidSyntaxException(
597
+ f"Aggregate concept {out.address} cannot reference itself. If defining a new concept in a select, use a new name."
598
+ )
593
599
  return out
594
600
 
595
601
 
File without changes
File without changes
File without changes
File without changes