pytrilogy 0.0.2.7__tar.gz → 0.0.2.8__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.
- {pytrilogy-0.0.2.7/pytrilogy.egg-info → pytrilogy-0.0.2.8}/PKG-INFO +1 -1
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8/pytrilogy.egg-info}/PKG-INFO +1 -1
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/__init__.py +1 -1
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/enums.py +1 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/models.py +10 -2
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/base.py +37 -11
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/common.py +15 -3
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/presto.py +2 -1
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/LICENSE.md +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/README.md +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pyproject.toml +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/SOURCES.txt +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/dependency_links.txt +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/entry_points.txt +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/requires.txt +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/pytrilogy.egg-info/top_level.txt +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/setup.cfg +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/setup.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_datatypes.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_declarations.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_derived_concepts.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_discovery_nodes.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_environment.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_functions.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_imports.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_metadata.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_models.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_multi_join_assignments.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_parsing.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_partial_handling.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_query_processing.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_select.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_statements.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_undefined_concept.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/tests/test_where_clause.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/compiler.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/constants.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/constants.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/env_processor.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/environment_helpers.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/ergonomics.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/exceptions.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/functions.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/graph_models.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/internal.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimization.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/base_optimization.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/inline_constant.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/inline_datasource.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/concept_strategies_v3.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/graph_utils.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/basic_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/common.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/filter_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/group_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/select_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/window_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/base_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/filter_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/group_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/merge_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/unnest_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/nodes/window_node.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/utility.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/query_processor.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/bigquery.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/config.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/duckdb.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/enums.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/postgres.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/snowflake.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/dialect/sql_server.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/engine.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/executor.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/hooks/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/hooks/base_hook.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/hooks/graph_hook.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/hooks/query_debugger.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/metadata/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parser.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/common.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/config.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/exceptions.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/helpers.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/parse_engine.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/render.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/parsing/trilogy.lark +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/py.typed +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/scripts/__init__.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/scripts/trilogy.py +0 -0
- {pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/utility.py +0 -0
|
@@ -2066,6 +2066,7 @@ class Datasource(Namespaced, BaseModel):
|
|
|
2066
2066
|
class UnnestJoin(BaseModel):
|
|
2067
2067
|
concept: Concept
|
|
2068
2068
|
alias: str = "unnest"
|
|
2069
|
+
rendering_required: bool = True
|
|
2069
2070
|
|
|
2070
2071
|
def __hash__(self):
|
|
2071
2072
|
return (self.alias + self.concept.address).__hash__()
|
|
@@ -2460,10 +2461,17 @@ class CTE(BaseModel):
|
|
|
2460
2461
|
for join in self.joins
|
|
2461
2462
|
if not isinstance(join, Join)
|
|
2462
2463
|
or (
|
|
2463
|
-
join
|
|
2464
|
-
and
|
|
2464
|
+
isinstance(join, Join)
|
|
2465
|
+
and (
|
|
2466
|
+
join.right_cte.name != removed_cte
|
|
2467
|
+
and join.left_cte.name != removed_cte
|
|
2468
|
+
)
|
|
2465
2469
|
)
|
|
2466
2470
|
]
|
|
2471
|
+
for join in self.joins:
|
|
2472
|
+
if isinstance(join, UnnestJoin) and join.concept == concept:
|
|
2473
|
+
join.rendering_required = False
|
|
2474
|
+
|
|
2467
2475
|
self.parent_ctes = [
|
|
2468
2476
|
x for x in self.parent_ctes if x.name != removed_cte
|
|
2469
2477
|
]
|
|
@@ -51,7 +51,7 @@ from trilogy.core.models import (
|
|
|
51
51
|
MergeStatementV2,
|
|
52
52
|
)
|
|
53
53
|
from trilogy.core.query_processor import process_query, process_persist
|
|
54
|
-
from trilogy.dialect.common import render_join
|
|
54
|
+
from trilogy.dialect.common import render_join, render_unnest
|
|
55
55
|
from trilogy.hooks.base_hook import BaseHook
|
|
56
56
|
from trilogy.core.enums import UnnestMode
|
|
57
57
|
|
|
@@ -128,6 +128,7 @@ FUNCTION_MAP = {
|
|
|
128
128
|
FunctionType.UNNEST: lambda x: f"unnest({x[0]})",
|
|
129
129
|
FunctionType.ATTR_ACCESS: lambda x: f"""{x[0]}.{x[1].replace("'", "")}""",
|
|
130
130
|
FunctionType.STRUCT: lambda x: f"{{{', '.join(struct_arg(x))}}}",
|
|
131
|
+
FunctionType.ARRAY: lambda x: f"[{', '.join(x)}]",
|
|
131
132
|
# math
|
|
132
133
|
FunctionType.ADD: lambda x: f"{x[0]} + {x[1]}",
|
|
133
134
|
FunctionType.SUBTRACT: lambda x: f"{x[0]} - {x[1]}",
|
|
@@ -466,7 +467,7 @@ class BaseDialect:
|
|
|
466
467
|
elif isinstance(e, MapWrapper):
|
|
467
468
|
return f"MAP {{{','.join([f'{self.render_expr(k, cte=cte, cte_map=cte_map)}:{self.render_expr(v, cte=cte, cte_map=cte_map)}' for k, v in e.items()])}}}"
|
|
468
469
|
elif isinstance(e, list):
|
|
469
|
-
return f"
|
|
470
|
+
return f"{self.FUNCTION_MAP[FunctionType.ARRAY]([self.render_expr(x, cte=cte, cte_map=cte_map) for x in e])}"
|
|
470
471
|
elif isinstance(e, DataType):
|
|
471
472
|
return str(e.value)
|
|
472
473
|
elif isinstance(e, DatePart):
|
|
@@ -480,8 +481,12 @@ class BaseDialect:
|
|
|
480
481
|
raise ValueError(f"Unable to render type {type(e)} {e}")
|
|
481
482
|
|
|
482
483
|
def render_cte(self, cte: CTE):
|
|
483
|
-
if self.UNNEST_MODE in (
|
|
484
|
-
|
|
484
|
+
if self.UNNEST_MODE in (
|
|
485
|
+
UnnestMode.CROSS_APPLY,
|
|
486
|
+
UnnestMode.CROSS_JOIN,
|
|
487
|
+
UnnestMode.CROSS_JOIN_ALIAS,
|
|
488
|
+
):
|
|
489
|
+
# for a cross apply, derivation happens in the join
|
|
485
490
|
# so we only use the alias to select
|
|
486
491
|
select_columns = [
|
|
487
492
|
self.render_concept_sql(c, cte)
|
|
@@ -499,17 +504,38 @@ class BaseDialect:
|
|
|
499
504
|
for c in cte.output_columns
|
|
500
505
|
if c.address not in [y.address for y in cte.hidden_concepts]
|
|
501
506
|
]
|
|
502
|
-
|
|
503
|
-
|
|
507
|
+
source: str | None = cte.base_name
|
|
508
|
+
if not cte.render_from_clause:
|
|
509
|
+
if len(cte.joins) > 0:
|
|
510
|
+
if cte.join_derived_concepts and self.UNNEST_MODE in (
|
|
511
|
+
UnnestMode.CROSS_JOIN_ALIAS,
|
|
512
|
+
UnnestMode.CROSS_JOIN,
|
|
513
|
+
UnnestMode.CROSS_APPLY,
|
|
514
|
+
):
|
|
515
|
+
source = f"{render_unnest(self.UNNEST_MODE, self.QUOTE_CHARACTER, cte.join_derived_concepts[0], self.render_concept_sql, cte)}"
|
|
516
|
+
# direct - eg DUCK DB - can be directly selected inline
|
|
517
|
+
elif cte.join_derived_concepts and self.UNNEST_MODE == UnnestMode.DIRECT:
|
|
518
|
+
source = None
|
|
519
|
+
else:
|
|
520
|
+
raise SyntaxError("CTE has joins but no from clause")
|
|
521
|
+
else:
|
|
522
|
+
source = None
|
|
523
|
+
else:
|
|
524
|
+
if cte.quote_address:
|
|
525
|
+
source = f"{self.QUOTE_CHARACTER}{cte.base_name}{self.QUOTE_CHARACTER}"
|
|
526
|
+
else:
|
|
527
|
+
source = cte.base_name
|
|
528
|
+
if cte.base_name != cte.base_alias:
|
|
529
|
+
source = f"{source} as {cte.base_alias}"
|
|
530
|
+
if not cte.render_from_clause:
|
|
531
|
+
final_joins = []
|
|
504
532
|
else:
|
|
505
|
-
|
|
506
|
-
if cte.base_name != cte.base_alias:
|
|
507
|
-
source = f"{source} as {cte.base_alias}"
|
|
533
|
+
final_joins = cte.joins or []
|
|
508
534
|
return CompiledCTE(
|
|
509
535
|
name=cte.name,
|
|
510
536
|
statement=self.SQL_TEMPLATE.render(
|
|
511
537
|
select_columns=select_columns,
|
|
512
|
-
base=
|
|
538
|
+
base=f"{source}" if source else None,
|
|
513
539
|
grain=cte.grain,
|
|
514
540
|
limit=cte.limit,
|
|
515
541
|
# some joins may not need to be rendered
|
|
@@ -524,7 +550,7 @@ class BaseDialect:
|
|
|
524
550
|
cte,
|
|
525
551
|
self.UNNEST_MODE,
|
|
526
552
|
)
|
|
527
|
-
for join in
|
|
553
|
+
for join in final_joins
|
|
528
554
|
]
|
|
529
555
|
if j
|
|
530
556
|
],
|
|
@@ -9,6 +9,18 @@ def null_wrapper(lval: str, rval: str, concept: Concept) -> str:
|
|
|
9
9
|
return f"{lval} = {rval}"
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
def render_unnest(
|
|
13
|
+
unnest_mode: UnnestMode,
|
|
14
|
+
quote_character: str,
|
|
15
|
+
concept: Concept,
|
|
16
|
+
render_func: Callable[[Concept, CTE, bool], str],
|
|
17
|
+
cte: CTE,
|
|
18
|
+
):
|
|
19
|
+
if unnest_mode == UnnestMode.CROSS_JOIN:
|
|
20
|
+
return f"{render_func(concept, cte, False)} as {quote_character}{concept.safe_address}{quote_character}"
|
|
21
|
+
return f"{render_func(concept, cte, False)} as unnest_wrapper ({quote_character}{concept.safe_address}{quote_character})"
|
|
22
|
+
|
|
23
|
+
|
|
12
24
|
def render_join(
|
|
13
25
|
join: Join | InstantiatedUnnestJoin,
|
|
14
26
|
quote_character: str,
|
|
@@ -25,10 +37,10 @@ def render_join(
|
|
|
25
37
|
if not cte:
|
|
26
38
|
raise ValueError("must provide a cte to build an unnest joins")
|
|
27
39
|
if unnest_mode == UnnestMode.CROSS_JOIN:
|
|
28
|
-
return f"CROSS JOIN {
|
|
40
|
+
return f"CROSS JOIN {render_unnest(unnest_mode, quote_character, join.concept, render_func, cte)}"
|
|
29
41
|
if unnest_mode == UnnestMode.CROSS_JOIN_ALIAS:
|
|
30
|
-
return f"CROSS JOIN {
|
|
31
|
-
return f"FULL JOIN {
|
|
42
|
+
return f"CROSS JOIN {render_unnest(unnest_mode, quote_character, join.concept, render_func, cte)}"
|
|
43
|
+
return f"FULL JOIN {render_unnest(unnest_mode, quote_character, join.concept, render_func, cte)}"
|
|
32
44
|
left_name = join.left_name
|
|
33
45
|
right_name = join.right_name
|
|
34
46
|
right_base = join.right_ref
|
|
@@ -33,6 +33,7 @@ FUNCTION_MAP = {
|
|
|
33
33
|
FunctionType.DATE_ADD: lambda x: f"DATE_ADD('{x[1]}', {x[2]}, {x[0]})",
|
|
34
34
|
FunctionType.CURRENT_DATE: lambda x: "CURRENT_DATE",
|
|
35
35
|
FunctionType.CURRENT_DATETIME: lambda x: "CURRENT_TIMESTAMP",
|
|
36
|
+
FunctionType.ARRAY: lambda x: f"ARRAY[{', '.join(x)}]",
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
FUNCTION_GRAIN_MATCH_MAP = {
|
|
@@ -86,7 +87,7 @@ class PrestoDialect(BaseDialect):
|
|
|
86
87
|
QUOTE_CHARACTER = '"'
|
|
87
88
|
SQL_TEMPLATE = SQL_TEMPLATE
|
|
88
89
|
DATATYPE_MAP = {**BaseDialect.DATATYPE_MAP, DataType.NUMERIC: "DECIMAL"}
|
|
89
|
-
UNNEST_MODE = UnnestMode.
|
|
90
|
+
UNNEST_MODE = UnnestMode.CROSS_JOIN_ALIAS
|
|
90
91
|
|
|
91
92
|
|
|
92
93
|
class TrinoDialect(PrestoDialect):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/basic_node.py
RENAMED
|
File without changes
|
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/filter_node.py
RENAMED
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/group_node.py
RENAMED
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/group_to_node.py
RENAMED
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/multiselect_node.py
RENAMED
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/node_merge_node.py
RENAMED
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/rowset_node.py
RENAMED
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/select_node.py
RENAMED
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/unnest_node.py
RENAMED
|
File without changes
|
{pytrilogy-0.0.2.7 → pytrilogy-0.0.2.8}/trilogy/core/processing/node_generators/window_node.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|