pytrilogy 0.0.2.57__py3-none-any.whl → 0.0.3.0__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.
- {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/METADATA +9 -2
- pytrilogy-0.0.3.0.dist-info/RECORD +99 -0
- {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/WHEEL +1 -1
- trilogy/__init__.py +2 -2
- trilogy/core/enums.py +1 -7
- trilogy/core/env_processor.py +17 -5
- trilogy/core/environment_helpers.py +11 -25
- trilogy/core/exceptions.py +4 -0
- trilogy/core/functions.py +695 -261
- trilogy/core/graph_models.py +10 -10
- trilogy/core/internal.py +11 -2
- trilogy/core/models/__init__.py +0 -0
- trilogy/core/models/author.py +2110 -0
- trilogy/core/models/build.py +1845 -0
- trilogy/core/models/build_environment.py +151 -0
- trilogy/core/models/core.py +370 -0
- trilogy/core/models/datasource.py +297 -0
- trilogy/core/models/environment.py +696 -0
- trilogy/core/models/execute.py +931 -0
- trilogy/core/optimization.py +17 -22
- trilogy/core/optimizations/base_optimization.py +1 -1
- trilogy/core/optimizations/inline_constant.py +6 -6
- trilogy/core/optimizations/inline_datasource.py +17 -11
- trilogy/core/optimizations/predicate_pushdown.py +17 -16
- trilogy/core/processing/concept_strategies_v3.py +181 -146
- trilogy/core/processing/graph_utils.py +1 -1
- trilogy/core/processing/node_generators/basic_node.py +19 -18
- trilogy/core/processing/node_generators/common.py +51 -45
- trilogy/core/processing/node_generators/filter_node.py +26 -13
- trilogy/core/processing/node_generators/group_node.py +26 -21
- trilogy/core/processing/node_generators/group_to_node.py +13 -10
- trilogy/core/processing/node_generators/multiselect_node.py +60 -43
- trilogy/core/processing/node_generators/node_merge_node.py +76 -38
- trilogy/core/processing/node_generators/rowset_node.py +59 -36
- trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +27 -34
- trilogy/core/processing/node_generators/select_merge_node.py +161 -64
- trilogy/core/processing/node_generators/select_node.py +13 -13
- trilogy/core/processing/node_generators/union_node.py +12 -11
- trilogy/core/processing/node_generators/unnest_node.py +9 -7
- trilogy/core/processing/node_generators/window_node.py +19 -16
- trilogy/core/processing/nodes/__init__.py +21 -18
- trilogy/core/processing/nodes/base_node.py +92 -77
- trilogy/core/processing/nodes/filter_node.py +19 -13
- trilogy/core/processing/nodes/group_node.py +55 -40
- trilogy/core/processing/nodes/merge_node.py +47 -38
- trilogy/core/processing/nodes/select_node_v2.py +54 -40
- trilogy/core/processing/nodes/union_node.py +5 -7
- trilogy/core/processing/nodes/unnest_node.py +7 -11
- trilogy/core/processing/nodes/window_node.py +9 -4
- trilogy/core/processing/utility.py +108 -80
- trilogy/core/query_processor.py +67 -49
- trilogy/core/statements/__init__.py +0 -0
- trilogy/core/statements/author.py +413 -0
- trilogy/core/statements/build.py +0 -0
- trilogy/core/statements/common.py +30 -0
- trilogy/core/statements/execute.py +42 -0
- trilogy/dialect/base.py +152 -111
- trilogy/dialect/common.py +9 -10
- trilogy/dialect/duckdb.py +1 -1
- trilogy/dialect/enums.py +4 -2
- trilogy/dialect/presto.py +1 -1
- trilogy/dialect/sql_server.py +1 -1
- trilogy/executor.py +44 -32
- trilogy/hooks/base_hook.py +6 -4
- trilogy/hooks/query_debugger.py +110 -93
- trilogy/parser.py +1 -1
- trilogy/parsing/common.py +303 -64
- trilogy/parsing/parse_engine.py +263 -617
- trilogy/parsing/render.py +50 -26
- trilogy/scripts/trilogy.py +2 -1
- pytrilogy-0.0.2.57.dist-info/RECORD +0 -87
- trilogy/core/models.py +0 -4960
- {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/LICENSE.md +0 -0
- {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/entry_points.txt +0 -0
- {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/top_level.txt +0 -0
trilogy/core/graph_models.py
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import networkx as nx
|
|
2
2
|
|
|
3
|
-
from trilogy.core.models import
|
|
3
|
+
from trilogy.core.models.build import BuildConcept, BuildDatasource
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
def concept_to_node(input:
|
|
6
|
+
def concept_to_node(input: BuildConcept) -> str:
|
|
7
7
|
# if input.purpose == Purpose.METRIC:
|
|
8
8
|
# return f"c~{input.namespace}.{input.name}@{input.grain}"
|
|
9
|
-
return f"c~{input.address}@{input.grain}"
|
|
9
|
+
return f"c~{input.address}@{input.grain.without_condition()}"
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
def datasource_to_node(input:
|
|
12
|
+
def datasource_to_node(input: BuildDatasource) -> str:
|
|
13
13
|
# if isinstance(input, JoinedDataSource):
|
|
14
14
|
# return "ds~join~" + ",".join(
|
|
15
15
|
# [datasource_to_node(sub) for sub in input.datasources]
|
|
@@ -22,12 +22,12 @@ class ReferenceGraph(nx.DiGraph):
|
|
|
22
22
|
super().__init__(*args, **kwargs)
|
|
23
23
|
|
|
24
24
|
def add_node(self, node_for_adding, **attr):
|
|
25
|
-
if isinstance(node_for_adding,
|
|
25
|
+
if isinstance(node_for_adding, BuildConcept):
|
|
26
26
|
node_name = concept_to_node(node_for_adding)
|
|
27
27
|
attr["type"] = "concept"
|
|
28
28
|
attr["concept"] = node_for_adding
|
|
29
29
|
attr["grain"] = node_for_adding.grain
|
|
30
|
-
elif isinstance(node_for_adding,
|
|
30
|
+
elif isinstance(node_for_adding, BuildDatasource):
|
|
31
31
|
node_name = datasource_to_node(node_for_adding)
|
|
32
32
|
attr["type"] = "datasource"
|
|
33
33
|
attr["ds"] = node_for_adding
|
|
@@ -37,19 +37,19 @@ class ReferenceGraph(nx.DiGraph):
|
|
|
37
37
|
super().add_node(node_name, **attr)
|
|
38
38
|
|
|
39
39
|
def add_edge(self, u_of_edge, v_of_edge, **attr):
|
|
40
|
-
if isinstance(u_of_edge,
|
|
40
|
+
if isinstance(u_of_edge, BuildConcept):
|
|
41
41
|
orig = u_of_edge
|
|
42
42
|
u_of_edge = concept_to_node(u_of_edge)
|
|
43
43
|
if u_of_edge not in self.nodes:
|
|
44
44
|
self.add_node(orig)
|
|
45
|
-
elif isinstance(u_of_edge,
|
|
45
|
+
elif isinstance(u_of_edge, BuildDatasource):
|
|
46
46
|
u_of_edge = datasource_to_node(u_of_edge)
|
|
47
47
|
|
|
48
|
-
if isinstance(v_of_edge,
|
|
48
|
+
if isinstance(v_of_edge, BuildConcept):
|
|
49
49
|
orig = v_of_edge
|
|
50
50
|
v_of_edge = concept_to_node(v_of_edge)
|
|
51
51
|
if v_of_edge not in self.nodes:
|
|
52
52
|
self.add_node(orig)
|
|
53
|
-
elif isinstance(v_of_edge,
|
|
53
|
+
elif isinstance(v_of_edge, BuildDatasource):
|
|
54
54
|
v_of_edge = datasource_to_node(v_of_edge)
|
|
55
55
|
super().add_edge(u_of_edge, v_of_edge, **attr)
|
trilogy/core/internal.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from trilogy.core.constants import ALL_ROWS_CONCEPT, INTERNAL_NAMESPACE
|
|
2
|
-
from trilogy.core.enums import FunctionType, Purpose
|
|
3
|
-
from trilogy.core.models import Concept,
|
|
2
|
+
from trilogy.core.enums import Derivation, FunctionType, Granularity, Purpose
|
|
3
|
+
from trilogy.core.models.author import Concept, Function, Grain
|
|
4
|
+
from trilogy.core.models.core import DataType
|
|
4
5
|
|
|
5
6
|
DEFAULT_CONCEPTS = {
|
|
6
7
|
ALL_ROWS_CONCEPT: Concept(
|
|
@@ -15,6 +16,8 @@ DEFAULT_CONCEPTS = {
|
|
|
15
16
|
output_datatype=DataType.INTEGER,
|
|
16
17
|
output_purpose=Purpose.CONSTANT,
|
|
17
18
|
),
|
|
19
|
+
granularity=Granularity.SINGLE_ROW,
|
|
20
|
+
derivation=Derivation.CONSTANT,
|
|
18
21
|
),
|
|
19
22
|
"concept_name": Concept(
|
|
20
23
|
name="concept_name",
|
|
@@ -22,6 +25,8 @@ DEFAULT_CONCEPTS = {
|
|
|
22
25
|
datatype=DataType.STRING,
|
|
23
26
|
purpose=Purpose.KEY,
|
|
24
27
|
grain=Grain(),
|
|
28
|
+
granularity=Granularity.SINGLE_ROW,
|
|
29
|
+
derivation=Derivation.CONSTANT,
|
|
25
30
|
),
|
|
26
31
|
"datasource": Concept(
|
|
27
32
|
name="datasource",
|
|
@@ -29,6 +34,8 @@ DEFAULT_CONCEPTS = {
|
|
|
29
34
|
datatype=DataType.STRING,
|
|
30
35
|
purpose=Purpose.KEY,
|
|
31
36
|
grain=Grain(),
|
|
37
|
+
granularity=Granularity.SINGLE_ROW,
|
|
38
|
+
derivation=Derivation.CONSTANT,
|
|
32
39
|
),
|
|
33
40
|
"query_text": Concept(
|
|
34
41
|
name="query_text",
|
|
@@ -36,5 +43,7 @@ DEFAULT_CONCEPTS = {
|
|
|
36
43
|
datatype=DataType.STRING,
|
|
37
44
|
purpose=Purpose.KEY,
|
|
38
45
|
grain=Grain(),
|
|
46
|
+
granularity=Granularity.SINGLE_ROW,
|
|
47
|
+
derivation=Derivation.CONSTANT,
|
|
39
48
|
),
|
|
40
49
|
}
|
|
File without changes
|