pytrilogy 0.0.3.72__tar.gz → 0.0.3.73__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 (150) hide show
  1. {pytrilogy-0.0.3.72/pytrilogy.egg-info → pytrilogy-0.0.3.73}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/__init__.py +1 -1
  4. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/constants.py +1 -1
  5. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/models/execute.py +0 -1
  6. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/window_node.py +2 -0
  7. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/utility.py +18 -0
  8. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/bigquery.py +2 -1
  9. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/common.py +1 -0
  10. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/postgres.py +2 -1
  11. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/presto.py +2 -1
  12. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/snowflake.py +2 -1
  13. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/sql_server.py +2 -1
  14. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/LICENSE.md +0 -0
  15. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/README.md +0 -0
  16. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/pyproject.toml +0 -0
  17. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/pytrilogy.egg-info/SOURCES.txt +0 -0
  18. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/pytrilogy.egg-info/dependency_links.txt +0 -0
  19. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/pytrilogy.egg-info/entry_points.txt +0 -0
  20. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/pytrilogy.egg-info/requires.txt +0 -0
  21. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/pytrilogy.egg-info/top_level.txt +0 -0
  22. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/setup.cfg +0 -0
  23. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/setup.py +0 -0
  24. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_datatypes.py +0 -0
  25. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_declarations.py +0 -0
  26. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_derived_concepts.py +0 -0
  27. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_discovery_nodes.py +0 -0
  28. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_enums.py +0 -0
  29. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_environment.py +0 -0
  30. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_execute_models.py +0 -0
  31. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_executor.py +0 -0
  32. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_failure.py +0 -0
  33. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_functions.py +0 -0
  34. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_imports.py +0 -0
  35. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_metadata.py +0 -0
  36. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_models.py +0 -0
  37. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_multi_join_assignments.py +0 -0
  38. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_parse_engine.py +0 -0
  39. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_parsing.py +0 -0
  40. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_parsing_failures.py +0 -0
  41. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_partial_handling.py +0 -0
  42. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_query_processing.py +0 -0
  43. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_query_render.py +0 -0
  44. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_select.py +0 -0
  45. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_show.py +0 -0
  46. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_statements.py +0 -0
  47. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_typing.py +0 -0
  48. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_undefined_concept.py +0 -0
  49. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_user_functions.py +0 -0
  50. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/tests/test_where_clause.py +0 -0
  51. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/authoring/__init__.py +0 -0
  52. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/compiler.py +0 -0
  53. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/__init__.py +0 -0
  54. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/constants.py +0 -0
  55. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/enums.py +0 -0
  56. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/env_processor.py +0 -0
  57. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/environment_helpers.py +0 -0
  58. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/ergonomics.py +0 -0
  59. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/exceptions.py +0 -0
  60. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/functions.py +0 -0
  61. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/graph_models.py +0 -0
  62. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/internal.py +0 -0
  63. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/models/__init__.py +0 -0
  64. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/models/author.py +0 -0
  65. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/models/build.py +0 -0
  66. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/models/build_environment.py +0 -0
  67. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/models/core.py +0 -0
  68. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/models/datasource.py +0 -0
  69. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/models/environment.py +0 -0
  70. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/optimization.py +0 -0
  71. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/optimizations/__init__.py +0 -0
  72. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/optimizations/base_optimization.py +0 -0
  73. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/optimizations/inline_datasource.py +0 -0
  74. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  75. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/__init__.py +0 -0
  76. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/concept_strategies_v3.py +0 -0
  77. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/discovery_loop.py +0 -0
  78. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/discovery_node_factory.py +0 -0
  79. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/discovery_utility.py +0 -0
  80. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/discovery_validation.py +0 -0
  81. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/graph_utils.py +0 -0
  82. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/__init__.py +0 -0
  83. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  84. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/common.py +0 -0
  85. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  86. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/group_node.py +0 -0
  87. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  88. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  89. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
  90. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/recursive_node.py +0 -0
  91. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
  92. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/select_helpers/__init__.py +0 -0
  93. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +0 -0
  94. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/select_merge_node.py +0 -0
  95. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/select_node.py +0 -0
  96. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/synonym_node.py +0 -0
  97. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/union_node.py +0 -0
  98. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  99. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/__init__.py +0 -0
  100. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/base_node.py +0 -0
  101. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/filter_node.py +0 -0
  102. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/group_node.py +0 -0
  103. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/merge_node.py +0 -0
  104. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/recursive_node.py +0 -0
  105. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
  106. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/union_node.py +0 -0
  107. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  108. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/processing/nodes/window_node.py +0 -0
  109. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/query_processor.py +0 -0
  110. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/statements/__init__.py +0 -0
  111. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/statements/author.py +0 -0
  112. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/statements/build.py +0 -0
  113. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/statements/common.py +0 -0
  114. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/statements/execute.py +0 -0
  115. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/core/utility.py +0 -0
  116. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/__init__.py +0 -0
  117. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/base.py +0 -0
  118. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/config.py +0 -0
  119. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/dataframe.py +0 -0
  120. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/duckdb.py +0 -0
  121. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/dialect/enums.py +0 -0
  122. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/engine.py +0 -0
  123. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/executor.py +0 -0
  124. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/hooks/__init__.py +0 -0
  125. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/hooks/base_hook.py +0 -0
  126. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/hooks/graph_hook.py +0 -0
  127. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/hooks/query_debugger.py +0 -0
  128. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/metadata/__init__.py +0 -0
  129. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/parser.py +0 -0
  130. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/parsing/__init__.py +0 -0
  131. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/parsing/common.py +0 -0
  132. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/parsing/config.py +0 -0
  133. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/parsing/exceptions.py +0 -0
  134. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/parsing/helpers.py +0 -0
  135. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/parsing/parse_engine.py +0 -0
  136. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/parsing/render.py +0 -0
  137. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/parsing/trilogy.lark +0 -0
  138. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/py.typed +0 -0
  139. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/render.py +0 -0
  140. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/scripts/__init__.py +0 -0
  141. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/scripts/trilogy.py +0 -0
  142. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/std/__init__.py +0 -0
  143. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/std/date.preql +0 -0
  144. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/std/display.preql +0 -0
  145. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/std/geography.preql +0 -0
  146. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/std/money.preql +0 -0
  147. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/std/net.preql +0 -0
  148. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/std/ranking.preql +0 -0
  149. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/std/report.preql +0 -0
  150. {pytrilogy-0.0.3.72 → pytrilogy-0.0.3.73}/trilogy/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.72
3
+ Version: 0.0.3.73
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.72
3
+ Version: 0.0.3.73
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.72"
7
+ __version__ = "0.0.3.73"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -37,7 +37,7 @@ class Comments:
37
37
  show: bool = False
38
38
  basic: bool = True
39
39
  joins: bool = True
40
- nullable: bool = False
40
+ nullable: bool = True
41
41
  partial: bool = True
42
42
 
43
43
 
@@ -501,7 +501,6 @@ class BaseJoin(BaseModel):
501
501
  f"Cannot join a dataself to itself, joining {self.left_datasource} and"
502
502
  f" {self.right_datasource}"
503
503
  )
504
-
505
504
  # Early returns maintained as in original code
506
505
  if self.concept_pairs or self.concepts == []:
507
506
  return self
@@ -69,6 +69,8 @@ def gen_window_node(
69
69
  # append in keys to get the right grain
70
70
  if concept.keys:
71
71
  for item in concept.keys:
72
+ if item in targets:
73
+ continue
72
74
  logger.info(
73
75
  f"{padding(depth)}{LOGGER_PREFIX} appending search for key {item}"
74
76
  )
@@ -13,6 +13,7 @@ from trilogy.core.enums import (
13
13
  FunctionClass,
14
14
  Granularity,
15
15
  JoinType,
16
+ Modifier,
16
17
  Purpose,
17
18
  )
18
19
  from trilogy.core.models.build import (
@@ -355,6 +356,20 @@ def reduce_concept_pairs(input: list[ConceptPair]) -> list[ConceptPair]:
355
356
  return final
356
357
 
357
358
 
359
+ def get_modifiers(
360
+ concept: str,
361
+ join: JoinOrderOutput,
362
+ ds_node_map: dict[str, QueryDatasource | BuildDatasource],
363
+ ):
364
+ base = []
365
+
366
+ if join.right and concept in ds_node_map[join.right].nullable_concepts:
367
+ base.append(Modifier.NULLABLE)
368
+ if join.left and concept in ds_node_map[join.left].nullable_concepts:
369
+ base.append(Modifier.NULLABLE)
370
+ return list(set(base))
371
+
372
+
358
373
  def get_node_joins(
359
374
  datasources: List[QueryDatasource | BuildDatasource],
360
375
  environment: BuildEnvironment,
@@ -400,6 +415,9 @@ def get_node_joins(
400
415
  concept_map[concept], ds_node_map[j.right]
401
416
  ),
402
417
  existing_datasource=ds_node_map[k],
418
+ modifiers=get_modifiers(
419
+ concept_map[concept].address, j, ds_node_map
420
+ ),
403
421
  )
404
422
  for k, v in j.keys.items()
405
423
  for concept in v
@@ -43,7 +43,8 @@ FUNCTION_MAP = {
43
43
 
44
44
  FUNCTION_GRAIN_MATCH_MAP = {
45
45
  **FUNCTION_MAP,
46
- FunctionType.COUNT: lambda args: "1",
46
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
47
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
47
48
  FunctionType.SUM: lambda args: f"{args[0]}",
48
49
  FunctionType.AVG: lambda args: f"{args[0]}",
49
50
  }
@@ -20,6 +20,7 @@ from trilogy.core.models.execute import (
20
20
 
21
21
 
22
22
  def null_wrapper(lval: str, rval: str, modifiers: list[Modifier]) -> str:
23
+
23
24
  if Modifier.NULLABLE in modifiers:
24
25
  return f"({lval} = {rval} or ({lval} is null and {rval} is null))"
25
26
  return f"{lval} = {rval}"
@@ -37,7 +37,8 @@ FUNCTION_MAP = {
37
37
 
38
38
  FUNCTION_GRAIN_MATCH_MAP = {
39
39
  **FUNCTION_MAP,
40
- FunctionType.COUNT: lambda args: f"{args[0]}",
40
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
41
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
41
42
  FunctionType.SUM: lambda args: f"{args[0]}",
42
43
  FunctionType.AVG: lambda args: f"{args[0]}",
43
44
  }
@@ -39,7 +39,8 @@ FUNCTION_MAP = {
39
39
 
40
40
  FUNCTION_GRAIN_MATCH_MAP = {
41
41
  **FUNCTION_MAP,
42
- FunctionType.COUNT: lambda args: f"{args[0]}",
42
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
43
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
43
44
  FunctionType.SUM: lambda args: f"{args[0]}",
44
45
  FunctionType.AVG: lambda args: f"{args[0]}",
45
46
  }
@@ -36,7 +36,8 @@ FUNCTION_MAP = {
36
36
 
37
37
  FUNCTION_GRAIN_MATCH_MAP = {
38
38
  **FUNCTION_MAP,
39
- FunctionType.COUNT: lambda args: f"{args[0]}",
39
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
40
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
40
41
  FunctionType.SUM: lambda args: f"{args[0]}",
41
42
  FunctionType.AVG: lambda args: f"{args[0]}",
42
43
  }
@@ -31,7 +31,8 @@ FUNCTION_MAP = {
31
31
  # we may return a static value
32
32
  FUNCTION_GRAIN_MATCH_MAP = {
33
33
  **FUNCTION_MAP,
34
- FunctionType.COUNT: lambda args: "1",
34
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
35
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
35
36
  FunctionType.SUM: lambda args: f"{args[0]}",
36
37
  FunctionType.AVG: lambda args: f"{args[0]}",
37
38
  }
File without changes
File without changes
File without changes
File without changes