pytrilogy 0.0.3.104__py3-none-any.whl → 0.0.3.105__py3-none-any.whl

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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.104
3
+ Version: 0.0.3.105
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -1,5 +1,5 @@
1
- pytrilogy-0.0.3.104.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
2
- trilogy/__init__.py,sha256=HyZF9WId40s9G3BjFS2OBMeHI7XNeE-YU1cFLvNOSWk,304
1
+ pytrilogy-0.0.3.105.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
2
+ trilogy/__init__.py,sha256=zj08OHuDZczNN19GmjEnVohqzVtTiDs1qMbzg8Lla3I,304
3
3
  trilogy/constants.py,sha256=g_zkVCNjGop6coZ1kM8eXXAzCnUN22ldx3TYFz0E9sc,1747
4
4
  trilogy/engine.py,sha256=3MiADf5MKcmxqiHBuRqiYdsXiLj7oitDfVvXvHrfjkA,2178
5
5
  trilogy/executor.py,sha256=KgCAQhHPT-j0rPkBbALX0f84W9-Q-bkjHayGuavg99w,16490
@@ -37,7 +37,7 @@ trilogy/core/optimizations/predicate_pushdown.py,sha256=5ubatgq1IwWQ4L2FDt4--y16
37
37
  trilogy/core/processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  trilogy/core/processing/concept_strategies_v3.py,sha256=AcMU1d5uCo8I1PFCkBtmcC6iFmM9vN6xSdKxSVMGfpA,23080
39
39
  trilogy/core/processing/discovery_node_factory.py,sha256=p23jiiHyhrW-Q8ndbnRlqMHJKT8ZqPOA89SzE4xaFFo,15445
40
- trilogy/core/processing/discovery_utility.py,sha256=wIuLsE6yuVykeYZdIqRSagivDNU3-ooiS7z6in4yqho,11518
40
+ trilogy/core/processing/discovery_utility.py,sha256=ZJTTWm34zpR30p-xzElUJCTdx-XT44skKG0-LBfEOg4,12525
41
41
  trilogy/core/processing/discovery_validation.py,sha256=eZ4HfHMpqZLI8MGG2jez8arS8THs6ceuVrQFIY6gXrU,5364
42
42
  trilogy/core/processing/graph_utils.py,sha256=8QUVrkE9j-9C1AyrCb1nQEh8daCe0u1HuXl-Te85lag,1205
43
43
  trilogy/core/processing/utility.py,sha256=1_oNnk6lWiy-D7LKYr07kU_v7iAM4i6ITUAS4bIiCr4,23444
@@ -45,7 +45,7 @@ trilogy/core/processing/node_generators/__init__.py,sha256=iVJ-crowPxYeut-hFjyEj
45
45
  trilogy/core/processing/node_generators/basic_node.py,sha256=74LoVZXLinRvSzk2LmI1kwza96TnuH3ELoYRIbHB29A,5578
46
46
  trilogy/core/processing/node_generators/common.py,sha256=xF32Kf6B08dZgKs2SOow1HomptSiSC057GCUCHFlS5s,9464
47
47
  trilogy/core/processing/node_generators/constant_node.py,sha256=LfpDq2WrBRZ3tGsLxw77LuigKfhbteWWh9L8BGdMGwk,1146
48
- trilogy/core/processing/node_generators/filter_node.py,sha256=ndPznkcFu_cdCNgaRpgot8oqnzdHv4KAIfjeUIzrE2w,10816
48
+ trilogy/core/processing/node_generators/filter_node.py,sha256=cJ5od1fAfvalaUDO2O4Y6Yrr2RukOCqey7f3zrKSBbI,10808
49
49
  trilogy/core/processing/node_generators/group_node.py,sha256=NdK1rl6Ze94XFWtgeC2dlRiL4pS3lh1ArKGPEltLtnw,8525
50
50
  trilogy/core/processing/node_generators/group_to_node.py,sha256=jKcNCDOY6fNblrdZwaRU0sbUSr9H0moQbAxrGgX6iGA,3832
51
51
  trilogy/core/processing/node_generators/multiselect_node.py,sha256=a505AEixjsjp5jI8Ng3H5KF_AaehkS6HfRfTef64l_o,7063
@@ -56,7 +56,7 @@ trilogy/core/processing/node_generators/select_merge_node.py,sha256=KQvGoNT5ZBWQ
56
56
  trilogy/core/processing/node_generators/select_node.py,sha256=Ta1G39V94gjX_AgyZDz9OqnwLz4BjY3D6Drx9YpziMQ,3555
57
57
  trilogy/core/processing/node_generators/synonym_node.py,sha256=AnAsa_Wj50NJ_IK0HSgab_7klYmKVrv0WI1uUe-GvEY,3766
58
58
  trilogy/core/processing/node_generators/union_node.py,sha256=NxQbnRRoYMI4WjMeph41yk4E6yipj53qdGuNt-Mozxw,2818
59
- trilogy/core/processing/node_generators/unnest_node.py,sha256=7uOZzBidEEKeZE0VW_XlgHGhEYf_snEHtV8UgJ_ZjyY,4048
59
+ trilogy/core/processing/node_generators/unnest_node.py,sha256=u_hVHFYMz-ZylDdHH9mhFSRpxuKcTGvrrOP0rxrY_Xg,3901
60
60
  trilogy/core/processing/node_generators/window_node.py,sha256=A90linr4pkZtTNfn9k2YNLqrJ_SFII3lbHxB-BC6mI8,6688
61
61
  trilogy/core/processing/node_generators/select_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  trilogy/core/processing/node_generators/select_helpers/datasource_injection.py,sha256=m2YQ4OmG0N2O61a7NEq1ZzbTa7JsCC00lxB2ymjcYRI,8224
@@ -119,8 +119,8 @@ trilogy/std/money.preql,sha256=XWwvAV3WxBsHX9zfptoYRnBigcfYwrYtBHXTME0xJuQ,2082
119
119
  trilogy/std/net.preql,sha256=WZCuvH87_rZntZiuGJMmBDMVKkdhTtxeHOkrXNwJ1EE,416
120
120
  trilogy/std/ranking.preql,sha256=LDoZrYyz4g3xsII9XwXfmstZD-_92i1Eox1UqkBIfi8,83
121
121
  trilogy/std/report.preql,sha256=LbV-XlHdfw0jgnQ8pV7acG95xrd1-p65fVpiIc-S7W4,202
122
- pytrilogy-0.0.3.104.dist-info/METADATA,sha256=IJmkrwnxe7gz3s89ZYVrDe6SkRY2cf6xNpmj5GTXkSE,11839
123
- pytrilogy-0.0.3.104.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
124
- pytrilogy-0.0.3.104.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
125
- pytrilogy-0.0.3.104.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
126
- pytrilogy-0.0.3.104.dist-info/RECORD,,
122
+ pytrilogy-0.0.3.105.dist-info/METADATA,sha256=9mxttMp6pkvGQMM3noJhBtY-c0gugqilfPVh0pfo61E,11839
123
+ pytrilogy-0.0.3.105.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
124
+ pytrilogy-0.0.3.105.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
125
+ pytrilogy-0.0.3.105.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
126
+ pytrilogy-0.0.3.105.dist-info/RECORD,,
trilogy/__init__.py CHANGED
@@ -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.104"
7
+ __version__ = "0.0.3.105"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -27,18 +27,22 @@ def calculate_effective_parent_grain(
27
27
  ) -> BuildGrain:
28
28
  # calculate the effective grain of the parent node
29
29
  # this is the union of all parent grains
30
- if isinstance(node, MergeNode):
30
+ if isinstance(node, QueryDatasource):
31
31
  grain = BuildGrain()
32
- qds = node.resolve()
32
+ qds = node
33
33
  if not qds.joins:
34
34
  return qds.datasources[0].grain
35
+ seen = set()
35
36
  for join in qds.joins:
36
37
  if isinstance(join, UnnestJoin):
38
+ grain += BuildGrain(components=set([x.address for x in join.concepts]))
37
39
  continue
38
40
  pairs = join.concept_pairs or []
39
41
  for key in pairs:
40
42
  left = key.existing_datasource
43
+ logger.info(f"adding left grain {left.grain} for join key {key.left}")
41
44
  grain += left.grain
45
+ seen.add(left.name)
42
46
  keys = [key.right for key in pairs]
43
47
  join_grain = BuildGrain.from_concepts(keys)
44
48
  if join_grain == join.right_datasource.grain:
@@ -48,6 +52,24 @@ def calculate_effective_parent_grain(
48
52
  f"join changes grain, adding {join.right_datasource.grain} to {grain}"
49
53
  )
50
54
  grain += join.right_datasource.grain
55
+ seen.add(join.right_datasource.name)
56
+ for x in qds.datasources:
57
+ # if we haven't seen it, it's still contributing to grain
58
+ # unless used ONLY in a subselect
59
+ # so the existence check is a [bad] proxy for that
60
+ if x.name not in seen and not (
61
+ qds.condition
62
+ and qds.condition.existence_arguments
63
+ and any(
64
+ [
65
+ c.address in block
66
+ for c in x.output_concepts
67
+ for block in qds.condition.existence_arguments
68
+ ]
69
+ )
70
+ ):
71
+ logger.info(f"adding unjoined grain {x.grain} for datasource {x.name}")
72
+ grain += x.grain
51
73
  return grain
52
74
  else:
53
75
  return node.grain or BuildGrain()
@@ -75,7 +97,7 @@ def check_if_group_required(
75
97
  if comp_grain.issubset(target_grain):
76
98
 
77
99
  logger.info(
78
- f"{padding}{LOGGER_PREFIX} Group requirement check: {comp_grain}, target: {target_grain}, grain is subset of target, no group node required"
100
+ f"{padding}{LOGGER_PREFIX} Group requirement check: {comp_grain}, target: {target_grain}, grain is subset of target, no group node required"
79
101
  )
80
102
  return GroupRequiredResponse(target_grain, comp_grain, False)
81
103
  # find out what extra is in the comp grain vs target grain
@@ -4,7 +4,6 @@ from trilogy.constants import logger
4
4
  from trilogy.core.models.build import (
5
5
  BuildConcept,
6
6
  BuildFilterItem,
7
- BuildGrain,
8
7
  BuildWhereClause,
9
8
  )
10
9
  from trilogy.core.models.build_environment import BuildEnvironment
@@ -238,10 +237,10 @@ def gen_filter_node(
238
237
  if not parent.preexisting_conditions == where.conditional:
239
238
  parent.add_condition(where.conditional)
240
239
  parent.add_existence_concepts(flattened_existence, False)
241
- parent.grain = BuildGrain.from_concepts(
242
- parent.output_concepts,
243
- environment=environment,
244
- )
240
+ # parent.grain = BuildGrain.from_concepts(
241
+ # parent.output_concepts,
242
+ # environment=environment,
243
+ # )
245
244
  parent.rebuild_cache()
246
245
  filter_node = parent
247
246
  else:
@@ -4,7 +4,6 @@ from trilogy.constants import logger
4
4
  from trilogy.core.models.build import (
5
5
  BuildConcept,
6
6
  BuildFunction,
7
- BuildGrain,
8
7
  BuildWhereClause,
9
8
  )
10
9
  from trilogy.core.models.build_environment import BuildEnvironment
@@ -104,10 +103,6 @@ def gen_unnest_node(
104
103
  preexisting_conditions=(
105
104
  conditional if conditional and local_conditions is False else None
106
105
  ),
107
- grain=BuildGrain.from_concepts(
108
- concepts=base.output_concepts,
109
- environment=environment,
110
- ),
111
106
  )
112
107
  # qds = new.resolve()
113
108
  # assert qds.source_map[concept.address] == {base.resolve()}