lora-python 0.26.1__tar.gz → 0.26.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.26.1 → lora_python-0.26.3}/Cargo.lock +19 -19
- {lora_python-0.26.1 → lora_python-0.26.3}/Cargo.toml +13 -13
- {lora_python-0.26.1 → lora_python-0.26.3}/PKG-INFO +1 -1
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/lib.rs +5 -5
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/logical.rs +16 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/optimizer.rs +105 -84
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/physical.rs +4 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/plan_tree.rs +46 -40
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/builtin_namespaces.rs +14 -0
- lora_python-0.26.3/crates/lora-database/tests/range_scan_bound_intersection.rs +183 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/list.rs +11 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/helpers.rs +99 -33
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/mod.rs +1 -1
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/scan.rs +9 -12
- {lora_python-0.26.1 → lora_python-0.26.3}/pyproject.toml +1 -1
- {lora_python-0.26.1 → lora_python-0.26.3}/LICENSE +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/README.md +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/.gitignore +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/LICENSE +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/README.md +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/build.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/examples/async_demo.py +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/examples/basic.py +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/errors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/from_python.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/gil.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/stream.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/src/to_python.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/tests/test_async.py +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/bindings/lora-python/tests/test_sync.py +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/errors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/resolved.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/scope.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/src/symbols.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-analyzer/tests/error_messages.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-ast/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-ast/src/ast.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-ast/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-builtins-meta/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-builtins-meta/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/pattern.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-compiler/src/planner.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/README.md +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/advanced.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/concurrency_guard.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/concurrent.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/engine.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/fixtures.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/index_acceleration.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/memory.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/memory_baseline.json +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/perf_smoke.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/query_implementations.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/realistic.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/scale.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/temporal_spatial.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/benches/wal.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/bulk_probe.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/carried_probe.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/heap_probe.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/keyset_probe.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/optional_probe.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/perf_probe.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/pushdown_probe.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/examples/storage_baseline.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/changes/build.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/changes/history.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/changes/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/builder.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/changes.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/compile.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/execute.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/explain.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/graph_api.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/occ.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/procedures.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/profile.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/pull_mode.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/replay.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/row_projection.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/schema.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/show_pipeline.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/stream.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/database/write_guard.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/durable_io.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/error.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/explain.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/io.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/live_store.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/named.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/plan_cache.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/snapshot/json.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/snapshot/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/snapshot/store.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/stream.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/transaction.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/admin.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/format.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/lock.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/platform.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/worker.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/archive.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/src/wal/write_scope.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/advanced_queries.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/aggregate_semantics.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/aggregation.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/backend_stub.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/binary.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/bit_shifts.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/borrowed_variable_reads.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/carried_value_sharing.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/change_feed.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/collect_nulls.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/comparison_ordering.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/constraints.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/create.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/cypher_compat.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/deferred_existence_end_state.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/docs_examples.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/early_limit.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/empty_ranges.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/entity_property_values.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/error_messages.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/errors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/explain_estimates.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/explain_profile.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/expression_semantics.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/expressions.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/foreach.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/fulltext_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/functions_extended.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/grouping_key_identity.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/id_seek.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/index_acceleration.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/integer_literals.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/invariants.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/limit_skip_counts.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/managed_snapshots.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/match.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/merge.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/merge_bound_end.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/missing_parameters.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/nested_aggregates.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/null_pattern_variables.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/optional_match_leading.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/order_by_aggregates.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/order_by_grouping_key_parts.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/order_by_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/ordering.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/parameters.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/parser.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/paths.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/pattern_subquery_where_seek.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/planner_pushdown.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/planner_stats.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/procedure_yield.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/projection.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/restart_index_state.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/scale.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/schema.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/seeds.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/snapshot.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/spatial.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/starts_with_range_seek.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/statement_atomicity.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/streaming_scans.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/string_number_addition.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/sum_empty.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_constructors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_map_components.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_range_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_strings.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/test_helpers.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/timeouts.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/transactions.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/types_advanced.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/union.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/unknown_names.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/update.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/vector_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/vectors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/wal.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/where_clause.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/with.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/with_predicates.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/write_path_bindings.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/write_results.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-database/tests/write_scaling.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/cancel.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/errors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/binops.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/errors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/expr.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/functions.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/point.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/regex.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/eval/vector.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/aggregation.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/immutable.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/mutable.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/optional.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/executor/sort.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/profile.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/aggregate.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/columns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/context.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/expand.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/filter.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/hydration.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/mutable.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/optional.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/path.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/projection.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/shape.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/sort.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/source.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/traits.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/pull/union.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/src/value.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-executor/tests/error_messages.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/csv.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/format.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/json_array.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/jsonl.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/mapping.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-io/src/value_json.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/cypher.pest +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/errors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/clauses.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/expressions.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/literals.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/patterns.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/query.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/schema.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/src/parser/util.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-parser/tests/error_messages.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/body.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/codec.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/columnar.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/envelope.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/errors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/format.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/options.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/transform.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/src/view.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-snapshot/tests/error_messages.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/codec.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/dict.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/encoded.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/intern.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/lock_table.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/adjacency.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/chunked_vec.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/cow.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/distinct_stats.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/graph.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/hnsw.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/id_bitmap.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/id_map.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/id_set.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/impls.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/index_catalog.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/mem_report.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/model_tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/point_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/property_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/record_slab.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/snapshot.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/stats.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/test_util.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/text_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/memory/vector_index.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/mutation.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/snapshot.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/traits.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/binary/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/binary/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/binary/traits.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/binary/types.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/graph.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/name.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/property_map.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/property_value.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/distance.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/point.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/srid.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/spatial/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/date.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/duration.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/format.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/time.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/temporal/zone.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/build.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/similarity.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/vector/types.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/types/view.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/src/varint.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-store/tests/error_messages.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/Cargo.toml +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/decode.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/encode.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/format.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/codec/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/config.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/dir.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/errors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/history.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/io.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/lib.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/lock.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/lsn.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/record.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/errors.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/mirror.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/recorder.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/recorder/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/replay.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/segment.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/testing.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/wal/mod.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/wal/tests.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/src/wal/wal.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/crates/lora-wal/tests/error_messages.rs +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/python/lora_python/__init__.py +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/python/lora_python/_async.py +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/python/lora_python/_native.pyi +0 -0
- {lora_python-0.26.1 → lora_python-0.26.3}/python/lora_python/py.typed +0 -0
- {lora_python-0.26.1 → lora_python-0.26.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.26.
|
|
857
|
+
version = "0.26.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.26.
|
|
868
|
+
version = "0.26.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.26.
|
|
875
|
+
version = "0.26.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.26.
|
|
883
|
+
version = "0.26.3"
|
|
884
884
|
|
|
885
885
|
[[package]]
|
|
886
886
|
name = "lora-compiler"
|
|
887
|
-
version = "0.26.
|
|
887
|
+
version = "0.26.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.26.
|
|
896
|
+
version = "0.26.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.26.
|
|
921
|
+
version = "0.26.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.26.
|
|
944
|
+
version = "0.26.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.26.
|
|
956
|
+
version = "0.26.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.26.
|
|
967
|
+
version = "0.26.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.26.
|
|
982
|
+
version = "0.26.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.26.
|
|
993
|
+
version = "0.26.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.26.
|
|
1006
|
+
version = "0.26.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.26.
|
|
1020
|
+
version = "0.26.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.26.
|
|
1035
|
+
version = "0.26.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.26.
|
|
1050
|
+
version = "0.26.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.26.
|
|
1065
|
+
version = "0.26.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.26.
|
|
1075
|
+
version = "0.26.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.26.
|
|
1091
|
+
version = "0.26.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.26.
|
|
7
|
+
version = "0.26.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.26.
|
|
19
|
-
lora-parser = { path = "crates/lora-parser", version = "=0.26.
|
|
20
|
-
lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.26.
|
|
21
|
-
lora-analyzer = { path = "crates/lora-analyzer", version = "=0.26.
|
|
22
|
-
lora-compiler = { path = "crates/lora-compiler", version = "=0.26.
|
|
23
|
-
lora-store = { path = "crates/lora-store", version = "=0.26.
|
|
24
|
-
lora-snapshot = { path = "crates/lora-snapshot", version = "=0.26.
|
|
25
|
-
lora-io = { path = "crates/lora-io", version = "=0.26.
|
|
26
|
-
lora-wal = { path = "crates/lora-wal", version = "=0.26.
|
|
27
|
-
lora-executor = { path = "crates/lora-executor", version = "=0.26.
|
|
28
|
-
lora-database = { path = "crates/lora-database", version = "=0.26.
|
|
29
|
-
lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.26.
|
|
18
|
+
lora-ast = { path = "crates/lora-ast", version = "=0.26.3" }
|
|
19
|
+
lora-parser = { path = "crates/lora-parser", version = "=0.26.3" }
|
|
20
|
+
lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.26.3" }
|
|
21
|
+
lora-analyzer = { path = "crates/lora-analyzer", version = "=0.26.3" }
|
|
22
|
+
lora-compiler = { path = "crates/lora-compiler", version = "=0.26.3" }
|
|
23
|
+
lora-store = { path = "crates/lora-store", version = "=0.26.3" }
|
|
24
|
+
lora-snapshot = { path = "crates/lora-snapshot", version = "=0.26.3", default-features = false }
|
|
25
|
+
lora-io = { path = "crates/lora-io", version = "=0.26.3" }
|
|
26
|
+
lora-wal = { path = "crates/lora-wal", version = "=0.26.3" }
|
|
27
|
+
lora-executor = { path = "crates/lora-executor", version = "=0.26.3", default-features = false }
|
|
28
|
+
lora-database = { path = "crates/lora-database", version = "=0.26.3" }
|
|
29
|
+
lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.26.3" }
|
|
30
30
|
|
|
31
31
|
# External crates.
|
|
32
32
|
anyhow = "1"
|
|
@@ -9,11 +9,11 @@ mod planner;
|
|
|
9
9
|
pub use plan_tree::{plan_tree_from_compiled, PlanTree, PlanTreeNode};
|
|
10
10
|
|
|
11
11
|
pub use logical::{
|
|
12
|
-
Aggregation, Argument, Create, Delete, Expand, Filter, Foreach, Limit,
|
|
13
|
-
Merge, NodeByIdSeek, NodeByPointScan, NodeByPropertyRangeScan,
|
|
14
|
-
NodeByTextScan, NodeScan, OptionalMatch, PathBuild, PlanNodeId,
|
|
15
|
-
RelByIdSeek, RelByPointScan, RelByPropertyRangeScan, RelByTextScan,
|
|
16
|
-
SortLimit, TextPredicate, Unwind,
|
|
12
|
+
Aggregation, Argument, Create, Delete, Expand, ExtraRangeBound, Filter, Foreach, Limit,
|
|
13
|
+
LogicalOp, LogicalPlan, Merge, NodeByIdSeek, NodeByPointScan, NodeByPropertyRangeScan,
|
|
14
|
+
NodeByPropertyScan, NodeByTextScan, NodeScan, OptionalMatch, PathBuild, PlanNodeId,
|
|
15
|
+
PointPredicate, Projection, RelByIdSeek, RelByPointScan, RelByPropertyRangeScan, RelByTextScan,
|
|
16
|
+
Remove, Set, Sort, SortLimit, TextPredicate, Unwind,
|
|
17
17
|
};
|
|
18
18
|
pub use optimizer::Optimizer;
|
|
19
19
|
pub use physical::{
|
|
@@ -150,6 +150,8 @@ pub struct NodeByPropertyRangeScan {
|
|
|
150
150
|
pub lo_inclusive: bool,
|
|
151
151
|
pub hi: Option<ResolvedExpr>,
|
|
152
152
|
pub hi_inclusive: bool,
|
|
153
|
+
/// More bounds on `key`, intersected with `lo`/`hi` per row.
|
|
154
|
+
pub extra_bounds: Vec<ExtraRangeBound>,
|
|
153
155
|
/// Set when the optimizer replaced an `ORDER BY var.key` above this
|
|
154
156
|
/// scan: rows must come out in that order (from the index when it can
|
|
155
157
|
/// supply it, otherwise sorted by the operator itself).
|
|
@@ -223,6 +225,20 @@ pub struct RelByPropertyRangeScan {
|
|
|
223
225
|
pub lo_inclusive: bool,
|
|
224
226
|
pub hi: Option<ResolvedExpr>,
|
|
225
227
|
pub hi_inclusive: bool,
|
|
228
|
+
/// More bounds on `key`, intersected with `lo`/`hi` per row.
|
|
229
|
+
pub extra_bounds: Vec<ExtraRangeBound>,
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/// A range-scan bound the planner cannot order against the scan's `lo` or
|
|
233
|
+
/// `hi` (a parameter, say, where `lo` is a STARTS WITH prefix). The
|
|
234
|
+
/// executor evaluates it per row and seeks from the tighter of the two, so
|
|
235
|
+
/// `x STARTS WITH $p AND x > $after` reads from `max($p, $after)`.
|
|
236
|
+
#[derive(Debug, Clone)]
|
|
237
|
+
pub struct ExtraRangeBound {
|
|
238
|
+
/// `true` for a lower bound (`>`, `>=`), `false` for an upper one.
|
|
239
|
+
pub lower: bool,
|
|
240
|
+
pub value: ResolvedExpr,
|
|
241
|
+
pub inclusive: bool,
|
|
226
242
|
}
|
|
227
243
|
|
|
228
244
|
/// Trigram-backed relationship scan. Mirror of [`NodeByTextScan`].
|
|
@@ -365,6 +365,7 @@ fn lower_logical_op(op: LogicalOp) -> PhysicalOp {
|
|
|
365
365
|
lo_inclusive: scan.lo_inclusive,
|
|
366
366
|
hi: scan.hi,
|
|
367
367
|
hi_inclusive: scan.hi_inclusive,
|
|
368
|
+
extra_bounds: scan.extra_bounds,
|
|
368
369
|
order: scan.order,
|
|
369
370
|
})
|
|
370
371
|
}
|
|
@@ -399,6 +400,7 @@ fn lower_logical_op(op: LogicalOp) -> PhysicalOp {
|
|
|
399
400
|
lo_inclusive: scan.lo_inclusive,
|
|
400
401
|
hi: scan.hi,
|
|
401
402
|
hi_inclusive: scan.hi_inclusive,
|
|
403
|
+
extra_bounds: scan.extra_bounds,
|
|
402
404
|
})
|
|
403
405
|
}
|
|
404
406
|
|
|
@@ -597,7 +599,36 @@ fn collect_index_candidates(
|
|
|
597
599
|
}
|
|
598
600
|
}
|
|
599
601
|
|
|
600
|
-
|
|
602
|
+
let text = text_predicate_for_var(predicate, scan.var);
|
|
603
|
+
// `x STARTS WITH s` is the range `s <= x < string.prefix_end(s)`,
|
|
604
|
+
// which a RANGE index answers when there is no TEXT index. It
|
|
605
|
+
// intersects with the comparisons on the same property, so a keyset
|
|
606
|
+
// page within a prefix seeks from its cursor.
|
|
607
|
+
let prefix = text.as_ref().filter(|candidate| {
|
|
608
|
+
matches!(candidate.predicate, TextPredicate::StartsWith) && !is_tautological_text(candidate)
|
|
609
|
+
});
|
|
610
|
+
let mut range = collect_range_bounds(predicate, scan.var);
|
|
611
|
+
match (&mut range, prefix) {
|
|
612
|
+
(Some(bounds), Some(prefix)) if bounds.key == prefix.key => {
|
|
613
|
+
add_prefix_bounds(bounds, &prefix.query);
|
|
614
|
+
}
|
|
615
|
+
(None, Some(prefix)) => {
|
|
616
|
+
let mut bounds = RangeBounds::new(prefix.key.clone());
|
|
617
|
+
add_prefix_bounds(&mut bounds, &prefix.query);
|
|
618
|
+
range = Some(bounds);
|
|
619
|
+
}
|
|
620
|
+
_ => {}
|
|
621
|
+
}
|
|
622
|
+
// A prefix on another property than the comparisons: its own scan.
|
|
623
|
+
let prefix_range = prefix
|
|
624
|
+
.filter(|prefix| range.as_ref().is_some_and(|b| b.key != prefix.key))
|
|
625
|
+
.map(|prefix| {
|
|
626
|
+
let mut bounds = RangeBounds::new(prefix.key.clone());
|
|
627
|
+
add_prefix_bounds(&mut bounds, &prefix.query);
|
|
628
|
+
bounds
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
for bounds in range.into_iter().chain(prefix_range) {
|
|
601
632
|
if !is_tautological_range(&bounds)
|
|
602
633
|
&& first_simple_label(&scan.labels)
|
|
603
634
|
.is_some_and(|label| stats.has_node_range_index(label, &bounds.key))
|
|
@@ -612,39 +643,14 @@ fn collect_index_candidates(
|
|
|
612
643
|
lo_inclusive: bounds.lo_inclusive,
|
|
613
644
|
hi: bounds.hi,
|
|
614
645
|
hi_inclusive: bounds.hi_inclusive,
|
|
646
|
+
extra_bounds: bounds.extra,
|
|
615
647
|
order: None,
|
|
616
648
|
},
|
|
617
649
|
));
|
|
618
650
|
}
|
|
619
651
|
}
|
|
620
652
|
|
|
621
|
-
if let Some(candidate) =
|
|
622
|
-
// `x STARTS WITH s` is the range `s <= x < string.prefix_end(s)`,
|
|
623
|
-
// which a RANGE index answers when there is no TEXT index.
|
|
624
|
-
if matches!(candidate.predicate, TextPredicate::StartsWith)
|
|
625
|
-
&& !is_tautological_text(&candidate)
|
|
626
|
-
&& first_simple_label(&scan.labels)
|
|
627
|
-
.is_some_and(|label| stats.has_node_range_index(label, &candidate.key))
|
|
628
|
-
{
|
|
629
|
-
out.push(LogicalOp::NodeByPropertyRangeScan(
|
|
630
|
-
NodeByPropertyRangeScan {
|
|
631
|
-
input: scan.input,
|
|
632
|
-
var: scan.var,
|
|
633
|
-
labels: scan.labels.clone(),
|
|
634
|
-
key: candidate.key.clone(),
|
|
635
|
-
lo: Some(candidate.query.clone()),
|
|
636
|
-
lo_inclusive: true,
|
|
637
|
-
hi: Some(ResolvedExpr::Function {
|
|
638
|
-
function: lora_analyzer::FunctionId::builtin("string.prefix_end")
|
|
639
|
-
.expect("string.prefix_end is a builtin"),
|
|
640
|
-
distinct: false,
|
|
641
|
-
args: vec![candidate.query.clone()],
|
|
642
|
-
}),
|
|
643
|
-
hi_inclusive: false,
|
|
644
|
-
order: None,
|
|
645
|
-
},
|
|
646
|
-
));
|
|
647
|
-
}
|
|
653
|
+
if let Some(candidate) = text {
|
|
648
654
|
if !is_tautological_text(&candidate)
|
|
649
655
|
&& first_simple_label(&scan.labels)
|
|
650
656
|
.is_some_and(|label| stats.has_node_text_index(label, &candidate.key))
|
|
@@ -729,6 +735,7 @@ fn collect_rel_index_candidates(
|
|
|
729
735
|
lo_inclusive: bounds.lo_inclusive,
|
|
730
736
|
hi: bounds.hi,
|
|
731
737
|
hi_inclusive: bounds.hi_inclusive,
|
|
738
|
+
extra_bounds: bounds.extra,
|
|
732
739
|
}));
|
|
733
740
|
}
|
|
734
741
|
}
|
|
@@ -977,7 +984,7 @@ fn is_tautological_range(bounds: &RangeBounds) -> bool {
|
|
|
977
984
|
),
|
|
978
985
|
(Some(_), true) => false,
|
|
979
986
|
};
|
|
980
|
-
lo_open && hi_open
|
|
987
|
+
lo_open && hi_open && bounds.extra.is_empty()
|
|
981
988
|
}
|
|
982
989
|
|
|
983
990
|
fn is_tautological_text(candidate: &TextCandidate) -> bool {
|
|
@@ -1075,66 +1082,75 @@ struct RangeBounds {
|
|
|
1075
1082
|
lo_inclusive: bool,
|
|
1076
1083
|
hi: Option<ResolvedExpr>,
|
|
1077
1084
|
hi_inclusive: bool,
|
|
1085
|
+
/// Bounds that could not be ordered against `lo`/`hi` at plan time.
|
|
1086
|
+
extra: Vec<ExtraRangeBound>,
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
impl RangeBounds {
|
|
1090
|
+
fn new(key: String) -> Self {
|
|
1091
|
+
Self {
|
|
1092
|
+
key,
|
|
1093
|
+
lo: None,
|
|
1094
|
+
lo_inclusive: false,
|
|
1095
|
+
hi: None,
|
|
1096
|
+
hi_inclusive: false,
|
|
1097
|
+
extra: Vec::new(),
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
/// Intersect one more bound: keep the tighter of it and the current
|
|
1102
|
+
/// one when both are literals, else keep it for the executor to order.
|
|
1103
|
+
fn add(&mut self, side: RangeSide, value: ResolvedExpr, inclusive: bool) {
|
|
1104
|
+
let (current, current_inclusive, tighter): (_, _, fn(_, _, _, _) -> _) = match side {
|
|
1105
|
+
RangeSide::Lower => (&mut self.lo, &mut self.lo_inclusive, lower_bound_is_tighter),
|
|
1106
|
+
RangeSide::Upper => (&mut self.hi, &mut self.hi_inclusive, upper_bound_is_tighter),
|
|
1107
|
+
};
|
|
1108
|
+
let Some(existing) = current.as_ref() else {
|
|
1109
|
+
*current = Some(value);
|
|
1110
|
+
*current_inclusive = inclusive;
|
|
1111
|
+
return;
|
|
1112
|
+
};
|
|
1113
|
+
if compare_literal_bounds(&value, existing).is_none() {
|
|
1114
|
+
self.extra.push(ExtraRangeBound {
|
|
1115
|
+
lower: matches!(side, RangeSide::Lower),
|
|
1116
|
+
value,
|
|
1117
|
+
inclusive,
|
|
1118
|
+
});
|
|
1119
|
+
} else if tighter(&value, inclusive, existing, *current_inclusive) {
|
|
1120
|
+
*current = Some(value);
|
|
1121
|
+
*current_inclusive = inclusive;
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1078
1124
|
}
|
|
1079
1125
|
|
|
1080
|
-
/// Walk an AND-tree and collect any `var.prop CMP
|
|
1081
|
-
/// Returns `None` if no comparison touches
|
|
1082
|
-
///
|
|
1126
|
+
/// Walk an AND-tree and collect any `var.prop CMP value` bounds on the
|
|
1127
|
+
/// first property compared. Returns `None` if no comparison touches
|
|
1128
|
+
/// `var`; bounds on other properties are left to the filter.
|
|
1083
1129
|
fn collect_range_bounds(predicate: &ResolvedExpr, var: VarId) -> Option<RangeBounds> {
|
|
1084
|
-
let mut
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
lo = Some(value);
|
|
1106
|
-
lo_inclusive = inclusive;
|
|
1107
|
-
}
|
|
1108
|
-
any = true;
|
|
1109
|
-
}
|
|
1110
|
-
RangeSide::Upper => {
|
|
1111
|
-
if key.as_deref().map(|k| k != found_key).unwrap_or(false) {
|
|
1112
|
-
return;
|
|
1113
|
-
}
|
|
1114
|
-
key = Some(found_key.to_string());
|
|
1115
|
-
if hi
|
|
1116
|
-
.as_ref()
|
|
1117
|
-
.map(|current| upper_bound_is_tighter(&value, inclusive, current, hi_inclusive))
|
|
1118
|
-
.unwrap_or(true)
|
|
1119
|
-
{
|
|
1120
|
-
hi = Some(value);
|
|
1121
|
-
hi_inclusive = inclusive;
|
|
1122
|
-
}
|
|
1123
|
-
any = true;
|
|
1124
|
-
}
|
|
1130
|
+
let mut bounds: Option<RangeBounds> = None;
|
|
1131
|
+
walk_and_for_range(predicate, var, &mut |found_key, side, value, inclusive| {
|
|
1132
|
+
let bounds = bounds.get_or_insert_with(|| RangeBounds::new(found_key.to_string()));
|
|
1133
|
+
if bounds.key == found_key {
|
|
1134
|
+
bounds.add(side, value, inclusive);
|
|
1135
|
+
}
|
|
1136
|
+
});
|
|
1137
|
+
bounds
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
/// The range `prefix <= x < string.prefix_end(prefix)` of `x STARTS WITH
|
|
1141
|
+
/// prefix`, added to `bounds`.
|
|
1142
|
+
fn add_prefix_bounds(bounds: &mut RangeBounds, prefix: &ResolvedExpr) {
|
|
1143
|
+
bounds.add(RangeSide::Lower, prefix.clone(), true);
|
|
1144
|
+
bounds.add(
|
|
1145
|
+
RangeSide::Upper,
|
|
1146
|
+
ResolvedExpr::Function {
|
|
1147
|
+
function: lora_analyzer::FunctionId::builtin("string.prefix_end")
|
|
1148
|
+
.expect("string.prefix_end is a builtin"),
|
|
1149
|
+
distinct: false,
|
|
1150
|
+
args: vec![prefix.clone()],
|
|
1125
1151
|
},
|
|
1152
|
+
false,
|
|
1126
1153
|
);
|
|
1127
|
-
|
|
1128
|
-
if !any {
|
|
1129
|
-
return None;
|
|
1130
|
-
}
|
|
1131
|
-
Some(RangeBounds {
|
|
1132
|
-
key: key?,
|
|
1133
|
-
lo,
|
|
1134
|
-
lo_inclusive,
|
|
1135
|
-
hi,
|
|
1136
|
-
hi_inclusive,
|
|
1137
|
-
})
|
|
1138
1154
|
}
|
|
1139
1155
|
|
|
1140
1156
|
#[derive(Clone, Copy)]
|
|
@@ -1703,6 +1719,7 @@ mod tests {
|
|
|
1703
1719
|
lo_inclusive: false,
|
|
1704
1720
|
hi: None,
|
|
1705
1721
|
hi_inclusive: false,
|
|
1722
|
+
extra_bounds: Vec::new(),
|
|
1706
1723
|
order: None,
|
|
1707
1724
|
}),
|
|
1708
1725
|
LogicalOp::NodeByPropertyScan(NodeByPropertyScan {
|
|
@@ -1759,6 +1776,7 @@ mod tests {
|
|
|
1759
1776
|
lo_inclusive: false,
|
|
1760
1777
|
hi: None,
|
|
1761
1778
|
hi_inclusive: false,
|
|
1779
|
+
extra: Vec::new(),
|
|
1762
1780
|
};
|
|
1763
1781
|
assert!(is_tautological_range(&bounds));
|
|
1764
1782
|
}
|
|
@@ -1771,6 +1789,7 @@ mod tests {
|
|
|
1771
1789
|
lo_inclusive: false,
|
|
1772
1790
|
hi: Some(lit_int(i64::MAX)),
|
|
1773
1791
|
hi_inclusive: false,
|
|
1792
|
+
extra: Vec::new(),
|
|
1774
1793
|
};
|
|
1775
1794
|
assert!(is_tautological_range(&bounds));
|
|
1776
1795
|
}
|
|
@@ -1783,6 +1802,7 @@ mod tests {
|
|
|
1783
1802
|
lo_inclusive: false,
|
|
1784
1803
|
hi: Some(lit_int(i64::MAX)),
|
|
1785
1804
|
hi_inclusive: false,
|
|
1805
|
+
extra: Vec::new(),
|
|
1786
1806
|
};
|
|
1787
1807
|
assert!(is_tautological_range(&bounds));
|
|
1788
1808
|
}
|
|
@@ -1795,6 +1815,7 @@ mod tests {
|
|
|
1795
1815
|
lo_inclusive: false,
|
|
1796
1816
|
hi: Some(lit_int(100)),
|
|
1797
1817
|
hi_inclusive: false,
|
|
1818
|
+
extra: Vec::new(),
|
|
1798
1819
|
};
|
|
1799
1820
|
assert!(!is_tautological_range(&bounds));
|
|
1800
1821
|
}
|
|
@@ -130,6 +130,8 @@ pub struct NodeByPropertyRangeScanExec {
|
|
|
130
130
|
pub lo_inclusive: bool,
|
|
131
131
|
pub hi: Option<ResolvedExpr>,
|
|
132
132
|
pub hi_inclusive: bool,
|
|
133
|
+
/// See [`crate::logical::ExtraRangeBound`].
|
|
134
|
+
pub extra_bounds: Vec<crate::logical::ExtraRangeBound>,
|
|
133
135
|
/// Set when the optimizer replaced an `ORDER BY var.key` above this
|
|
134
136
|
/// scan: rows must come out in that order (from the index when it can
|
|
135
137
|
/// supply it, otherwise sorted by the operator itself).
|
|
@@ -168,6 +170,8 @@ pub struct RelByPropertyRangeScanExec {
|
|
|
168
170
|
pub lo_inclusive: bool,
|
|
169
171
|
pub hi: Option<ResolvedExpr>,
|
|
170
172
|
pub hi_inclusive: bool,
|
|
173
|
+
/// See [`crate::logical::ExtraRangeBound`].
|
|
174
|
+
pub extra_bounds: Vec<crate::logical::ExtraRangeBound>,
|
|
171
175
|
}
|
|
172
176
|
|
|
173
177
|
#[derive(Debug, Clone)]
|
|
@@ -195,26 +195,12 @@ fn describe(op: &PhysicalOp) -> PlanDescription {
|
|
|
195
195
|
d.insert("labels".to_string(), label_groups_str(&n.labels));
|
|
196
196
|
}
|
|
197
197
|
d.insert("key".to_string(), n.key.clone());
|
|
198
|
-
|
|
199
|
-
d
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
expr_str(lo)
|
|
205
|
-
),
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
if let Some(hi) = &n.hi {
|
|
209
|
-
d.insert(
|
|
210
|
-
"hi".to_string(),
|
|
211
|
-
format!(
|
|
212
|
-
"{} {}",
|
|
213
|
-
if n.hi_inclusive { "<=" } else { "<" },
|
|
214
|
-
expr_str(hi)
|
|
215
|
-
),
|
|
216
|
-
);
|
|
217
|
-
}
|
|
198
|
+
insert_range_bounds(
|
|
199
|
+
&mut d,
|
|
200
|
+
(&n.lo, n.lo_inclusive),
|
|
201
|
+
(&n.hi, n.hi_inclusive),
|
|
202
|
+
&n.extra_bounds,
|
|
203
|
+
);
|
|
218
204
|
PlanDescription::with_children("NodeByPropertyRangeScan", d, opt_input(n.input))
|
|
219
205
|
}
|
|
220
206
|
PhysicalOp::NodeByPointScan(n) => {
|
|
@@ -282,26 +268,12 @@ fn describe(op: &PhysicalOp) -> PlanDescription {
|
|
|
282
268
|
direction_str(n.direction).to_string(),
|
|
283
269
|
);
|
|
284
270
|
d.insert("key".to_string(), n.key.clone());
|
|
285
|
-
|
|
286
|
-
d
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
expr_str(lo)
|
|
292
|
-
),
|
|
293
|
-
);
|
|
294
|
-
}
|
|
295
|
-
if let Some(hi) = &n.hi {
|
|
296
|
-
d.insert(
|
|
297
|
-
"hi".to_string(),
|
|
298
|
-
format!(
|
|
299
|
-
"{} {}",
|
|
300
|
-
if n.hi_inclusive { "<=" } else { "<" },
|
|
301
|
-
expr_str(hi)
|
|
302
|
-
),
|
|
303
|
-
);
|
|
304
|
-
}
|
|
271
|
+
insert_range_bounds(
|
|
272
|
+
&mut d,
|
|
273
|
+
(&n.lo, n.lo_inclusive),
|
|
274
|
+
(&n.hi, n.hi_inclusive),
|
|
275
|
+
&n.extra_bounds,
|
|
276
|
+
);
|
|
305
277
|
PlanDescription::with_children("RelByPropertyRangeScan", d, opt_input(n.input))
|
|
306
278
|
}
|
|
307
279
|
PhysicalOp::RelByTextScan(n) => {
|
|
@@ -641,3 +613,37 @@ fn expr_str(e: &ResolvedExpr) -> String {
|
|
|
641
613
|
fn pattern_summary(part_count: usize) -> String {
|
|
642
614
|
format!("{} pattern part(s)", part_count)
|
|
643
615
|
}
|
|
616
|
+
|
|
617
|
+
/// The `lo` and `hi` details of a range scan: each side's bounds joined
|
|
618
|
+
/// with `AND`, the scan seeking from the tightest at run time.
|
|
619
|
+
fn insert_range_bounds(
|
|
620
|
+
d: &mut BTreeMap<String, String>,
|
|
621
|
+
lo: (&Option<ResolvedExpr>, bool),
|
|
622
|
+
hi: (&Option<ResolvedExpr>, bool),
|
|
623
|
+
extra: &[crate::logical::ExtraRangeBound],
|
|
624
|
+
) {
|
|
625
|
+
for (name, lower, (first, first_inclusive)) in [("lo", true, lo), ("hi", false, hi)] {
|
|
626
|
+
let parts: Vec<String> = first
|
|
627
|
+
.iter()
|
|
628
|
+
.map(|value| (value, first_inclusive))
|
|
629
|
+
.chain(
|
|
630
|
+
extra
|
|
631
|
+
.iter()
|
|
632
|
+
.filter(|b| b.lower == lower)
|
|
633
|
+
.map(|b| (&b.value, b.inclusive)),
|
|
634
|
+
)
|
|
635
|
+
.map(|(value, inclusive)| {
|
|
636
|
+
let op = match (lower, inclusive) {
|
|
637
|
+
(true, true) => ">=",
|
|
638
|
+
(true, false) => ">",
|
|
639
|
+
(false, true) => "<=",
|
|
640
|
+
(false, false) => "<",
|
|
641
|
+
};
|
|
642
|
+
format!("{op} {}", expr_str(value))
|
|
643
|
+
})
|
|
644
|
+
.collect();
|
|
645
|
+
if !parts.is_empty() {
|
|
646
|
+
d.insert(name.to_string(), parts.join(" AND "));
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|