lora-python 0.21.0__tar.gz → 0.22.0__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.21.0 → lora_python-0.22.0}/Cargo.lock +19 -19
- {lora_python-0.21.0 → lora_python-0.22.0}/Cargo.toml +13 -13
- {lora_python-0.21.0 → lora_python-0.22.0}/PKG-INFO +1 -1
- lora_python-0.22.0/crates/lora-database/tests/timeouts.rs +211 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/cancel.rs +55 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/errors.rs +13 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/expr.rs +50 -9
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/mod.rs +1 -1
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/aggregation.rs +3 -5
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/helpers.rs +75 -18
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/immutable.rs +14 -9
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/aggregate.rs +8 -7
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/filter.rs +1 -1
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/projection.rs +1 -1
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/source.rs +8 -1
- {lora_python-0.21.0 → lora_python-0.22.0}/pyproject.toml +1 -1
- lora_python-0.21.0/crates/lora-database/tests/timeouts.rs +0 -88
- {lora_python-0.21.0 → lora_python-0.22.0}/LICENSE +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/README.md +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/.gitignore +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/LICENSE +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/README.md +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/build.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/examples/async_demo.py +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/examples/basic.py +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/errors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/from_python.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/gil.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/stream.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/src/to_python.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/tests/test_async.py +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/bindings/lora-python/tests/test_sync.py +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/errors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/resolved.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/scope.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/src/symbols.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-analyzer/tests/error_messages.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-ast/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-ast/src/ast.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-ast/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-builtins-meta/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-builtins-meta/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/logical.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/optimizer.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/pattern.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/physical.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/plan_tree.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-compiler/src/planner.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/README.md +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/advanced.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/concurrency_guard.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/concurrent.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/engine.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/fixtures.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/index_acceleration.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/memory.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/memory_baseline.json +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/perf_smoke.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/query_implementations.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/realistic.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/scale.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/temporal_spatial.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/benches/wal.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/bulk_probe.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/carried_probe.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/heap_probe.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/keyset_probe.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/optional_probe.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/perf_probe.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/examples/pushdown_probe.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/changes/build.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/changes/history.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/changes/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/builder.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/changes.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/compile.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/execute.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/explain.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/graph_api.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/occ.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/procedures.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/profile.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/pull_mode.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/replay.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/row_projection.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/schema.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/show_pipeline.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/stream.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/database/write_guard.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/durable_io.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/error.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/explain.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/io.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/live_store.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/named.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/plan_cache.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/snapshot/json.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/snapshot/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/snapshot/store.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/stream.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/transaction.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/admin.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/format.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/lock.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/platform.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/worker.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/archive.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/src/wal/write_scope.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/advanced_queries.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/aggregation.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/backend_stub.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/binary.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/borrowed_variable_reads.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/carried_value_sharing.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/change_feed.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/comparison_ordering.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/constraints.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/create.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/cypher_compat.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/docs_examples.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/early_limit.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/empty_ranges.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/error_messages.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/errors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/explain_estimates.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/explain_profile.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/expressions.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/foreach.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/fulltext_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/functions_extended.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/index_acceleration.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/invariants.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/limit_skip_counts.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/managed_snapshots.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/match.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/merge.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/merge_bound_end.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/order_by_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/ordering.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/parameters.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/parser.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/paths.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/planner_pushdown.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/procedure_yield.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/projection.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/scale.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/schema.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/seeds.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/snapshot.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/spatial.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/starts_with_range_seek.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/string_number_addition.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_constructors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_map_components.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_range_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_strings.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/test_helpers.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/transactions.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/types_advanced.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/union.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/unknown_names.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/update.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/vector_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/vectors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/wal.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/where_clause.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/with.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/with_predicates.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/write_results.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-database/tests/write_scaling.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/binops.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/errors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/functions.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/point.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/regex.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/eval/vector.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/mutable.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/optional.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/executor/sort.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/profile.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/columns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/context.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/expand.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/hydration.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/mutable.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/optional.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/path.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/scan.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/shape.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/sort.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/traits.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/pull/union.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/src/value.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-executor/tests/error_messages.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/csv.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/format.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/json_array.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/jsonl.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/mapping.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-io/src/value_json.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/cypher.pest +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/errors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/clauses.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/expressions.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/literals.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/patterns.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/query.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/schema.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/src/parser/util.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-parser/tests/error_messages.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/body.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/codec.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/columnar.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/envelope.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/errors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/format.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/options.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/transform.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/src/view.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-snapshot/tests/error_messages.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/codec.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/intern.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/lock_table.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/chunked_vec.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/cow.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/graph.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/hnsw.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/id_set.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/impls.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/index_catalog.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/mem_report.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/point_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/property_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/snapshot.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/stats.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/text_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/memory/vector_index.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/mutation.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/snapshot.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/traits.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/binary/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/binary/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/binary/traits.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/binary/types.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/graph.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/property_map.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/property_value.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/distance.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/point.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/srid.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/spatial/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/date.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/duration.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/format.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/time.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/temporal/zone.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/build.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/similarity.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/src/types/vector/types.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-store/tests/error_messages.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/Cargo.toml +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/decode.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/encode.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/format.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/codec/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/config.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/dir.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/errors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/history.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/io.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/lib.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/lock.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/lsn.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/record.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/errors.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/mirror.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/recorder.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/recorder/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/replay.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/segment.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/testing.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/wal/mod.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/wal/tests.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/src/wal/wal.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/crates/lora-wal/tests/error_messages.rs +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/python/lora_python/__init__.py +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/python/lora_python/_async.py +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/python/lora_python/_native.pyi +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/python/lora_python/py.typed +0 -0
- {lora_python-0.21.0 → lora_python-0.22.0}/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.
|
|
857
|
+
version = "0.22.0"
|
|
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.
|
|
868
|
+
version = "0.22.0"
|
|
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.
|
|
875
|
+
version = "0.22.0"
|
|
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.
|
|
883
|
+
version = "0.22.0"
|
|
884
884
|
|
|
885
885
|
[[package]]
|
|
886
886
|
name = "lora-compiler"
|
|
887
|
-
version = "0.
|
|
887
|
+
version = "0.22.0"
|
|
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.
|
|
896
|
+
version = "0.22.0"
|
|
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.
|
|
921
|
+
version = "0.22.0"
|
|
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.
|
|
944
|
+
version = "0.22.0"
|
|
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.
|
|
956
|
+
version = "0.22.0"
|
|
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.
|
|
967
|
+
version = "0.22.0"
|
|
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.
|
|
982
|
+
version = "0.22.0"
|
|
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.
|
|
993
|
+
version = "0.22.0"
|
|
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.
|
|
1006
|
+
version = "0.22.0"
|
|
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.
|
|
1020
|
+
version = "0.22.0"
|
|
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.
|
|
1035
|
+
version = "0.22.0"
|
|
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.
|
|
1050
|
+
version = "0.22.0"
|
|
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.
|
|
1065
|
+
version = "0.22.0"
|
|
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.
|
|
1075
|
+
version = "0.22.0"
|
|
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.
|
|
1091
|
+
version = "0.22.0"
|
|
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.
|
|
7
|
+
version = "0.22.0"
|
|
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.
|
|
19
|
-
lora-parser = { path = "crates/lora-parser", version = "=0.
|
|
20
|
-
lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.
|
|
21
|
-
lora-analyzer = { path = "crates/lora-analyzer", version = "=0.
|
|
22
|
-
lora-compiler = { path = "crates/lora-compiler", version = "=0.
|
|
23
|
-
lora-store = { path = "crates/lora-store", version = "=0.
|
|
24
|
-
lora-snapshot = { path = "crates/lora-snapshot", version = "=0.
|
|
25
|
-
lora-io = { path = "crates/lora-io", version = "=0.
|
|
26
|
-
lora-wal = { path = "crates/lora-wal", version = "=0.
|
|
27
|
-
lora-executor = { path = "crates/lora-executor", version = "=0.
|
|
28
|
-
lora-database = { path = "crates/lora-database", version = "=0.
|
|
29
|
-
lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.
|
|
18
|
+
lora-ast = { path = "crates/lora-ast", version = "=0.22.0" }
|
|
19
|
+
lora-parser = { path = "crates/lora-parser", version = "=0.22.0" }
|
|
20
|
+
lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.22.0" }
|
|
21
|
+
lora-analyzer = { path = "crates/lora-analyzer", version = "=0.22.0" }
|
|
22
|
+
lora-compiler = { path = "crates/lora-compiler", version = "=0.22.0" }
|
|
23
|
+
lora-store = { path = "crates/lora-store", version = "=0.22.0" }
|
|
24
|
+
lora-snapshot = { path = "crates/lora-snapshot", version = "=0.22.0", default-features = false }
|
|
25
|
+
lora-io = { path = "crates/lora-io", version = "=0.22.0" }
|
|
26
|
+
lora-wal = { path = "crates/lora-wal", version = "=0.22.0" }
|
|
27
|
+
lora-executor = { path = "crates/lora-executor", version = "=0.22.0", default-features = false }
|
|
28
|
+
lora-database = { path = "crates/lora-database", version = "=0.22.0" }
|
|
29
|
+
lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.22.0" }
|
|
30
30
|
|
|
31
31
|
# External crates.
|
|
32
32
|
anyhow = "1"
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
//! Query deadlines and cancellation reach every execution path.
|
|
2
|
+
//!
|
|
3
|
+
//! Regression coverage for two gaps: writes whose input runs on the pull
|
|
4
|
+
//! pipeline never checked their deadline, and a bounded write that timed
|
|
5
|
+
//! out on the in-place fast path could leave a partial write behind.
|
|
6
|
+
|
|
7
|
+
mod test_helpers;
|
|
8
|
+
|
|
9
|
+
use std::collections::BTreeMap;
|
|
10
|
+
use std::time::{Duration, Instant};
|
|
11
|
+
|
|
12
|
+
use lora_database::{CancellableDeadline, LoraErrorCode};
|
|
13
|
+
use test_helpers::TestDb;
|
|
14
|
+
|
|
15
|
+
const N: usize = 20_000;
|
|
16
|
+
|
|
17
|
+
fn seeded() -> TestDb {
|
|
18
|
+
let db = TestDb::new();
|
|
19
|
+
db.run(&format!("UNWIND range(1, {N}) AS i CREATE (:A {{i: i}})"));
|
|
20
|
+
db.run(&format!("UNWIND range(1, {N}) AS i CREATE (:B {{i: i}})"));
|
|
21
|
+
db
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
fn timed_out(db: &TestDb, query: &str, timeout: Duration) -> Duration {
|
|
25
|
+
let start = Instant::now();
|
|
26
|
+
let err = db
|
|
27
|
+
.service
|
|
28
|
+
.execute_with_params_timeout(query, None, BTreeMap::new(), timeout)
|
|
29
|
+
.expect_err("query should time out");
|
|
30
|
+
assert_eq!(err.code(), LoraErrorCode::Timeout, "{err}");
|
|
31
|
+
start.elapsed()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#[test]
|
|
35
|
+
fn streaming_write_honours_its_deadline_and_leaves_nothing() {
|
|
36
|
+
let db = seeded();
|
|
37
|
+
// CREATE over a 4e8-row cartesian product runs on the pull pipeline.
|
|
38
|
+
let took = timed_out(
|
|
39
|
+
&db,
|
|
40
|
+
"MATCH (a:A), (b:B) CREATE (:Pair)",
|
|
41
|
+
Duration::from_millis(50),
|
|
42
|
+
);
|
|
43
|
+
assert!(took < Duration::from_secs(2), "took {took:?}");
|
|
44
|
+
db.assert_count("MATCH (p:Pair) RETURN p", 0);
|
|
45
|
+
// The writer lock was released.
|
|
46
|
+
db.run("CREATE (:After)");
|
|
47
|
+
db.assert_count("MATCH (x:After) RETURN x", 1);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#[test]
|
|
51
|
+
fn filter_that_never_yields_still_times_out() {
|
|
52
|
+
let db = seeded();
|
|
53
|
+
// The condition reads both variables, so it cannot be pushed down to
|
|
54
|
+
// either scan (a lone `a.i = -1` now becomes an empty index seek) and
|
|
55
|
+
// the filter really does reject all 4e8 rows of the product.
|
|
56
|
+
let took = timed_out(
|
|
57
|
+
&db,
|
|
58
|
+
"MATCH (a:A), (b:B) WHERE a.i + b.i = -1 SET a.hit = true",
|
|
59
|
+
Duration::from_millis(50),
|
|
60
|
+
);
|
|
61
|
+
assert!(took < Duration::from_secs(2), "took {took:?}");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
#[test]
|
|
65
|
+
fn cancellation_stops_a_running_query() {
|
|
66
|
+
let db = std::sync::Arc::new(seeded());
|
|
67
|
+
let mut handle = CancellableDeadline::new(None);
|
|
68
|
+
let deadline = handle.deadline();
|
|
69
|
+
let shared = db.clone();
|
|
70
|
+
let worker = std::thread::spawn(move || {
|
|
71
|
+
let service = &shared.service;
|
|
72
|
+
service.execute_with_params_deadline(
|
|
73
|
+
"MATCH (a:A), (b:B) RETURN count(*) AS c",
|
|
74
|
+
None,
|
|
75
|
+
BTreeMap::new(),
|
|
76
|
+
deadline,
|
|
77
|
+
)
|
|
78
|
+
});
|
|
79
|
+
std::thread::sleep(Duration::from_millis(50));
|
|
80
|
+
let start = Instant::now();
|
|
81
|
+
handle.cancel();
|
|
82
|
+
let err = worker
|
|
83
|
+
.join()
|
|
84
|
+
.unwrap()
|
|
85
|
+
.expect_err("cancelled query must fail");
|
|
86
|
+
assert_eq!(err.code(), LoraErrorCode::Timeout);
|
|
87
|
+
assert!(start.elapsed() < Duration::from_secs(2));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Deadlines inside expression evaluation
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
//
|
|
94
|
+
// `@loradb/lora-graphql` compiles relationship-filter quantifiers to
|
|
95
|
+
// `size([(a)-[:R]->(b) WHERE <pred> | 1]) > 0`, nested for nested filters.
|
|
96
|
+
// Those comprehensions run inside one expression evaluation, below the
|
|
97
|
+
// operator boundaries the pipeline checks, so a three-level nested filter
|
|
98
|
+
// once ran 15 s past a 1 s deadline and returned rows.
|
|
99
|
+
|
|
100
|
+
/// ~5k festivals, ~2k users, ~23k user->festival and ~4k user->user
|
|
101
|
+
/// FOLLOWS edges, spread deterministically.
|
|
102
|
+
fn follows_graph() -> TestDb {
|
|
103
|
+
let db = TestDb::new();
|
|
104
|
+
db.run("CREATE INDEX FOR (n:Festival) ON (n.i)");
|
|
105
|
+
db.run("CREATE INDEX FOR (n:User) ON (n.i)");
|
|
106
|
+
db.run("UNWIND range(0, 4999) AS i CREATE (:Festival {i: i, key: 'f' + toString(i)})");
|
|
107
|
+
db.run(
|
|
108
|
+
"UNWIND range(0, 1999) AS i \
|
|
109
|
+
CREATE (:User {i: i, key: 'u' + toString(i), name: 'user ' + toString(i)})",
|
|
110
|
+
);
|
|
111
|
+
db.run(
|
|
112
|
+
"UNWIND range(0, 22999) AS i \
|
|
113
|
+
MATCH (u:User {i: (i * 7919) % 2000}), (f:Festival {i: (i * 104729) % 5000}) \
|
|
114
|
+
CREATE (u)-[:FOLLOWS]->(f)",
|
|
115
|
+
);
|
|
116
|
+
db.run(
|
|
117
|
+
"UNWIND range(0, 3999) AS i \
|
|
118
|
+
MATCH (a:User {i: (i * 7919) % 2000}), (b:User {i: (i * 6007 + 1) % 2000}) \
|
|
119
|
+
CREATE (a)-[:FOLLOWS]->(b)",
|
|
120
|
+
);
|
|
121
|
+
db
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// No user name contains 'zz', so every level of the nested filter runs
|
|
125
|
+
/// to completion: about a second of work in a release build.
|
|
126
|
+
const NESTED_FILTER: &str = "MATCH (f:Festival) \
|
|
127
|
+
WHERE size([(f)<-[:FOLLOWS]-(u:User) \
|
|
128
|
+
WHERE size([(u)-[:FOLLOWS]->(g:Festival) \
|
|
129
|
+
WHERE size([(g)<-[:FOLLOWS]-(w:User) WHERE w.name CONTAINS 'zz' | 1]) > 0 \
|
|
130
|
+
| 1]) > 0 \
|
|
131
|
+
| 1]) > 0 \
|
|
132
|
+
RETURN f.key";
|
|
133
|
+
|
|
134
|
+
#[test]
|
|
135
|
+
fn nested_pattern_comprehension_honours_its_deadline() {
|
|
136
|
+
let db = follows_graph();
|
|
137
|
+
let timeout = Duration::from_millis(150);
|
|
138
|
+
// Without a LIMIT the read runs on the buffered executor, whose filter
|
|
139
|
+
// loop never checked the deadline; with one it streams. Both must stop.
|
|
140
|
+
for query in [
|
|
141
|
+
NESTED_FILTER.to_string(),
|
|
142
|
+
format!("{NESTED_FILTER} ORDER BY f.key LIMIT 10"),
|
|
143
|
+
format!("{NESTED_FILTER} LIMIT 1"),
|
|
144
|
+
] {
|
|
145
|
+
let took = timed_out(&db, &query, timeout);
|
|
146
|
+
assert!(
|
|
147
|
+
took < timeout + Duration::from_millis(150),
|
|
148
|
+
"{query}: took {took:?} for a {timeout:?} deadline"
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
#[test]
|
|
154
|
+
fn nested_pattern_comprehension_stops_on_cancel() {
|
|
155
|
+
let db = std::sync::Arc::new(follows_graph());
|
|
156
|
+
let mut handle = CancellableDeadline::new(None);
|
|
157
|
+
let deadline = handle.deadline();
|
|
158
|
+
let shared = db.clone();
|
|
159
|
+
let worker = std::thread::spawn(move || {
|
|
160
|
+
shared
|
|
161
|
+
.service
|
|
162
|
+
.execute_with_params_deadline(NESTED_FILTER, None, BTreeMap::new(), deadline)
|
|
163
|
+
});
|
|
164
|
+
std::thread::sleep(Duration::from_millis(50));
|
|
165
|
+
let start = Instant::now();
|
|
166
|
+
handle.cancel();
|
|
167
|
+
let err = worker
|
|
168
|
+
.join()
|
|
169
|
+
.unwrap()
|
|
170
|
+
.expect_err("cancelled query must fail");
|
|
171
|
+
assert_eq!(err.code(), LoraErrorCode::Timeout);
|
|
172
|
+
assert!(
|
|
173
|
+
start.elapsed() < Duration::from_millis(150),
|
|
174
|
+
"stopped {:?} after cancel",
|
|
175
|
+
start.elapsed()
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
#[test]
|
|
180
|
+
fn list_comprehension_reduce_and_quantifiers_honour_their_deadline() {
|
|
181
|
+
let db = TestDb::new();
|
|
182
|
+
let timeout = Duration::from_millis(200);
|
|
183
|
+
for query in [
|
|
184
|
+
// One row, one expression: no operator boundary inside the work.
|
|
185
|
+
"RETURN size([x IN range(1, 3000) WHERE size([y IN range(1, 3000) WHERE x * y = -1]) > 0]) AS n",
|
|
186
|
+
"RETURN reduce(acc = 0, x IN range(1, 3000) | acc + size([y IN range(1, 3000) WHERE x = y])) AS n",
|
|
187
|
+
"RETURN any(x IN range(1, 3000) WHERE any(y IN range(1, 3000) WHERE x * y = -1)) AS n",
|
|
188
|
+
"RETURN all(x IN range(1, 3000) WHERE none(y IN range(1, 3000) WHERE x * y = -1)) AS n",
|
|
189
|
+
] {
|
|
190
|
+
let took = timed_out(&db, query, timeout);
|
|
191
|
+
assert!(
|
|
192
|
+
took < timeout + Duration::from_millis(150),
|
|
193
|
+
"{query}: took {took:?} for a {timeout:?} deadline"
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
#[test]
|
|
199
|
+
fn cartesian_match_stops_close_to_its_deadline() {
|
|
200
|
+
let db = seeded();
|
|
201
|
+
let timeout = Duration::from_millis(300);
|
|
202
|
+
let took = timed_out(
|
|
203
|
+
&db,
|
|
204
|
+
"MATCH (a:A), (b:B) WHERE a.i + b.i = -1 RETURN a.i",
|
|
205
|
+
timeout,
|
|
206
|
+
);
|
|
207
|
+
assert!(
|
|
208
|
+
took < timeout + Duration::from_millis(150),
|
|
209
|
+
"took {took:?} for a {timeout:?} deadline"
|
|
210
|
+
);
|
|
211
|
+
}
|
|
@@ -108,8 +108,20 @@ pub(crate) fn is_cancelled(deadline: Instant) -> bool {
|
|
|
108
108
|
|
|
109
109
|
thread_local! {
|
|
110
110
|
static ACTIVE: std::cell::Cell<Option<Instant>> = const { std::cell::Cell::new(None) };
|
|
111
|
+
/// Iterations of expression-level loops since the last clock read.
|
|
112
|
+
static EVAL_TICK: std::cell::Cell<u32> = const { std::cell::Cell::new(0) };
|
|
113
|
+
/// Set once an expression-level check saw the active deadline pass
|
|
114
|
+
/// (or its query cancelled). Sticky for the rest of the query on this
|
|
115
|
+
/// thread so every enclosing loop unwinds at its next iteration.
|
|
116
|
+
static EVAL_TRIPPED: std::cell::Cell<bool> = const { std::cell::Cell::new(false) };
|
|
111
117
|
}
|
|
112
118
|
|
|
119
|
+
/// Expression-level loop iterations between two clock reads. One
|
|
120
|
+
/// iteration is at least a row clone plus a storage lookup, so 256 of them
|
|
121
|
+
/// cost tens of microseconds: the check stays far below 1% of the work
|
|
122
|
+
/// while a deadline is still noticed within a millisecond or so.
|
|
123
|
+
const EVAL_CHECK_STRIDE: u32 = 256;
|
|
124
|
+
|
|
113
125
|
/// Makes a query's deadline visible to everything that runs on this
|
|
114
126
|
/// thread while the query executes, including pull pipelines that
|
|
115
127
|
/// operators build lazily mid-query (`OPTIONAL MATCH`, `CALL {}`) and
|
|
@@ -123,6 +135,10 @@ pub(crate) struct DeadlineScope {
|
|
|
123
135
|
impl DeadlineScope {
|
|
124
136
|
pub(crate) fn enter(deadline: Option<Instant>) -> Self {
|
|
125
137
|
let prev = ACTIVE.with(|a| a.get());
|
|
138
|
+
if prev.is_none() {
|
|
139
|
+
// A new query on this thread: forget a trip left by the last.
|
|
140
|
+
EVAL_TRIPPED.with(|t| t.set(false));
|
|
141
|
+
}
|
|
126
142
|
ACTIVE.with(|a| a.set(deadline.or(prev)));
|
|
127
143
|
Self { prev }
|
|
128
144
|
}
|
|
@@ -132,7 +148,46 @@ impl Drop for DeadlineScope {
|
|
|
132
148
|
fn drop(&mut self) {
|
|
133
149
|
let prev = self.prev;
|
|
134
150
|
ACTIVE.with(|a| a.set(prev));
|
|
151
|
+
if prev.is_none() {
|
|
152
|
+
EVAL_TRIPPED.with(|t| t.set(false));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// Cheap per-iteration check for loops that run inside one expression
|
|
158
|
+
/// evaluation (pattern and list comprehensions, `reduce`, list
|
|
159
|
+
/// quantifiers, pattern expansion). Those loops sit below every operator
|
|
160
|
+
/// boundary the pipeline checks, so without this a single `WHERE` could
|
|
161
|
+
/// run arbitrarily far past the query's deadline. Reads the clock every
|
|
162
|
+
/// [`EVAL_CHECK_STRIDE`] calls; once it fires it stays fired for the rest
|
|
163
|
+
/// of the query, and `eval_expr_result` then reports the timeout.
|
|
164
|
+
#[inline]
|
|
165
|
+
pub(crate) fn eval_deadline_hit() -> bool {
|
|
166
|
+
if EVAL_TRIPPED.with(|t| t.get()) {
|
|
167
|
+
return true;
|
|
135
168
|
}
|
|
169
|
+
let tick = EVAL_TICK.with(|t| {
|
|
170
|
+
let n = t.get().wrapping_add(1);
|
|
171
|
+
t.set(n);
|
|
172
|
+
n
|
|
173
|
+
});
|
|
174
|
+
if !tick.is_multiple_of(EVAL_CHECK_STRIDE) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
match active_deadline() {
|
|
178
|
+
Some(deadline) if deadline_reached(deadline) => {
|
|
179
|
+
EVAL_TRIPPED.with(|t| t.set(true));
|
|
180
|
+
true
|
|
181
|
+
}
|
|
182
|
+
_ => false,
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/// Whether an expression on this thread stopped early because the active
|
|
187
|
+
/// query's deadline passed: its value is incomplete and must not be used.
|
|
188
|
+
#[inline]
|
|
189
|
+
pub(crate) fn eval_tripped() -> bool {
|
|
190
|
+
EVAL_TRIPPED.with(|t| t.get())
|
|
136
191
|
}
|
|
137
192
|
|
|
138
193
|
/// The deadline of the query currently executing on this thread, if any.
|
|
@@ -106,6 +106,19 @@ pub enum ExecutorError {
|
|
|
106
106
|
|
|
107
107
|
pub type ExecResult<T> = Result<T, ExecutorError>;
|
|
108
108
|
|
|
109
|
+
impl ExecutorError {
|
|
110
|
+
/// The error for a failed expression evaluation: the query timeout
|
|
111
|
+
/// when the expression stopped on the deadline, a runtime error
|
|
112
|
+
/// carrying its message otherwise.
|
|
113
|
+
pub(crate) fn from_eval(message: String) -> Self {
|
|
114
|
+
if message == crate::eval::DEADLINE_EXCEEDED {
|
|
115
|
+
ExecutorError::QueryTimeout
|
|
116
|
+
} else {
|
|
117
|
+
ExecutorError::RuntimeError(message)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
109
122
|
pub fn value_kind(value: &LoraValue) -> String {
|
|
110
123
|
match value {
|
|
111
124
|
LoraValue::Null => "null".into(),
|
|
@@ -25,6 +25,13 @@ use super::binops::{eval_binary, eval_in, eval_unary, value_eq};
|
|
|
25
25
|
use super::errors::{clear_eval_error, take_eval_error};
|
|
26
26
|
use super::functions::eval_function;
|
|
27
27
|
|
|
28
|
+
/// The message [`eval_expr_result`] fails with when an expression stopped
|
|
29
|
+
/// because the query's deadline passed or the query was cancelled.
|
|
30
|
+
/// [`crate::ExecutorError`] maps it back to `QueryTimeout`.
|
|
31
|
+
pub const DEADLINE_EXCEEDED: &str = "query deadline exceeded";
|
|
32
|
+
|
|
33
|
+
use crate::cancel::eval_deadline_hit;
|
|
34
|
+
|
|
28
35
|
pub struct EvalContext<'a, S: GraphStorage> {
|
|
29
36
|
pub storage: &'a S,
|
|
30
37
|
pub params: &'a BTreeMap<String, LoraValue>,
|
|
@@ -125,6 +132,9 @@ pub fn eval_expr<S: GraphStorage>(
|
|
|
125
132
|
let mut inner_row = row.clone();
|
|
126
133
|
let mut count = 0usize;
|
|
127
134
|
for item in items {
|
|
135
|
+
if eval_deadline_hit() {
|
|
136
|
+
return LoraValue::Null;
|
|
137
|
+
}
|
|
128
138
|
inner_row.insert_inline(*variable, item);
|
|
129
139
|
if eval_expr(predicate, &inner_row, ctx).is_truthy() {
|
|
130
140
|
count += 1;
|
|
@@ -154,6 +164,9 @@ pub fn eval_expr<S: GraphStorage>(
|
|
|
154
164
|
let mut result = Vec::with_capacity(items.len());
|
|
155
165
|
let mut inner_row = row.clone();
|
|
156
166
|
for item in items {
|
|
167
|
+
if eval_deadline_hit() {
|
|
168
|
+
return LoraValue::Null;
|
|
169
|
+
}
|
|
157
170
|
// When no map_expr, we need the item after filter —
|
|
158
171
|
// stash it in the row binding and read it back if kept.
|
|
159
172
|
inner_row.insert_inline(*variable, item);
|
|
@@ -194,6 +207,9 @@ pub fn eval_expr<S: GraphStorage>(
|
|
|
194
207
|
let mut inner_row = row.clone();
|
|
195
208
|
let mut acc = init_val;
|
|
196
209
|
for item in items {
|
|
210
|
+
if eval_deadline_hit() {
|
|
211
|
+
return LoraValue::Null;
|
|
212
|
+
}
|
|
197
213
|
inner_row.insert_inline(*accumulator, acc);
|
|
198
214
|
inner_row.insert_inline(*variable, item);
|
|
199
215
|
acc = eval_expr(expr, &inner_row, ctx);
|
|
@@ -409,6 +425,9 @@ fn eval_exists_subquery<S: GraphStorage>(
|
|
|
409
425
|
let is_last_part = part_idx + 1 == pattern.parts.len();
|
|
410
426
|
let mut next_rows = Vec::new();
|
|
411
427
|
for current_row in &candidate_rows {
|
|
428
|
+
if eval_deadline_hit() {
|
|
429
|
+
return LoraValue::Null;
|
|
430
|
+
}
|
|
412
431
|
match &part.element {
|
|
413
432
|
ResolvedPatternElement::Node {
|
|
414
433
|
var,
|
|
@@ -470,6 +489,9 @@ fn eval_exists_subquery<S: GraphStorage>(
|
|
|
470
489
|
step.rel.direction,
|
|
471
490
|
&step.rel.types,
|
|
472
491
|
|rel_id, dst_id| {
|
|
492
|
+
if eval_deadline_hit() {
|
|
493
|
+
return Err(());
|
|
494
|
+
}
|
|
473
495
|
if let Some(bound) = dst_bound {
|
|
474
496
|
if dst_id != bound {
|
|
475
497
|
return Ok::<(), ()>(());
|
|
@@ -544,7 +566,7 @@ fn exists_candidate_matches<S: GraphStorage>(
|
|
|
544
566
|
ctx: &EvalContext<'_, S>,
|
|
545
567
|
) -> bool {
|
|
546
568
|
where_
|
|
547
|
-
.map(|where_expr| eval_expr(where_expr, row, ctx).is_truthy())
|
|
569
|
+
.map(|where_expr| !eval_deadline_hit() && eval_expr(where_expr, row, ctx).is_truthy())
|
|
548
570
|
.unwrap_or(true)
|
|
549
571
|
}
|
|
550
572
|
|
|
@@ -565,6 +587,9 @@ fn eval_pattern_comprehension<S: GraphStorage>(
|
|
|
565
587
|
for part in &pattern.parts {
|
|
566
588
|
let mut next_rows = Vec::new();
|
|
567
589
|
for current_row in &candidate_rows {
|
|
590
|
+
if eval_deadline_hit() {
|
|
591
|
+
return LoraValue::Null;
|
|
592
|
+
}
|
|
568
593
|
match &part.element {
|
|
569
594
|
lora_analyzer::ResolvedPatternElement::Node {
|
|
570
595
|
var,
|
|
@@ -617,6 +642,9 @@ fn eval_pattern_comprehension<S: GraphStorage>(
|
|
|
617
642
|
step.rel.direction,
|
|
618
643
|
&step.rel.types,
|
|
619
644
|
|rel_id, dst_id| {
|
|
645
|
+
if eval_deadline_hit() {
|
|
646
|
+
return Err(());
|
|
647
|
+
}
|
|
620
648
|
if dst_bound.is_some_and(|bound| bound != dst_id)
|
|
621
649
|
|| rel_bound.is_some_and(|bound| bound != rel_id)
|
|
622
650
|
{
|
|
@@ -671,16 +699,22 @@ fn eval_pattern_comprehension<S: GraphStorage>(
|
|
|
671
699
|
}
|
|
672
700
|
|
|
673
701
|
if let Some(where_expr) = where_ {
|
|
674
|
-
candidate_rows
|
|
702
|
+
candidate_rows
|
|
703
|
+
.retain(|r| !eval_deadline_hit() && eval_expr(where_expr, r, ctx).is_truthy());
|
|
704
|
+
}
|
|
705
|
+
if crate::cancel::eval_tripped() {
|
|
706
|
+
return LoraValue::Null;
|
|
675
707
|
}
|
|
676
708
|
|
|
677
709
|
// Map each matched row through the map expression
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
710
|
+
let mut out = Vec::with_capacity(candidate_rows.len());
|
|
711
|
+
for r in &candidate_rows {
|
|
712
|
+
if eval_deadline_hit() {
|
|
713
|
+
return LoraValue::Null;
|
|
714
|
+
}
|
|
715
|
+
out.push(eval_expr(map_expr, r, ctx));
|
|
716
|
+
}
|
|
717
|
+
LoraValue::List(out)
|
|
684
718
|
}
|
|
685
719
|
|
|
686
720
|
/// A copy of `row` holding only `reads`, the variables a pattern subquery
|
|
@@ -754,6 +788,9 @@ fn match_node_pattern<S: GraphStorage>(
|
|
|
754
788
|
|
|
755
789
|
let mut out = Vec::new();
|
|
756
790
|
for id in candidate_ids {
|
|
791
|
+
if eval_deadline_hit() {
|
|
792
|
+
break;
|
|
793
|
+
}
|
|
757
794
|
let matched = ctx
|
|
758
795
|
.storage
|
|
759
796
|
.with_node(id, |n| {
|
|
@@ -833,7 +870,7 @@ impl<S: GraphStorage> VarLengthWalk<'_, '_, S> {
|
|
|
833
870
|
if hops >= self.min_hops {
|
|
834
871
|
self.emit(node, path, out);
|
|
835
872
|
}
|
|
836
|
-
if hops >= self.max_hops {
|
|
873
|
+
if hops >= self.max_hops || eval_deadline_hit() {
|
|
837
874
|
return;
|
|
838
875
|
}
|
|
839
876
|
let mut next = Vec::new();
|
|
@@ -976,6 +1013,10 @@ pub fn eval_expr_result<S: GraphStorage>(
|
|
|
976
1013
|
) -> Result<LoraValue, String> {
|
|
977
1014
|
clear_eval_error();
|
|
978
1015
|
let value = eval_expr(expr, row, ctx);
|
|
1016
|
+
if crate::cancel::eval_tripped() {
|
|
1017
|
+
clear_eval_error();
|
|
1018
|
+
return Err(DEADLINE_EXCEEDED.to_string());
|
|
1019
|
+
}
|
|
979
1020
|
match take_eval_error() {
|
|
980
1021
|
Some(err) => Err(err),
|
|
981
1022
|
None => Ok(value),
|