pytrilogy 0.3.485__tar.gz → 0.3.486__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.
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/PKG-INFO +1 -1
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/__init__.py +1 -1
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/aggregate_rollup.py +14 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/concept_strategies_v4.py +11 -6
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/group_graph.py +121 -79
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/source_planning.py +4 -15
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/Cargo.lock +1 -1
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/Cargo.toml +1 -1
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/.scripts/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/.scripts/build_backend.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/.scripts/sync_version.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/LICENSE.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/pyproject.toml +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/constants.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/conversation.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/enums.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/execute.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/models.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/prompts.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/providers/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/providers/anthropic.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/providers/base.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/providers/deepseek.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/providers/google.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/providers/openai.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/providers/openrouter.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/providers/utils.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/ai/syntax_examples.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/authoring/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/authoring/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/constants.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/assertions.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/average_parts.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/casts.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/constants.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/domain_graph.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/domain_validation.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/enums.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/env_processor.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/environment_helpers.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/ergonomics.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/exceptions.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/fingerprint.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/functions.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/grain_pin.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/graph.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/graph_models.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/having_normalization.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/internal.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/like_patterns.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/author.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/build.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/build_environment.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/copying.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/core.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/datasource.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/environment.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/execute.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/models/keyspace.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimization.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/atom_contract.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/base_optimization.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/collapse_single_parent.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/existence_having_fold.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/filtered_aggregate.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/full_join_lowering.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/hide_unused_concept.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/identity_group.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/inline_datasource.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/join_hoist.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/join_upgrade.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/merge_irrelevant_group_by.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/null_safe_join.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/order_inner_joins.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/reuse_parent_lookup.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/semi_join_pushdown.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/strip_redundant_not_null.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/union_dim_pushdown.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/utils.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/value_set_join_upgrade.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/basic_graph.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/condition_utility.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/constants.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/discovery_utility.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/discovery_validation.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/grain_utility.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/join_key_groups.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/join_resolution.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/model_ambiguity.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/common.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/presence_probe.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/select_helpers/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/select_helpers/condition_routing.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/select_helpers/datasource_nodes.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/select_helpers/source_scoring.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/select_merge_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/node_generators/select_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/base_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/filter_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/group_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/merge_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/recursive_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/subselect_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/union_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/unnest_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/nodes/window_node.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/null_provenance.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/partial_bridging.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/plan_trace.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/plan_trace_model.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/relation_rollup.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/scan_partials.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/source_dominance.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/statement_scope.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/utility.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/concept_graph.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/condition_injection.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/condition_placement.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/constants.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/edges.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/extent_ownership.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/final_cover.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/functional_dependency.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/group_behaviors.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/group_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/history.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/join_plan.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/keyspace.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/models.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/network_build.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/network_coalescing.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/network_model.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/network_obligations.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/network_search.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/network_topology.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/projection.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/region_domains.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/region_reads.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/renders.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/root_partition.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/staged_where.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/strategy_builder.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/union_arms.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/aggregate.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/basic.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/common.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/condition_sources.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/constant.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/dispatch.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/filter.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/group_to.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/multiselect.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/nested_select.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/recursive.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/root.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/rowset.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/rowset_witness.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/subselect.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/union.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/union_select.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/unnest.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_node_generators/window.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/query_processor.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/scope_diagnostics.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/statements/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/statements/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/statements/author.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/statements/build.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/statements/common.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/statements/execute.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/table_processor.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/union_find.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/utility.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/validation/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/validation/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/validation/common.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/validation/concept.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/validation/datasource.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/validation/environment.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/validation/fix.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/validation/rows.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/where_scope_normalization.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/base.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/bigquery.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/bigquery_engine.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/bigquery_persist.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/bigquery_staging.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/cancel.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/clickhouse.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/clickhouse_chdb.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/common.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/config.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/dataframe.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/duckdb.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/duckdb_pool.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/duckdb_uv.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/duckdb_vgi.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/enums.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/haybarn_engine.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/metadata.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/mock.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/mock_pattern.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/mysql.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/postgres.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/presto.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/python_source.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/results.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/snowflake.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/source_pushdown.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/sql_server.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/sqlite.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/dialect/table_function.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/engine.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/assertions.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/client_copy.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/config.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/envs.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/model_fingerprint.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/outputs.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/report.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/staged_write.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/AGENTS.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/CLAUDE.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/cache.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/declaration.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/exceptions.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/isolation.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/partitions.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/persistence.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/phases.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/snapshot.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/state_store.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/state/watermarks.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/execution/write_order.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/executor.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/hooks/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/hooks/base_hook.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/hooks/graph_hook.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/hooks/query_debugger.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/adapters.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/arrow.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/click_support.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/contract.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/describe.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/errors.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/runner.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/sinks.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/io/vgi.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/metadata/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parser.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/common.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/exceptions.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/helpers.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/parse_engine_v2.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/pretty.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/render.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/trilogy.lark +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/concept_syntax.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/errors.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/function_syntax.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/hydration.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/import_service.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/lark_backend.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/model.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/pest_backend.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rowset_semantics.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/chart_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/concept_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/conditional_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/datasource_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/expression_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/function_definition_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/function_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/import_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/merge_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/multiselect_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/operational_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/order_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/persist_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/rawsql_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/rowset_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/select_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/select_statement_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/statement_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/subselect_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/token_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/tvf_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules/type_rules.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/rules_context.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/select_finalize.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/semantic_scope.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/semantic_state.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/statement_planner.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/statement_plans.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/symbols.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/parsing/v2/syntax.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/py.typed +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/render.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/rendering/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/rendering/altair_renderer.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/rendering/base.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/rendering/chart_theme.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/rendering/rich_types.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/rendering/terminal_renderer.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/rendering/theme.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/report/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/report/backends/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/report/backends/base.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/report/backends/html.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/report/backends/png.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/report/charts.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/report/document.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/report/runner.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/report/tables.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/AGENTS.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/CLAUDE.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/agent.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/agent_info.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/agent_info_docs/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/agent_info_docs/cli.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/agent_info_docs/content.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/agent_info_docs/directory.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/agent_sessions.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/agent_sql_tools.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/agent_tools.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/click_utils.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/cloud.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/cloud_models.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/common.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/database.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/README.md +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/build.sh +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/examples/basic_usage.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/directory_resolver.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/graph.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/lib.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/main.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/network_search.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/parser.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/python_bindings.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/resolver.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/trilogy.pest +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/src/trilogy_parser.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/tests/base.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/tests/cli_integration.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/tests/customer.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/tests/main.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/tests/orders.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/tests/parse_cost.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/tests/public_api.rs +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/tests/test_data/base.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency/tests/test_data/consumer.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/dependency.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/display.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/display_core.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/display_execution.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/display_ingest.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/display_init.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/display_models.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/display_parallel.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/display_refresh.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/display_validation.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/env_commands.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/environment.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/explore.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/explore_seen.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/file.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/file_helpers/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/file_helpers/backends.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/file_helpers/preql_description.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/file_helpers/preql_validation.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/fmt.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/ingest.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/ingest_helpers/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/ingest_helpers/fk_inference.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/ingest_helpers/foreign_keys.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/ingest_helpers/formatting.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/ingest_helpers/introspection.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/ingest_helpers/typing.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/init.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/parallel_execution.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/plan.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/project_config.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/public.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/refresh.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/render.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/run.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/connection_spec.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/file_discovery.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/index_generation.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/jobs.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/mcp_server.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/models.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/state_cache.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/state_computation.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/serve_helpers/studio_bundle.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/single_execution.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/source.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/source_identity.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/state.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/testing.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/trilogy.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/scripts/validate_agent.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/staging.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/__init__.py +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/bytes.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/chart.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/collection.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/color.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/currency.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/date.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/display.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/geography.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/metric.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/money.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/net.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/ranking.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/report.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/std/semantic.preql +0 -0
- {pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/utility.py +0 -0
|
@@ -244,6 +244,20 @@ def filter_finer_row_args(
|
|
|
244
244
|
]
|
|
245
245
|
|
|
246
246
|
|
|
247
|
+
def joinable_property(
|
|
248
|
+
concept: BuildConcept | None, datasource: BuildDatasource
|
|
249
|
+
) -> bool:
|
|
250
|
+
"""A dimension's column keyed on `datasource`'s grain: a join onto its rows
|
|
251
|
+
supplies it at that grain."""
|
|
252
|
+
return (
|
|
253
|
+
concept is not None
|
|
254
|
+
and concept.lineage is None
|
|
255
|
+
and concept.purpose == Purpose.PROPERTY
|
|
256
|
+
and bool(concept.keys)
|
|
257
|
+
and set(concept.keys or ()) <= set(datasource.grain.components)
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
|
|
247
261
|
def finer_than_grain(
|
|
248
262
|
concept: BuildConcept,
|
|
249
263
|
grain: BuildGrain,
|
|
@@ -52,6 +52,7 @@ from trilogy.core.processing.aggregate_rollup import (
|
|
|
52
52
|
at_own_grain,
|
|
53
53
|
filter_finer_row_args,
|
|
54
54
|
holds_every_kept_row,
|
|
55
|
+
joinable_property,
|
|
55
56
|
source_rollup_concepts,
|
|
56
57
|
sourced_arguments,
|
|
57
58
|
)
|
|
@@ -988,13 +989,10 @@ def _finer_filter_reaches_rollup(
|
|
|
988
989
|
demands = [c for c in mandatory_list if c.address not in rolled_roots]
|
|
989
990
|
assert where is not None
|
|
990
991
|
# an atom over a stored aggregate filters only the pinned scan's own rows,
|
|
991
|
-
# so every other demand must be a column of that scan
|
|
992
|
+
# so every other demand must be a column of that scan, or a dimension's
|
|
993
|
+
# column keyed on its grain (`_plan_joined_filter_rollup` joins it on)
|
|
992
994
|
if not is_scalar_condition(where.conditional):
|
|
993
|
-
return any(
|
|
994
|
-
{c.canonical_address for c in demands}
|
|
995
|
-
<= {c.canonical_address for c in ds.output_concepts}
|
|
996
|
-
for ds in rollup_sources
|
|
997
|
-
)
|
|
995
|
+
return any(_rides_summary_scan(demands, ds) for ds in rollup_sources)
|
|
998
996
|
reached = walk_lineage(
|
|
999
997
|
[c for c in mandatory_list if c.address not in rolled_roots],
|
|
1000
998
|
descend=lambda c: c.address not in rolled_roots,
|
|
@@ -1024,6 +1022,13 @@ def _finer_filter_reaches_rollup(
|
|
|
1024
1022
|
)
|
|
1025
1023
|
|
|
1026
1024
|
|
|
1025
|
+
def _rides_summary_scan(demands: list[BuildConcept], ds: BuildDatasource) -> bool:
|
|
1026
|
+
bound = {c.canonical_address for c in ds.output_concepts}
|
|
1027
|
+
return all(
|
|
1028
|
+
c.canonical_address in bound or joinable_property(c, ds) for c in demands
|
|
1029
|
+
)
|
|
1030
|
+
|
|
1031
|
+
|
|
1027
1032
|
def _aggregates_rolled_groups(
|
|
1028
1033
|
concept: BuildConcept,
|
|
1029
1034
|
rolled_roots: set[str],
|
|
@@ -17,7 +17,7 @@ single bucket). No derivation is privileged in the orchestrator.
|
|
|
17
17
|
|
|
18
18
|
from collections import defaultdict
|
|
19
19
|
from collections.abc import Sequence
|
|
20
|
-
from dataclasses import dataclass, field
|
|
20
|
+
from dataclasses import dataclass, field
|
|
21
21
|
|
|
22
22
|
from trilogy.constants import logger
|
|
23
23
|
from trilogy.core import graph as nx
|
|
@@ -2344,12 +2344,18 @@ def build_group_graph(
|
|
|
2344
2344
|
environment,
|
|
2345
2345
|
rollup_padded,
|
|
2346
2346
|
)
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
)
|
|
2350
|
-
|
|
2347
|
+
folds = _elect_folds(group_graph, group_edges, attrs, concept_attrs)
|
|
2348
|
+
grouping = _elect_grouping_providers(group_graph, attrs, environment, folds)
|
|
2349
|
+
placed = _place_projections(group_graph, group_edges, attrs, buckets, grouping)
|
|
2350
|
+
_fold_groups(group_graph, group_edges, attrs, buckets, folds)
|
|
2351
2351
|
_rehome_groups(
|
|
2352
|
-
group_graph,
|
|
2352
|
+
group_graph,
|
|
2353
|
+
group_edges,
|
|
2354
|
+
attrs,
|
|
2355
|
+
buckets,
|
|
2356
|
+
concept_attrs,
|
|
2357
|
+
environment,
|
|
2358
|
+
placed,
|
|
2353
2359
|
)
|
|
2354
2360
|
trace_group_graph(
|
|
2355
2361
|
"FINAL added, concept sets computed, sources regrafted",
|
|
@@ -2458,16 +2464,13 @@ def trace_group_graph(
|
|
|
2458
2464
|
@dataclass(frozen=True)
|
|
2459
2465
|
class RowProvider:
|
|
2460
2466
|
"""The row source a regraftable group is re-homed onto: the parent it
|
|
2461
|
-
reads, the lineage parents that parent replaces, the dimension ROOT
|
|
2462
|
-
for it
|
|
2463
|
-
|
|
2464
|
-
already a parent."""
|
|
2467
|
+
reads, the lineage parents that parent replaces, and the dimension ROOT
|
|
2468
|
+
minted for it. Once elected (`_as_rewrite`) it holds only what the graph
|
|
2469
|
+
lacks: `parent` is None when already a parent."""
|
|
2465
2470
|
|
|
2466
2471
|
parent: str | None
|
|
2467
2472
|
drop: frozenset[str] = frozenset()
|
|
2468
2473
|
minted: GroupBucket | None = None
|
|
2469
|
-
# the parent renders the group in its own SELECT: the group folds into it
|
|
2470
|
-
inline: bool = False
|
|
2471
2474
|
|
|
2472
2475
|
|
|
2473
2476
|
def _regraft_candidate(
|
|
@@ -2865,28 +2868,54 @@ def _inline_window(
|
|
|
2865
2868
|
return parent
|
|
2866
2869
|
|
|
2867
2870
|
|
|
2868
|
-
def
|
|
2871
|
+
def _elect_folds(
|
|
2869
2872
|
group_graph: nx.DiGraph,
|
|
2870
2873
|
group_edges: EdgeMap,
|
|
2871
2874
|
attrs: dict[str, GroupAttrs],
|
|
2872
2875
|
concept_attrs: dict[str, ConceptAttrs],
|
|
2876
|
+
) -> dict[str, str]:
|
|
2877
|
+
"""Each scalar BASIC a WINDOW renders inline, to that WINDOW, elected over
|
|
2878
|
+
the graph stage 2 built. A fold target is a WINDOW, so no fold removes
|
|
2879
|
+
another's."""
|
|
2880
|
+
folds: dict[str, str] = {}
|
|
2881
|
+
for gid in group_graph.nodes:
|
|
2882
|
+
if gid == FINAL_NODE_ID:
|
|
2883
|
+
continue
|
|
2884
|
+
window = _inline_window(group_graph, group_edges, attrs, concept_attrs, gid)
|
|
2885
|
+
if window is not None:
|
|
2886
|
+
folds[gid] = window
|
|
2887
|
+
return folds
|
|
2888
|
+
|
|
2889
|
+
|
|
2890
|
+
def _fold_groups(
|
|
2891
|
+
group_graph: nx.DiGraph,
|
|
2892
|
+
group_edges: EdgeMap,
|
|
2893
|
+
attrs: dict[str, GroupAttrs],
|
|
2894
|
+
buckets: dict[str, GroupBucket],
|
|
2895
|
+
folds: dict[str, str],
|
|
2896
|
+
) -> None:
|
|
2897
|
+
for gid, window in folds.items():
|
|
2898
|
+
_absorb_group(gid, window, group_graph, group_edges, attrs, buckets)
|
|
2899
|
+
|
|
2900
|
+
|
|
2901
|
+
def _elect_grouping_providers(
|
|
2902
|
+
group_graph: nx.DiGraph,
|
|
2903
|
+
attrs: dict[str, GroupAttrs],
|
|
2873
2904
|
environment: BuildEnvironment,
|
|
2905
|
+
folds: dict[str, str],
|
|
2874
2906
|
) -> dict[str, str]:
|
|
2875
2907
|
"""Each terminal scalar projection's grouping provider, elected over the
|
|
2876
|
-
graph stage 2 built. A
|
|
2877
|
-
|
|
2908
|
+
graph stage 2 built. A fold outranks it: that projection keeps its grain
|
|
2909
|
+
and renders in its WINDOW."""
|
|
2878
2910
|
providers: dict[str, str] = {}
|
|
2879
2911
|
for gid in group_graph.nodes:
|
|
2880
|
-
if gid == FINAL_NODE_ID:
|
|
2912
|
+
if gid == FINAL_NODE_ID or gid in folds:
|
|
2881
2913
|
continue
|
|
2882
2914
|
provider = _terminal_basic_grouping_provider(
|
|
2883
2915
|
group_graph, attrs, gid, environment
|
|
2884
2916
|
)
|
|
2885
|
-
if provider is None
|
|
2886
|
-
|
|
2887
|
-
):
|
|
2888
|
-
continue
|
|
2889
|
-
providers[gid] = provider
|
|
2917
|
+
if provider is not None:
|
|
2918
|
+
providers[gid] = provider
|
|
2890
2919
|
return providers
|
|
2891
2920
|
|
|
2892
2921
|
|
|
@@ -2904,39 +2933,66 @@ def _state_projection_grains(
|
|
|
2904
2933
|
buckets[gid].grain_components = grain
|
|
2905
2934
|
|
|
2906
2935
|
|
|
2907
|
-
def
|
|
2936
|
+
def _projection_placements(
|
|
2908
2937
|
group_graph: nx.DiGraph,
|
|
2909
2938
|
group_edges: EdgeMap,
|
|
2910
2939
|
attrs: dict[str, GroupAttrs],
|
|
2911
|
-
buckets: dict[str, GroupBucket],
|
|
2912
|
-
concept_attrs: dict[str, ConceptAttrs],
|
|
2913
|
-
environment: BuildEnvironment,
|
|
2914
2940
|
grouping: dict[str, str],
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
|
|
2923
|
-
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
elif not _grain_needed_by_independent_sibling(
|
|
2927
|
-
group_graph, attrs, gid, grouping_provider, grouping
|
|
2928
|
-
):
|
|
2941
|
+
) -> dict[str, RowProvider]:
|
|
2942
|
+
"""Each stated projection's edge onto its grouping provider and the
|
|
2943
|
+
lineage parents it replaces, read over the graph stage 2 built. A
|
|
2944
|
+
projection whose provider's grain an independent sibling co-grains on is
|
|
2945
|
+
not placed: it keeps its parents and takes a row provider."""
|
|
2946
|
+
placements: dict[str, RowProvider] = {}
|
|
2947
|
+
for gid, provider in grouping.items():
|
|
2948
|
+
if _grain_needed_by_independent_sibling(
|
|
2949
|
+
group_graph, attrs, gid, provider, grouping
|
|
2950
|
+
):
|
|
2951
|
+
continue
|
|
2929
2952
|
# Placed at the provider's grain, the projection has no use for a
|
|
2930
2953
|
# finer relation the provider was built from. Joined back, it pairs
|
|
2931
2954
|
# the provider's groups on a non-key (a region domain on a nullable
|
|
2932
2955
|
# description) and drops or multiplies them.
|
|
2933
|
-
provider_ancestors = nx.ancestors(group_graph,
|
|
2956
|
+
provider_ancestors = nx.ancestors(group_graph, provider)
|
|
2934
2957
|
drop = frozenset(
|
|
2935
2958
|
pred
|
|
2936
2959
|
for pred in lineage_predecessors(group_graph, group_edges, gid)
|
|
2937
2960
|
if pred in provider_ancestors
|
|
2938
2961
|
)
|
|
2939
|
-
|
|
2962
|
+
placements[gid] = RowProvider(provider, drop)
|
|
2963
|
+
return placements
|
|
2964
|
+
|
|
2965
|
+
|
|
2966
|
+
def _place_projections(
|
|
2967
|
+
group_graph: nx.DiGraph,
|
|
2968
|
+
group_edges: EdgeMap,
|
|
2969
|
+
attrs: dict[str, GroupAttrs],
|
|
2970
|
+
buckets: dict[str, GroupBucket],
|
|
2971
|
+
grouping: dict[str, str],
|
|
2972
|
+
) -> frozenset[str]:
|
|
2973
|
+
"""State each terminal projection's grain and, where no independent
|
|
2974
|
+
sibling needs that grain, its lineage: an edge from its grouping provider
|
|
2975
|
+
in place of the parents the provider was built from. Every projection
|
|
2976
|
+
feeds only FINAL, so no placement moves another group's ancestors.
|
|
2977
|
+
Returns the projections placed."""
|
|
2978
|
+
_state_projection_grains(attrs, buckets, grouping)
|
|
2979
|
+
placements = _projection_placements(group_graph, group_edges, attrs, grouping)
|
|
2980
|
+
for gid, placement in placements.items():
|
|
2981
|
+
_apply_row_provider(group_graph, group_edges, attrs, buckets, gid, placement)
|
|
2982
|
+
return frozenset(placements)
|
|
2983
|
+
|
|
2984
|
+
|
|
2985
|
+
def _elect_row_provider(
|
|
2986
|
+
group_graph: nx.DiGraph,
|
|
2987
|
+
group_edges: EdgeMap,
|
|
2988
|
+
attrs: dict[str, GroupAttrs],
|
|
2989
|
+
buckets: dict[str, GroupBucket],
|
|
2990
|
+
concept_attrs: dict[str, ConceptAttrs],
|
|
2991
|
+
environment: BuildEnvironment,
|
|
2992
|
+
gid: str,
|
|
2993
|
+
) -> RowProvider | None:
|
|
2994
|
+
"""Pick `gid`'s row source over the graph; mutates nothing. The choices,
|
|
2995
|
+
in order: a full-coverage sibling, a dimension ROOT, a partial spine."""
|
|
2940
2996
|
parent_gid = _regraft_candidate(
|
|
2941
2997
|
group_graph, group_edges, attrs, gid, allow_partial=False
|
|
2942
2998
|
)
|
|
@@ -2983,11 +3039,8 @@ def _apply_row_provider(
|
|
|
2983
3039
|
def _as_rewrite(
|
|
2984
3040
|
group_graph: nx.DiGraph, gid: str, provider: RowProvider
|
|
2985
3041
|
) -> RowProvider | None:
|
|
2986
|
-
"""`provider` less what the graph
|
|
2987
|
-
|
|
2988
|
-
mints nothing."""
|
|
2989
|
-
if provider.inline:
|
|
2990
|
-
return provider
|
|
3042
|
+
"""`provider` less what the graph already holds, or None when it changes
|
|
3043
|
+
nothing: its parent is already a parent, and it drops and mints nothing."""
|
|
2991
3044
|
drop = frozenset(p for p in provider.drop if group_graph.has_edge(p, gid))
|
|
2992
3045
|
minted = provider.minted
|
|
2993
3046
|
if minted is not None and minted.group_id in group_graph:
|
|
@@ -3007,20 +3060,22 @@ def _elect_row_providers(
|
|
|
3007
3060
|
buckets: dict[str, GroupBucket],
|
|
3008
3061
|
concept_attrs: dict[str, ConceptAttrs],
|
|
3009
3062
|
environment: BuildEnvironment,
|
|
3010
|
-
|
|
3063
|
+
placed: frozenset[str],
|
|
3011
3064
|
) -> dict[str, RowProvider]:
|
|
3012
|
-
"""Each regraftable group
|
|
3013
|
-
|
|
3014
|
-
|
|
3015
|
-
|
|
3016
|
-
|
|
3017
|
-
|
|
3018
|
-
`
|
|
3065
|
+
"""Each regraftable group not placed at its grouping provider whose best
|
|
3066
|
+
row source is already built, elected over one graph (stage 2's, with the
|
|
3067
|
+
projections placed and the folds made), as the rewrite it makes of that
|
|
3068
|
+
graph. A provider only adds a lineage edge, drops ROOT parents and mints
|
|
3069
|
+
a ROOT.
|
|
3070
|
+
|
|
3071
|
+
Concrete datasource selection remains in `source_planning` and
|
|
3072
|
+
StrategyNode construction in `strategy_builder`.
|
|
3019
3073
|
"""
|
|
3020
3074
|
providers: dict[str, RowProvider] = {}
|
|
3021
3075
|
for gid in list(group_graph.nodes):
|
|
3022
3076
|
if (
|
|
3023
3077
|
gid == FINAL_NODE_ID
|
|
3078
|
+
or gid in placed
|
|
3024
3079
|
or attrs[gid].derivation not in _REGRAFTABLE_DERIVATIONS
|
|
3025
3080
|
):
|
|
3026
3081
|
continue
|
|
@@ -3031,27 +3086,13 @@ def _elect_row_providers(
|
|
|
3031
3086
|
buckets,
|
|
3032
3087
|
concept_attrs,
|
|
3033
3088
|
environment,
|
|
3034
|
-
grouping,
|
|
3035
3089
|
gid,
|
|
3036
3090
|
)
|
|
3037
3091
|
if provider is not None:
|
|
3038
3092
|
provider = _as_rewrite(group_graph, gid, provider)
|
|
3039
3093
|
if provider is not None:
|
|
3040
3094
|
providers[gid] = provider
|
|
3041
|
-
|
|
3042
|
-
return {
|
|
3043
|
-
gid: replace(p, drop=frozenset(folded.get(pred, pred) for pred in p.drop))
|
|
3044
|
-
for gid, p in providers.items()
|
|
3045
|
-
}
|
|
3046
|
-
|
|
3047
|
-
|
|
3048
|
-
def _folds(providers: dict[str, RowProvider]) -> dict[str, str]:
|
|
3049
|
-
"""Each group its provider renders inline, to that provider."""
|
|
3050
|
-
return {
|
|
3051
|
-
gid: p.parent
|
|
3052
|
-
for gid, p in providers.items()
|
|
3053
|
-
if p.inline and p.parent is not None
|
|
3054
|
-
}
|
|
3095
|
+
return providers
|
|
3055
3096
|
|
|
3056
3097
|
|
|
3057
3098
|
def _rehome_groups(
|
|
@@ -3061,17 +3102,18 @@ def _rehome_groups(
|
|
|
3061
3102
|
buckets: dict[str, GroupBucket],
|
|
3062
3103
|
concept_attrs: dict[str, ConceptAttrs],
|
|
3063
3104
|
environment: BuildEnvironment,
|
|
3064
|
-
|
|
3105
|
+
placed: frozenset[str],
|
|
3065
3106
|
) -> None:
|
|
3066
|
-
"""Elect every group's row provider over
|
|
3067
|
-
|
|
3068
|
-
group its provider renders inline and apply the rest: no election reads
|
|
3069
|
-
another's fold or edges."""
|
|
3107
|
+
"""Elect every unplaced group's row provider over one graph, then apply
|
|
3108
|
+
them all: no election reads another's edges."""
|
|
3070
3109
|
providers = _elect_row_providers(
|
|
3071
|
-
group_graph,
|
|
3110
|
+
group_graph,
|
|
3111
|
+
group_edges,
|
|
3112
|
+
attrs,
|
|
3113
|
+
buckets,
|
|
3114
|
+
concept_attrs,
|
|
3115
|
+
environment,
|
|
3116
|
+
placed,
|
|
3072
3117
|
)
|
|
3073
|
-
for gid, parent in _folds(providers).items():
|
|
3074
|
-
_absorb_group(gid, parent, group_graph, group_edges, attrs, buckets)
|
|
3075
3118
|
for gid, provider in providers.items():
|
|
3076
|
-
|
|
3077
|
-
_apply_row_provider(group_graph, group_edges, attrs, buckets, gid, provider)
|
|
3119
|
+
_apply_row_provider(group_graph, group_edges, attrs, buckets, gid, provider)
|
{pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/processing/v4_helper/source_planning.py
RENAMED
|
@@ -16,7 +16,7 @@ from typing import cast
|
|
|
16
16
|
|
|
17
17
|
from trilogy.constants import logger
|
|
18
18
|
from trilogy.core.constants import parent_axis_keys
|
|
19
|
-
from trilogy.core.enums import Derivation, Granularity, JoinType
|
|
19
|
+
from trilogy.core.enums import Derivation, Granularity, JoinType
|
|
20
20
|
from trilogy.core.graph_models import ReferenceGraph, concept_to_node
|
|
21
21
|
from trilogy.core.models.build import (
|
|
22
22
|
BuildConcept,
|
|
@@ -33,6 +33,7 @@ from trilogy.core.processing.aggregate_rollup import (
|
|
|
33
33
|
at_own_grain,
|
|
34
34
|
filter_finer_row_args,
|
|
35
35
|
holds_every_kept_row,
|
|
36
|
+
joinable_property,
|
|
36
37
|
joined_condition_columns,
|
|
37
38
|
merge_rollup_concepts,
|
|
38
39
|
source_rollup_concepts,
|
|
@@ -1705,7 +1706,8 @@ def _finer_filter_rollup_source(
|
|
|
1705
1706
|
if not all(
|
|
1706
1707
|
c in canonicals
|
|
1707
1708
|
or (
|
|
1708
|
-
|
|
1709
|
+
len(arms) == 1
|
|
1710
|
+
and joinable_property(environment.concepts.get(c), arms[0])
|
|
1709
1711
|
and all(
|
|
1710
1712
|
at_own_grain(a, target_grain, environment.concepts)
|
|
1711
1713
|
for a in aggregates
|
|
@@ -1744,19 +1746,6 @@ def _finer_filter_rollup_source(
|
|
|
1744
1746
|
return matches[0]
|
|
1745
1747
|
|
|
1746
1748
|
|
|
1747
|
-
def _joinable_property(
|
|
1748
|
-
concept: BuildConcept | None, arms: list[BuildDatasource]
|
|
1749
|
-
) -> bool:
|
|
1750
|
-
return (
|
|
1751
|
-
concept is not None
|
|
1752
|
-
and concept.lineage is None
|
|
1753
|
-
and concept.purpose == Purpose.PROPERTY
|
|
1754
|
-
and bool(concept.keys)
|
|
1755
|
-
and len(arms) == 1
|
|
1756
|
-
and set(concept.keys or ()) <= set(arms[0].grain.components)
|
|
1757
|
-
)
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
1749
|
def _rolls_every_aggregate(
|
|
1761
1750
|
datasource: BuildDatasource | BuildUnionDatasource,
|
|
1762
1751
|
request: SourceRequest,
|
|
@@ -4,7 +4,7 @@ name = "trilogy-parser"
|
|
|
4
4
|
# crates.io releases ride the same stream (see pythonpublish.yml), so a
|
|
5
5
|
# published crate version always corresponds to the pytrilogy release
|
|
6
6
|
# whose grammar it carries.
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.486"
|
|
8
8
|
edition = "2021"
|
|
9
9
|
description = "Parser and import/datasource dependency resolver for the Trilogy language"
|
|
10
10
|
license = "MIT"
|
|
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
|
|
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.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/collapse_single_parent.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
|
{pytrilogy-0.3.485 → pytrilogy-0.3.486}/trilogy/core/optimizations/merge_irrelevant_group_by.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|