lora-python 0.22.2__tar.gz → 0.22.3__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.
- {lora_python-0.22.2 → lora_python-0.22.3}/Cargo.lock +19 -19
- {lora_python-0.22.2 → lora_python-0.22.3}/Cargo.toml +13 -13
- {lora_python-0.22.2 → lora_python-0.22.3}/PKG-INFO +1 -1
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/analyzer/clauses.rs +270 -1
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/analyzer/expressions.rs +4 -1
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/analyzer/state.rs +8 -1
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/errors.rs +6 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/resolved.rs +13 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/symbols.rs +6 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-compiler/src/lib.rs +8 -1
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-compiler/src/planner.rs +106 -4
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/compile.rs +26 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/execute.rs +1 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/mod.rs +1 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/occ.rs +34 -4
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/profile.rs +1 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/stream.rs +1 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/plan_cache.rs +1 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/transaction.rs +3 -0
- lora_python-0.22.3/crates/lora-database/tests/aggregate_semantics.rs +297 -0
- lora_python-0.22.3/crates/lora-database/tests/bit_shifts.rs +141 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/borrowed_variable_reads.rs +2 -1
- lora_python-0.22.3/crates/lora-database/tests/deferred_existence_end_state.rs +225 -0
- lora_python-0.22.3/crates/lora-database/tests/entity_property_values.rs +197 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/errors.rs +9 -7
- lora_python-0.22.3/crates/lora-database/tests/expression_semantics.rs +185 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/expressions.rs +10 -5
- lora_python-0.22.3/crates/lora-database/tests/integer_literals.rs +128 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/invariants.rs +6 -7
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/limit_skip_counts.rs +5 -5
- lora_python-0.22.3/crates/lora-database/tests/missing_parameters.rs +159 -0
- lora_python-0.22.3/crates/lora-database/tests/nested_aggregates.rs +244 -0
- lora_python-0.22.3/crates/lora-database/tests/order_by_aggregates.rs +185 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/parameters.rs +25 -16
- lora_python-0.22.3/crates/lora-database/tests/statement_atomicity.rs +215 -0
- lora_python-0.22.3/crates/lora-database/tests/sum_empty.rs +127 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/temporal.rs +11 -3
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/where_clause.rs +2 -3
- lora_python-0.22.3/crates/lora-database/tests/write_path_bindings.rs +166 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/binops.rs +36 -7
- lora_python-0.22.3/crates/lora-executor/src/eval/builtins/bits_ns.rs +77 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/list.rs +17 -5
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/number.rs +2 -2
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/expr.rs +16 -12
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/executor/aggregation.rs +5 -4
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/executor/helpers.rs +44 -57
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/executor/mod.rs +2 -2
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/executor/mutable.rs +161 -97
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/aggregate.rs +99 -84
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/value.rs +15 -8
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/parser/expressions.rs +32 -4
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/parser/literals.rs +37 -22
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/parser/tests.rs +69 -20
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/constraint_enforce.rs +70 -2
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/impls.rs +45 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/traits.rs +35 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/temporal/duration.rs +23 -7
- {lora_python-0.22.2 → lora_python-0.22.3}/pyproject.toml +1 -1
- lora_python-0.22.2/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -33
- {lora_python-0.22.2 → lora_python-0.22.3}/LICENSE +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/README.md +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/.gitignore +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/LICENSE +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/README.md +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/build.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/examples/async_demo.py +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/examples/basic.py +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/src/errors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/src/from_python.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/src/gil.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/src/stream.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/src/to_python.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/tests/test_async.py +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/bindings/lora-python/tests/test_sync.py +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/src/scope.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-analyzer/tests/error_messages.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-ast/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-ast/src/ast.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-ast/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-builtins-meta/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-builtins-meta/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-compiler/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-compiler/src/logical.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-compiler/src/optimizer.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-compiler/src/pattern.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-compiler/src/physical.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-compiler/src/plan_tree.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/README.md +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/advanced.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/concurrency_guard.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/concurrent.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/engine.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/fixtures.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/index_acceleration.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/memory.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/memory_baseline.json +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/perf_smoke.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/query_implementations.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/realistic.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/scale.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/temporal_spatial.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/benches/wal.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/examples/bulk_probe.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/examples/carried_probe.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/examples/heap_probe.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/examples/keyset_probe.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/examples/optional_probe.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/examples/perf_probe.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/examples/pushdown_probe.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/changes/build.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/changes/history.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/changes/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/builder.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/changes.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/explain.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/graph_api.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/procedures.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/pull_mode.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/replay.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/row_projection.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/schema.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/show_pipeline.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/database/write_guard.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/durable_io.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/error.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/explain.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/io.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/live_store.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/named.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/snapshot/json.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/snapshot/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/snapshot/store.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/stream.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/wal/admin.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/wal/archive/format.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/wal/archive/lock.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/wal/archive/platform.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/wal/archive/worker.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/wal/archive.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/wal/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/src/wal/write_scope.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/advanced_queries.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/aggregation.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/backend_stub.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/binary.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/carried_value_sharing.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/change_feed.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/collect_nulls.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/comparison_ordering.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/constraints.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/create.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/cypher_compat.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/docs_examples.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/early_limit.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/empty_ranges.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/error_messages.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/explain_estimates.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/explain_profile.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/foreach.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/fulltext_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/functions_extended.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/grouping_key_identity.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/index_acceleration.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/managed_snapshots.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/match.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/merge.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/merge_bound_end.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/optional_match_leading.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/order_by_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/ordering.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/parser.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/paths.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/planner_pushdown.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/procedure_yield.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/projection.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/scale.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/schema.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/seeds.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/snapshot.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/spatial.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/starts_with_range_seek.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/string_number_addition.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/temporal_constructors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/temporal_map_components.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/temporal_range_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/temporal_strings.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/test_helpers.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/timeouts.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/transactions.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/types_advanced.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/union.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/unknown_names.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/update.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/vector_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/vectors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/wal.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/with.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/with_predicates.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/write_results.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-database/tests/write_scaling.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/cancel.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/errors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/errors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/functions.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/point.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/regex.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/eval/vector.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/executor/immutable.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/executor/optional.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/executor/sort.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/profile.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/columns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/context.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/expand.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/filter.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/hydration.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/mutable.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/optional.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/path.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/projection.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/scan.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/shape.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/sort.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/source.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/traits.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/src/pull/union.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-executor/tests/error_messages.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-io/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-io/src/csv.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-io/src/format.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-io/src/json_array.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-io/src/jsonl.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-io/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-io/src/mapping.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-io/src/value_json.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/cypher.pest +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/errors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/parser/clauses.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/parser/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/parser/patterns.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/parser/query.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/parser/schema.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/src/parser/util.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-parser/tests/error_messages.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/body.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/codec.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/columnar.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/envelope.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/errors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/format.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/options.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/transform.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/src/view.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-snapshot/tests/error_messages.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/codec.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/intern.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/lock_table.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/chunked_vec.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/cow.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/graph.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/hnsw.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/id_set.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/index_catalog.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/mem_report.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/point_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/property_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/snapshot.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/stats.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/text_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/memory/vector_index.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/mutation.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/snapshot.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/binary/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/binary/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/binary/traits.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/binary/types.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/graph.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/property_map.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/property_value.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/spatial/distance.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/spatial/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/spatial/point.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/spatial/srid.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/spatial/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/temporal/date.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/temporal/format.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/temporal/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/temporal/time.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/temporal/zone.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/vector/build.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/vector/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/vector/similarity.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/vector/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/src/types/vector/types.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-store/tests/error_messages.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/Cargo.toml +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/codec/decode.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/codec/encode.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/codec/format.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/codec/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/codec/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/config.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/dir.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/errors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/history.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/io.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/lib.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/lock.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/lsn.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/record.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/recorder/errors.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/recorder/mirror.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/recorder/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/recorder/recorder.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/recorder/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/replay.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/segment.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/testing.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/wal/mod.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/wal/tests.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/src/wal/wal.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/crates/lora-wal/tests/error_messages.rs +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/python/lora_python/__init__.py +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/python/lora_python/_async.py +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/python/lora_python/_native.pyi +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/python/lora_python/py.typed +0 -0
- {lora_python-0.22.2 → lora_python-0.22.3}/python/lora_python/types.py +0 -0
|
@@ -854,7 +854,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
|
|
854
854
|
|
|
855
855
|
[[package]]
|
|
856
856
|
name = "lora-analyzer"
|
|
857
|
-
version = "0.22.
|
|
857
|
+
version = "0.22.3"
|
|
858
858
|
dependencies = [
|
|
859
859
|
"lora-ast",
|
|
860
860
|
"lora-builtins-meta",
|
|
@@ -865,14 +865,14 @@ dependencies = [
|
|
|
865
865
|
|
|
866
866
|
[[package]]
|
|
867
867
|
name = "lora-ast"
|
|
868
|
-
version = "0.22.
|
|
868
|
+
version = "0.22.3"
|
|
869
869
|
dependencies = [
|
|
870
870
|
"smallvec 2.0.0-alpha.12",
|
|
871
871
|
]
|
|
872
872
|
|
|
873
873
|
[[package]]
|
|
874
874
|
name = "lora-binding-buffer"
|
|
875
|
-
version = "0.22.
|
|
875
|
+
version = "0.22.3"
|
|
876
876
|
dependencies = [
|
|
877
877
|
"lora-database",
|
|
878
878
|
"lora-store",
|
|
@@ -880,11 +880,11 @@ dependencies = [
|
|
|
880
880
|
|
|
881
881
|
[[package]]
|
|
882
882
|
name = "lora-builtins-meta"
|
|
883
|
-
version = "0.22.
|
|
883
|
+
version = "0.22.3"
|
|
884
884
|
|
|
885
885
|
[[package]]
|
|
886
886
|
name = "lora-compiler"
|
|
887
|
-
version = "0.22.
|
|
887
|
+
version = "0.22.3"
|
|
888
888
|
dependencies = [
|
|
889
889
|
"lora-analyzer",
|
|
890
890
|
"lora-ast",
|
|
@@ -893,7 +893,7 @@ dependencies = [
|
|
|
893
893
|
|
|
894
894
|
[[package]]
|
|
895
895
|
name = "lora-database"
|
|
896
|
-
version = "0.22.
|
|
896
|
+
version = "0.22.3"
|
|
897
897
|
dependencies = [
|
|
898
898
|
"anyhow",
|
|
899
899
|
"chacha20poly1305",
|
|
@@ -918,7 +918,7 @@ dependencies = [
|
|
|
918
918
|
|
|
919
919
|
[[package]]
|
|
920
920
|
name = "lora-executor"
|
|
921
|
-
version = "0.22.
|
|
921
|
+
version = "0.22.3"
|
|
922
922
|
dependencies = [
|
|
923
923
|
"blake3",
|
|
924
924
|
"crc32fast",
|
|
@@ -941,7 +941,7 @@ dependencies = [
|
|
|
941
941
|
|
|
942
942
|
[[package]]
|
|
943
943
|
name = "lora-ffi"
|
|
944
|
-
version = "0.22.
|
|
944
|
+
version = "0.22.3"
|
|
945
945
|
dependencies = [
|
|
946
946
|
"anyhow",
|
|
947
947
|
"lora-binding-buffer",
|
|
@@ -953,7 +953,7 @@ dependencies = [
|
|
|
953
953
|
|
|
954
954
|
[[package]]
|
|
955
955
|
name = "lora-io"
|
|
956
|
-
version = "0.22.
|
|
956
|
+
version = "0.22.3"
|
|
957
957
|
dependencies = [
|
|
958
958
|
"lora-executor",
|
|
959
959
|
"lora-store",
|
|
@@ -964,7 +964,7 @@ dependencies = [
|
|
|
964
964
|
|
|
965
965
|
[[package]]
|
|
966
966
|
name = "lora-node"
|
|
967
|
-
version = "0.22.
|
|
967
|
+
version = "0.22.3"
|
|
968
968
|
dependencies = [
|
|
969
969
|
"anyhow",
|
|
970
970
|
"lora-binding-buffer",
|
|
@@ -979,7 +979,7 @@ dependencies = [
|
|
|
979
979
|
|
|
980
980
|
[[package]]
|
|
981
981
|
name = "lora-parser"
|
|
982
|
-
version = "0.22.
|
|
982
|
+
version = "0.22.3"
|
|
983
983
|
dependencies = [
|
|
984
984
|
"lora-ast",
|
|
985
985
|
"pest",
|
|
@@ -990,7 +990,7 @@ dependencies = [
|
|
|
990
990
|
|
|
991
991
|
[[package]]
|
|
992
992
|
name = "lora-python"
|
|
993
|
-
version = "0.22.
|
|
993
|
+
version = "0.22.3"
|
|
994
994
|
dependencies = [
|
|
995
995
|
"anyhow",
|
|
996
996
|
"lora-binding-buffer",
|
|
@@ -1003,7 +1003,7 @@ dependencies = [
|
|
|
1003
1003
|
|
|
1004
1004
|
[[package]]
|
|
1005
1005
|
name = "lora-query-wasm"
|
|
1006
|
-
version = "0.22.
|
|
1006
|
+
version = "0.22.3"
|
|
1007
1007
|
dependencies = [
|
|
1008
1008
|
"console_error_panic_hook",
|
|
1009
1009
|
"js-sys",
|
|
@@ -1017,7 +1017,7 @@ dependencies = [
|
|
|
1017
1017
|
|
|
1018
1018
|
[[package]]
|
|
1019
1019
|
name = "lora-server"
|
|
1020
|
-
version = "0.22.
|
|
1020
|
+
version = "0.22.3"
|
|
1021
1021
|
dependencies = [
|
|
1022
1022
|
"anyhow",
|
|
1023
1023
|
"axum",
|
|
@@ -1032,7 +1032,7 @@ dependencies = [
|
|
|
1032
1032
|
|
|
1033
1033
|
[[package]]
|
|
1034
1034
|
name = "lora-snapshot"
|
|
1035
|
-
version = "0.22.
|
|
1035
|
+
version = "0.22.3"
|
|
1036
1036
|
dependencies = [
|
|
1037
1037
|
"argon2",
|
|
1038
1038
|
"blake3",
|
|
@@ -1047,7 +1047,7 @@ dependencies = [
|
|
|
1047
1047
|
|
|
1048
1048
|
[[package]]
|
|
1049
1049
|
name = "lora-store"
|
|
1050
|
-
version = "0.22.
|
|
1050
|
+
version = "0.22.3"
|
|
1051
1051
|
dependencies = [
|
|
1052
1052
|
"crc32fast",
|
|
1053
1053
|
"jiff",
|
|
@@ -1062,7 +1062,7 @@ dependencies = [
|
|
|
1062
1062
|
|
|
1063
1063
|
[[package]]
|
|
1064
1064
|
name = "lora-wal"
|
|
1065
|
-
version = "0.22.
|
|
1065
|
+
version = "0.22.3"
|
|
1066
1066
|
dependencies = [
|
|
1067
1067
|
"crc32fast",
|
|
1068
1068
|
"lora-store",
|
|
@@ -1072,7 +1072,7 @@ dependencies = [
|
|
|
1072
1072
|
|
|
1073
1073
|
[[package]]
|
|
1074
1074
|
name = "lora-wasm"
|
|
1075
|
-
version = "0.22.
|
|
1075
|
+
version = "0.22.3"
|
|
1076
1076
|
dependencies = [
|
|
1077
1077
|
"anyhow",
|
|
1078
1078
|
"console_error_panic_hook",
|
|
@@ -1088,7 +1088,7 @@ dependencies = [
|
|
|
1088
1088
|
|
|
1089
1089
|
[[package]]
|
|
1090
1090
|
name = "lora_ruby"
|
|
1091
|
-
version = "0.22.
|
|
1091
|
+
version = "0.22.3"
|
|
1092
1092
|
dependencies = [
|
|
1093
1093
|
"anyhow",
|
|
1094
1094
|
"lora-database",
|
|
@@ -4,7 +4,7 @@ resolver = "2"
|
|
|
4
4
|
|
|
5
5
|
[workspace.package]
|
|
6
6
|
edition = "2021"
|
|
7
|
-
version = "0.22.
|
|
7
|
+
version = "0.22.3"
|
|
8
8
|
license = "BUSL-1.1"
|
|
9
9
|
authors = ["LoraDB, Inc."]
|
|
10
10
|
repository = "https://github.com/lora-db/lora"
|
|
@@ -15,18 +15,18 @@ rust-version = "1.87"
|
|
|
15
15
|
# Internal crates — versions are kept in lockstep with [workspace.package].version
|
|
16
16
|
# by `scripts/sync-versions.mjs`. Both `path` and `version` are set so that
|
|
17
17
|
# `cargo publish` works (crates.io cannot resolve path-only deps).
|
|
18
|
-
lora-ast = { path = "crates/lora-ast", version = "=0.22.
|
|
19
|
-
lora-parser = { path = "crates/lora-parser", version = "=0.22.
|
|
20
|
-
lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.22.
|
|
21
|
-
lora-analyzer = { path = "crates/lora-analyzer", version = "=0.22.
|
|
22
|
-
lora-compiler = { path = "crates/lora-compiler", version = "=0.22.
|
|
23
|
-
lora-store = { path = "crates/lora-store", version = "=0.22.
|
|
24
|
-
lora-snapshot = { path = "crates/lora-snapshot", version = "=0.22.
|
|
25
|
-
lora-io = { path = "crates/lora-io", version = "=0.22.
|
|
26
|
-
lora-wal = { path = "crates/lora-wal", version = "=0.22.
|
|
27
|
-
lora-executor = { path = "crates/lora-executor", version = "=0.22.
|
|
28
|
-
lora-database = { path = "crates/lora-database", version = "=0.22.
|
|
29
|
-
lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.22.
|
|
18
|
+
lora-ast = { path = "crates/lora-ast", version = "=0.22.3" }
|
|
19
|
+
lora-parser = { path = "crates/lora-parser", version = "=0.22.3" }
|
|
20
|
+
lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.22.3" }
|
|
21
|
+
lora-analyzer = { path = "crates/lora-analyzer", version = "=0.22.3" }
|
|
22
|
+
lora-compiler = { path = "crates/lora-compiler", version = "=0.22.3" }
|
|
23
|
+
lora-store = { path = "crates/lora-store", version = "=0.22.3" }
|
|
24
|
+
lora-snapshot = { path = "crates/lora-snapshot", version = "=0.22.3", default-features = false }
|
|
25
|
+
lora-io = { path = "crates/lora-io", version = "=0.22.3" }
|
|
26
|
+
lora-wal = { path = "crates/lora-wal", version = "=0.22.3" }
|
|
27
|
+
lora-executor = { path = "crates/lora-executor", version = "=0.22.3", default-features = false }
|
|
28
|
+
lora-database = { path = "crates/lora-database", version = "=0.22.3" }
|
|
29
|
+
lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.22.3" }
|
|
30
30
|
|
|
31
31
|
# External crates.
|
|
32
32
|
anyhow = "1"
|
|
@@ -3,7 +3,7 @@ use super::state::{Analyzer, PatternContext};
|
|
|
3
3
|
use crate::{errors::*, resolved::*, symbols::*};
|
|
4
4
|
use lora_ast::{
|
|
5
5
|
Create, Delete, Expr, Foreach, InQueryCall, Match, Merge, ProjectionBody, ProjectionItem,
|
|
6
|
-
Remove, RemoveItem, Return, Set, SetItem, Unwind, UpdatingClause, Variable, With,
|
|
6
|
+
Remove, RemoveItem, Return, Set, SetItem, Span, Unwind, UpdatingClause, Variable, With,
|
|
7
7
|
};
|
|
8
8
|
use lora_store::GraphCatalog;
|
|
9
9
|
use std::collections::{BTreeMap, BTreeSet};
|
|
@@ -17,6 +17,7 @@ pub(super) struct ExportedAlias {
|
|
|
17
17
|
#[derive(Debug, Clone)]
|
|
18
18
|
pub(super) struct AnalyzedProjectionBody {
|
|
19
19
|
pub(super) items: Vec<ResolvedProjection>,
|
|
20
|
+
pub(super) lifted_aggregates: Vec<ResolvedProjection>,
|
|
20
21
|
pub(super) include_existing: bool,
|
|
21
22
|
pub(super) exported_aliases: Vec<ExportedAlias>,
|
|
22
23
|
pub(super) order: Vec<ResolvedSortItem>,
|
|
@@ -318,6 +319,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
318
319
|
Ok(ResolvedReturn {
|
|
319
320
|
distinct: r.body.distinct,
|
|
320
321
|
items: analyzed.items,
|
|
322
|
+
lifted_aggregates: analyzed.lifted_aggregates,
|
|
321
323
|
include_existing: analyzed.include_existing,
|
|
322
324
|
order: analyzed.order,
|
|
323
325
|
skip: analyzed.skip,
|
|
@@ -352,6 +354,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
352
354
|
Ok(ResolvedWith {
|
|
353
355
|
distinct: w.body.distinct,
|
|
354
356
|
items: analyzed.items,
|
|
357
|
+
lifted_aggregates: analyzed.lifted_aggregates,
|
|
355
358
|
include_existing: analyzed.include_existing,
|
|
356
359
|
order: analyzed.order,
|
|
357
360
|
skip: analyzed.skip,
|
|
@@ -364,6 +367,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
364
367
|
&mut self,
|
|
365
368
|
body: &ProjectionBody,
|
|
366
369
|
) -> Result<AnalyzedProjectionBody, SemanticError> {
|
|
370
|
+
let first_var = self.symbols.next_var();
|
|
367
371
|
let mut items = Vec::new();
|
|
368
372
|
let mut include_existing = false;
|
|
369
373
|
let mut exported_aliases = Vec::new();
|
|
@@ -406,6 +410,20 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
406
410
|
}
|
|
407
411
|
}
|
|
408
412
|
|
|
413
|
+
// The items as written, before lifting rewrites them: an ORDER BY key
|
|
414
|
+
// that restates one sorts by its column.
|
|
415
|
+
let written: Vec<(String, VarId, bool)> = items
|
|
416
|
+
.iter()
|
|
417
|
+
.map(|item| {
|
|
418
|
+
(
|
|
419
|
+
format!("{:?}", item.expr),
|
|
420
|
+
item.output,
|
|
421
|
+
expr_contains_aggregate(&item.expr),
|
|
422
|
+
)
|
|
423
|
+
})
|
|
424
|
+
.collect();
|
|
425
|
+
let mut lifted_aggregates = self.lift_nested_aggregates(&mut items, first_var)?;
|
|
426
|
+
|
|
409
427
|
// Build a lookup from alias names to their output VarIds so ORDER BY
|
|
410
428
|
// can reference projection aliases (e.g. ORDER BY name when RETURN p.name AS name).
|
|
411
429
|
let alias_map: BTreeMap<String, VarId> = exported_aliases
|
|
@@ -424,6 +442,13 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
424
442
|
})
|
|
425
443
|
})
|
|
426
444
|
.collect::<Result<Vec<_>, SemanticError>>()?;
|
|
445
|
+
let order = self.lift_order_aggregates(
|
|
446
|
+
order,
|
|
447
|
+
&written,
|
|
448
|
+
&mut lifted_aggregates,
|
|
449
|
+
body.distinct,
|
|
450
|
+
first_var,
|
|
451
|
+
)?;
|
|
427
452
|
|
|
428
453
|
let skip = body
|
|
429
454
|
.skip
|
|
@@ -438,6 +463,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
438
463
|
|
|
439
464
|
Ok(AnalyzedProjectionBody {
|
|
440
465
|
items,
|
|
466
|
+
lifted_aggregates,
|
|
441
467
|
include_existing,
|
|
442
468
|
exported_aliases,
|
|
443
469
|
order,
|
|
@@ -447,6 +473,249 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
447
473
|
}
|
|
448
474
|
}
|
|
449
475
|
|
|
476
|
+
impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
477
|
+
/// Split every item that nests an aggregate inside a larger expression
|
|
478
|
+
/// (`size(collect(x))`, `{c: count(*)}`): each aggregate call becomes a
|
|
479
|
+
/// hidden column and the item reads it, so the planner can aggregate
|
|
480
|
+
/// first and evaluate the item on the grouped row. Inside such an item,
|
|
481
|
+
/// a sub-expression that restates a grouping key reads that key's column.
|
|
482
|
+
///
|
|
483
|
+
/// Anything else the item reads from before this projection would be a
|
|
484
|
+
/// different value per row of the group, so it is rejected, as in
|
|
485
|
+
/// openCypher. `first_var` is the first id this projection allocated:
|
|
486
|
+
/// lower ids are those earlier bindings, higher ones its own aliases and
|
|
487
|
+
/// comprehension locals.
|
|
488
|
+
fn lift_nested_aggregates(
|
|
489
|
+
&mut self,
|
|
490
|
+
items: &mut [ResolvedProjection],
|
|
491
|
+
first_var: VarId,
|
|
492
|
+
) -> Result<Vec<ResolvedProjection>, SemanticError> {
|
|
493
|
+
if !items
|
|
494
|
+
.iter()
|
|
495
|
+
.any(|item| expr_contains_aggregate(&item.expr) && !is_bare_aggregate(&item.expr))
|
|
496
|
+
{
|
|
497
|
+
return Ok(Vec::new());
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// Grouping keys, compared by their derived `Debug` form (structural
|
|
501
|
+
// and deterministic), with the column each one lands in.
|
|
502
|
+
let keys: Vec<(String, VarId)> = items
|
|
503
|
+
.iter()
|
|
504
|
+
.filter(|item| !expr_contains_aggregate(&item.expr))
|
|
505
|
+
.map(|item| (format!("{:?}", item.expr), item.output))
|
|
506
|
+
.collect();
|
|
507
|
+
|
|
508
|
+
let mut lifted = Vec::new();
|
|
509
|
+
for item in items.iter_mut() {
|
|
510
|
+
if !expr_contains_aggregate(&item.expr) || is_bare_aggregate(&item.expr) {
|
|
511
|
+
continue;
|
|
512
|
+
}
|
|
513
|
+
let mut expr = item.expr.clone();
|
|
514
|
+
lift_aggregates_in(
|
|
515
|
+
&mut expr,
|
|
516
|
+
&keys,
|
|
517
|
+
&mut || self.symbols.new_var(),
|
|
518
|
+
&mut lifted,
|
|
519
|
+
item.span,
|
|
520
|
+
);
|
|
521
|
+
|
|
522
|
+
if reads_ungrouped(&expr, &keys, first_var) {
|
|
523
|
+
return Err(SemanticError::ImplicitGroupingKey(item.name.to_string()));
|
|
524
|
+
}
|
|
525
|
+
item.expr = expr;
|
|
526
|
+
}
|
|
527
|
+
Ok(lifted)
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/// Point ORDER BY keys of an aggregating projection at what they mean
|
|
531
|
+
/// on the grouped rows. A key that restates an item (as written, before
|
|
532
|
+
/// lifting) sorts by that item's column; an aggregate in any other key
|
|
533
|
+
/// is lifted into a hidden column like a nested one in an item, the
|
|
534
|
+
/// planner keeping it until the sort. A projection that doesn't
|
|
535
|
+
/// aggregate can't aggregate in ORDER BY, and after DISTINCT a key can
|
|
536
|
+
/// only aggregate what is projected (openCypher rejects both).
|
|
537
|
+
fn lift_order_aggregates(
|
|
538
|
+
&mut self,
|
|
539
|
+
order: Vec<ResolvedSortItem>,
|
|
540
|
+
written: &[(String, VarId, bool)],
|
|
541
|
+
lifted: &mut Vec<ResolvedProjection>,
|
|
542
|
+
distinct: bool,
|
|
543
|
+
first_var: VarId,
|
|
544
|
+
) -> Result<Vec<ResolvedSortItem>, SemanticError> {
|
|
545
|
+
let aggregating = written.iter().any(|(_, _, aggregates)| *aggregates);
|
|
546
|
+
if !aggregating {
|
|
547
|
+
if order.iter().any(|key| expr_contains_aggregate(&key.expr)) {
|
|
548
|
+
return Err(SemanticError::AggregationInOrderBy(
|
|
549
|
+
"the projection doesn't aggregate".into(),
|
|
550
|
+
));
|
|
551
|
+
}
|
|
552
|
+
return Ok(order);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
let keys: Vec<(String, VarId)> = written
|
|
556
|
+
.iter()
|
|
557
|
+
.filter(|(_, _, aggregates)| !aggregates)
|
|
558
|
+
.map(|(shape, output, _)| (shape.clone(), *output))
|
|
559
|
+
.collect();
|
|
560
|
+
order
|
|
561
|
+
.into_iter()
|
|
562
|
+
.map(|mut key| {
|
|
563
|
+
let shape = format!("{:?}", key.expr);
|
|
564
|
+
if let Some((_, output, _)) = written.iter().find(|(s, _, _)| *s == shape) {
|
|
565
|
+
key.expr = ResolvedExpr::Variable(*output);
|
|
566
|
+
return Ok(key);
|
|
567
|
+
}
|
|
568
|
+
if !expr_contains_aggregate(&key.expr) {
|
|
569
|
+
return Ok(key);
|
|
570
|
+
}
|
|
571
|
+
if distinct {
|
|
572
|
+
return Err(SemanticError::AggregationInOrderBy(
|
|
573
|
+
"after DISTINCT it can only sort by an aggregate that is projected".into(),
|
|
574
|
+
));
|
|
575
|
+
}
|
|
576
|
+
lift_aggregates_in(
|
|
577
|
+
&mut key.expr,
|
|
578
|
+
&keys,
|
|
579
|
+
&mut || self.symbols.new_var(),
|
|
580
|
+
lifted,
|
|
581
|
+
Span::default(),
|
|
582
|
+
);
|
|
583
|
+
if reads_ungrouped(&key.expr, &keys, first_var) {
|
|
584
|
+
return Err(SemanticError::ImplicitGroupingKey("ORDER BY".into()));
|
|
585
|
+
}
|
|
586
|
+
Ok(key)
|
|
587
|
+
})
|
|
588
|
+
.collect()
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/// Whether `expr`, after lifting, reads a binding from before the
|
|
593
|
+
/// projection (an id below `first_var`) that isn't a grouping key's
|
|
594
|
+
/// column: a value that differs per row of the group.
|
|
595
|
+
fn reads_ungrouped(expr: &ResolvedExpr, keys: &[(String, VarId)], first_var: VarId) -> bool {
|
|
596
|
+
let mut reads = BTreeSet::new();
|
|
597
|
+
expr.collect_vars(&mut reads);
|
|
598
|
+
reads
|
|
599
|
+
.iter()
|
|
600
|
+
.any(|v| *v < first_var && !keys.iter().any(|(_, key)| key == v))
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/// Whether `expr` is itself one aggregate call, the shape the aggregation
|
|
604
|
+
/// operator evaluates directly.
|
|
605
|
+
fn is_bare_aggregate(expr: &ResolvedExpr) -> bool {
|
|
606
|
+
matches!(expr, ResolvedExpr::Function { function, .. } if function.is_aggregate())
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/// Replace each aggregate call in `expr` with a fresh variable, recording
|
|
610
|
+
/// the call as a hidden projection in `lifted`; replace each aggregate-free
|
|
611
|
+
/// sub-expression that restates a grouping key with that key's column.
|
|
612
|
+
fn lift_aggregates_in(
|
|
613
|
+
expr: &mut ResolvedExpr,
|
|
614
|
+
keys: &[(String, VarId)],
|
|
615
|
+
new_var: &mut dyn FnMut() -> VarId,
|
|
616
|
+
lifted: &mut Vec<ResolvedProjection>,
|
|
617
|
+
span: Span,
|
|
618
|
+
) {
|
|
619
|
+
if is_bare_aggregate(expr) {
|
|
620
|
+
let output = new_var();
|
|
621
|
+
let call = std::mem::replace(expr, ResolvedExpr::Variable(output));
|
|
622
|
+
lifted.push(ResolvedProjection {
|
|
623
|
+
expr: call,
|
|
624
|
+
output,
|
|
625
|
+
name: format!(" aggregate {}", output.0).into(),
|
|
626
|
+
explicit_alias: false,
|
|
627
|
+
span,
|
|
628
|
+
});
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
// Not a key, but its parts may be (`size(n.tags)` with `n.tags` grouped).
|
|
632
|
+
if !keys.is_empty() && !expr_contains_aggregate(expr) {
|
|
633
|
+
let shape = format!("{:?}", expr);
|
|
634
|
+
if let Some((_, output)) = keys.iter().find(|(key, _)| *key == shape) {
|
|
635
|
+
*expr = ResolvedExpr::Variable(*output);
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
let mut go = |e: &mut ResolvedExpr| lift_aggregates_in(e, keys, new_var, lifted, span);
|
|
640
|
+
match expr {
|
|
641
|
+
ResolvedExpr::Variable(_) | ResolvedExpr::Literal(_) | ResolvedExpr::Parameter(_) => {}
|
|
642
|
+
ResolvedExpr::Property { expr, .. } | ResolvedExpr::Unary { expr, .. } => go(expr),
|
|
643
|
+
ResolvedExpr::Binary { lhs, rhs, .. } => {
|
|
644
|
+
go(lhs);
|
|
645
|
+
go(rhs);
|
|
646
|
+
}
|
|
647
|
+
ResolvedExpr::Function { args, .. } => args.iter_mut().for_each(go),
|
|
648
|
+
ResolvedExpr::List(items) => items.iter_mut().for_each(go),
|
|
649
|
+
ResolvedExpr::Map(items) => items.iter_mut().for_each(|(_, v)| go(v)),
|
|
650
|
+
ResolvedExpr::Case {
|
|
651
|
+
input,
|
|
652
|
+
alternatives,
|
|
653
|
+
else_expr,
|
|
654
|
+
} => {
|
|
655
|
+
if let Some(e) = input {
|
|
656
|
+
go(e);
|
|
657
|
+
}
|
|
658
|
+
for (w, t) in alternatives {
|
|
659
|
+
go(w);
|
|
660
|
+
go(t);
|
|
661
|
+
}
|
|
662
|
+
if let Some(e) = else_expr {
|
|
663
|
+
go(e);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
ResolvedExpr::ListPredicate {
|
|
667
|
+
list, predicate, ..
|
|
668
|
+
} => {
|
|
669
|
+
go(list);
|
|
670
|
+
go(predicate);
|
|
671
|
+
}
|
|
672
|
+
ResolvedExpr::ListComprehension {
|
|
673
|
+
list,
|
|
674
|
+
filter,
|
|
675
|
+
map_expr,
|
|
676
|
+
..
|
|
677
|
+
} => {
|
|
678
|
+
go(list);
|
|
679
|
+
if let Some(e) = filter {
|
|
680
|
+
go(e);
|
|
681
|
+
}
|
|
682
|
+
if let Some(e) = map_expr {
|
|
683
|
+
go(e);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
ResolvedExpr::Reduce {
|
|
687
|
+
init, list, expr, ..
|
|
688
|
+
} => {
|
|
689
|
+
go(init);
|
|
690
|
+
go(list);
|
|
691
|
+
go(expr);
|
|
692
|
+
}
|
|
693
|
+
ResolvedExpr::MapProjection { base, selectors } => {
|
|
694
|
+
go(base);
|
|
695
|
+
for selector in selectors {
|
|
696
|
+
if let ResolvedMapSelector::Literal(_, e) = selector {
|
|
697
|
+
go(e);
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
ResolvedExpr::Index { expr, index } => {
|
|
702
|
+
go(expr);
|
|
703
|
+
go(index);
|
|
704
|
+
}
|
|
705
|
+
ResolvedExpr::Slice { expr, from, to } => {
|
|
706
|
+
go(expr);
|
|
707
|
+
if let Some(e) = from {
|
|
708
|
+
go(e);
|
|
709
|
+
}
|
|
710
|
+
if let Some(e) = to {
|
|
711
|
+
go(e);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
// Their pattern reads row bindings directly; aggregates can't nest there.
|
|
715
|
+
ResolvedExpr::ExistsSubquery { .. } | ResolvedExpr::PatternComprehension { .. } => {}
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
450
719
|
fn projection_name(expr: &Expr) -> String {
|
|
451
720
|
match expr {
|
|
452
721
|
Expr::Variable(v) => v.name.clone(),
|
|
@@ -117,7 +117,10 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
117
117
|
Expr::String(v, _) => Ok(ResolvedExpr::Literal(LiteralValue::String(v.clone()))),
|
|
118
118
|
Expr::Bool(v, _) => Ok(ResolvedExpr::Literal(LiteralValue::Bool(*v))),
|
|
119
119
|
Expr::Null(_) => Ok(ResolvedExpr::Literal(LiteralValue::Null)),
|
|
120
|
-
Expr::Parameter(name, _) =>
|
|
120
|
+
Expr::Parameter(name, _) => {
|
|
121
|
+
self.parameters.insert(name.clone());
|
|
122
|
+
Ok(ResolvedExpr::Parameter(name.clone()))
|
|
123
|
+
}
|
|
121
124
|
|
|
122
125
|
Expr::List(items, _) => {
|
|
123
126
|
let items = items
|
|
@@ -20,6 +20,8 @@ pub struct Analyzer<'a, S: GraphCatalog + ?Sized> {
|
|
|
20
20
|
/// graph-catalog check — the caller can't know which keys the data
|
|
21
21
|
/// carries until rows are bound at execution time.
|
|
22
22
|
pub(super) dynamic_property_vars: BTreeSet<VarId>,
|
|
23
|
+
/// Every `$name` resolved so far (see [`ResolvedQuery::parameters`]).
|
|
24
|
+
pub(super) parameters: BTreeSet<String>,
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
@@ -37,6 +39,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
37
39
|
scopes: ScopeStack::new(),
|
|
38
40
|
symbols: SymbolTable::default(),
|
|
39
41
|
dynamic_property_vars: BTreeSet::new(),
|
|
42
|
+
parameters: BTreeSet::new(),
|
|
40
43
|
}
|
|
41
44
|
}
|
|
42
45
|
|
|
@@ -106,7 +109,11 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
106
109
|
}
|
|
107
110
|
}
|
|
108
111
|
|
|
109
|
-
Ok(ResolvedQuery {
|
|
112
|
+
Ok(ResolvedQuery {
|
|
113
|
+
clauses,
|
|
114
|
+
unions,
|
|
115
|
+
parameters: std::mem::take(&mut self.parameters),
|
|
116
|
+
})
|
|
110
117
|
}
|
|
111
118
|
|
|
112
119
|
fn analyze_single_query(
|
|
@@ -47,6 +47,12 @@ pub enum SemanticError {
|
|
|
47
47
|
#[error("aggregation functions are not allowed in WHERE clause")]
|
|
48
48
|
AggregationInWhere,
|
|
49
49
|
|
|
50
|
+
#[error("`{0}` aggregates, so outside its aggregate functions it can only use grouping keys; project that value as its own column")]
|
|
51
|
+
ImplicitGroupingKey(String),
|
|
52
|
+
|
|
53
|
+
#[error("ORDER BY can't aggregate here: {0}")]
|
|
54
|
+
AggregationInOrderBy(String),
|
|
55
|
+
|
|
50
56
|
#[error("all UNION branches must return the same number of columns: expected {0}, got {1}")]
|
|
51
57
|
UnionColumnCountMismatch(usize, usize),
|
|
52
58
|
|
|
@@ -8,6 +8,9 @@ use lora_ast::{
|
|
|
8
8
|
#[derive(Debug, Clone)]
|
|
9
9
|
pub struct ResolvedQuery {
|
|
10
10
|
pub clauses: Vec<ResolvedClause>,
|
|
11
|
+
/// Every `$name` the query reads, across its UNION branches and
|
|
12
|
+
/// subqueries: running it without one of them is an error.
|
|
13
|
+
pub parameters: BTreeSet<String>,
|
|
11
14
|
/// Additional UNION branches. Each branch is a separate resolved query
|
|
12
15
|
/// that produces rows to be combined with the head query's results.
|
|
13
16
|
pub unions: Vec<ResolvedUnionPart>,
|
|
@@ -142,6 +145,11 @@ pub enum ResolvedRemoveItem {
|
|
|
142
145
|
pub struct ResolvedReturn {
|
|
143
146
|
pub distinct: bool,
|
|
144
147
|
pub items: Vec<ResolvedProjection>,
|
|
148
|
+
/// Aggregate calls nested inside a larger item (`size(collect(x))`,
|
|
149
|
+
/// `count(*) + 1`), each lifted into its own hidden column. Those items
|
|
150
|
+
/// read the lifted columns, and grouping keys, by output id, so they
|
|
151
|
+
/// are evaluated after aggregation.
|
|
152
|
+
pub lifted_aggregates: Vec<ResolvedProjection>,
|
|
145
153
|
pub include_existing: bool,
|
|
146
154
|
pub order: Vec<ResolvedSortItem>,
|
|
147
155
|
pub skip: Option<ResolvedExpr>,
|
|
@@ -152,6 +160,11 @@ pub struct ResolvedReturn {
|
|
|
152
160
|
pub struct ResolvedWith {
|
|
153
161
|
pub distinct: bool,
|
|
154
162
|
pub items: Vec<ResolvedProjection>,
|
|
163
|
+
/// Aggregate calls nested inside a larger item (`size(collect(x))`,
|
|
164
|
+
/// `count(*) + 1`), each lifted into its own hidden column. Those items
|
|
165
|
+
/// read the lifted columns, and grouping keys, by output id, so they
|
|
166
|
+
/// are evaluated after aggregation.
|
|
167
|
+
pub lifted_aggregates: Vec<ResolvedProjection>,
|
|
155
168
|
pub include_existing: bool,
|
|
156
169
|
pub order: Vec<ResolvedSortItem>,
|
|
157
170
|
pub skip: Option<ResolvedExpr>,
|
|
@@ -19,6 +19,12 @@ impl SymbolTable {
|
|
|
19
19
|
Self { next_var: 0 }
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
/// The id the next `new_var` returns. Every variable bound from here on
|
|
23
|
+
/// (aliases, comprehension locals) gets this id or a higher one.
|
|
24
|
+
pub fn next_var(&self) -> VarId {
|
|
25
|
+
VarId(self.next_var)
|
|
26
|
+
}
|
|
27
|
+
|
|
22
28
|
pub fn new_var(&mut self) -> VarId {
|
|
23
29
|
let id = VarId(self.next_var);
|
|
24
30
|
self.next_var += 1;
|
|
@@ -30,6 +30,8 @@ use lora_store::GraphStats;
|
|
|
30
30
|
#[derive(Debug, Clone)]
|
|
31
31
|
pub struct CompiledQuery {
|
|
32
32
|
pub physical: PhysicalPlan,
|
|
33
|
+
/// Every `$name` the query reads ([`ResolvedQuery::parameters`]).
|
|
34
|
+
pub parameters: std::collections::BTreeSet<String>,
|
|
33
35
|
/// Additional UNION branches, each compiled independently.
|
|
34
36
|
pub unions: Vec<CompiledUnionBranch>,
|
|
35
37
|
}
|
|
@@ -58,6 +60,7 @@ impl Compiler {
|
|
|
58
60
|
let branch_query = ResolvedQuery {
|
|
59
61
|
clauses: union_part.clauses.clone(),
|
|
60
62
|
unions: Vec::new(),
|
|
63
|
+
parameters: Default::default(),
|
|
61
64
|
};
|
|
62
65
|
CompiledUnionBranch {
|
|
63
66
|
all: union_part.all,
|
|
@@ -66,7 +69,11 @@ impl Compiler {
|
|
|
66
69
|
})
|
|
67
70
|
.collect();
|
|
68
71
|
|
|
69
|
-
CompiledQuery {
|
|
72
|
+
CompiledQuery {
|
|
73
|
+
physical,
|
|
74
|
+
unions,
|
|
75
|
+
parameters: query.parameters.clone(),
|
|
76
|
+
}
|
|
70
77
|
}
|
|
71
78
|
}
|
|
72
79
|
|